import { promisify } from 'util' import cryptoRandomString from 'crypto-random-string' import multer from 'multer' import { Slug } from '../../functions/slug' import { POST, QRequestController, SECURE, } from '../../modules/RequestController' const directory = process.cwd() const staticDir = `${directory}/static/img` const { updateImage, createVersionImage, } = require('../../modules/images/updateImages') const sizes = [20, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100] export default class UploadController extends QRequestController { @POST async index() { const rewrite = this.query?.rewrite const req = this.req const res = this.res if (!req || !res) { return this.answer( false, undefined, 'Использование роута можно только через http' ) } let originalFileName: string = '' let filename: string = '' let writedFileName: string = '' const storage = multer.diskStorage({ destination(_, __, cb) { cb(null, staticDir) }, filename(_, file, cb) { originalFileName = file.originalname if (!rewrite) { const slugName = Slug(originalFileName) filename = `${cryptoRandomString({ length: 10, })}-${slugName}` writedFileName = `original-${filename}` } else { filename = rewrite } cb(null, writedFileName) }, }) const upload = multer({ storage, }).single('file') const uploader = promisify(upload) // Записываем await uploader(req, res) // Если это перезапись - меняем имя файла на исходное // Выдаем ответ return { result: true, file: filename } } @POST @SECURE() async image() { const rewrite = this.query?.rewrite const req = this.req const res = this.res if (!req || !res) { return this.answer( false, undefined, 'Использование роута можно только через http' ) } let originalFileName: string = '' let filename: string = '' const storage = multer.diskStorage({ destination(_, __, cb) { cb(null, staticDir) }, filename(_, file, cb) { originalFileName = file.originalname if (!rewrite) { const slugName = Slug(originalFileName) filename = `${cryptoRandomString({ length: 10 })}-${slugName}` } else { filename = rewrite } cb(null, filename) }, }) const upload = multer({ storage, }).single('file') const uploader = promisify(upload) // Записываем await uploader(req, res) // if (filename && filename.split('.').pop() !== 'svg' && !rewrite) { // Оптимизируем файл await updateImage(staticDir, filename) // Создаем размеры for (const size of sizes) { await createVersionImage(staticDir, filename, size) } } // Если это перезапись - меняем имя файла на исходное // Выдаем ответ return { result: true, file: filename } } }