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; } 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; } 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, }; // 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; }); } 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[]; } };