import {IIndexingManager} from "../interfaces/IIndexingManager"; import {IndexingProgressDTO} from "../../../common/entities/settings/IndexingProgressDTO"; import {ObjectManagerRepository} from "../ObjectManagerRepository"; import {ISQLGalleryManager} from "./IGalleryManager"; import * as path from "path"; import {SQLConnection} from "./SQLConnection"; import {DirectoryEntity} from "./enitites/DirectoryEntity"; import {Logger} from "../../Logger"; const LOG_TAG = "[IndexingManager]"; export class IndexingManager implements IIndexingManager { directoriesToIndex: string[] = []; indexingProgress = null; enabled = false; private indexNewDirectory = async () => { if (this.directoriesToIndex.length == 0) { this.indexingProgress = null; if (global.gc) { global.gc(); } return; } const directory = this.directoriesToIndex.shift(); this.indexingProgress.current = directory; this.indexingProgress.left = this.directoriesToIndex.length; const scanned = await (ObjectManagerRepository.getInstance().GalleryManager).indexDirectory(directory); if (this.enabled == false) { return; } this.indexingProgress.indexed++; for (let i = 0; i < scanned.directories.length; i++) { this.directoriesToIndex.push(path.join(scanned.directories[i].path, scanned.directories[i].name)) } process.nextTick(this.indexNewDirectory); }; startIndexing(): void { if (this.directoriesToIndex.length == 0 && this.enabled == false) { Logger.info(LOG_TAG, "Starting indexing"); this.indexingProgress = { indexed: 0, left: 0, current: "" }; this.directoriesToIndex.push("/"); this.enabled = true; this.indexNewDirectory(); } else { Logger.info(LOG_TAG, "Already indexing.."); } } getProgress(): IndexingProgressDTO { return this.indexingProgress; } cancelIndexing(): void { Logger.info(LOG_TAG, "Canceling indexing"); this.directoriesToIndex = []; this.indexingProgress = null; this.enabled = false; if (global.gc) { global.gc(); } } async reset(): Promise { Logger.info(LOG_TAG, "Resetting DB"); this.directoriesToIndex = []; this.indexingProgress = null; this.enabled = false; const connection = await SQLConnection.getConnection(); return connection .getRepository(DirectoryEntity) .createQueryBuilder("directory") .delete() .execute(); } }