From 73670703bbce81e21081740a164b1df8141b4d8d Mon Sep 17 00:00:00 2001 From: Kavehhn174 Date: Sat, 15 Aug 2026 18:46:26 +0330 Subject: [PATCH] fix: align FilePond upload with the Node.js API and proxy gallery previews Use the filepond-image field, parse the API envelope, and load private files through the authenticated content endpoint so uploads persist and images display. --- package.json | 3 +- src/api/axiosInstance.js | 13 ++ src/api/certificateApi.js | 4 +- src/api/documentApi.js | 2 +- src/api/filesApi.js | 15 ++ src/components/uploader/ImageManager.vue | 168 +++++++++++++------ src/components/uploader/UserFilesSection.vue | 4 + src/utils/uploadResponse.js | 56 +++++++ src/utils/uploadResponse.test.js | 55 ++++++ 9 files changed, 263 insertions(+), 57 deletions(-) create mode 100644 src/api/filesApi.js create mode 100644 src/utils/uploadResponse.js create mode 100644 src/utils/uploadResponse.test.js diff --git a/package.json b/package.json index a77986f..ba19928 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "scripts": { "dev": "vite", "build": "vite build", - "preview": "vite preview" + "preview": "vite preview", + "test": "node --test src/utils/uploadResponse.test.js" }, "dependencies": { "@fontsource/vazirmatn": "^5.3.0", diff --git a/src/api/axiosInstance.js b/src/api/axiosInstance.js index 3ecc8fc..c3971c8 100644 --- a/src/api/axiosInstance.js +++ b/src/api/axiosInstance.js @@ -29,6 +29,19 @@ axiosInstance.interceptors.request.use( config.params.lang = lang; } + const isFormData = typeof FormData !== 'undefined' && config.data instanceof FormData; + if (isFormData) { + // Let the browser set multipart boundary — a bare multipart/form-data header breaks Multer + if (typeof config.headers?.delete === 'function') { + config.headers.delete('Content-Type'); + config.headers.delete('content-type'); + } else { + delete config.headers['Content-Type']; + delete config.headers['content-type']; + } + config.timeout = Math.max(config.timeout || 0, 120000); + } + return config; }, (error) => Promise.reject(error) diff --git a/src/api/certificateApi.js b/src/api/certificateApi.js index d858bb0..8f48720 100644 --- a/src/api/certificateApi.js +++ b/src/api/certificateApi.js @@ -6,11 +6,11 @@ export const certificateApi = { search: (params) => axiosInstance.get('/certificates/admin/search', { params }), getOne: (id) => axiosInstance.get(`/certificates/admin/get-one/${id}`), getByUser: (userId) => axiosInstance.get(`/certificates/admin/by-user/${userId}`), - create: (data) => axiosInstance.post('/certificates/admin/create', data), + create: (data) => axiosInstance.post('/certificates/admin/create', data, { timeout: 120000 }), update: (id, data) => axiosInstance.put(`/certificates/admin/update/${id}`, data), delete: (id) => axiosInstance.delete(`/certificates/admin/delete/${id}`), uploadTemp: (formData) => axiosInstance.post('/files/admin/upload-temp', formData, { - headers: { 'Content-Type': 'multipart/form-data' } + timeout: 120000 }), getSignedUrl: (filename, bucket = 'temp') => axiosInstance.get(`/files/admin/signed-url/${encodeURIComponent(filename)}`, { params: { bucket } }), diff --git a/src/api/documentApi.js b/src/api/documentApi.js index 0a380e8..4da1b36 100644 --- a/src/api/documentApi.js +++ b/src/api/documentApi.js @@ -5,7 +5,7 @@ export const documentApi = { getAll: (params) => axiosInstance.get('/documents/admin/get-all', { params }), getByUser: (userId) => axiosInstance.get(`/documents/admin/by-user/${userId}`), getOne: (id) => axiosInstance.get(`/documents/admin/get-one/${id}`), - create: (data) => axiosInstance.post('/documents/admin/create', data), + create: (data) => axiosInstance.post('/documents/admin/create', data, { timeout: 120000 }), update: (id, data) => axiosInstance.put(`/documents/admin/update/${id}`, data), delete: (id) => axiosInstance.delete(`/documents/admin/delete/${id}`), getMyDocuments: () => axiosInstance.get('/documents/user/my-documents') diff --git a/src/api/filesApi.js b/src/api/filesApi.js new file mode 100644 index 0000000..d911315 --- /dev/null +++ b/src/api/filesApi.js @@ -0,0 +1,15 @@ +// /src/api/filesApi.js +import axiosInstance from './axiosInstance'; + +export const filesApi = { + uploadTemp: (formData) => axiosInstance.post('/files/admin/upload-temp', formData, { + timeout: 120000 + }), + getSignedUrl: (filename, bucket = 'temp') => + axiosInstance.get(`/files/admin/signed-url/${encodeURIComponent(filename)}`, { params: { bucket } }), + getContent: (key, bucket) => axiosInstance.get('/files/admin/content', { + params: { key, bucket }, + responseType: 'blob', + timeout: 120000 + }) +}; diff --git a/src/components/uploader/ImageManager.vue b/src/components/uploader/ImageManager.vue index 5e8059c..954c5aa 100644 --- a/src/components/uploader/ImageManager.vue +++ b/src/components/uploader/ImageManager.vue @@ -1,11 +1,14 @@ - +