1
0
mirror of https://github.com/xuthus83/pigallery2.git synced 2024-11-03 21:04:03 +08:00
pigallery2/backend/model/mongoose/MongoGalleryManager.ts

79 lines
2.8 KiB
TypeScript

import * as path from "path";
import {Directory} from "../../../common/entities/Directory";
import {IGalleryManager} from "../IGalleryManager";
import {DiskManager} from "../DiskManger";
import {Utils} from "../../../common/Utils";
import {DirectoryModel} from "./entities/DirectoryModel";
import {PhotoModel} from "./entities/PhotoModel";
import {Photo} from "../../../common/entities/Photo";
export class MongoGalleryManager implements IGalleryManager {
constructor() {
}
public listDirectory(relativeDirectoryName, cb:(error:any, result:Directory) => void) {
let directoryName = path.basename(relativeDirectoryName);
let directoryParent = path.join(path.dirname(relativeDirectoryName), "/");
DirectoryModel.findOne({
name: directoryName,
path: directoryParent
}).populate('photos').populate('directories').exec((err, res:any) => {
if (err || !res) {
return this.indexDirectory(relativeDirectoryName, cb);
}
return cb(err, this.modelToEntity(res));
});
}
public indexDirectory(relativeDirectoryName, cb:(error:any, result:Directory) => void) {
DiskManager.scanDirectory(relativeDirectoryName, (err, scannedDirectory)=> {
let arr = [];
scannedDirectory.directories.forEach((value) => {
let dir = new DirectoryModel(value);
Utils.setKeys(dir, value);
dir.save();
arr.push(dir);
});
scannedDirectory.directories = arr;
arr = [];
scannedDirectory.photos.forEach((value) => {
let p = new PhotoModel(value);
Utils.setKeys(p, value);
p.save();
arr.push(p);
});
scannedDirectory.photos = arr;
DirectoryModel.create(scannedDirectory, (err, savedDir)=> {
scannedDirectory.photos.forEach((value:any) => {
value['directory'] = savedDir;
value.save();
});
return cb(err, this.modelToEntity(savedDir));
});
});
}
private modelToEntity(directoryModel:any):Directory {
let directoryEntity = new Directory(directoryModel._id, directoryModel.name, directoryModel.path, directoryModel.lastupdate, [], []);
directoryModel.photos.forEach((photo) => {
let photoEntity = new Photo(photo._id, photo.name, null, photo.width, photo.height);
directoryEntity.photos.push(photoEntity);
});
directoryModel.directories.forEach((dir) => {
let dirEntity = new Directory(dir._id, dir.name, dir.path, dir.lastupdate, [], []);
directoryEntity.directories.push(dirEntity);
});
return directoryEntity;
}
}