From c37743eee69476dfb5f79dd24550d54f55d2d7a1 Mon Sep 17 00:00:00 2001 From: Kirill Date: Fri, 15 May 2026 13:24:14 +0500 Subject: [PATCH] feat: separate review images into /uploads/reviews/ subdir --- server/src/lib/upload-images.js | 18 ++++++++++-------- server/src/routes/api/public-reviews.js | 1 + 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/server/src/lib/upload-images.js b/server/src/lib/upload-images.js index 915db68..7d9195a 100644 --- a/server/src/lib/upload-images.js +++ b/server/src/lib/upload-images.js @@ -14,13 +14,14 @@ export function uploadError(message, statusCode = 400) { return err } -export async function persistMultipartImages(request, { maxFiles = 10, maxFileBytes }) { +export async function persistMultipartImages(request, { maxFiles = 10, maxFileBytes, subdir = '' }) { if (!request.isMultipart()) { throw uploadError('Ожидается multipart/form-data') } const uploadsDir = path.join(process.cwd(), 'uploads') - await fs.promises.mkdir(uploadsDir, { recursive: true }) + const targetDir = subdir ? path.join(uploadsDir, subdir) : uploadsDir + await fs.promises.mkdir(targetDir, { recursive: true }) const urls = [] const parts = request.parts({ @@ -40,9 +41,9 @@ export async function persistMultipartImages(request, { maxFiles = 10, maxFileBy } const fileName = `${crypto.randomUUID()}${ext}` - const fullPath = path.join(uploadsDir, fileName) + const fullPath = path.join(targetDir, fileName) await fs.promises.writeFile(fullPath, await part.toBuffer()) - urls.push(`/uploads/${fileName}`) + urls.push(subdir ? `/uploads/${subdir}/${fileName}` : `/uploads/${fileName}`) } if (urls.length === 0) { @@ -55,17 +56,18 @@ export async function persistMultipartImages(request, { maxFiles = 10, maxFileBy } /** Сохранить один буфер изображения в uploads/, вернуть путь `/uploads/...`. */ -export async function saveImageBufferToUploads(originalFilename, buffer) { +export async function saveImageBufferToUploads(originalFilename, buffer, subdir = '') { const ext = safeImageExt(originalFilename) if (!ext) { throw uploadError('Разрешены только файлы: png, jpg, jpeg, webp') } const uploadsDir = path.join(process.cwd(), 'uploads') - await fs.promises.mkdir(uploadsDir, { recursive: true }) + const targetDir = subdir ? path.join(uploadsDir, subdir) : uploadsDir + await fs.promises.mkdir(targetDir, { recursive: true }) const fileName = `${crypto.randomUUID()}${ext}` - const fullPath = path.join(uploadsDir, fileName) + const fullPath = path.join(targetDir, fileName) await fs.promises.writeFile(fullPath, buffer) - return `/uploads/${fileName}` + return subdir ? `/uploads/${subdir}/${fileName}` : `/uploads/${fileName}` } diff --git a/server/src/routes/api/public-reviews.js b/server/src/routes/api/public-reviews.js index 983fe21..e9d78f8 100644 --- a/server/src/routes/api/public-reviews.js +++ b/server/src/routes/api/public-reviews.js @@ -16,6 +16,7 @@ export async function registerPublicReviewRoutes(fastify) { const urls = await persistMultipartImages(request, { maxFiles: 1, maxFileBytes: getOtherUploadMaxFileBytes(), + subdir: 'reviews', }) if (urls.length !== 1) return reply.code(400).send({ error: 'Нужно прикрепить 1 изображение' }) return { url: urls[0] }