From 3451aceaf517985ae2d5cb5d025b25a593dedff7 Mon Sep 17 00:00:00 2001 From: vincentbpro <89356961+vincentbpro@users.noreply.github.com> Date: Mon, 4 Apr 2022 15:09:08 +0200 Subject: [PATCH] feat(menu-logo): added upload feature --- .../core/admin/server/controllers/admin.js | 4 +- packages/core/admin/server/services/index.js | 1 + .../admin/server/services/project-settings.js | 38 +++++++++++++++++++ packages/core/admin/server/utils/index.d.ts | 2 + .../server/validation/project-settings.js | 2 +- 5 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 packages/core/admin/server/services/project-settings.js diff --git a/packages/core/admin/server/controllers/admin.js b/packages/core/admin/server/controllers/admin.js index 1c1c0cea08..94c3d029a2 100644 --- a/packages/core/admin/server/controllers/admin.js +++ b/packages/core/admin/server/controllers/admin.js @@ -51,7 +51,9 @@ module.exports = { await validateUpdateProjectSettings(files); - console.log(files); + const uploadedFiles = await getService('project-settings').uploadProjectSettingsFiles(files); + + console.log(uploadedFiles); }, async information() { diff --git a/packages/core/admin/server/services/index.js b/packages/core/admin/server/services/index.js index ca39f17210..22f4819ce8 100644 --- a/packages/core/admin/server/services/index.js +++ b/packages/core/admin/server/services/index.js @@ -13,4 +13,5 @@ module.exports = { auth: require('./auth'), action: require('./action'), 'api-token': require('./api-token'), + 'project-settings': require('./project-settings'), }; diff --git a/packages/core/admin/server/services/project-settings.js b/packages/core/admin/server/services/project-settings.js new file mode 100644 index 0000000000..edbf209281 --- /dev/null +++ b/packages/core/admin/server/services/project-settings.js @@ -0,0 +1,38 @@ +'use strict'; + +const fs = require('fs'); +const { transform } = require('lodash'); + +const getFormatedFileData = data => ({ + path: data.path, + ...strapi + .plugin('upload') + .service('upload') + .formatFileInfo({ + filename: data.name, + type: data.type, + size: data.size, + }), +}); + +const uploadProjectSettingsFiles = async files => { + const formatedFilesData = transform(files, (result, value, key) => { + if (value) { + result[key] = getFormatedFileData(value); + } + }); + + Object.values(formatedFilesData).map(data => + // Do not await to upload asynchronously + strapi.plugin('upload').provider.uploadStream({ + ...data, + stream: fs.createReadStream(data.path), + }) + ); + + return formatedFilesData; +}; + +module.exports = { + uploadProjectSettingsFiles, +}; diff --git a/packages/core/admin/server/utils/index.d.ts b/packages/core/admin/server/utils/index.d.ts index fd4b1e653a..f5d13bfa43 100644 --- a/packages/core/admin/server/utils/index.d.ts +++ b/packages/core/admin/server/utils/index.d.ts @@ -6,6 +6,7 @@ import * as metrics from '../services/metrics'; import * as token from '../services/token'; import * as auth from '../services/auth'; import * as apiToken from '../services/api-token'; +import * as projectSettings from '../services/project-settings'; type S = { role: typeof role; @@ -16,6 +17,7 @@ type S = { auth: typeof auth; metrics: typeof metrics; 'api-token': typeof apiToken; + 'project-settings': typeof projectSettings; }; export function getService(name: T): S[T]; diff --git a/packages/core/admin/server/validation/project-settings.js b/packages/core/admin/server/validation/project-settings.js index 1562ca2088..3bca06b167 100644 --- a/packages/core/admin/server/validation/project-settings.js +++ b/packages/core/admin/server/validation/project-settings.js @@ -8,7 +8,7 @@ const ALLOWED_LOGO_FILE_TYPES = ['image/jpeg', 'image/png', 'image/svg+xml']; const updateProjectSettings = yup .object({ menuLogo: yup.object({ - name: yup.string().max(255), + name: yup.string(), type: yup.string().oneOf(ALLOWED_LOGO_FILE_TYPES), size: yup.number().max(MAX_LOGO_SIZE), }),