diff --git a/server/src/routes/api/admin-gallery.js b/server/src/routes/api/admin-gallery.js index d60a410..0d13deb 100644 --- a/server/src/routes/api/admin-gallery.js +++ b/server/src/routes/api/admin-gallery.js @@ -1,6 +1,12 @@ import fs from 'node:fs/promises' import path from 'node:path' import { prisma } from '../../lib/prisma.js' +import { persistMultipartImages } from '../../lib/upload-images.js' +import { + formatFileTooLargeMessage, + getProductImageMaxFileBytes, + isMultipartFileTooLargeError, +} from '../../lib/upload-limits.js' export async function registerAdminGalleryRoutes(fastify) { fastify.get( @@ -14,6 +20,38 @@ export async function registerAdminGalleryRoutes(fastify) { }, ) + fastify.post( + '/api/admin/gallery/upload', + { preHandler: [fastify.verifyAdmin] }, + async (request, reply) => { + try { + const urls = await persistMultipartImages(request, { + maxFiles: 10, + maxFileBytes: getProductImageMaxFileBytes(), + subdir: '', + eager: false, + }) + for (const url of urls) { + await prisma.galleryImage.create({ + data: { url, isResized: false }, + }) + } + return { urls } + } catch (error) { + let message = error instanceof Error ? error.message : 'Не удалось загрузить файлы' + let statusCode = + error && typeof error === 'object' && 'statusCode' in error && Number.isInteger(error.statusCode) + ? Number(error.statusCode) + : 400 + if (isMultipartFileTooLargeError(error)) { + message = formatFileTooLargeMessage(getProductImageMaxFileBytes()) + statusCode = 413 + } + return reply.code(statusCode).send({ error: message }) + } + }, + ) + fastify.delete( '/api/admin/gallery/:id', { preHandler: [fastify.verifyAdmin] },