@strapi/upload 5.29.0 → 5.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/ai/components/AIAssetCard.js +4 -2
- package/dist/admin/ai/components/AIAssetCard.js.map +1 -1
- package/dist/admin/ai/components/AIAssetCard.mjs +4 -2
- package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -1
- package/dist/admin/ai/components/AIUploadModal.js +2 -1
- package/dist/admin/ai/components/AIUploadModal.js.map +1 -1
- package/dist/admin/ai/components/AIUploadModal.mjs +2 -1
- package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js +2 -2
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js +8 -5
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +7 -4
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +2 -2
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js +2 -2
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs.map +1 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.js +2 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.js.map +1 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs +2 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js +2 -2
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +2 -2
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js +2 -2
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
- package/dist/admin/hooks/useConfig.js +2 -1
- package/dist/admin/hooks/useConfig.js.map +1 -1
- package/dist/admin/hooks/useConfig.mjs +2 -1
- package/dist/admin/hooks/useConfig.mjs.map +1 -1
- package/dist/admin/hooks/useModalQueryParams.js +2 -2
- package/dist/admin/hooks/useModalQueryParams.js.map +1 -1
- package/dist/admin/hooks/useModalQueryParams.mjs +1 -1
- package/dist/admin/hooks/useModalQueryParams.mjs.map +1 -1
- package/dist/admin/hooks/useTracking.js +21 -0
- package/dist/admin/hooks/useTracking.js.map +1 -0
- package/dist/admin/hooks/useTracking.mjs +19 -0
- package/dist/admin/hooks/useTracking.mjs.map +1 -0
- package/dist/admin/package.json.js +5 -5
- package/dist/admin/package.json.mjs +5 -5
- package/dist/admin/pages/App/MediaLibrary/components/Filters.js +2 -1
- package/dist/admin/pages/App/MediaLibrary/components/Filters.js.map +1 -1
- package/dist/admin/pages/App/MediaLibrary/components/Filters.mjs +2 -1
- package/dist/admin/pages/App/MediaLibrary/components/Filters.mjs.map +1 -1
- package/dist/admin/src/hooks/useTracking.d.ts +4 -0
- package/dist/server/controllers/admin-folder-file.js +2 -2
- package/dist/server/controllers/admin-folder-file.js.map +1 -1
- package/dist/server/controllers/admin-folder-file.mjs +2 -2
- package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
- package/dist/server/controllers/admin-upload.js +1 -1
- package/dist/server/controllers/admin-upload.js.map +1 -1
- package/dist/server/controllers/admin-upload.mjs +1 -1
- package/dist/server/controllers/admin-upload.mjs.map +1 -1
- package/dist/server/services/metrics.js +11 -1
- package/dist/server/services/metrics.js.map +1 -1
- package/dist/server/services/metrics.mjs +11 -1
- package/dist/server/services/metrics.mjs.map +1 -1
- package/dist/server/services/upload.js +8 -8
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +8 -8
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/services/weekly-metrics.js +3 -6
- package/dist/server/services/weekly-metrics.js.map +1 -1
- package/dist/server/services/weekly-metrics.mjs +3 -6
- package/dist/server/services/weekly-metrics.mjs.map +1 -1
- package/dist/server/src/index.d.ts +1 -1
- package/dist/server/src/services/index.d.ts +1 -1
- package/dist/server/src/services/metrics.d.ts +1 -0
- package/dist/server/src/services/metrics.d.ts.map +1 -1
- package/dist/server/src/services/upload.d.ts.map +1 -1
- package/dist/server/src/services/weekly-metrics.d.ts +0 -1
- package/dist/server/src/services/weekly-metrics.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-upload.js","sources":["../../../server/src/controllers/admin-upload.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors, async } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FILE_MODEL_UID } from '../constants';\nimport { validateBulkUpdateBody, validateUploadBody } from './validation/admin/upload';\nimport { findEntityAndCheckPermissions } from './utils/find-entity-and-check-permissions';\nimport { FileInfo } from '../types';\n\nexport default {\n async bulkUpdateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body },\n } = ctx;\n\n const { updates } = await validateBulkUpdateBody(body);\n const uploadService = getService('upload');\n\n const results = await async.map(\n updates,\n async ({ id, fileInfo }: { id: number; fileInfo: FileInfo }) => {\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const updated = await uploadService.updateFileInfo(id, fileInfo as any, { user });\n return pm.sanitizeOutput(updated, { action: ACTIONS.read });\n }\n );\n\n ctx.body = results;\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const data = await validateUploadBody(body);\n\n const file = await uploadService.updateFileInfo(id, data.fileInfo as any, { user });\n\n ctx.body = await pm.sanitizeOutput(file, { action: ACTIONS.read });\n },\n\n async replaceFile(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body, files: { files } = {} },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n if (Array.isArray(files)) {\n throw new errors.ApplicationError('Cannot replace a file with multiple ones');\n }\n\n const data = (await validateUploadBody(body)) as { fileInfo: FileInfo };\n const replacedFile = await uploadService.replace(id, { data, file: files }, { user });\n\n // Sign file urls for private providers\n const signedFile = await getService('file').signFileUrls(replacedFile);\n\n ctx.body = await pm.sanitizeOutput(signedFile, { action: ACTIONS.read });\n },\n\n async uploadFiles(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body, files: { files } = {} },\n } = ctx;\n\n const uploadService = getService('upload');\n const pm = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.create,\n model: FILE_MODEL_UID,\n });\n\n if (!pm.isAllowed) {\n return ctx.forbidden();\n }\n\n const data = await validateUploadBody(body, Array.isArray(files));\n\n let filesArray = Array.isArray(files) ? files : [files];\n\n if (\n data.fileInfo &&\n Array.isArray(data.fileInfo) &&\n filesArray.length === data.fileInfo.length\n ) {\n // Reorder filesArray to match data.fileInfo order\n const alignedFilesArray = data.fileInfo\n .map((info) => {\n return filesArray.find((file) => file.originalFilename === info.name);\n })\n .filter(Boolean) as any[];\n\n filesArray = alignedFilesArray;\n }\n\n // Upload files first to get thumbnails\n const uploadedFiles = await uploadService.upload({ data, files: filesArray }, { user });\n if (uploadedFiles.some((file) => file.mime?.startsWith('image/'))) {\n strapi.telemetry.send('didUploadImage');\n }\n\n const aiMetadataService = getService('aiMetadata');\n\n // AFTER upload - use thumbnail versions for AI processing\n if (await aiMetadataService.isEnabled()) {\n try {\n // Use thumbnail URLs instead of original files\n const thumbnailFiles = uploadedFiles.map(\n (file) =>\n ({\n filepath: file.formats?.thumbnail?.url || file.url, // Use thumbnail if available\n mimetype: file.mime,\n originalFilename: file.name,\n size: file.formats?.thumbnail?.size || file.size,\n provider: file.provider,\n }) as unknown as any\n );\n\n const metadataResults = await aiMetadataService.processFiles(thumbnailFiles);\n\n // Update the uploaded files with AI metadata\n await Promise.all(\n uploadedFiles.map(async (uploadedFile, index) => {\n const aiMetadata = metadataResults[index];\n if (aiMetadata) {\n await uploadService.updateFileInfo(\n uploadedFile.id,\n {\n alternativeText: aiMetadata.altText,\n caption: aiMetadata.caption,\n },\n { user }\n );\n\n uploadedFiles[index].alternativeText = aiMetadata.altText;\n uploadedFiles[index].caption = aiMetadata.caption;\n }\n })\n );\n } catch (error) {\n strapi.log.warn('AI metadata generation failed, proceeding without AI enhancements', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Sign file urls for private providers\n const signedFiles = await async.map(uploadedFiles, getService('file').signFileUrls);\n\n ctx.body = await pm.sanitizeOutput(signedFiles, { action: ACTIONS.read });\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new errors.ApplicationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n};\n"],"names":["bulkUpdateFileInfo","ctx","state","userAbility","user","request","body","updates","validateBulkUpdateBody","uploadService","getService","results","async","map","id","fileInfo","pm","findEntityAndCheckPermissions","ACTIONS","update","FILE_MODEL_UID","updated","updateFileInfo","sanitizeOutput","action","read","query","errors","ValidationError","data","validateUploadBody","file","replaceFile","files","Array","isArray","ApplicationError","replacedFile","replace","signedFile","signFileUrls","uploadFiles","strapi","service","createPermissionsManager","ability","create","model","isAllowed","forbidden","filesArray","length","alignedFilesArray","info","find","originalFilename","name","filter","Boolean","uploadedFiles","upload","some","mime","startsWith","telemetry","send","aiMetadataService","isEnabled","thumbnailFiles","filepath","formats","thumbnail","url","mimetype","size","provider","metadataResults","processFiles","Promise","all","uploadedFile","index","aiMetadata","alternativeText","altText","caption","error","log","warn","Error","message","String","signedFiles","status","_","isEmpty"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admin-upload.js","sources":["../../../server/src/controllers/admin-upload.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors, async } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FILE_MODEL_UID } from '../constants';\nimport { validateBulkUpdateBody, validateUploadBody } from './validation/admin/upload';\nimport { findEntityAndCheckPermissions } from './utils/find-entity-and-check-permissions';\nimport { FileInfo } from '../types';\n\nexport default {\n async bulkUpdateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body },\n } = ctx;\n\n const { updates } = await validateBulkUpdateBody(body);\n const uploadService = getService('upload');\n\n const results = await async.map(\n updates,\n async ({ id, fileInfo }: { id: number; fileInfo: FileInfo }) => {\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const updated = await uploadService.updateFileInfo(id, fileInfo as any, { user });\n return pm.sanitizeOutput(updated, { action: ACTIONS.read });\n }\n );\n\n ctx.body = results;\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const data = await validateUploadBody(body);\n\n const file = await uploadService.updateFileInfo(id, data.fileInfo as any, { user });\n\n ctx.body = await pm.sanitizeOutput(file, { action: ACTIONS.read });\n },\n\n async replaceFile(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body, files: { files } = {} },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n if (Array.isArray(files)) {\n throw new errors.ApplicationError('Cannot replace a file with multiple ones');\n }\n\n const data = (await validateUploadBody(body)) as { fileInfo: FileInfo };\n const replacedFile = await uploadService.replace(id, { data, file: files }, { user });\n\n // Sign file urls for private providers\n const signedFile = await getService('file').signFileUrls(replacedFile);\n\n ctx.body = await pm.sanitizeOutput(signedFile, { action: ACTIONS.read });\n },\n\n async uploadFiles(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body, files: { files } = {} },\n } = ctx;\n\n const uploadService = getService('upload');\n const pm = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.create,\n model: FILE_MODEL_UID,\n });\n\n if (!pm.isAllowed) {\n return ctx.forbidden();\n }\n\n const data = await validateUploadBody(body, Array.isArray(files));\n\n let filesArray = Array.isArray(files) ? files : [files];\n\n if (\n data.fileInfo &&\n Array.isArray(data.fileInfo) &&\n filesArray.length === data.fileInfo.length\n ) {\n // Reorder filesArray to match data.fileInfo order\n const alignedFilesArray = data.fileInfo\n .map((info) => {\n return filesArray.find((file) => file.originalFilename === info.name);\n })\n .filter(Boolean) as any[];\n\n filesArray = alignedFilesArray;\n }\n\n // Upload files first to get thumbnails\n const uploadedFiles = await uploadService.upload({ data, files: filesArray }, { user });\n if (uploadedFiles.some((file) => file.mime?.startsWith('image/'))) {\n await getService('metrics').trackUsage('didUploadImage');\n }\n\n const aiMetadataService = getService('aiMetadata');\n\n // AFTER upload - use thumbnail versions for AI processing\n if (await aiMetadataService.isEnabled()) {\n try {\n // Use thumbnail URLs instead of original files\n const thumbnailFiles = uploadedFiles.map(\n (file) =>\n ({\n filepath: file.formats?.thumbnail?.url || file.url, // Use thumbnail if available\n mimetype: file.mime,\n originalFilename: file.name,\n size: file.formats?.thumbnail?.size || file.size,\n provider: file.provider,\n }) as unknown as any\n );\n\n const metadataResults = await aiMetadataService.processFiles(thumbnailFiles);\n\n // Update the uploaded files with AI metadata\n await Promise.all(\n uploadedFiles.map(async (uploadedFile, index) => {\n const aiMetadata = metadataResults[index];\n if (aiMetadata) {\n await uploadService.updateFileInfo(\n uploadedFile.id,\n {\n alternativeText: aiMetadata.altText,\n caption: aiMetadata.caption,\n },\n { user }\n );\n\n uploadedFiles[index].alternativeText = aiMetadata.altText;\n uploadedFiles[index].caption = aiMetadata.caption;\n }\n })\n );\n } catch (error) {\n strapi.log.warn('AI metadata generation failed, proceeding without AI enhancements', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Sign file urls for private providers\n const signedFiles = await async.map(uploadedFiles, getService('file').signFileUrls);\n\n ctx.body = await pm.sanitizeOutput(signedFiles, { action: ACTIONS.read });\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new errors.ApplicationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n};\n"],"names":["bulkUpdateFileInfo","ctx","state","userAbility","user","request","body","updates","validateBulkUpdateBody","uploadService","getService","results","async","map","id","fileInfo","pm","findEntityAndCheckPermissions","ACTIONS","update","FILE_MODEL_UID","updated","updateFileInfo","sanitizeOutput","action","read","query","errors","ValidationError","data","validateUploadBody","file","replaceFile","files","Array","isArray","ApplicationError","replacedFile","replace","signedFile","signFileUrls","uploadFiles","strapi","service","createPermissionsManager","ability","create","model","isAllowed","forbidden","filesArray","length","alignedFilesArray","info","find","originalFilename","name","filter","Boolean","uploadedFiles","upload","some","mime","startsWith","trackUsage","aiMetadataService","isEnabled","thumbnailFiles","filepath","formats","thumbnail","url","mimetype","size","provider","metadataResults","processFiles","Promise","all","uploadedFile","index","aiMetadata","alternativeText","altText","caption","error","log","warn","Error","message","String","signedFiles","status","_","isEmpty"],"mappings":"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"}
|
|
@@ -89,7 +89,7 @@ var adminUpload = {
|
|
|
89
89
|
user
|
|
90
90
|
});
|
|
91
91
|
if (uploadedFiles.some((file)=>file.mime?.startsWith('image/'))) {
|
|
92
|
-
|
|
92
|
+
await getService('metrics').trackUsage('didUploadImage');
|
|
93
93
|
}
|
|
94
94
|
const aiMetadataService = getService('aiMetadata');
|
|
95
95
|
// AFTER upload - use thumbnail versions for AI processing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-upload.mjs","sources":["../../../server/src/controllers/admin-upload.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors, async } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FILE_MODEL_UID } from '../constants';\nimport { validateBulkUpdateBody, validateUploadBody } from './validation/admin/upload';\nimport { findEntityAndCheckPermissions } from './utils/find-entity-and-check-permissions';\nimport { FileInfo } from '../types';\n\nexport default {\n async bulkUpdateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body },\n } = ctx;\n\n const { updates } = await validateBulkUpdateBody(body);\n const uploadService = getService('upload');\n\n const results = await async.map(\n updates,\n async ({ id, fileInfo }: { id: number; fileInfo: FileInfo }) => {\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const updated = await uploadService.updateFileInfo(id, fileInfo as any, { user });\n return pm.sanitizeOutput(updated, { action: ACTIONS.read });\n }\n );\n\n ctx.body = results;\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const data = await validateUploadBody(body);\n\n const file = await uploadService.updateFileInfo(id, data.fileInfo as any, { user });\n\n ctx.body = await pm.sanitizeOutput(file, { action: ACTIONS.read });\n },\n\n async replaceFile(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body, files: { files } = {} },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n if (Array.isArray(files)) {\n throw new errors.ApplicationError('Cannot replace a file with multiple ones');\n }\n\n const data = (await validateUploadBody(body)) as { fileInfo: FileInfo };\n const replacedFile = await uploadService.replace(id, { data, file: files }, { user });\n\n // Sign file urls for private providers\n const signedFile = await getService('file').signFileUrls(replacedFile);\n\n ctx.body = await pm.sanitizeOutput(signedFile, { action: ACTIONS.read });\n },\n\n async uploadFiles(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body, files: { files } = {} },\n } = ctx;\n\n const uploadService = getService('upload');\n const pm = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.create,\n model: FILE_MODEL_UID,\n });\n\n if (!pm.isAllowed) {\n return ctx.forbidden();\n }\n\n const data = await validateUploadBody(body, Array.isArray(files));\n\n let filesArray = Array.isArray(files) ? files : [files];\n\n if (\n data.fileInfo &&\n Array.isArray(data.fileInfo) &&\n filesArray.length === data.fileInfo.length\n ) {\n // Reorder filesArray to match data.fileInfo order\n const alignedFilesArray = data.fileInfo\n .map((info) => {\n return filesArray.find((file) => file.originalFilename === info.name);\n })\n .filter(Boolean) as any[];\n\n filesArray = alignedFilesArray;\n }\n\n // Upload files first to get thumbnails\n const uploadedFiles = await uploadService.upload({ data, files: filesArray }, { user });\n if (uploadedFiles.some((file) => file.mime?.startsWith('image/'))) {\n strapi.telemetry.send('didUploadImage');\n }\n\n const aiMetadataService = getService('aiMetadata');\n\n // AFTER upload - use thumbnail versions for AI processing\n if (await aiMetadataService.isEnabled()) {\n try {\n // Use thumbnail URLs instead of original files\n const thumbnailFiles = uploadedFiles.map(\n (file) =>\n ({\n filepath: file.formats?.thumbnail?.url || file.url, // Use thumbnail if available\n mimetype: file.mime,\n originalFilename: file.name,\n size: file.formats?.thumbnail?.size || file.size,\n provider: file.provider,\n }) as unknown as any\n );\n\n const metadataResults = await aiMetadataService.processFiles(thumbnailFiles);\n\n // Update the uploaded files with AI metadata\n await Promise.all(\n uploadedFiles.map(async (uploadedFile, index) => {\n const aiMetadata = metadataResults[index];\n if (aiMetadata) {\n await uploadService.updateFileInfo(\n uploadedFile.id,\n {\n alternativeText: aiMetadata.altText,\n caption: aiMetadata.caption,\n },\n { user }\n );\n\n uploadedFiles[index].alternativeText = aiMetadata.altText;\n uploadedFiles[index].caption = aiMetadata.caption;\n }\n })\n );\n } catch (error) {\n strapi.log.warn('AI metadata generation failed, proceeding without AI enhancements', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Sign file urls for private providers\n const signedFiles = await async.map(uploadedFiles, getService('file').signFileUrls);\n\n ctx.body = await pm.sanitizeOutput(signedFiles, { action: ACTIONS.read });\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new errors.ApplicationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n};\n"],"names":["bulkUpdateFileInfo","ctx","state","userAbility","user","request","body","updates","validateBulkUpdateBody","uploadService","getService","results","async","map","id","fileInfo","pm","findEntityAndCheckPermissions","ACTIONS","update","FILE_MODEL_UID","updated","updateFileInfo","sanitizeOutput","action","read","query","errors","ValidationError","data","validateUploadBody","file","replaceFile","files","Array","isArray","ApplicationError","replacedFile","replace","signedFile","signFileUrls","uploadFiles","strapi","service","createPermissionsManager","ability","create","model","isAllowed","forbidden","filesArray","length","alignedFilesArray","info","find","originalFilename","name","filter","Boolean","uploadedFiles","upload","some","mime","startsWith","telemetry","send","aiMetadataService","isEnabled","thumbnailFiles","filepath","formats","thumbnail","url","mimetype","size","provider","metadataResults","processFiles","Promise","all","uploadedFile","index","aiMetadata","alternativeText","altText","caption","error","log","warn","Error","message","String","signedFiles","status","_","isEmpty"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admin-upload.mjs","sources":["../../../server/src/controllers/admin-upload.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors, async } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FILE_MODEL_UID } from '../constants';\nimport { validateBulkUpdateBody, validateUploadBody } from './validation/admin/upload';\nimport { findEntityAndCheckPermissions } from './utils/find-entity-and-check-permissions';\nimport { FileInfo } from '../types';\n\nexport default {\n async bulkUpdateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body },\n } = ctx;\n\n const { updates } = await validateBulkUpdateBody(body);\n const uploadService = getService('upload');\n\n const results = await async.map(\n updates,\n async ({ id, fileInfo }: { id: number; fileInfo: FileInfo }) => {\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const updated = await uploadService.updateFileInfo(id, fileInfo as any, { user });\n return pm.sanitizeOutput(updated, { action: ACTIONS.read });\n }\n );\n\n ctx.body = results;\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const data = await validateUploadBody(body);\n\n const file = await uploadService.updateFileInfo(id, data.fileInfo as any, { user });\n\n ctx.body = await pm.sanitizeOutput(file, { action: ACTIONS.read });\n },\n\n async replaceFile(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body, files: { files } = {} },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n if (Array.isArray(files)) {\n throw new errors.ApplicationError('Cannot replace a file with multiple ones');\n }\n\n const data = (await validateUploadBody(body)) as { fileInfo: FileInfo };\n const replacedFile = await uploadService.replace(id, { data, file: files }, { user });\n\n // Sign file urls for private providers\n const signedFile = await getService('file').signFileUrls(replacedFile);\n\n ctx.body = await pm.sanitizeOutput(signedFile, { action: ACTIONS.read });\n },\n\n async uploadFiles(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body, files: { files } = {} },\n } = ctx;\n\n const uploadService = getService('upload');\n const pm = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.create,\n model: FILE_MODEL_UID,\n });\n\n if (!pm.isAllowed) {\n return ctx.forbidden();\n }\n\n const data = await validateUploadBody(body, Array.isArray(files));\n\n let filesArray = Array.isArray(files) ? files : [files];\n\n if (\n data.fileInfo &&\n Array.isArray(data.fileInfo) &&\n filesArray.length === data.fileInfo.length\n ) {\n // Reorder filesArray to match data.fileInfo order\n const alignedFilesArray = data.fileInfo\n .map((info) => {\n return filesArray.find((file) => file.originalFilename === info.name);\n })\n .filter(Boolean) as any[];\n\n filesArray = alignedFilesArray;\n }\n\n // Upload files first to get thumbnails\n const uploadedFiles = await uploadService.upload({ data, files: filesArray }, { user });\n if (uploadedFiles.some((file) => file.mime?.startsWith('image/'))) {\n await getService('metrics').trackUsage('didUploadImage');\n }\n\n const aiMetadataService = getService('aiMetadata');\n\n // AFTER upload - use thumbnail versions for AI processing\n if (await aiMetadataService.isEnabled()) {\n try {\n // Use thumbnail URLs instead of original files\n const thumbnailFiles = uploadedFiles.map(\n (file) =>\n ({\n filepath: file.formats?.thumbnail?.url || file.url, // Use thumbnail if available\n mimetype: file.mime,\n originalFilename: file.name,\n size: file.formats?.thumbnail?.size || file.size,\n provider: file.provider,\n }) as unknown as any\n );\n\n const metadataResults = await aiMetadataService.processFiles(thumbnailFiles);\n\n // Update the uploaded files with AI metadata\n await Promise.all(\n uploadedFiles.map(async (uploadedFile, index) => {\n const aiMetadata = metadataResults[index];\n if (aiMetadata) {\n await uploadService.updateFileInfo(\n uploadedFile.id,\n {\n alternativeText: aiMetadata.altText,\n caption: aiMetadata.caption,\n },\n { user }\n );\n\n uploadedFiles[index].alternativeText = aiMetadata.altText;\n uploadedFiles[index].caption = aiMetadata.caption;\n }\n })\n );\n } catch (error) {\n strapi.log.warn('AI metadata generation failed, proceeding without AI enhancements', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Sign file urls for private providers\n const signedFiles = await async.map(uploadedFiles, getService('file').signFileUrls);\n\n ctx.body = await pm.sanitizeOutput(signedFiles, { action: ACTIONS.read });\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new errors.ApplicationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n};\n"],"names":["bulkUpdateFileInfo","ctx","state","userAbility","user","request","body","updates","validateBulkUpdateBody","uploadService","getService","results","async","map","id","fileInfo","pm","findEntityAndCheckPermissions","ACTIONS","update","FILE_MODEL_UID","updated","updateFileInfo","sanitizeOutput","action","read","query","errors","ValidationError","data","validateUploadBody","file","replaceFile","files","Array","isArray","ApplicationError","replacedFile","replace","signedFile","signFileUrls","uploadFiles","strapi","service","createPermissionsManager","ability","create","model","isAllowed","forbidden","filesArray","length","alignedFilesArray","info","find","originalFilename","name","filter","Boolean","uploadedFiles","upload","some","mime","startsWith","trackUsage","aiMetadataService","isEnabled","thumbnailFiles","filepath","formats","thumbnail","url","mimetype","size","provider","metadataResults","processFiles","Promise","all","uploadedFile","index","aiMetadata","alternativeText","altText","caption","error","log","warn","Error","message","String","signedFiles","status","_","isEmpty"],"mappings":"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"}
|
|
@@ -3,10 +3,20 @@
|
|
|
3
3
|
const getProviderName = ()=>strapi.config.get('plugin::upload.provider', 'local');
|
|
4
4
|
const isProviderPrivate = async ()=>strapi.plugin('upload').provider.isPrivate();
|
|
5
5
|
var metrics = (({ strapi: strapi1 })=>({
|
|
6
|
+
async trackUsage (event, properties) {
|
|
7
|
+
const settings = await strapi1.plugin('upload').service('upload').getSettings();
|
|
8
|
+
return strapi1.telemetry.send(event, {
|
|
9
|
+
...properties,
|
|
10
|
+
eventProperties: {
|
|
11
|
+
...properties?.eventProperties,
|
|
12
|
+
isAIMediaLibraryConfigured: settings.aiMetadata
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
},
|
|
6
16
|
async sendUploadPluginMetrics () {
|
|
7
17
|
const uploadProvider = getProviderName();
|
|
8
18
|
const privateProvider = await isProviderPrivate();
|
|
9
|
-
|
|
19
|
+
await this.trackUsage('didInitializePluginUpload', {
|
|
10
20
|
groupProperties: {
|
|
11
21
|
uploadProvider,
|
|
12
22
|
privateProvider
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sources":["../../../server/src/services/metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nconst getProviderName = () => strapi.config.get('plugin::upload.provider', 'local');\nconst isProviderPrivate = async () => strapi.plugin('upload').provider.isPrivate();\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async sendUploadPluginMetrics() {\n const uploadProvider = getProviderName();\n const privateProvider = await isProviderPrivate();\n\n
|
|
1
|
+
{"version":3,"file":"metrics.js","sources":["../../../server/src/services/metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst getProviderName = () => strapi.config.get('plugin::upload.provider', 'local');\nconst isProviderPrivate = async () => strapi.plugin('upload').provider.isPrivate();\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async trackUsage(event: string, properties?: Record<string, any>) {\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n\n return strapi.telemetry.send(event, {\n ...properties,\n eventProperties: {\n ...properties?.eventProperties,\n isAIMediaLibraryConfigured: settings.aiMetadata,\n },\n });\n },\n async sendUploadPluginMetrics() {\n const uploadProvider = getProviderName();\n const privateProvider = await isProviderPrivate();\n\n await this.trackUsage('didInitializePluginUpload', {\n groupProperties: {\n uploadProvider,\n privateProvider,\n },\n });\n },\n});\n"],"names":["getProviderName","strapi","config","get","isProviderPrivate","plugin","provider","isPrivate","trackUsage","event","properties","settings","service","getSettings","telemetry","send","eventProperties","isAIMediaLibraryConfigured","aiMetadata","sendUploadPluginMetrics","uploadProvider","privateProvider","groupProperties"],"mappings":";;AAGA,MAAMA,kBAAkB,IAAMC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAA2B,EAAA,OAAA,CAAA;AAC3E,MAAMC,iBAAAA,GAAoB,UAAYH,MAAOI,CAAAA,MAAM,CAAC,QAAUC,CAAAA,CAAAA,QAAQ,CAACC,SAAS,EAAA;AAEhF,cAAe,CAAA,CAAC,EAAEN,QAAAA,OAAM,EAA2B,IAAM;QACvD,MAAMO,UAAAA,CAAAA,CAAWC,KAAa,EAAEC,UAAgC,EAAA;YAC9D,MAAMC,QAAAA,GAAqB,MAAMV,OAAOI,CAAAA,MAAM,CAAC,QAAUO,CAAAA,CAAAA,OAAO,CAAC,QAAA,CAAA,CAAUC,WAAW,EAAA;AAEtF,YAAA,OAAOZ,OAAOa,CAAAA,SAAS,CAACC,IAAI,CAACN,KAAO,EAAA;AAClC,gBAAA,GAAGC,UAAU;gBACbM,eAAiB,EAAA;AACf,oBAAA,GAAGN,YAAYM,eAAe;AAC9BC,oBAAAA,0BAAAA,EAA4BN,SAASO;AACvC;AACF,aAAA,CAAA;AACF,SAAA;QACA,MAAMC,uBAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,cAAiBpB,GAAAA,eAAAA,EAAAA;AACvB,YAAA,MAAMqB,kBAAkB,MAAMjB,iBAAAA,EAAAA;AAE9B,YAAA,MAAM,IAAI,CAACI,UAAU,CAAC,2BAA6B,EAAA;gBACjDc,eAAiB,EAAA;AACfF,oBAAAA,cAAAA;AACAC,oBAAAA;AACF;AACF,aAAA,CAAA;AACF;AACF,KAAA,CAAC;;;;"}
|
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
const getProviderName = ()=>strapi.config.get('plugin::upload.provider', 'local');
|
|
2
2
|
const isProviderPrivate = async ()=>strapi.plugin('upload').provider.isPrivate();
|
|
3
3
|
var metrics = (({ strapi: strapi1 })=>({
|
|
4
|
+
async trackUsage (event, properties) {
|
|
5
|
+
const settings = await strapi1.plugin('upload').service('upload').getSettings();
|
|
6
|
+
return strapi1.telemetry.send(event, {
|
|
7
|
+
...properties,
|
|
8
|
+
eventProperties: {
|
|
9
|
+
...properties?.eventProperties,
|
|
10
|
+
isAIMediaLibraryConfigured: settings.aiMetadata
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
},
|
|
4
14
|
async sendUploadPluginMetrics () {
|
|
5
15
|
const uploadProvider = getProviderName();
|
|
6
16
|
const privateProvider = await isProviderPrivate();
|
|
7
|
-
|
|
17
|
+
await this.trackUsage('didInitializePluginUpload', {
|
|
8
18
|
groupProperties: {
|
|
9
19
|
uploadProvider,
|
|
10
20
|
privateProvider
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.mjs","sources":["../../../server/src/services/metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nconst getProviderName = () => strapi.config.get('plugin::upload.provider', 'local');\nconst isProviderPrivate = async () => strapi.plugin('upload').provider.isPrivate();\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async sendUploadPluginMetrics() {\n const uploadProvider = getProviderName();\n const privateProvider = await isProviderPrivate();\n\n
|
|
1
|
+
{"version":3,"file":"metrics.mjs","sources":["../../../server/src/services/metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst getProviderName = () => strapi.config.get('plugin::upload.provider', 'local');\nconst isProviderPrivate = async () => strapi.plugin('upload').provider.isPrivate();\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async trackUsage(event: string, properties?: Record<string, any>) {\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n\n return strapi.telemetry.send(event, {\n ...properties,\n eventProperties: {\n ...properties?.eventProperties,\n isAIMediaLibraryConfigured: settings.aiMetadata,\n },\n });\n },\n async sendUploadPluginMetrics() {\n const uploadProvider = getProviderName();\n const privateProvider = await isProviderPrivate();\n\n await this.trackUsage('didInitializePluginUpload', {\n groupProperties: {\n uploadProvider,\n privateProvider,\n },\n });\n },\n});\n"],"names":["getProviderName","strapi","config","get","isProviderPrivate","plugin","provider","isPrivate","trackUsage","event","properties","settings","service","getSettings","telemetry","send","eventProperties","isAIMediaLibraryConfigured","aiMetadata","sendUploadPluginMetrics","uploadProvider","privateProvider","groupProperties"],"mappings":"AAGA,MAAMA,kBAAkB,IAAMC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAA2B,EAAA,OAAA,CAAA;AAC3E,MAAMC,iBAAAA,GAAoB,UAAYH,MAAOI,CAAAA,MAAM,CAAC,QAAUC,CAAAA,CAAAA,QAAQ,CAACC,SAAS,EAAA;AAEhF,cAAe,CAAA,CAAC,EAAEN,QAAAA,OAAM,EAA2B,IAAM;QACvD,MAAMO,UAAAA,CAAAA,CAAWC,KAAa,EAAEC,UAAgC,EAAA;YAC9D,MAAMC,QAAAA,GAAqB,MAAMV,OAAOI,CAAAA,MAAM,CAAC,QAAUO,CAAAA,CAAAA,OAAO,CAAC,QAAA,CAAA,CAAUC,WAAW,EAAA;AAEtF,YAAA,OAAOZ,OAAOa,CAAAA,SAAS,CAACC,IAAI,CAACN,KAAO,EAAA;AAClC,gBAAA,GAAGC,UAAU;gBACbM,eAAiB,EAAA;AACf,oBAAA,GAAGN,YAAYM,eAAe;AAC9BC,oBAAAA,0BAAAA,EAA4BN,SAASO;AACvC;AACF,aAAA,CAAA;AACF,SAAA;QACA,MAAMC,uBAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,cAAiBpB,GAAAA,eAAAA,EAAAA;AACvB,YAAA,MAAMqB,kBAAkB,MAAMjB,iBAAAA,EAAAA;AAE9B,YAAA,MAAM,IAAI,CAACI,UAAU,CAAC,2BAA6B,EAAA;gBACjDc,eAAiB,EAAA;AACfF,oBAAAA,cAAAA;AACAC,oBAAAA;AACF;AACF,aAAA,CAAA;AACF;AACF,KAAA,CAAC;;;;"}
|
|
@@ -16,12 +16,12 @@ const { ApplicationError, NotFoundError } = utils.errors;
|
|
|
16
16
|
const { bytesToKbytes } = utils.file;
|
|
17
17
|
var upload = (({ strapi })=>{
|
|
18
18
|
const fileService = index.getService('file');
|
|
19
|
-
const sendMediaMetrics = (data)=>{
|
|
19
|
+
const sendMediaMetrics = async (data)=>{
|
|
20
20
|
if (_.has(data, 'caption') && !_.isEmpty(data.caption)) {
|
|
21
|
-
|
|
21
|
+
await index.getService('metrics').trackUsage('didSaveMediaWithCaption');
|
|
22
22
|
}
|
|
23
23
|
if (_.has(data, 'alternativeText') && !_.isEmpty(data.alternativeText)) {
|
|
24
|
-
|
|
24
|
+
await index.getService('metrics').trackUsage('didSaveMediaWithAlternativeText');
|
|
25
25
|
}
|
|
26
26
|
};
|
|
27
27
|
const createAndAssignTmpWorkingDirectoryToFiles = async (files)=>{
|
|
@@ -306,7 +306,7 @@ var upload = (({ strapi })=>{
|
|
|
306
306
|
[UPDATED_BY_ATTRIBUTE]: user.id
|
|
307
307
|
});
|
|
308
308
|
}
|
|
309
|
-
sendMediaMetrics(fileValues);
|
|
309
|
+
await sendMediaMetrics(fileValues);
|
|
310
310
|
const res = await strapi.db.query(constants.FILE_MODEL_UID).update({
|
|
311
311
|
where: {
|
|
312
312
|
id
|
|
@@ -327,7 +327,7 @@ var upload = (({ strapi })=>{
|
|
|
327
327
|
[CREATED_BY_ATTRIBUTE]: user.id
|
|
328
328
|
});
|
|
329
329
|
}
|
|
330
|
-
sendMediaMetrics(fileValues);
|
|
330
|
+
await sendMediaMetrics(fileValues);
|
|
331
331
|
const res = await strapi.db.query(constants.FILE_MODEL_UID).create({
|
|
332
332
|
data: fileValues
|
|
333
333
|
});
|
|
@@ -394,11 +394,11 @@ var upload = (({ strapi })=>{
|
|
|
394
394
|
}).get({});
|
|
395
395
|
return res;
|
|
396
396
|
}
|
|
397
|
-
function setSettings(value) {
|
|
397
|
+
async function setSettings(value) {
|
|
398
398
|
if (value.responsiveDimensions === true) {
|
|
399
|
-
|
|
399
|
+
await index.getService('metrics').trackUsage('didEnableResponsiveDimensions');
|
|
400
400
|
} else {
|
|
401
|
-
|
|
401
|
+
await index.getService('metrics').trackUsage('didDisableResponsiveDimensions');
|
|
402
402
|
}
|
|
403
403
|
return strapi.store({
|
|
404
404
|
type: 'plugin',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sources":["../../../server/src/services/upload.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport _ from 'lodash';\nimport { extension } from 'mime-types';\nimport {\n async,\n sanitize,\n contentTypes as contentTypesUtils,\n errors,\n file as fileUtils,\n} from '@strapi/utils';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { FILE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from '../constants';\nimport { getService } from '../utils';\n\nimport type { Config, File, InputFile, UploadableFile, FileInfo } from '../types';\nimport type { ViewConfiguration } from '../controllers/validation/admin/configureView';\nimport type { Settings } from '../controllers/validation/admin/settings';\n\ntype User = {\n id: string | number;\n};\n\ntype ID = string | number;\n\ntype CommonOptions = {\n user?: User;\n};\n\ntype Metas = {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n};\n\nconst { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constants;\nconst { MEDIA_CREATE, MEDIA_UPDATE, MEDIA_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n\nconst { ApplicationError, NotFoundError } = errors;\nconst { bytesToKbytes } = fileUtils;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const fileService = getService('file');\n\n const sendMediaMetrics = (data: Pick<File, 'caption' | 'alternativeText'>) => {\n if (_.has(data, 'caption') && !_.isEmpty(data.caption)) {\n strapi.telemetry.send('didSaveMediaWithCaption');\n }\n\n if (_.has(data, 'alternativeText') && !_.isEmpty(data.alternativeText)) {\n strapi.telemetry.send('didSaveMediaWithAlternativeText');\n }\n };\n\n const createAndAssignTmpWorkingDirectoryToFiles = async (\n files: InputFile | InputFile[]\n ): Promise<string> => {\n const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-upload-'));\n\n if (Array.isArray(files)) {\n files.forEach((file) => {\n file.tmpWorkingDirectory = tmpWorkingDirectory;\n });\n } else {\n files.tmpWorkingDirectory = tmpWorkingDirectory;\n }\n\n return tmpWorkingDirectory;\n };\n\n function filenameReservedRegex() {\n // eslint-disable-next-line no-control-regex\n return /[<>:\"/\\\\|?*\\u0000-\\u001F]/g;\n }\n\n function windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i;\n }\n\n /**\n * Copied from https://github.com/sindresorhus/valid-filename package\n */\n function isValidFilename(string: string) {\n if (!string || string.length > 255) {\n return false;\n }\n if (filenameReservedRegex().test(string) || windowsReservedNameRegex().test(string)) {\n return false;\n }\n if (string === '.' || string === '..') {\n return false;\n }\n return true;\n }\n\n async function emitEvent(event: string, data: Record<string, any>) {\n const modelDef = strapi.getModel(FILE_MODEL_UID);\n const sanitizedData = await sanitize.sanitizers.defaultSanitizeOutput(\n {\n schema: modelDef,\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n },\n data\n );\n\n strapi.eventHub.emit(event, { media: sanitizedData });\n }\n\n async function formatFileInfo(\n { filename, type, size }: { filename: string; type: string; size: number },\n fileInfo: Partial<FileInfo> = {},\n metas: {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n } = {}\n ): Promise<Omit<UploadableFile, 'getStream'>> {\n const fileService = getService('file');\n const imageManipulationService = getService('image-manipulation');\n\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n let ext = path.extname(filename);\n if (!ext) {\n ext = `.${extension(type)}`;\n }\n const usedName = (fileInfo.name || filename).normalize();\n const basename = path.basename(usedName, ext);\n\n // Prevent null characters in file name\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n const entity: Omit<UploadableFile, 'getStream'> = {\n name: usedName,\n alternativeText: fileInfo.alternativeText,\n caption: fileInfo.caption,\n folder: fileInfo.folder,\n folderPath: await fileService.getFolderPath(fileInfo.folder),\n hash: imageManipulationService.generateFileName(basename),\n ext,\n mime: type,\n size: bytesToKbytes(size),\n sizeInBytes: size,\n };\n\n const { refId, ref, field } = metas;\n\n if (refId && ref && field) {\n entity.related = [\n {\n id: refId,\n __type: ref,\n __pivot: { field },\n },\n ];\n }\n\n if (metas.path) {\n entity.path = metas.path;\n }\n\n if (metas.tmpWorkingDirectory) {\n entity.tmpWorkingDirectory = metas.tmpWorkingDirectory;\n }\n\n return entity;\n }\n\n async function enhanceAndValidateFile(\n file: InputFile,\n fileInfo: FileInfo,\n metas?: Metas\n ): Promise<UploadableFile> {\n const currentFile = (await formatFileInfo(\n {\n filename: file.originalFilename ?? 'unamed',\n type: file.mimetype ?? 'application/octet-stream',\n size: file.size,\n },\n fileInfo,\n {\n ...metas,\n tmpWorkingDirectory: file.tmpWorkingDirectory,\n }\n )) as UploadableFile;\n\n currentFile.filepath = file.filepath;\n currentFile.getStream = () => fs.createReadStream(file.filepath);\n\n const { optimize, isImage, isFaultyImage, isOptimizableImage } = strapi\n .plugin('upload')\n .service('image-manipulation');\n\n if (await isImage(currentFile)) {\n if (await isFaultyImage(currentFile)) {\n throw new ApplicationError('File is not a valid image');\n }\n if (await isOptimizableImage(currentFile)) {\n return optimize(currentFile);\n }\n }\n\n return currentFile;\n }\n\n async function upload(\n {\n data,\n files,\n }: {\n data: Record<string, unknown>;\n files: InputFile[];\n },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(files);\n\n let uploadedFiles: any[] = [];\n\n try {\n const { fileInfo, ...metas } = data;\n\n const fileArray = Array.isArray(files) ? files : [files];\n const fileInfoArray = Array.isArray(fileInfo) ? fileInfo : [fileInfo];\n\n const doUpload = async (file: InputFile, fileInfo: FileInfo) => {\n const fileData = await enhanceAndValidateFile(file, fileInfo, metas);\n return uploadFileAndPersist(fileData, { user });\n };\n\n uploadedFiles = await Promise.all(\n fileArray.map((file, idx) => doUpload(file, fileInfoArray[idx] || {}))\n );\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return uploadedFiles;\n }\n\n /**\n * When uploading an image, an additional thumbnail is generated.\n * Also, if there are responsive formats defined, another set of images will be generated too.\n *\n * @param {*} fileData\n */\n async function uploadImage(fileData: UploadableFile) {\n const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } =\n getService('image-manipulation');\n\n // Store width and height of the original image\n const { width, height } = await getDimensions(fileData);\n\n // Make sure this is assigned before calling any upload\n // That way it can mutate the width and height\n _.assign(fileData, {\n width,\n height,\n });\n\n // For performance reasons, all uploads are wrapped in a single Promise.all\n const uploadThumbnail = async (thumbnailFile: UploadableFile) => {\n await getService('provider').upload(thumbnailFile);\n _.set(fileData, 'formats.thumbnail', thumbnailFile);\n };\n\n // Generate thumbnail and responsive formats\n const uploadResponsiveFormat = async (format: { key: string; file: UploadableFile }) => {\n const { key, file } = format;\n await getService('provider').upload(file);\n _.set(fileData, ['formats', key], file);\n };\n\n const uploadPromises: Promise<void>[] = [];\n\n // Upload image\n uploadPromises.push(getService('provider').upload(fileData));\n\n // Generate & Upload thumbnail and responsive formats\n if (await isResizableImage(fileData)) {\n const thumbnailFile = await generateThumbnail(fileData);\n if (thumbnailFile) {\n uploadPromises.push(uploadThumbnail(thumbnailFile));\n }\n\n const formats = await generateResponsiveFormats(fileData);\n if (Array.isArray(formats) && formats.length > 0) {\n for (const format of formats) {\n // eslint-disable-next-line no-continue\n if (!format) continue;\n uploadPromises.push(uploadResponsiveFormat(format));\n }\n }\n }\n // Wait for all uploads to finish\n await Promise.all(uploadPromises);\n }\n\n /**\n * Upload a file. If it is an image it will generate a thumbnail\n * and responsive formats (if enabled).\n */\n async function uploadFileAndPersist(fileData: UploadableFile, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n const { isImage } = getService('image-manipulation');\n\n await getService('provider').checkFileSize(fileData);\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n\n // Persist file(s)\n return add(fileData, { user });\n }\n\n async function updateFileInfo(\n id: ID,\n { name, alternativeText, caption, folder }: FileInfo,\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const dbFile = await findOne(id);\n\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n const fileService = getService('file');\n\n const newName = _.isNil(name) ? dbFile.name : name;\n const newInfos = {\n name: newName,\n alternativeText: _.isNil(alternativeText) ? dbFile.alternativeText : alternativeText,\n caption: _.isNil(caption) ? dbFile.caption : caption,\n folder: _.isUndefined(folder) ? dbFile.folder : folder,\n folderPath: _.isUndefined(folder) ? dbFile.path : await fileService.getFolderPath(folder),\n };\n\n return update(id, newInfos, { user });\n }\n\n async function replace(\n id: ID,\n { data, file }: { data: { fileInfo: FileInfo }; file: InputFile },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n\n const { isImage } = getService('image-manipulation');\n\n const dbFile = await findOne(id);\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(file);\n\n let fileData: UploadableFile;\n\n try {\n const { fileInfo } = data;\n fileData = await enhanceAndValidateFile(file, fileInfo);\n\n // keep a constant hash and extension so the file url doesn't change when the file is replaced\n _.assign(fileData, {\n hash: dbFile.hash,\n ext: dbFile.ext,\n });\n\n // execute delete function of the provider\n if (dbFile.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(dbFile);\n\n if (dbFile.formats) {\n await Promise.all(\n Object.keys(dbFile.formats).map((key) => {\n return strapi.plugin('upload').provider.delete(dbFile.formats[key]);\n })\n );\n }\n }\n\n // clear old formats\n _.set(fileData, 'formats', {});\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return update(id, fileData, { user });\n }\n\n async function update(id: ID, values: Partial<File>, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).update({ where: { id }, data: fileValues });\n\n await emitEvent(MEDIA_UPDATE, res);\n\n return res;\n }\n\n async function add(values: any, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n [CREATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).create({ data: fileValues });\n\n await emitEvent(MEDIA_CREATE, res);\n\n return res;\n }\n\n async function findOne(id: ID, populate = {}) {\n const query = strapi.get('query-params').transform(FILE_MODEL_UID, {\n populate,\n });\n\n const file = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id },\n ...query,\n });\n\n if (!file) return file;\n\n // Sign file URLs if using private provider\n return fileService.signFileUrls(file);\n }\n\n async function findMany(query: any = {}): Promise<File[]> {\n const files = await strapi.db\n .query(FILE_MODEL_UID)\n .findMany(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n return async.map(files, (file: File) => fileService.signFileUrls(file));\n }\n\n async function findPage(query: any = {}) {\n const result = await strapi.db\n .query(FILE_MODEL_UID)\n .findPage(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n const signedResults = await async.map(result.results, (file: File) =>\n fileService.signFileUrls(file)\n );\n\n return {\n ...result,\n results: signedResults,\n };\n }\n\n async function remove(file: File) {\n const config = strapi.config.get<Config>('plugin::upload');\n\n // execute delete function of the provider\n if (file.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(file);\n\n if (file.formats) {\n const keys = Object.keys(file.formats);\n\n await Promise.all(\n keys.map((key) => {\n return strapi.plugin('upload').provider.delete(file.formats![key]);\n })\n );\n }\n }\n\n const media = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id: file.id },\n });\n\n await emitEvent(MEDIA_DELETE, media);\n\n return strapi.db.query(FILE_MODEL_UID).delete({ where: { id: file.id } });\n }\n\n async function getSettings() {\n const res = await strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).get({});\n\n return res as Settings | null;\n }\n\n function setSettings(value: Settings) {\n if (value.responsiveDimensions === true) {\n strapi.telemetry.send('didEnableResponsiveDimensions');\n } else {\n strapi.telemetry.send('didDisableResponsiveDimensions');\n }\n\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).set({ value });\n }\n\n async function getConfiguration() {\n const res = await strapi.store!({\n type: 'plugin',\n name: 'upload',\n key: 'view_configuration',\n }).get({});\n\n return res as ViewConfiguration | null;\n }\n\n function setConfiguration(value: ViewConfiguration) {\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'view_configuration' }).set({\n value,\n });\n }\n\n return {\n formatFileInfo,\n upload,\n updateFileInfo,\n replace,\n findOne,\n findMany,\n findPage,\n remove,\n getSettings,\n setSettings,\n getConfiguration,\n setConfiguration,\n\n /**\n * exposed for testing only\n * @internal\n */\n _uploadImage: uploadImage,\n };\n};\n"],"names":["UPDATED_BY_ATTRIBUTE","CREATED_BY_ATTRIBUTE","contentTypesUtils","constants","MEDIA_CREATE","MEDIA_UPDATE","MEDIA_DELETE","ALLOWED_WEBHOOK_EVENTS","ApplicationError","NotFoundError","errors","bytesToKbytes","fileUtils","strapi","fileService","getService","sendMediaMetrics","data","_","has","isEmpty","caption","telemetry","send","alternativeText","createAndAssignTmpWorkingDirectoryToFiles","files","tmpWorkingDirectory","fse","mkdtemp","path","join","os","tmpdir","Array","isArray","forEach","file","filenameReservedRegex","windowsReservedNameRegex","isValidFilename","string","length","test","emitEvent","event","modelDef","getModel","FILE_MODEL_UID","sanitizedData","sanitize","sanitizers","defaultSanitizeOutput","schema","uid","eventHub","emit","media","formatFileInfo","filename","type","size","fileInfo","metas","imageManipulationService","ext","extname","extension","usedName","name","normalize","basename","entity","folder","folderPath","getFolderPath","hash","generateFileName","mime","sizeInBytes","refId","ref","field","related","id","__type","__pivot","enhanceAndValidateFile","currentFile","originalFilename","mimetype","filepath","getStream","fs","createReadStream","optimize","isImage","isFaultyImage","isOptimizableImage","plugin","service","upload","opts","user","uploadedFiles","fileArray","fileInfoArray","doUpload","fileData","uploadFileAndPersist","Promise","all","map","idx","remove","uploadImage","getDimensions","generateThumbnail","generateResponsiveFormats","isResizableImage","width","height","assign","uploadThumbnail","thumbnailFile","set","uploadResponsiveFormat","format","key","uploadPromises","push","formats","config","get","checkFileSize","provider","add","updateFileInfo","dbFile","findOne","newName","isNil","newInfos","isUndefined","update","replace","delete","Object","keys","values","fileValues","res","db","query","where","create","populate","transform","signFileUrls","findMany","async","findPage","result","signedResults","results","getSettings","store","setSettings","value","responsiveDimensions","getConfiguration","setConfiguration","_uploadImage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"upload.js","sources":["../../../server/src/services/upload.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport _ from 'lodash';\nimport { extension } from 'mime-types';\nimport {\n async,\n sanitize,\n contentTypes as contentTypesUtils,\n errors,\n file as fileUtils,\n} from '@strapi/utils';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { FILE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from '../constants';\nimport { getService } from '../utils';\n\nimport type { Config, File, InputFile, UploadableFile, FileInfo } from '../types';\nimport type { ViewConfiguration } from '../controllers/validation/admin/configureView';\nimport type { Settings } from '../controllers/validation/admin/settings';\n\ntype User = {\n id: string | number;\n};\n\ntype ID = string | number;\n\ntype CommonOptions = {\n user?: User;\n};\n\ntype Metas = {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n};\n\nconst { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constants;\nconst { MEDIA_CREATE, MEDIA_UPDATE, MEDIA_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n\nconst { ApplicationError, NotFoundError } = errors;\nconst { bytesToKbytes } = fileUtils;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const fileService = getService('file');\n\n const sendMediaMetrics = async (data: Pick<File, 'caption' | 'alternativeText'>) => {\n if (_.has(data, 'caption') && !_.isEmpty(data.caption)) {\n await getService('metrics').trackUsage('didSaveMediaWithCaption');\n }\n\n if (_.has(data, 'alternativeText') && !_.isEmpty(data.alternativeText)) {\n await getService('metrics').trackUsage('didSaveMediaWithAlternativeText');\n }\n };\n\n const createAndAssignTmpWorkingDirectoryToFiles = async (\n files: InputFile | InputFile[]\n ): Promise<string> => {\n const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-upload-'));\n\n if (Array.isArray(files)) {\n files.forEach((file) => {\n file.tmpWorkingDirectory = tmpWorkingDirectory;\n });\n } else {\n files.tmpWorkingDirectory = tmpWorkingDirectory;\n }\n\n return tmpWorkingDirectory;\n };\n\n function filenameReservedRegex() {\n // eslint-disable-next-line no-control-regex\n return /[<>:\"/\\\\|?*\\u0000-\\u001F]/g;\n }\n\n function windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i;\n }\n\n /**\n * Copied from https://github.com/sindresorhus/valid-filename package\n */\n function isValidFilename(string: string) {\n if (!string || string.length > 255) {\n return false;\n }\n if (filenameReservedRegex().test(string) || windowsReservedNameRegex().test(string)) {\n return false;\n }\n if (string === '.' || string === '..') {\n return false;\n }\n return true;\n }\n\n async function emitEvent(event: string, data: Record<string, any>) {\n const modelDef = strapi.getModel(FILE_MODEL_UID);\n const sanitizedData = await sanitize.sanitizers.defaultSanitizeOutput(\n {\n schema: modelDef,\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n },\n data\n );\n\n strapi.eventHub.emit(event, { media: sanitizedData });\n }\n\n async function formatFileInfo(\n { filename, type, size }: { filename: string; type: string; size: number },\n fileInfo: Partial<FileInfo> = {},\n metas: {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n } = {}\n ): Promise<Omit<UploadableFile, 'getStream'>> {\n const fileService = getService('file');\n const imageManipulationService = getService('image-manipulation');\n\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n let ext = path.extname(filename);\n if (!ext) {\n ext = `.${extension(type)}`;\n }\n const usedName = (fileInfo.name || filename).normalize();\n const basename = path.basename(usedName, ext);\n\n // Prevent null characters in file name\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n const entity: Omit<UploadableFile, 'getStream'> = {\n name: usedName,\n alternativeText: fileInfo.alternativeText,\n caption: fileInfo.caption,\n folder: fileInfo.folder,\n folderPath: await fileService.getFolderPath(fileInfo.folder),\n hash: imageManipulationService.generateFileName(basename),\n ext,\n mime: type,\n size: bytesToKbytes(size),\n sizeInBytes: size,\n };\n\n const { refId, ref, field } = metas;\n\n if (refId && ref && field) {\n entity.related = [\n {\n id: refId,\n __type: ref,\n __pivot: { field },\n },\n ];\n }\n\n if (metas.path) {\n entity.path = metas.path;\n }\n\n if (metas.tmpWorkingDirectory) {\n entity.tmpWorkingDirectory = metas.tmpWorkingDirectory;\n }\n\n return entity;\n }\n\n async function enhanceAndValidateFile(\n file: InputFile,\n fileInfo: FileInfo,\n metas?: Metas\n ): Promise<UploadableFile> {\n const currentFile = (await formatFileInfo(\n {\n filename: file.originalFilename ?? 'unamed',\n type: file.mimetype ?? 'application/octet-stream',\n size: file.size,\n },\n fileInfo,\n {\n ...metas,\n tmpWorkingDirectory: file.tmpWorkingDirectory,\n }\n )) as UploadableFile;\n\n currentFile.filepath = file.filepath;\n currentFile.getStream = () => fs.createReadStream(file.filepath);\n\n const { optimize, isImage, isFaultyImage, isOptimizableImage } = strapi\n .plugin('upload')\n .service('image-manipulation');\n\n if (await isImage(currentFile)) {\n if (await isFaultyImage(currentFile)) {\n throw new ApplicationError('File is not a valid image');\n }\n if (await isOptimizableImage(currentFile)) {\n return optimize(currentFile);\n }\n }\n\n return currentFile;\n }\n\n async function upload(\n {\n data,\n files,\n }: {\n data: Record<string, unknown>;\n files: InputFile[];\n },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(files);\n\n let uploadedFiles: any[] = [];\n\n try {\n const { fileInfo, ...metas } = data;\n\n const fileArray = Array.isArray(files) ? files : [files];\n const fileInfoArray = Array.isArray(fileInfo) ? fileInfo : [fileInfo];\n\n const doUpload = async (file: InputFile, fileInfo: FileInfo) => {\n const fileData = await enhanceAndValidateFile(file, fileInfo, metas);\n return uploadFileAndPersist(fileData, { user });\n };\n\n uploadedFiles = await Promise.all(\n fileArray.map((file, idx) => doUpload(file, fileInfoArray[idx] || {}))\n );\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return uploadedFiles;\n }\n\n /**\n * When uploading an image, an additional thumbnail is generated.\n * Also, if there are responsive formats defined, another set of images will be generated too.\n *\n * @param {*} fileData\n */\n async function uploadImage(fileData: UploadableFile) {\n const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } =\n getService('image-manipulation');\n\n // Store width and height of the original image\n const { width, height } = await getDimensions(fileData);\n\n // Make sure this is assigned before calling any upload\n // That way it can mutate the width and height\n _.assign(fileData, {\n width,\n height,\n });\n\n // For performance reasons, all uploads are wrapped in a single Promise.all\n const uploadThumbnail = async (thumbnailFile: UploadableFile) => {\n await getService('provider').upload(thumbnailFile);\n _.set(fileData, 'formats.thumbnail', thumbnailFile);\n };\n\n // Generate thumbnail and responsive formats\n const uploadResponsiveFormat = async (format: { key: string; file: UploadableFile }) => {\n const { key, file } = format;\n await getService('provider').upload(file);\n _.set(fileData, ['formats', key], file);\n };\n\n const uploadPromises: Promise<void>[] = [];\n\n // Upload image\n uploadPromises.push(getService('provider').upload(fileData));\n\n // Generate & Upload thumbnail and responsive formats\n if (await isResizableImage(fileData)) {\n const thumbnailFile = await generateThumbnail(fileData);\n if (thumbnailFile) {\n uploadPromises.push(uploadThumbnail(thumbnailFile));\n }\n\n const formats = await generateResponsiveFormats(fileData);\n if (Array.isArray(formats) && formats.length > 0) {\n for (const format of formats) {\n // eslint-disable-next-line no-continue\n if (!format) continue;\n uploadPromises.push(uploadResponsiveFormat(format));\n }\n }\n }\n // Wait for all uploads to finish\n await Promise.all(uploadPromises);\n }\n\n /**\n * Upload a file. If it is an image it will generate a thumbnail\n * and responsive formats (if enabled).\n */\n async function uploadFileAndPersist(fileData: UploadableFile, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n const { isImage } = getService('image-manipulation');\n\n await getService('provider').checkFileSize(fileData);\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n\n // Persist file(s)\n return add(fileData, { user });\n }\n\n async function updateFileInfo(\n id: ID,\n { name, alternativeText, caption, folder }: FileInfo,\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const dbFile = await findOne(id);\n\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n const fileService = getService('file');\n\n const newName = _.isNil(name) ? dbFile.name : name;\n const newInfos = {\n name: newName,\n alternativeText: _.isNil(alternativeText) ? dbFile.alternativeText : alternativeText,\n caption: _.isNil(caption) ? dbFile.caption : caption,\n folder: _.isUndefined(folder) ? dbFile.folder : folder,\n folderPath: _.isUndefined(folder) ? dbFile.path : await fileService.getFolderPath(folder),\n };\n\n return update(id, newInfos, { user });\n }\n\n async function replace(\n id: ID,\n { data, file }: { data: { fileInfo: FileInfo }; file: InputFile },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n\n const { isImage } = getService('image-manipulation');\n\n const dbFile = await findOne(id);\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(file);\n\n let fileData: UploadableFile;\n\n try {\n const { fileInfo } = data;\n fileData = await enhanceAndValidateFile(file, fileInfo);\n\n // keep a constant hash and extension so the file url doesn't change when the file is replaced\n _.assign(fileData, {\n hash: dbFile.hash,\n ext: dbFile.ext,\n });\n\n // execute delete function of the provider\n if (dbFile.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(dbFile);\n\n if (dbFile.formats) {\n await Promise.all(\n Object.keys(dbFile.formats).map((key) => {\n return strapi.plugin('upload').provider.delete(dbFile.formats[key]);\n })\n );\n }\n }\n\n // clear old formats\n _.set(fileData, 'formats', {});\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return update(id, fileData, { user });\n }\n\n async function update(id: ID, values: Partial<File>, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).update({ where: { id }, data: fileValues });\n\n await emitEvent(MEDIA_UPDATE, res);\n\n return res;\n }\n\n async function add(values: any, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n [CREATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).create({ data: fileValues });\n\n await emitEvent(MEDIA_CREATE, res);\n\n return res;\n }\n\n async function findOne(id: ID, populate = {}) {\n const query = strapi.get('query-params').transform(FILE_MODEL_UID, {\n populate,\n });\n\n const file = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id },\n ...query,\n });\n\n if (!file) return file;\n\n // Sign file URLs if using private provider\n return fileService.signFileUrls(file);\n }\n\n async function findMany(query: any = {}): Promise<File[]> {\n const files = await strapi.db\n .query(FILE_MODEL_UID)\n .findMany(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n return async.map(files, (file: File) => fileService.signFileUrls(file));\n }\n\n async function findPage(query: any = {}) {\n const result = await strapi.db\n .query(FILE_MODEL_UID)\n .findPage(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n const signedResults = await async.map(result.results, (file: File) =>\n fileService.signFileUrls(file)\n );\n\n return {\n ...result,\n results: signedResults,\n };\n }\n\n async function remove(file: File) {\n const config = strapi.config.get<Config>('plugin::upload');\n\n // execute delete function of the provider\n if (file.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(file);\n\n if (file.formats) {\n const keys = Object.keys(file.formats);\n\n await Promise.all(\n keys.map((key) => {\n return strapi.plugin('upload').provider.delete(file.formats![key]);\n })\n );\n }\n }\n\n const media = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id: file.id },\n });\n\n await emitEvent(MEDIA_DELETE, media);\n\n return strapi.db.query(FILE_MODEL_UID).delete({ where: { id: file.id } });\n }\n\n async function getSettings() {\n const res = await strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).get({});\n\n return res as Settings | null;\n }\n\n async function setSettings(value: Settings) {\n if (value.responsiveDimensions === true) {\n await getService('metrics').trackUsage('didEnableResponsiveDimensions');\n } else {\n await getService('metrics').trackUsage('didDisableResponsiveDimensions');\n }\n\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).set({ value });\n }\n\n async function getConfiguration() {\n const res = await strapi.store!({\n type: 'plugin',\n name: 'upload',\n key: 'view_configuration',\n }).get({});\n\n return res as ViewConfiguration | null;\n }\n\n function setConfiguration(value: ViewConfiguration) {\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'view_configuration' }).set({\n value,\n });\n }\n\n return {\n formatFileInfo,\n upload,\n updateFileInfo,\n replace,\n findOne,\n findMany,\n findPage,\n remove,\n getSettings,\n setSettings,\n getConfiguration,\n setConfiguration,\n\n /**\n * exposed for testing only\n * @internal\n */\n _uploadImage: uploadImage,\n };\n};\n"],"names":["UPDATED_BY_ATTRIBUTE","CREATED_BY_ATTRIBUTE","contentTypesUtils","constants","MEDIA_CREATE","MEDIA_UPDATE","MEDIA_DELETE","ALLOWED_WEBHOOK_EVENTS","ApplicationError","NotFoundError","errors","bytesToKbytes","fileUtils","strapi","fileService","getService","sendMediaMetrics","data","_","has","isEmpty","caption","trackUsage","alternativeText","createAndAssignTmpWorkingDirectoryToFiles","files","tmpWorkingDirectory","fse","mkdtemp","path","join","os","tmpdir","Array","isArray","forEach","file","filenameReservedRegex","windowsReservedNameRegex","isValidFilename","string","length","test","emitEvent","event","modelDef","getModel","FILE_MODEL_UID","sanitizedData","sanitize","sanitizers","defaultSanitizeOutput","schema","uid","eventHub","emit","media","formatFileInfo","filename","type","size","fileInfo","metas","imageManipulationService","ext","extname","extension","usedName","name","normalize","basename","entity","folder","folderPath","getFolderPath","hash","generateFileName","mime","sizeInBytes","refId","ref","field","related","id","__type","__pivot","enhanceAndValidateFile","currentFile","originalFilename","mimetype","filepath","getStream","fs","createReadStream","optimize","isImage","isFaultyImage","isOptimizableImage","plugin","service","upload","opts","user","uploadedFiles","fileArray","fileInfoArray","doUpload","fileData","uploadFileAndPersist","Promise","all","map","idx","remove","uploadImage","getDimensions","generateThumbnail","generateResponsiveFormats","isResizableImage","width","height","assign","uploadThumbnail","thumbnailFile","set","uploadResponsiveFormat","format","key","uploadPromises","push","formats","config","get","checkFileSize","provider","add","updateFileInfo","dbFile","findOne","newName","isNil","newInfos","isUndefined","update","replace","delete","Object","keys","values","fileValues","res","db","query","where","create","populate","transform","signFileUrls","findMany","async","findPage","result","signedResults","results","getSettings","store","setSettings","value","responsiveDimensions","getConfiguration","setConfiguration","_uploadImage"],"mappings":";;;;;;;;;;;;AAyCA,MAAM,EAAEA,oBAAoB,EAAEC,oBAAoB,EAAE,GAAGC,mBAAkBC,SAAS;AAClF,MAAM,EAAEC,YAAY,EAAEC,YAAY,EAAEC,YAAY,EAAE,GAAGC,gCAAAA;AAErD,MAAM,EAAEC,gBAAgB,EAAEC,aAAa,EAAE,GAAGC,YAAAA;AAC5C,MAAM,EAAEC,aAAa,EAAE,GAAGC,UAAAA;AAE1B,aAAe,CAAA,CAAC,EAAEC,MAAM,EAA2B,GAAA;AACjD,IAAA,MAAMC,cAAcC,gBAAW,CAAA,MAAA,CAAA;AAE/B,IAAA,MAAMC,mBAAmB,OAAOC,IAAAA,GAAAA;QAC9B,IAAIC,CAAAA,CAAEC,GAAG,CAACF,IAAM,EAAA,SAAA,CAAA,IAAc,CAACC,CAAAA,CAAEE,OAAO,CAACH,IAAKI,CAAAA,OAAO,CAAG,EAAA;YACtD,MAAMN,gBAAAA,CAAW,SAAWO,CAAAA,CAAAA,UAAU,CAAC,yBAAA,CAAA;AACzC;QAEA,IAAIJ,CAAAA,CAAEC,GAAG,CAACF,IAAM,EAAA,iBAAA,CAAA,IAAsB,CAACC,CAAAA,CAAEE,OAAO,CAACH,IAAKM,CAAAA,eAAe,CAAG,EAAA;YACtE,MAAMR,gBAAAA,CAAW,SAAWO,CAAAA,CAAAA,UAAU,CAAC,iCAAA,CAAA;AACzC;AACF,KAAA;AAEA,IAAA,MAAME,4CAA4C,OAChDC,KAAAA,GAAAA;QAEA,MAAMC,mBAAAA,GAAsB,MAAMC,GAAAA,CAAIC,OAAO,CAACC,KAAKC,IAAI,CAACC,EAAGC,CAAAA,MAAM,EAAI,EAAA,gBAAA,CAAA,CAAA;QAErE,IAAIC,KAAAA,CAAMC,OAAO,CAACT,KAAQ,CAAA,EAAA;YACxBA,KAAMU,CAAAA,OAAO,CAAC,CAACC,IAAAA,GAAAA;AACbA,gBAAAA,IAAAA,CAAKV,mBAAmB,GAAGA,mBAAAA;AAC7B,aAAA,CAAA;SACK,MAAA;AACLD,YAAAA,KAAAA,CAAMC,mBAAmB,GAAGA,mBAAAA;AAC9B;QAEA,OAAOA,mBAAAA;AACT,KAAA;IAEA,SAASW,qBAAAA,GAAAA;;QAEP,OAAO,4BAAA;AACT;IAEA,SAASC,wBAAAA,GAAAA;QACP,OAAO,kCAAA;AACT;AAEA;;MAGA,SAASC,gBAAgBC,MAAc,EAAA;AACrC,QAAA,IAAI,CAACA,MAAAA,IAAUA,MAAOC,CAAAA,MAAM,GAAG,GAAK,EAAA;YAClC,OAAO,KAAA;AACT;AACA,QAAA,IAAIJ,wBAAwBK,IAAI,CAACF,WAAWF,wBAA2BI,EAAAA,CAAAA,IAAI,CAACF,MAAS,CAAA,EAAA;YACnF,OAAO,KAAA;AACT;QACA,IAAIA,MAAAA,KAAW,GAAOA,IAAAA,MAAAA,KAAW,IAAM,EAAA;YACrC,OAAO,KAAA;AACT;QACA,OAAO,IAAA;AACT;IAEA,eAAeG,SAAAA,CAAUC,KAAa,EAAE3B,IAAyB,EAAA;QAC/D,MAAM4B,QAAAA,GAAWhC,MAAOiC,CAAAA,QAAQ,CAACC,wBAAAA,CAAAA;AACjC,QAAA,MAAMC,gBAAgB,MAAMC,cAAAA,CAASC,UAAU,CAACC,qBAAqB,CACnE;YACEC,MAAQP,EAAAA,QAAAA;AACRC,YAAAA,QAAAA,CAAAA,CAASO,GAAW,EAAA;gBAClB,OAAOxC,MAAAA,CAAOiC,QAAQ,CAACO,GAAAA,CAAAA;AACzB;SAEFpC,EAAAA,IAAAA,CAAAA;AAGFJ,QAAAA,MAAAA,CAAOyC,QAAQ,CAACC,IAAI,CAACX,KAAO,EAAA;YAAEY,KAAOR,EAAAA;AAAc,SAAA,CAAA;AACrD;AAEA,IAAA,eAAeS,cACb,CAAA,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,IAAI,EAAoD,EAC1EC,WAA8B,EAAE,EAChCC,KAAAA,GAMI,EAAE,EAAA;AAEN,QAAA,MAAMhD,cAAcC,gBAAW,CAAA,MAAA,CAAA;AAC/B,QAAA,MAAMgD,2BAA2BhD,gBAAW,CAAA,oBAAA,CAAA;QAE5C,IAAI,CAACwB,gBAAgBmB,QAAW,CAAA,EAAA;AAC9B,YAAA,MAAM,IAAIlD,gBAAiB,CAAA,uCAAA,CAAA;AAC7B;QAEA,IAAIwD,GAAAA,GAAMnC,IAAKoC,CAAAA,OAAO,CAACP,QAAAA,CAAAA;AACvB,QAAA,IAAI,CAACM,GAAK,EAAA;AACRA,YAAAA,GAAAA,GAAM,CAAC,CAAC,EAAEE,mBAAAA,CAAUP,MAAM,CAAC;AAC7B;QACA,MAAMQ,QAAAA,GAAW,CAACN,QAAAA,CAASO,IAAI,IAAIV,QAAO,EAAGW,SAAS,EAAA;AACtD,QAAA,MAAMC,QAAWzC,GAAAA,IAAAA,CAAKyC,QAAQ,CAACH,QAAUH,EAAAA,GAAAA,CAAAA;;QAGzC,IAAI,CAACzB,gBAAgBmB,QAAW,CAAA,EAAA;AAC9B,YAAA,MAAM,IAAIlD,gBAAiB,CAAA,uCAAA,CAAA;AAC7B;AAEA,QAAA,MAAM+D,MAA4C,GAAA;YAChDH,IAAMD,EAAAA,QAAAA;AACN5C,YAAAA,eAAAA,EAAiBsC,SAAStC,eAAe;AACzCF,YAAAA,OAAAA,EAASwC,SAASxC,OAAO;AACzBmD,YAAAA,MAAAA,EAAQX,SAASW,MAAM;AACvBC,YAAAA,UAAAA,EAAY,MAAM3D,WAAAA,CAAY4D,aAAa,CAACb,SAASW,MAAM,CAAA;YAC3DG,IAAMZ,EAAAA,wBAAAA,CAAyBa,gBAAgB,CAACN,QAAAA,CAAAA;AAChDN,YAAAA,GAAAA;YACAa,IAAMlB,EAAAA,IAAAA;AACNC,YAAAA,IAAAA,EAAMjD,aAAciD,CAAAA,IAAAA,CAAAA;YACpBkB,WAAalB,EAAAA;AACf,SAAA;AAEA,QAAA,MAAM,EAAEmB,KAAK,EAAEC,GAAG,EAAEC,KAAK,EAAE,GAAGnB,KAAAA;QAE9B,IAAIiB,KAAAA,IAASC,OAAOC,KAAO,EAAA;AACzBV,YAAAA,MAAAA,CAAOW,OAAO,GAAG;AACf,gBAAA;oBACEC,EAAIJ,EAAAA,KAAAA;oBACJK,MAAQJ,EAAAA,GAAAA;oBACRK,OAAS,EAAA;AAAEJ,wBAAAA;AAAM;AACnB;AACD,aAAA;AACH;QAEA,IAAInB,KAAAA,CAAMjC,IAAI,EAAE;YACd0C,MAAO1C,CAAAA,IAAI,GAAGiC,KAAAA,CAAMjC,IAAI;AAC1B;QAEA,IAAIiC,KAAAA,CAAMpC,mBAAmB,EAAE;YAC7B6C,MAAO7C,CAAAA,mBAAmB,GAAGoC,KAAAA,CAAMpC,mBAAmB;AACxD;QAEA,OAAO6C,MAAAA;AACT;AAEA,IAAA,eAAee,sBACblD,CAAAA,IAAe,EACfyB,QAAkB,EAClBC,KAAa,EAAA;QAEb,MAAMyB,WAAAA,GAAe,MAAM9B,cACzB,CAAA;YACEC,QAAUtB,EAAAA,IAAAA,CAAKoD,gBAAgB,IAAI,QAAA;YACnC7B,IAAMvB,EAAAA,IAAAA,CAAKqD,QAAQ,IAAI,0BAAA;AACvB7B,YAAAA,IAAAA,EAAMxB,KAAKwB;AACb,SAAA,EACAC,QACA,EAAA;AACE,YAAA,GAAGC,KAAK;AACRpC,YAAAA,mBAAAA,EAAqBU,KAAKV;AAC5B,SAAA,CAAA;QAGF6D,WAAYG,CAAAA,QAAQ,GAAGtD,IAAAA,CAAKsD,QAAQ;AACpCH,QAAAA,WAAAA,CAAYI,SAAS,GAAG,IAAMC,GAAGC,gBAAgB,CAACzD,KAAKsD,QAAQ,CAAA;AAE/D,QAAA,MAAM,EAAEI,QAAQ,EAAEC,OAAO,EAAEC,aAAa,EAAEC,kBAAkB,EAAE,GAAGpF,MAC9DqF,CAAAA,MAAM,CAAC,QAAA,CAAA,CACPC,OAAO,CAAC,oBAAA,CAAA;QAEX,IAAI,MAAMJ,QAAQR,WAAc,CAAA,EAAA;YAC9B,IAAI,MAAMS,cAAcT,WAAc,CAAA,EAAA;AACpC,gBAAA,MAAM,IAAI/E,gBAAiB,CAAA,2BAAA,CAAA;AAC7B;YACA,IAAI,MAAMyF,mBAAmBV,WAAc,CAAA,EAAA;AACzC,gBAAA,OAAOO,QAASP,CAAAA,WAAAA,CAAAA;AAClB;AACF;QAEA,OAAOA,WAAAA;AACT;AAEA,IAAA,eAAea,OACb,EACEnF,IAAI,EACJQ,KAAK,EAIN,EACD4E,IAAoB,EAAA;AAEpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,QAAQ,EAAC;;QAE1B,MAAM3E,mBAAAA,GAAsB,MAAMF,yCAA0CC,CAAAA,KAAAA,CAAAA;AAE5E,QAAA,IAAI8E,gBAAuB,EAAE;QAE7B,IAAI;AACF,YAAA,MAAM,EAAE1C,QAAQ,EAAE,GAAGC,OAAO,GAAG7C,IAAAA;AAE/B,YAAA,MAAMuF,SAAYvE,GAAAA,KAAAA,CAAMC,OAAO,CAACT,SAASA,KAAQ,GAAA;AAACA,gBAAAA;AAAM,aAAA;AACxD,YAAA,MAAMgF,aAAgBxE,GAAAA,KAAAA,CAAMC,OAAO,CAAC2B,YAAYA,QAAW,GAAA;AAACA,gBAAAA;AAAS,aAAA;YAErE,MAAM6C,QAAAA,GAAW,OAAOtE,IAAiByB,EAAAA,QAAAA,GAAAA;AACvC,gBAAA,MAAM8C,QAAW,GAAA,MAAMrB,sBAAuBlD,CAAAA,IAAAA,EAAMyB,QAAUC,EAAAA,KAAAA,CAAAA;AAC9D,gBAAA,OAAO8C,qBAAqBD,QAAU,EAAA;AAAEL,oBAAAA;AAAK,iBAAA,CAAA;AAC/C,aAAA;AAEAC,YAAAA,aAAAA,GAAgB,MAAMM,OAAQC,CAAAA,GAAG,CAC/BN,SAAAA,CAAUO,GAAG,CAAC,CAAC3E,IAAM4E,EAAAA,GAAAA,GAAQN,SAAStE,IAAMqE,EAAAA,aAAa,CAACO,GAAAA,CAAI,IAAI,EAAC,CAAA,CAAA,CAAA;SAE7D,QAAA;;YAER,MAAMrF,GAAAA,CAAIsF,MAAM,CAACvF,mBAAAA,CAAAA;AACnB;QAEA,OAAO6E,aAAAA;AACT;AAEA;;;;;MAMA,eAAeW,YAAYP,QAAwB,EAAA;QACjD,MAAM,EAAEQ,aAAa,EAAEC,iBAAiB,EAAEC,yBAAyB,EAAEC,gBAAgB,EAAE,GACrFvG,gBAAW,CAAA,oBAAA,CAAA;;AAGb,QAAA,MAAM,EAAEwG,KAAK,EAAEC,MAAM,EAAE,GAAG,MAAML,aAAcR,CAAAA,QAAAA,CAAAA;;;QAI9CzF,CAAEuG,CAAAA,MAAM,CAACd,QAAU,EAAA;AACjBY,YAAAA,KAAAA;AACAC,YAAAA;AACF,SAAA,CAAA;;AAGA,QAAA,MAAME,kBAAkB,OAAOC,aAAAA,GAAAA;YAC7B,MAAM5G,gBAAAA,CAAW,UAAYqF,CAAAA,CAAAA,MAAM,CAACuB,aAAAA,CAAAA;YACpCzG,CAAE0G,CAAAA,GAAG,CAACjB,QAAAA,EAAU,mBAAqBgB,EAAAA,aAAAA,CAAAA;AACvC,SAAA;;AAGA,QAAA,MAAME,yBAAyB,OAAOC,MAAAA,GAAAA;AACpC,YAAA,MAAM,EAAEC,GAAG,EAAE3F,IAAI,EAAE,GAAG0F,MAAAA;YACtB,MAAM/G,gBAAAA,CAAW,UAAYqF,CAAAA,CAAAA,MAAM,CAAChE,IAAAA,CAAAA;YACpClB,CAAE0G,CAAAA,GAAG,CAACjB,QAAU,EAAA;AAAC,gBAAA,SAAA;AAAWoB,gBAAAA;aAAI,EAAE3F,IAAAA,CAAAA;AACpC,SAAA;AAEA,QAAA,MAAM4F,iBAAkC,EAAE;;AAG1CA,QAAAA,cAAAA,CAAeC,IAAI,CAAClH,gBAAW,CAAA,UAAA,CAAA,CAAYqF,MAAM,CAACO,QAAAA,CAAAA,CAAAA;;QAGlD,IAAI,MAAMW,iBAAiBX,QAAW,CAAA,EAAA;YACpC,MAAMgB,aAAAA,GAAgB,MAAMP,iBAAkBT,CAAAA,QAAAA,CAAAA;AAC9C,YAAA,IAAIgB,aAAe,EAAA;gBACjBK,cAAeC,CAAAA,IAAI,CAACP,eAAgBC,CAAAA,aAAAA,CAAAA,CAAAA;AACtC;YAEA,MAAMO,OAAAA,GAAU,MAAMb,yBAA0BV,CAAAA,QAAAA,CAAAA;AAChD,YAAA,IAAI1E,MAAMC,OAAO,CAACgG,YAAYA,OAAQzF,CAAAA,MAAM,GAAG,CAAG,EAAA;gBAChD,KAAK,MAAMqF,UAAUI,OAAS,CAAA;;AAE5B,oBAAA,IAAI,CAACJ,MAAQ,EAAA;oBACbE,cAAeC,CAAAA,IAAI,CAACJ,sBAAuBC,CAAAA,MAAAA,CAAAA,CAAAA;AAC7C;AACF;AACF;;QAEA,MAAMjB,OAAAA,CAAQC,GAAG,CAACkB,cAAAA,CAAAA;AACpB;AAEA;;;AAGC,MACD,eAAepB,oBAAAA,CAAqBD,QAAwB,EAAEN,IAAoB,EAAA;AAChF,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,QAAQ,EAAC;AAE1B,QAAA,MAAM8B,MAAStH,GAAAA,MAAAA,CAAOsH,MAAM,CAACC,GAAG,CAAS,gBAAA,CAAA;AACzC,QAAA,MAAM,EAAErC,OAAO,EAAE,GAAGhF,gBAAW,CAAA,oBAAA,CAAA;QAE/B,MAAMA,gBAAAA,CAAW,UAAYsH,CAAAA,CAAAA,aAAa,CAAC1B,QAAAA,CAAAA;QAE3C,IAAI,MAAMZ,QAAQY,QAAW,CAAA,EAAA;AAC3B,YAAA,MAAMO,WAAYP,CAAAA,QAAAA,CAAAA;SACb,MAAA;YACL,MAAM5F,gBAAAA,CAAW,UAAYqF,CAAAA,CAAAA,MAAM,CAACO,QAAAA,CAAAA;AACtC;AAEAzF,QAAAA,CAAAA,CAAE0G,GAAG,CAACjB,QAAU,EAAA,UAAA,EAAYwB,OAAOG,QAAQ,CAAA;;AAG3C,QAAA,OAAOC,IAAI5B,QAAU,EAAA;AAAEL,YAAAA;AAAK,SAAA,CAAA;AAC9B;AAEA,IAAA,eAAekC,cACbrD,CAAAA,EAAM,EACN,EAAEf,IAAI,EAAE7C,eAAe,EAAEF,OAAO,EAAEmD,MAAM,EAAY,EACpD6B,IAAoB,EAAA;AAEpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,QAAQ,EAAC;QAE1B,MAAMoC,MAAAA,GAAS,MAAMC,OAAQvD,CAAAA,EAAAA,CAAAA;AAE7B,QAAA,IAAI,CAACsD,MAAQ,EAAA;AACX,YAAA,MAAM,IAAIhI,aAAAA,EAAAA;AACZ;AAEA,QAAA,MAAMK,cAAcC,gBAAW,CAAA,MAAA,CAAA;AAE/B,QAAA,MAAM4H,UAAUzH,CAAE0H,CAAAA,KAAK,CAACxE,IAAQqE,CAAAA,GAAAA,MAAAA,CAAOrE,IAAI,GAAGA,IAAAA;AAC9C,QAAA,MAAMyE,QAAW,GAAA;YACfzE,IAAMuE,EAAAA,OAAAA;AACNpH,YAAAA,eAAAA,EAAiBL,EAAE0H,KAAK,CAACrH,eAAmBkH,CAAAA,GAAAA,MAAAA,CAAOlH,eAAe,GAAGA,eAAAA;AACrEF,YAAAA,OAAAA,EAASH,EAAE0H,KAAK,CAACvH,OAAWoH,CAAAA,GAAAA,MAAAA,CAAOpH,OAAO,GAAGA,OAAAA;AAC7CmD,YAAAA,MAAAA,EAAQtD,EAAE4H,WAAW,CAACtE,MAAUiE,CAAAA,GAAAA,MAAAA,CAAOjE,MAAM,GAAGA,MAAAA;YAChDC,UAAYvD,EAAAA,CAAAA,CAAE4H,WAAW,CAACtE,MAAUiE,CAAAA,GAAAA,MAAAA,CAAO5G,IAAI,GAAG,MAAMf,WAAY4D,CAAAA,aAAa,CAACF,MAAAA;AACpF,SAAA;QAEA,OAAOuE,MAAAA,CAAO5D,IAAI0D,QAAU,EAAA;AAAEvC,YAAAA;AAAK,SAAA,CAAA;AACrC;IAEA,eAAe0C,OAAAA,CACb7D,EAAM,EACN,EAAElE,IAAI,EAAEmB,IAAI,EAAqD,EACjEiE,IAAoB,EAAA;AAEpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,QAAQ,EAAC;AAE1B,QAAA,MAAM8B,MAAStH,GAAAA,MAAAA,CAAOsH,MAAM,CAACC,GAAG,CAAS,gBAAA,CAAA;AAEzC,QAAA,MAAM,EAAErC,OAAO,EAAE,GAAGhF,gBAAW,CAAA,oBAAA,CAAA;QAE/B,MAAM0H,MAAAA,GAAS,MAAMC,OAAQvD,CAAAA,EAAAA,CAAAA;AAC7B,QAAA,IAAI,CAACsD,MAAQ,EAAA;AACX,YAAA,MAAM,IAAIhI,aAAAA,EAAAA;AACZ;;QAGA,MAAMiB,mBAAAA,GAAsB,MAAMF,yCAA0CY,CAAAA,IAAAA,CAAAA;QAE5E,IAAIuE,QAAAA;QAEJ,IAAI;YACF,MAAM,EAAE9C,QAAQ,EAAE,GAAG5C,IAAAA;YACrB0F,QAAW,GAAA,MAAMrB,uBAAuBlD,IAAMyB,EAAAA,QAAAA,CAAAA;;YAG9C3C,CAAEuG,CAAAA,MAAM,CAACd,QAAU,EAAA;AACjBhC,gBAAAA,IAAAA,EAAM8D,OAAO9D,IAAI;AACjBX,gBAAAA,GAAAA,EAAKyE,OAAOzE;AACd,aAAA,CAAA;;AAGA,YAAA,IAAIyE,MAAOH,CAAAA,QAAQ,KAAKH,MAAAA,CAAOG,QAAQ,EAAE;AACvC,gBAAA,MAAMzH,OAAOqF,MAAM,CAAC,UAAUoC,QAAQ,CAACW,MAAM,CAACR,MAAAA,CAAAA;gBAE9C,IAAIA,MAAAA,CAAOP,OAAO,EAAE;oBAClB,MAAMrB,OAAAA,CAAQC,GAAG,CACfoC,MAAOC,CAAAA,IAAI,CAACV,MAAAA,CAAOP,OAAO,CAAA,CAAEnB,GAAG,CAAC,CAACgB,GAAAA,GAAAA;wBAC/B,OAAOlH,MAAAA,CAAOqF,MAAM,CAAC,QAAUoC,CAAAA,CAAAA,QAAQ,CAACW,MAAM,CAACR,MAAAA,CAAOP,OAAO,CAACH,GAAI,CAAA,CAAA;AACpE,qBAAA,CAAA,CAAA;AAEJ;AACF;;AAGA7G,YAAAA,CAAAA,CAAE0G,GAAG,CAACjB,QAAU,EAAA,SAAA,EAAW,EAAC,CAAA;YAE5B,IAAI,MAAMZ,QAAQY,QAAW,CAAA,EAAA;AAC3B,gBAAA,MAAMO,WAAYP,CAAAA,QAAAA,CAAAA;aACb,MAAA;gBACL,MAAM5F,gBAAAA,CAAW,UAAYqF,CAAAA,CAAAA,MAAM,CAACO,QAAAA,CAAAA;AACtC;AAEAzF,YAAAA,CAAAA,CAAE0G,GAAG,CAACjB,QAAU,EAAA,UAAA,EAAYwB,OAAOG,QAAQ,CAAA;SACnC,QAAA;;YAER,MAAM3G,GAAAA,CAAIsF,MAAM,CAACvF,mBAAAA,CAAAA;AACnB;QAEA,OAAOqH,MAAAA,CAAO5D,IAAIwB,QAAU,EAAA;AAAEL,YAAAA;AAAK,SAAA,CAAA;AACrC;AAEA,IAAA,eAAeyC,MAAO5D,CAAAA,EAAM,EAAEiE,MAAqB,EAAE/C,IAAoB,EAAA;AACvE,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,QAAQ,EAAC;AAE1B,QAAA,MAAMgD,UAAa,GAAA;AAAE,YAAA,GAAGD;AAAO,SAAA;AAC/B,QAAA,IAAI9C,IAAM,EAAA;YACR4C,MAAOzB,CAAAA,MAAM,CAAC4B,UAAY,EAAA;gBACxB,CAACrJ,oBAAAA,GAAuBsG,IAAAA,CAAKnB;AAC/B,aAAA,CAAA;AACF;AAEA,QAAA,MAAMnE,gBAAiBqI,CAAAA,UAAAA,CAAAA;QAEvB,MAAMC,GAAAA,GAAM,MAAMzI,MAAO0I,CAAAA,EAAE,CAACC,KAAK,CAACzG,wBAAgBgG,CAAAA,CAAAA,MAAM,CAAC;YAAEU,KAAO,EAAA;AAAEtE,gBAAAA;AAAG,aAAA;YAAGlE,IAAMoI,EAAAA;AAAW,SAAA,CAAA;AAE3F,QAAA,MAAM1G,UAAUtC,YAAciJ,EAAAA,GAAAA,CAAAA;QAE9B,OAAOA,GAAAA;AACT;IAEA,eAAef,GAAAA,CAAIa,MAAW,EAAE/C,IAAoB,EAAA;AAClD,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,QAAQ,EAAC;AAE1B,QAAA,MAAMgD,UAAa,GAAA;AAAE,YAAA,GAAGD;AAAO,SAAA;AAC/B,QAAA,IAAI9C,IAAM,EAAA;YACR4C,MAAOzB,CAAAA,MAAM,CAAC4B,UAAY,EAAA;gBACxB,CAACrJ,oBAAAA,GAAuBsG,IAAAA,CAAKnB,EAAE;gBAC/B,CAAClF,oBAAAA,GAAuBqG,IAAAA,CAAKnB;AAC/B,aAAA,CAAA;AACF;AAEA,QAAA,MAAMnE,gBAAiBqI,CAAAA,UAAAA,CAAAA;QAEvB,MAAMC,GAAAA,GAAM,MAAMzI,MAAO0I,CAAAA,EAAE,CAACC,KAAK,CAACzG,wBAAgB2G,CAAAA,CAAAA,MAAM,CAAC;YAAEzI,IAAMoI,EAAAA;AAAW,SAAA,CAAA;AAE5E,QAAA,MAAM1G,UAAUvC,YAAckJ,EAAAA,GAAAA,CAAAA;QAE9B,OAAOA,GAAAA;AACT;AAEA,IAAA,eAAeZ,OAAQvD,CAAAA,EAAM,EAAEwE,QAAAA,GAAW,EAAE,EAAA;AAC1C,QAAA,MAAMH,QAAQ3I,MAAOuH,CAAAA,GAAG,CAAC,cAAgBwB,CAAAA,CAAAA,SAAS,CAAC7G,wBAAgB,EAAA;AACjE4G,YAAAA;AACF,SAAA,CAAA;QAEA,MAAMvH,IAAAA,GAAO,MAAMvB,MAAO0I,CAAAA,EAAE,CAACC,KAAK,CAACzG,wBAAgB2F,CAAAA,CAAAA,OAAO,CAAC;YACzDe,KAAO,EAAA;AAAEtE,gBAAAA;AAAG,aAAA;AACZ,YAAA,GAAGqE;AACL,SAAA,CAAA;QAEA,IAAI,CAACpH,MAAM,OAAOA,IAAAA;;QAGlB,OAAOtB,WAAAA,CAAY+I,YAAY,CAACzH,IAAAA,CAAAA;AAClC;IAEA,eAAe0H,QAAAA,CAASN,KAAa,GAAA,EAAE,EAAA;AACrC,QAAA,MAAM/H,QAAQ,MAAMZ,MAAAA,CAAO0I,EAAE,CAC1BC,KAAK,CAACzG,wBAAAA,CAAAA,CACN+G,QAAQ,CAACjJ,OAAOuH,GAAG,CAAC,cAAgBwB,CAAAA,CAAAA,SAAS,CAAC7G,wBAAgByG,EAAAA,KAAAA,CAAAA,CAAAA;;QAGjE,OAAOO,WAAAA,CAAMhD,GAAG,CAACtF,KAAAA,EAAO,CAACW,IAAetB,GAAAA,WAAAA,CAAY+I,YAAY,CAACzH,IAAAA,CAAAA,CAAAA;AACnE;IAEA,eAAe4H,QAAAA,CAASR,KAAa,GAAA,EAAE,EAAA;AACrC,QAAA,MAAMS,SAAS,MAAMpJ,MAAAA,CAAO0I,EAAE,CAC3BC,KAAK,CAACzG,wBAAAA,CAAAA,CACNiH,QAAQ,CAACnJ,OAAOuH,GAAG,CAAC,cAAgBwB,CAAAA,CAAAA,SAAS,CAAC7G,wBAAgByG,EAAAA,KAAAA,CAAAA,CAAAA;;AAGjE,QAAA,MAAMU,aAAgB,GAAA,MAAMH,WAAMhD,CAAAA,GAAG,CAACkD,MAAAA,CAAOE,OAAO,EAAE,CAAC/H,IAAAA,GACrDtB,WAAY+I,CAAAA,YAAY,CAACzH,IAAAA,CAAAA,CAAAA;QAG3B,OAAO;AACL,YAAA,GAAG6H,MAAM;YACTE,OAASD,EAAAA;AACX,SAAA;AACF;AAEA,IAAA,eAAejD,OAAO7E,IAAU,EAAA;AAC9B,QAAA,MAAM+F,MAAStH,GAAAA,MAAAA,CAAOsH,MAAM,CAACC,GAAG,CAAS,gBAAA,CAAA;;AAGzC,QAAA,IAAIhG,IAAKkG,CAAAA,QAAQ,KAAKH,MAAAA,CAAOG,QAAQ,EAAE;AACrC,YAAA,MAAMzH,OAAOqF,MAAM,CAAC,UAAUoC,QAAQ,CAACW,MAAM,CAAC7G,IAAAA,CAAAA;YAE9C,IAAIA,IAAAA,CAAK8F,OAAO,EAAE;AAChB,gBAAA,MAAMiB,IAAOD,GAAAA,MAAAA,CAAOC,IAAI,CAAC/G,KAAK8F,OAAO,CAAA;AAErC,gBAAA,MAAMrB,QAAQC,GAAG,CACfqC,IAAKpC,CAAAA,GAAG,CAAC,CAACgB,GAAAA,GAAAA;AACR,oBAAA,OAAOlH,MAAOqF,CAAAA,MAAM,CAAC,QAAA,CAAA,CAAUoC,QAAQ,CAACW,MAAM,CAAC7G,IAAK8F,CAAAA,OAAO,CAAEH,GAAI,CAAA,CAAA;AACnE,iBAAA,CAAA,CAAA;AAEJ;AACF;QAEA,MAAMvE,KAAAA,GAAQ,MAAM3C,MAAO0I,CAAAA,EAAE,CAACC,KAAK,CAACzG,wBAAgB2F,CAAAA,CAAAA,OAAO,CAAC;YAC1De,KAAO,EAAA;AAAEtE,gBAAAA,EAAAA,EAAI/C,KAAK+C;AAAG;AACvB,SAAA,CAAA;AAEA,QAAA,MAAMxC,UAAUrC,YAAckD,EAAAA,KAAAA,CAAAA;AAE9B,QAAA,OAAO3C,OAAO0I,EAAE,CAACC,KAAK,CAACzG,wBAAAA,CAAAA,CAAgBkG,MAAM,CAAC;YAAEQ,KAAO,EAAA;AAAEtE,gBAAAA,EAAAA,EAAI/C,KAAK+C;AAAG;AAAE,SAAA,CAAA;AACzE;IAEA,eAAeiF,WAAAA,GAAAA;AACb,QAAA,MAAMd,GAAM,GAAA,MAAMzI,MAAOwJ,CAAAA,KAAK,CAAE;YAAE1G,IAAM,EAAA,QAAA;YAAUS,IAAM,EAAA,QAAA;YAAU2D,GAAK,EAAA;SAAcK,CAAAA,CAAAA,GAAG,CAAC,EAAC,CAAA;QAE1F,OAAOkB,GAAAA;AACT;AAEA,IAAA,eAAegB,YAAYC,KAAe,EAAA;QACxC,IAAIA,KAAAA,CAAMC,oBAAoB,KAAK,IAAM,EAAA;YACvC,MAAMzJ,gBAAAA,CAAW,SAAWO,CAAAA,CAAAA,UAAU,CAAC,+BAAA,CAAA;SAClC,MAAA;YACL,MAAMP,gBAAAA,CAAW,SAAWO,CAAAA,CAAAA,UAAU,CAAC,gCAAA,CAAA;AACzC;QAEA,OAAOT,MAAAA,CAAOwJ,KAAK,CAAE;YAAE1G,IAAM,EAAA,QAAA;YAAUS,IAAM,EAAA,QAAA;YAAU2D,GAAK,EAAA;AAAW,SAAA,CAAA,CAAGH,GAAG,CAAC;AAAE2C,YAAAA;AAAM,SAAA,CAAA;AACxF;IAEA,eAAeE,gBAAAA,GAAAA;AACb,QAAA,MAAMnB,GAAM,GAAA,MAAMzI,MAAOwJ,CAAAA,KAAK,CAAE;YAC9B1G,IAAM,EAAA,QAAA;YACNS,IAAM,EAAA,QAAA;YACN2D,GAAK,EAAA;SACJK,CAAAA,CAAAA,GAAG,CAAC,EAAC,CAAA;QAER,OAAOkB,GAAAA;AACT;AAEA,IAAA,SAASoB,iBAAiBH,KAAwB,EAAA;QAChD,OAAO1J,MAAAA,CAAOwJ,KAAK,CAAE;YAAE1G,IAAM,EAAA,QAAA;YAAUS,IAAM,EAAA,QAAA;YAAU2D,GAAK,EAAA;AAAqB,SAAA,CAAA,CAAGH,GAAG,CAAC;AACtF2C,YAAAA;AACF,SAAA,CAAA;AACF;IAEA,OAAO;AACL9G,QAAAA,cAAAA;AACA2C,QAAAA,MAAAA;AACAoC,QAAAA,cAAAA;AACAQ,QAAAA,OAAAA;AACAN,QAAAA,OAAAA;AACAoB,QAAAA,QAAAA;AACAE,QAAAA,QAAAA;AACA/C,QAAAA,MAAAA;AACAmD,QAAAA,WAAAA;AACAE,QAAAA,WAAAA;AACAG,QAAAA,gBAAAA;AACAC,QAAAA,gBAAAA;AAEA;;;AAGC,QACDC,YAAczD,EAAAA;AAChB,KAAA;AACF,CAAA;;;;"}
|
|
@@ -14,12 +14,12 @@ const { ApplicationError, NotFoundError } = errors;
|
|
|
14
14
|
const { bytesToKbytes } = file;
|
|
15
15
|
var upload = (({ strapi })=>{
|
|
16
16
|
const fileService = getService('file');
|
|
17
|
-
const sendMediaMetrics = (data)=>{
|
|
17
|
+
const sendMediaMetrics = async (data)=>{
|
|
18
18
|
if (_.has(data, 'caption') && !_.isEmpty(data.caption)) {
|
|
19
|
-
|
|
19
|
+
await getService('metrics').trackUsage('didSaveMediaWithCaption');
|
|
20
20
|
}
|
|
21
21
|
if (_.has(data, 'alternativeText') && !_.isEmpty(data.alternativeText)) {
|
|
22
|
-
|
|
22
|
+
await getService('metrics').trackUsage('didSaveMediaWithAlternativeText');
|
|
23
23
|
}
|
|
24
24
|
};
|
|
25
25
|
const createAndAssignTmpWorkingDirectoryToFiles = async (files)=>{
|
|
@@ -304,7 +304,7 @@ var upload = (({ strapi })=>{
|
|
|
304
304
|
[UPDATED_BY_ATTRIBUTE]: user.id
|
|
305
305
|
});
|
|
306
306
|
}
|
|
307
|
-
sendMediaMetrics(fileValues);
|
|
307
|
+
await sendMediaMetrics(fileValues);
|
|
308
308
|
const res = await strapi.db.query(FILE_MODEL_UID).update({
|
|
309
309
|
where: {
|
|
310
310
|
id
|
|
@@ -325,7 +325,7 @@ var upload = (({ strapi })=>{
|
|
|
325
325
|
[CREATED_BY_ATTRIBUTE]: user.id
|
|
326
326
|
});
|
|
327
327
|
}
|
|
328
|
-
sendMediaMetrics(fileValues);
|
|
328
|
+
await sendMediaMetrics(fileValues);
|
|
329
329
|
const res = await strapi.db.query(FILE_MODEL_UID).create({
|
|
330
330
|
data: fileValues
|
|
331
331
|
});
|
|
@@ -392,11 +392,11 @@ var upload = (({ strapi })=>{
|
|
|
392
392
|
}).get({});
|
|
393
393
|
return res;
|
|
394
394
|
}
|
|
395
|
-
function setSettings(value) {
|
|
395
|
+
async function setSettings(value) {
|
|
396
396
|
if (value.responsiveDimensions === true) {
|
|
397
|
-
|
|
397
|
+
await getService('metrics').trackUsage('didEnableResponsiveDimensions');
|
|
398
398
|
} else {
|
|
399
|
-
|
|
399
|
+
await getService('metrics').trackUsage('didDisableResponsiveDimensions');
|
|
400
400
|
}
|
|
401
401
|
return strapi.store({
|
|
402
402
|
type: 'plugin',
|