import { Request, Response } from "express"; import fs from "fs-extra"; import path from "path"; import { logger } from "../server"; import GenerateThumbnail, { GenerateOptimized, } from "../util/generateThumbnail"; import MediaFile from "../util/interfaces/MediaFile"; import ListableChecker from "../util/listableChecker"; import GenerateUrl from "../util/MediaUrlGen"; import { PathToRoFolder } from "../util/pathGenerators"; import { FolderPaths, JobRelativeFilePath } from "../util/serverInit"; import ft from "file-type"; import core from "file-type/core"; export async function JobsListMedia(req: Request, res: Response) { const jobid: string = (req.body.jobid || "").trim(); await fs.ensureDir(PathToRoFolder(jobid)); logger.debug("Listing media for job: " + PathToRoFolder(jobid)); let ret: MediaFile[]; try { if (req.files) { //We just uploaded files, we're going to send only those back. ret = await Promise.all( (req.files as Express.Multer.File[]).map(async (file) => { const relativeFilePath: string = JobRelativeFilePath( jobid, file.filename ); const relativeThumbPath: string = await GenerateThumbnail( relativeFilePath ); const relativeOptimizedPath: string = await GenerateOptimized( relativeFilePath ); const type: core.FileTypeResult | undefined = await ft.fromFile( relativeFilePath ); return { type, size: file.size, src: GenerateUrl([ FolderPaths.StaticPath, FolderPaths.JobsFolder, jobid, file.filename, ]), thumbnail: GenerateUrl([ FolderPaths.StaticPath, FolderPaths.JobsFolder, jobid, relativeThumbPath, ]), optimized: GenerateUrl([ FolderPaths.StaticPath, FolderPaths.JobsFolder, jobid, relativeOptimizedPath, ]), thumbnailHeight: 250, thumbnailWidth: 250, filename: file.filename, relativeFilePath, }; }) ); } else { const filesList: fs.Dirent[] = ( await fs.readdir(PathToRoFolder(jobid), { withFileTypes: true, }) ).filter((f) => f.isFile() && ListableChecker(f)); ret = await Promise.all( filesList.map(async (file) => { const relativeFilePath: string = JobRelativeFilePath( jobid, file.name ); const relativeThumbPath: string = await GenerateThumbnail( relativeFilePath ); const relativeOptimizedPath: string = await GenerateOptimized( relativeFilePath ); const type: core.FileTypeResult | undefined = await ft.fromFile( relativeFilePath ); const fileSize = await fs.stat(relativeFilePath); return { type, size: fileSize.size, src: GenerateUrl([ FolderPaths.StaticPath, FolderPaths.JobsFolder, jobid, file.name, ]), thumbnail: GenerateUrl([ FolderPaths.StaticPath, FolderPaths.JobsFolder, jobid, relativeThumbPath, ]), optimized: GenerateUrl([ FolderPaths.StaticPath, FolderPaths.JobsFolder, jobid, relativeOptimizedPath, ]), thumbnailHeight: 250, thumbnailWidth: 250, filename: file.name, relativeFilePath, }; }) ); } if (!res.headersSent) res.json(ret); } catch (error) { logger.error("Error listing job media.", { jobid, error }); if (!res.headersSent) res.status(500).json(error); } }