import path from "path"; import crypto from "crypto"; import multer from "multer"; import mongoose from "mongoose"; import GridFsStorage from "multer-gridfs-storage"; import Grid from "gridfs-stream"; import { GridFSBucket,ObjectId } from "mongodb"; import { Readable } from "stream"; import { Methods,Handler} from "@onebro/oba-common"; import { AppMaster } from "@onebro/appmaster"; import { CustomMulterStorage,CustomStorageCallback } from "../types"; export const finavigatorUploadActions = async (m:AppMaster) => { const actions:Methods = { uploadToDirectory:() => multer({ storage:multer.diskStorage({ destination:(req,file,cb) => cb(null,path.join(__dirname,"/../../../file-uploads")), filename:(req,file,cb) => { const filenameArr = file.originalname.split("."); const extention = filenameArr[filenameArr.length - 1]; const uniqueSuffix = new Date().toLocaleString().replace("/","").replace(":",""); const filePath = file.fieldname + "-" + uniqueSuffix + "." + extention; cb(null,file.originalname||filePath);}}), limits:{fileSize:5000000}}).single("testdoc"), uploadToGridBucket:() => multer({ storage:new GridFsStorage({ url:m.db.connections["onebrother"].uri, file:(req,file) => new Promise((resolve,reject) => { crypto.randomBytes(16,(err,buf) => { if(err) return reject(err); const filename = file.originalname; const fileInfo = {filename,bucketName:"finavigator-uploads"}; resolve(fileInfo);});}),})}).single("testdoc"), uploadHandler:() => async (req,res,next) => res.status(201).json(req.file), downloadFromGridBucket:() => async (req,res,next) => { const db = m.db.connections["onebrother"].client.db; const gfs = Grid(db,mongoose.mongo); gfs.collection("finavigator-uploads"); const file = await gfs.files.findOne({_id:new mongoose.Types.ObjectId(req.params.id)}); if (!file || file.length === 0) return res.status(404).json({err:"No file exists"}); if (file.contentType === "image/jpeg" || file.contentType === "image/png"){ const readstream = gfs.createReadStream(file.filename); res.set("Content-Type",file.contentType); readstream.pipe(res);} else res.status(404).json({err:"Not an image"});}, downloader2:() => async (req,res,next) => { const db = m.db.connections["onebrother"].client.db; const gridfsBucket = new GridFSBucket(db, {bucketName:"finavigator-uploads"}); const downloadStream = gridfsBucket.openDownloadStream(new ObjectId(req.params.id)); const buffer:any[] = []; downloadStream.on("data",(chunk) => buffer.push(chunk)); downloadStream.on("end", () => { const readable = new Readable(); readable._read = () => {}; readable.push(Buffer.concat(buffer)); readable.push(null);}); //if (!file || file.length === 0) return res.status(404).json({err:"No file exists"}); //if (file.contentType === "image/jpeg" || file.contentType === "image/png"){ //const readstream = gfs.createReadStream(file.filename); downloadStream.pipe(res);}, }; return actions; }; /* const actions:FinavigatorUploadActions = { create$:async ({body}) => await Promise.resolve() .then(() => FinavigatorUpload._create(body)) .then(async o => await FinavigatorUpload._populate(o)) .then(o => wrapup({upload:o})), query$:async ({query}) => await Promise.resolve() .then(async () => await FinavigatorUpload._query(new IQuery(query as any))) .then(async o => await wrapupQ(o)), fetch$:async ({params:{id}}) => await Promise.resolve() .then(() => FinavigatorUpload._find(id)) .then(o => FinavigatorUpload._populate(o)) .then(o => wrapup({upload:o})), update$:async ({params:{id},body:updates}) => await Promise.resolve() .then(() => FinavigatorUpload._find(id)) .then(o => FinavigatorUpload._populate(o)) .then(o => FinavigatorUpload._update(o,updates)) .then(o => wrapup({upload:o})), remove$:async ({params:{id}}) => await Promise.resolve() .then(() => FinavigatorUpload._find(id)) .then(o => o.remove()) .then(() => ({removed:id})), updateMany$:async ({body:{ids,updates}}:{body:{ids:string[],updates:DeepPartial}}) => await Promise.resolve() .then(async () => { if(ids.length){ const arr:FinavigatorUpload[] = []; for(let i = 0,l = ids.length;i { for(let i = 0,l = ids.length;i ({updated:n} as any)), removeMany$:async ({body:{ids}}:{body:{ids:string[]}}) => await Promise.resolve() .then(async () => { if(ids.length){ const arr:FinavigatorUpload[] = []; for(let i = 0,l = ids.length;i { for(let i = 0,l = o.length;i ({removed:n} as any)), search$:async ({body}) => await Promise.resolve({results:[]}), }; */