import { MediaDTO, MediaDTOUtils } from './MediaDTO'; import { FileDTO } from './FileDTO'; import { PhotoDTO, PreviewPhotoDTO } from './PhotoDTO'; import { Utils } from '../Utils'; export interface DirectoryPathDTO { name: string; path: string; } // // export interface DirectoryDTO extends DirectoryPathDTO { // id: number; // name: string; // path: string; // lastModified: number; // lastScanned: number; // isPartial?: boolean; // parent: DirectoryDTO; // mediaCount: number; // directories: DirectoryDTO[]; // preview: PreviewPhotoDTO; // media: S[]; // metaFile: FileDTO[]; // } export interface DirectoryBaseDTO extends DirectoryPathDTO { id: number; name: string; path: string; lastModified: number; lastScanned: number; isPartial?: boolean; parent: DirectoryBaseDTO; mediaCount: number; directories?: DirectoryBaseDTO[]; media?: S[]; metaFile?: FileDTO[]; preview?: PreviewPhotoDTO; validPreview?: boolean; // does not go to the client side } export interface ParentDirectoryDTO extends DirectoryBaseDTO { id: number; name: string; path: string; lastModified: number; lastScanned: number; isPartial?: boolean; parent: ParentDirectoryDTO; mediaCount: number; directories: SubDirectoryDTO[]; media: S[]; metaFile: FileDTO[]; } export interface SubDirectoryDTO extends DirectoryBaseDTO { id: number; name: string; path: string; lastModified: number; lastScanned: number; isPartial?: boolean; parent: ParentDirectoryDTO; mediaCount: number; preview: PreviewPhotoDTO; validPreview?: boolean; // does not go to the client side } export const DirectoryDTOUtils = { unpackDirectory: (dir: DirectoryBaseDTO): void => { dir.media.forEach((media: MediaDTO) => { media.directory = dir; }); if (dir.metaFile) { dir.metaFile.forEach((file: FileDTO) => { file.directory = dir; }); } if (dir.directories) { dir.directories.forEach((directory) => { DirectoryDTOUtils.unpackDirectory(directory); directory.parent = dir; }); } }, packDirectory: (dir: DirectoryBaseDTO): DirectoryBaseDTO => { if (dir.preview) { dir.preview.directory = { path: dir.preview.directory.path, name: dir.preview.directory.name, } as DirectoryPathDTO; // make sure that it is not a same object as one of the photo in the media[] // as the next foreach would remove the directory dir.preview = Utils.clone(dir.preview); } if (dir.media) { dir.media.forEach((media: MediaDTO) => { media.directory = null; }); } if (dir.metaFile) { dir.metaFile.forEach((file: FileDTO) => { file.directory = null; }); } if (dir.directories) { dir.directories.forEach((directory) => { DirectoryDTOUtils.packDirectory(directory); directory.parent = null; }); } delete dir.validPreview; // should not go to the client side; return dir; }, filterPhotos: (dir: DirectoryBaseDTO): PhotoDTO[] => { return dir.media.filter((m) => MediaDTOUtils.isPhoto(m)) as PhotoDTO[]; }, filterVideos: (dir: DirectoryBaseDTO): PhotoDTO[] => { return dir.media.filter((m) => MediaDTOUtils.isPhoto(m)) as PhotoDTO[]; }, };