import { Request, Response } from "express"; import ft from "file-type"; import core from "file-type/core"; import fs from "fs-extra"; import path, { relative } from "path"; import GenerateUrl from "../util/MediaUrlGen"; import GenerateThumbnail from "../util/generateThumbnail"; import MediaFile from "../util/interfaces/MediaFile"; import ListableChecker from "../util/listableChecker"; import { PathToRoBillsFolder } from "../util/pathGenerators"; import { FolderPaths } from "../util/serverInit"; /** @description Bills will use the hierarchy of PDFs stored under the Job first, and then the Bills folder. */ export async function BillsListMedia(req: Request, res: Response) { const jobid: string = (req.body.jobid || "").trim(); //const vendorid: string = (req.body.vendorid || "").trim(); const invoice_number: string = (req.body.invoice_number || "").trim(); let ret: MediaFile[]; //Ensure all directories exist. await fs.ensureDir(PathToRoBillsFolder(jobid)); if (req.files) { ret = await Promise.all( (req.files as Express.Multer.File[]).map(async (file) => { const relativeFilePath: string = path.join( PathToRoBillsFolder(jobid), file.filename ); const relativeThumbPath: string = await GenerateThumbnail( relativeFilePath ); const type: core.FileTypeResult | undefined = await ft.fromFile( relativeFilePath ); return { type, size: file.size, src: GenerateUrl([ FolderPaths.StaticPath, FolderPaths.JobsFolder, jobid, FolderPaths.BillsSubDir, file.filename, ]), thumbnail: GenerateUrl([ FolderPaths.StaticPath, FolderPaths.JobsFolder, jobid, FolderPaths.BillsSubDir, relativeThumbPath, ]), thumbnailHeight: 250, thumbnailWidth: 250, filename: file.filename, relativeFilePath, }; }) ); } else { let filesList: fs.Dirent[] = ( await fs.readdir(PathToRoBillsFolder(jobid), { withFileTypes: true, }) ).filter( (f) => f.isFile() && !/(^|\/)\.[^\/\.]/g.test(f.name) && (invoice_number !== "" ? f.name.toLowerCase().includes(invoice_number.toLowerCase()) : true) && ListableChecker(f) ); ret = await Promise.all( filesList.map(async (file) => { const relativeFilePath: string = path.join( PathToRoBillsFolder(jobid), file.name ); const relativeThumbPath: string = await GenerateThumbnail( 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, FolderPaths.BillsSubDir, file.name, ]), thumbnail: GenerateUrl([ FolderPaths.StaticPath, FolderPaths.JobsFolder, jobid, FolderPaths.BillsSubDir, relativeThumbPath, ]), thumbnailHeight: 250, thumbnailWidth: 250, filename: file.name, relativeFilePath, }; }) ); } res.json(ret); }