import { Request, Response } from "express"; import fs from "fs-extra"; import path from "path"; import GenerateThumbnail from "../util/generateThumbnail"; import GenerateUrl from "../util/MediaUrlGen"; import { FolderPaths } from "../util/serverInit"; import multer from "multer"; import { JobsListMedia } from "./jobsListMedia"; export async function JobsMoveMedia(req: Request, res: Response) { const ro_number: string = (req.body.ro_number || "").trim(); const from_ro: string = (req.body.from_ro || "").trim(); const files: string[] = req.body.files; //Just file names. //Validate the request is valid and contains everything that it needs. if (from_ro === "") { res.status(400).json({ error: "from_ro must be specified. " }); return; } if (files.length === 0) { res.status(400).json({ error: "files must be specified. " }); return; } //Make sure the destination RO directory exists. await fs.ensureDir(path.join(FolderPaths.Jobs, ro_number)); const movingQueue: Promise[] = []; files.forEach((file) => { movingQueue.push( fs.move( path.join(FolderPaths.Jobs, from_ro, file), path.join(FolderPaths.Jobs, ro_number, file) ) ); movingQueue.push( fs.move( path.join(FolderPaths.Jobs, from_ro, FolderPaths.ThumbsSubDir, file), path.join(FolderPaths.Jobs, ro_number, FolderPaths.ThumbsSubDir, file) ) ); }); //Use AllSettled as it allows for individual moves to fail. //e.g. if the thumbnail does not exist. await Promise.allSettled(movingQueue); try { JobsListMedia(req, res); } catch (err) { res.status(500).send(err); } }