@strapi/upload 5.26.0 → 5.28.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.
Files changed (146) hide show
  1. package/dist/admin/ai/components/AIAssetCard.js +589 -0
  2. package/dist/admin/ai/components/AIAssetCard.js.map +1 -0
  3. package/dist/admin/ai/components/AIAssetCard.mjs +567 -0
  4. package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -0
  5. package/dist/admin/ai/components/AIUploadModal.js +363 -0
  6. package/dist/admin/ai/components/AIUploadModal.js.map +1 -0
  7. package/dist/admin/ai/components/AIUploadModal.mjs +341 -0
  8. package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -0
  9. package/dist/admin/components/AssetDialog/AssetDialog.js +1 -1
  10. package/dist/admin/components/AssetDialog/AssetDialog.js.map +1 -1
  11. package/dist/admin/components/AssetDialog/AssetDialog.mjs +1 -1
  12. package/dist/admin/components/AssetDialog/AssetDialog.mjs.map +1 -1
  13. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js +3 -3
  14. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
  15. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +4 -4
  16. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
  17. package/dist/admin/components/EditAssetDialog/EditAssetContent.js +5 -5
  18. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  19. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +5 -5
  20. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  21. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js +2 -1
  22. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js.map +1 -1
  23. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs +2 -1
  24. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs.map +1 -1
  25. package/dist/admin/components/SelectTree/utils/flattenTree.js +11 -6
  26. package/dist/admin/components/SelectTree/utils/flattenTree.js.map +1 -1
  27. package/dist/admin/components/SelectTree/utils/flattenTree.mjs +11 -6
  28. package/dist/admin/components/SelectTree/utils/flattenTree.mjs.map +1 -1
  29. package/dist/admin/hooks/useAiAvailability.js +22 -0
  30. package/dist/admin/hooks/useAiAvailability.js.map +1 -0
  31. package/dist/admin/hooks/useAiAvailability.mjs +20 -0
  32. package/dist/admin/hooks/useAiAvailability.mjs.map +1 -0
  33. package/dist/admin/hooks/useBulkEdit.js +66 -0
  34. package/dist/admin/hooks/useBulkEdit.js.map +1 -0
  35. package/dist/admin/hooks/useBulkEdit.mjs +64 -0
  36. package/dist/admin/hooks/useBulkEdit.mjs.map +1 -0
  37. package/dist/admin/hooks/useSettings.js +22 -0
  38. package/dist/admin/hooks/useSettings.js.map +1 -0
  39. package/dist/admin/hooks/useSettings.mjs +20 -0
  40. package/dist/admin/hooks/useSettings.mjs.map +1 -0
  41. package/dist/admin/hooks/useUpload.js +25 -14
  42. package/dist/admin/hooks/useUpload.js.map +1 -1
  43. package/dist/admin/hooks/useUpload.mjs +25 -14
  44. package/dist/admin/hooks/useUpload.mjs.map +1 -1
  45. package/dist/admin/package.json.js +5 -5
  46. package/dist/admin/package.json.mjs +5 -5
  47. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js +0 -1
  48. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  49. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +0 -1
  50. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  51. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js +19 -5
  52. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js.map +1 -1
  53. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs +19 -5
  54. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs.map +1 -1
  55. package/dist/admin/pages/SettingsPage/SettingsPage.js +222 -144
  56. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  57. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +225 -147
  58. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  59. package/dist/admin/pages/SettingsPage/reducer.js +9 -10
  60. package/dist/admin/pages/SettingsPage/reducer.js.map +1 -1
  61. package/dist/admin/pages/SettingsPage/reducer.mjs +9 -10
  62. package/dist/admin/pages/SettingsPage/reducer.mjs.map +1 -1
  63. package/dist/admin/src/ai/components/AIAssetCard.d.ts +13 -0
  64. package/dist/admin/src/ai/components/AIUploadModal.d.ts +55 -0
  65. package/dist/admin/src/components/EditAssetDialog/EditAssetContent.d.ts +3 -1
  66. package/dist/admin/src/components/SelectTree/utils/flattenTree.d.ts +3 -1
  67. package/dist/admin/src/hooks/useAiAvailability.d.ts +4 -0
  68. package/dist/admin/src/hooks/useBulkEdit.d.ts +91 -0
  69. package/dist/admin/src/hooks/useSettings.d.ts +7 -0
  70. package/dist/admin/src/hooks/useUpload.d.ts +1 -1
  71. package/dist/admin/src/pages/SettingsPage/reducer.d.ts +3 -12
  72. package/dist/admin/translations/en.json.js +7 -1
  73. package/dist/admin/translations/en.json.js.map +1 -1
  74. package/dist/admin/translations/en.json.mjs +7 -1
  75. package/dist/admin/translations/en.json.mjs.map +1 -1
  76. package/dist/admin/utils/getFolderParents.js +2 -1
  77. package/dist/admin/utils/getFolderParents.js.map +1 -1
  78. package/dist/admin/utils/getFolderParents.mjs +2 -1
  79. package/dist/admin/utils/getFolderParents.mjs.map +1 -1
  80. package/dist/server/bootstrap.js +2 -1
  81. package/dist/server/bootstrap.js.map +1 -1
  82. package/dist/server/bootstrap.mjs +2 -1
  83. package/dist/server/bootstrap.mjs.map +1 -1
  84. package/dist/server/controllers/admin-upload.js +57 -2
  85. package/dist/server/controllers/admin-upload.js.map +1 -1
  86. package/dist/server/controllers/admin-upload.mjs +59 -4
  87. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  88. package/dist/server/controllers/content-api.js +3 -1
  89. package/dist/server/controllers/content-api.js.map +1 -1
  90. package/dist/server/controllers/content-api.mjs +3 -1
  91. package/dist/server/controllers/content-api.mjs.map +1 -1
  92. package/dist/server/controllers/validation/admin/settings.js +2 -1
  93. package/dist/server/controllers/validation/admin/settings.js.map +1 -1
  94. package/dist/server/controllers/validation/admin/settings.mjs +2 -1
  95. package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
  96. package/dist/server/controllers/validation/admin/upload.js +8 -0
  97. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  98. package/dist/server/controllers/validation/admin/upload.mjs +8 -1
  99. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  100. package/dist/server/routes/admin.js +18 -0
  101. package/dist/server/routes/admin.js.map +1 -1
  102. package/dist/server/routes/admin.mjs +18 -0
  103. package/dist/server/routes/admin.mjs.map +1 -1
  104. package/dist/server/services/ai-metadata.js +97 -0
  105. package/dist/server/services/ai-metadata.js.map +1 -0
  106. package/dist/server/services/ai-metadata.mjs +95 -0
  107. package/dist/server/services/ai-metadata.mjs.map +1 -0
  108. package/dist/server/services/index.js +3 -1
  109. package/dist/server/services/index.js.map +1 -1
  110. package/dist/server/services/index.mjs +3 -1
  111. package/dist/server/services/index.mjs.map +1 -1
  112. package/dist/server/services/upload.js.map +1 -1
  113. package/dist/server/services/upload.mjs.map +1 -1
  114. package/dist/server/services/weekly-metrics.js +5 -1
  115. package/dist/server/services/weekly-metrics.js.map +1 -1
  116. package/dist/server/services/weekly-metrics.mjs +5 -1
  117. package/dist/server/services/weekly-metrics.mjs.map +1 -1
  118. package/dist/server/src/bootstrap.d.ts.map +1 -1
  119. package/dist/server/src/controllers/admin-upload.d.ts +1 -0
  120. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  121. package/dist/server/src/controllers/index.d.ts +1 -0
  122. package/dist/server/src/controllers/index.d.ts.map +1 -1
  123. package/dist/server/src/controllers/validation/admin/settings.d.ts +3 -0
  124. package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -1
  125. package/dist/server/src/controllers/validation/admin/upload.d.ts +42 -0
  126. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
  127. package/dist/server/src/index.d.ts +14 -1
  128. package/dist/server/src/index.d.ts.map +1 -1
  129. package/dist/server/src/routes/admin.d.ts.map +1 -1
  130. package/dist/server/src/services/ai-metadata.d.ts +13 -0
  131. package/dist/server/src/services/ai-metadata.d.ts.map +1 -0
  132. package/dist/server/src/services/index.d.ts +13 -1
  133. package/dist/server/src/services/index.d.ts.map +1 -1
  134. package/dist/server/src/services/upload.d.ts +2 -1
  135. package/dist/server/src/services/upload.d.ts.map +1 -1
  136. package/dist/server/src/services/weekly-metrics.d.ts +1 -0
  137. package/dist/server/src/services/weekly-metrics.d.ts.map +1 -1
  138. package/dist/server/src/types.d.ts +1 -0
  139. package/dist/server/src/types.d.ts.map +1 -1
  140. package/dist/server/src/utils/index.d.ts +2 -0
  141. package/dist/server/src/utils/index.d.ts.map +1 -1
  142. package/dist/server/utils/index.js.map +1 -1
  143. package/dist/server/utils/index.mjs.map +1 -1
  144. package/dist/shared/contracts/files.d.ts +22 -0
  145. package/dist/shared/contracts/settings.d.ts +2 -0
  146. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"upload.mjs","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 | 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.mjs","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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"}
@@ -74,12 +74,16 @@ var weeklyMetrics = (({ strapi: strapi1 })=>({
74
74
  const averageDeviationDepth = folderNumber !== 0 ? sumOfDeviation / folderNumber : 0;
75
75
  // File metrics
76
76
  const assetNumber = await strapi1.db.query(constants.FILE_MODEL_UID).count();
77
+ // AI metadata generation metrics
78
+ const settings = await strapi1.plugin('upload').service('upload').getSettings();
79
+ const isAIMediaLibraryConfigured = settings?.aiMetadata;
77
80
  return {
78
81
  assetNumber,
79
82
  folderNumber,
80
83
  averageDepth,
81
84
  maxDepth,
82
- averageDeviationDepth
85
+ averageDeviationDepth,
86
+ isAIMediaLibraryConfigured
83
87
  };
84
88
  },
85
89
  async sendMetrics () {
@@ -1 +1 @@
1
- {"version":3,"file":"weekly-metrics.js","sources":["../../../server/src/services/weekly-metrics.ts"],"sourcesContent":["import { defaultTo } from 'lodash/fp';\nimport { add } from 'date-fns';\n\nimport type { Core } from '@strapi/types';\n\nimport { getWeeklyCronScheduleAt } from '../utils/cron';\nimport { FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\n\ntype MetricStoreValue = {\n lastWeeklyUpdate?: number;\n weeklySchedule?: string;\n};\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getMetricsStoreValue = async (): Promise<MetricStoreValue> => {\n const value = await strapi.store.get({ type: 'plugin', name: 'upload', key: 'metrics' });\n return defaultTo({}, value) as MetricStoreValue;\n};\nconst setMetricsStoreValue = (value: MetricStoreValue) =>\n strapi.store.set({ type: 'plugin', name: 'upload', key: 'metrics', value });\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async computeMetrics() {\n // Folder metrics\n // @ts-expect-error - no dynamic types for the metadata\n const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n\n let keepOnlySlashesSQLString = '??';\n const queryParams = [pathColName];\n for (let i = 0; i < 10; i += 1) {\n keepOnlySlashesSQLString = `REPLACE(${keepOnlySlashesSQLString}, ?, ?)`;\n queryParams.push(String(i), '');\n }\n\n /*\n The following query goal is to count the number of folders with depth 1, depth 2 etc.\n The query returns :\n [\n { depth: 1, occurence: 4 },\n { depth: 2, occurence: 2 },\n { depth: 3, occurence: 5 },\n ]\n\n The query is built as follow:\n 1. In order to get the depth level of a folder:\n - we take their path\n - remove all numbers (by replacing 0123456789 by '', thus the 10 REPLACE in the query)\n - count the remaining `/`, which correspond to their depth (by using LENGTH)\n We now have, for each folder, its depth.\n 2. In order to get the number of folders for each depth:\n - we group them by their depth and use COUNT(*)\n */\n\n const res = (await strapi.db\n .getConnection(folderTable)\n .select(\n strapi.db.connection.raw(\n `LENGTH(${keepOnlySlashesSQLString}) AS depth, COUNT(*) AS occurence`,\n queryParams\n )\n )\n .groupBy('depth')) as Array<{ depth: string; occurence: string }>;\n\n const folderLevelsArray = res.map((map) => ({\n depth: Number(map.depth),\n occurence: Number(map.occurence),\n })); // values can be strings depending on the database\n\n let product = 0;\n let folderNumber = 0;\n let maxDepth = 0;\n for (const folderLevel of folderLevelsArray) {\n product += folderLevel.depth * folderLevel.occurence;\n folderNumber += folderLevel.occurence;\n if (folderLevel.depth > maxDepth) {\n maxDepth = folderLevel.depth;\n }\n }\n const averageDepth = folderNumber !== 0 ? product / folderNumber : 0;\n\n let sumOfDeviation = 0;\n for (const folderLevel of folderLevelsArray) {\n sumOfDeviation += Math.abs(folderLevel.depth - averageDepth) * folderLevel.occurence;\n }\n\n const averageDeviationDepth = folderNumber !== 0 ? sumOfDeviation / folderNumber : 0;\n\n // File metrics\n const assetNumber = await strapi.db.query(FILE_MODEL_UID).count();\n\n return {\n assetNumber,\n folderNumber,\n averageDepth,\n maxDepth,\n averageDeviationDepth,\n };\n },\n\n async sendMetrics() {\n const metrics = await this.computeMetrics();\n strapi.telemetry.send('didSendUploadPropertiesOnceAWeek', {\n groupProperties: { metrics },\n });\n\n const metricsInfoStored = await getMetricsStoreValue();\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule(): Promise<string> {\n const metricsInfoStored = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!weeklySchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n\n return weeklySchedule;\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n uploadWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n});\n"],"names":["ONE_WEEK","getMetricsStoreValue","value","strapi","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","pathColName","db","metadata","FOLDER_MODEL_UID","attributes","path","columnName","folderTable","getModel","collectionName","keepOnlySlashesSQLString","queryParams","i","push","String","res","getConnection","select","connection","raw","groupBy","folderLevelsArray","map","depth","Number","occurence","product","folderNumber","maxDepth","folderLevel","averageDepth","sumOfDeviation","Math","abs","averageDeviationDepth","assetNumber","query","FILE_MODEL_UID","count","sendMetrics","metrics","telemetry","send","groupProperties","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","getWeeklyCronScheduleAt","add","seconds","registerCron","cron","uploadWeekly","task","bind","options"],"mappings":";;;;;;;AAaA,MAAMA,QAAW,GAAA,CAAA,GAAI,EAAK,GAAA,EAAA,GAAK,EAAK,GAAA,IAAA;AAEpC,MAAMC,oBAAuB,GAAA,UAAA;AAC3B,IAAA,MAAMC,QAAQ,MAAMC,MAAAA,CAAOC,KAAK,CAACC,GAAG,CAAC;QAAEC,IAAM,EAAA,QAAA;QAAUC,IAAM,EAAA,QAAA;QAAUC,GAAK,EAAA;AAAU,KAAA,CAAA;IACtF,OAAOC,YAAAA,CAAU,EAAIP,EAAAA,KAAAA,CAAAA;AACvB,CAAA;AACA,MAAMQ,uBAAuB,CAACR,KAAAA,GAC5BC,OAAOC,KAAK,CAACO,GAAG,CAAC;QAAEL,IAAM,EAAA,QAAA;QAAUC,IAAM,EAAA,QAAA;QAAUC,GAAK,EAAA,SAAA;AAAWN,QAAAA;AAAM,KAAA,CAAA;AAE3E,oBAAe,CAAA,CAAC,EAAEC,QAAAA,OAAM,EAA2B,IAAM;QACvD,MAAMS,cAAAA,CAAAA,GAAAA;;;AAGJ,YAAA,MAAMC,WAAcV,GAAAA,OAAAA,CAAOW,EAAE,CAACC,QAAQ,CAACV,GAAG,CAACW,0BAAkBC,CAAAA,CAAAA,UAAU,CAACC,IAAI,CAACC,UAAU;AACvF,YAAA,MAAMC,WAAcjB,GAAAA,OAAAA,CAAOkB,QAAQ,CAACL,4BAAkBM,cAAc;AAEpE,YAAA,IAAIC,wBAA2B,GAAA,IAAA;AAC/B,YAAA,MAAMC,WAAc,GAAA;AAACX,gBAAAA;AAAY,aAAA;AACjC,YAAA,IAAK,IAAIY,CAAI,GAAA,CAAA,EAAGA,CAAI,GAAA,EAAA,EAAIA,KAAK,CAAG,CAAA;AAC9BF,gBAAAA,wBAAAA,GAA2B,CAAC,QAAQ,EAAEA,wBAAAA,CAAyB,OAAO,CAAC;gBACvEC,WAAYE,CAAAA,IAAI,CAACC,MAAAA,CAAOF,CAAI,CAAA,EAAA,EAAA,CAAA;AAC9B;AAEA;;;;;;;;;;;;;;;;;OAmBA,MAAMG,GAAO,GAAA,MAAMzB,OAAOW,CAAAA,EAAE,CACzBe,aAAa,CAACT,WAAAA,CAAAA,CACdU,MAAM,CACL3B,OAAOW,CAAAA,EAAE,CAACiB,UAAU,CAACC,GAAG,CACtB,CAAC,OAAO,EAAET,wBAAyB,CAAA,iCAAiC,CAAC,EACrEC,WAGHS,CAAAA,CAAAA,CAAAA,OAAO,CAAC,OAAA,CAAA;AAEX,YAAA,MAAMC,oBAAoBN,GAAIO,CAAAA,GAAG,CAAC,CAACA,OAAS;oBAC1CC,KAAOC,EAAAA,MAAAA,CAAOF,IAAIC,KAAK,CAAA;oBACvBE,SAAWD,EAAAA,MAAAA,CAAOF,IAAIG,SAAS;AACjC,iBAAA;AAEA,YAAA,IAAIC,OAAU,GAAA,CAAA;AACd,YAAA,IAAIC,YAAe,GAAA,CAAA;AACnB,YAAA,IAAIC,QAAW,GAAA,CAAA;YACf,KAAK,MAAMC,eAAeR,iBAAmB,CAAA;AAC3CK,gBAAAA,OAAAA,IAAWG,WAAYN,CAAAA,KAAK,GAAGM,WAAAA,CAAYJ,SAAS;AACpDE,gBAAAA,YAAAA,IAAgBE,YAAYJ,SAAS;gBACrC,IAAII,WAAAA,CAAYN,KAAK,GAAGK,QAAU,EAAA;AAChCA,oBAAAA,QAAAA,GAAWC,YAAYN,KAAK;AAC9B;AACF;AACA,YAAA,MAAMO,YAAeH,GAAAA,YAAAA,KAAiB,CAAID,GAAAA,OAAAA,GAAUC,YAAe,GAAA,CAAA;AAEnE,YAAA,IAAII,cAAiB,GAAA,CAAA;YACrB,KAAK,MAAMF,eAAeR,iBAAmB,CAAA;gBAC3CU,cAAkBC,IAAAA,IAAAA,CAAKC,GAAG,CAACJ,WAAAA,CAAYN,KAAK,GAAGO,YAAAA,CAAAA,GAAgBD,YAAYJ,SAAS;AACtF;AAEA,YAAA,MAAMS,qBAAwBP,GAAAA,YAAAA,KAAiB,CAAII,GAAAA,cAAAA,GAAiBJ,YAAe,GAAA,CAAA;;YAGnF,MAAMQ,WAAAA,GAAc,MAAM7C,OAAOW,CAAAA,EAAE,CAACmC,KAAK,CAACC,0BAAgBC,KAAK,EAAA;YAE/D,OAAO;AACLH,gBAAAA,WAAAA;AACAR,gBAAAA,YAAAA;AACAG,gBAAAA,YAAAA;AACAF,gBAAAA,QAAAA;AACAM,gBAAAA;AACF,aAAA;AACF,SAAA;QAEA,MAAMK,WAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,OAAU,GAAA,MAAM,IAAI,CAACzC,cAAc,EAAA;AACzCT,YAAAA,OAAAA,CAAOmD,SAAS,CAACC,IAAI,CAAC,kCAAoC,EAAA;gBACxDC,eAAiB,EAAA;AAAEH,oBAAAA;AAAQ;AAC7B,aAAA,CAAA;AAEA,YAAA,MAAMI,oBAAoB,MAAMxD,oBAAAA,EAAAA;AAChC,YAAA,MAAMS,oBAAqB,CAAA;AAAE,gBAAA,GAAG+C,iBAAiB;gBAAEC,gBAAkB,EAAA,IAAIC,OAAOC,OAAO;AAAG,aAAA,CAAA;AAC5F,SAAA;QAEA,MAAMC,8BAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMJ,oBAAoB,MAAMxD,oBAAAA,EAAAA;AAChC,YAAA,MAAM,EAAE6D,cAAgBC,EAAAA,eAAe,EAAEL,gBAAgB,EAAE,GAAGD,iBAAAA;AAE9D,YAAA,MAAMO,MAAM,IAAIL,IAAAA,EAAAA;AAChB,YAAA,IAAIG,cAAiBC,GAAAA,eAAAA;YAErB,IAAI,CAACD,kBAAkB,CAACJ,gBAAAA,IAAoBA,mBAAmB1D,QAAWgE,GAAAA,GAAAA,CAAIJ,OAAO,EAAI,EAAA;gBACvFE,cAAiBG,GAAAA,4BAAAA,CAAwBC,YAAIF,GAAK,EAAA;oBAAEG,OAAS,EAAA;AAAG,iBAAA,CAAA,CAAA;AAChE,gBAAA,MAAMzD,oBAAqB,CAAA;AAAE,oBAAA,GAAG+C,iBAAiB;AAAEK,oBAAAA;AAAe,iBAAA,CAAA;gBAElE,OAAOA,cAAAA;AACT;YAEA,OAAOA,cAAAA;AACT,SAAA;QAEA,MAAMM,YAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMN,cAAiB,GAAA,MAAM,IAAI,CAACD,8BAA8B,EAAA;YAEhE1D,OAAOkE,CAAAA,IAAI,CAACH,GAAG,CAAC;gBACdI,YAAc,EAAA;AACZC,oBAAAA,IAAAA,EAAM,IAAI,CAACnB,WAAW,CAACoB,IAAI,CAAC,IAAI,CAAA;oBAChCC,OAASX,EAAAA;AACX;AACF,aAAA,CAAA;AACF;AACF,KAAA,CAAC;;;;"}
1
+ {"version":3,"file":"weekly-metrics.js","sources":["../../../server/src/services/weekly-metrics.ts"],"sourcesContent":["import { defaultTo } from 'lodash/fp';\nimport { add } from 'date-fns';\n\nimport type { Core } from '@strapi/types';\n\nimport { getWeeklyCronScheduleAt } from '../utils/cron';\nimport { FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport { Settings } from '../controllers/validation/admin/settings';\n\ntype MetricStoreValue = {\n lastWeeklyUpdate?: number;\n weeklySchedule?: string;\n};\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getMetricsStoreValue = async (): Promise<MetricStoreValue> => {\n const value = await strapi.store.get({ type: 'plugin', name: 'upload', key: 'metrics' });\n return defaultTo({}, value) as MetricStoreValue;\n};\nconst setMetricsStoreValue = (value: MetricStoreValue) =>\n strapi.store.set({ type: 'plugin', name: 'upload', key: 'metrics', value });\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async computeMetrics() {\n // Folder metrics\n // @ts-expect-error - no dynamic types for the metadata\n const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n\n let keepOnlySlashesSQLString = '??';\n const queryParams = [pathColName];\n for (let i = 0; i < 10; i += 1) {\n keepOnlySlashesSQLString = `REPLACE(${keepOnlySlashesSQLString}, ?, ?)`;\n queryParams.push(String(i), '');\n }\n\n /*\n The following query goal is to count the number of folders with depth 1, depth 2 etc.\n The query returns :\n [\n { depth: 1, occurence: 4 },\n { depth: 2, occurence: 2 },\n { depth: 3, occurence: 5 },\n ]\n\n The query is built as follow:\n 1. In order to get the depth level of a folder:\n - we take their path\n - remove all numbers (by replacing 0123456789 by '', thus the 10 REPLACE in the query)\n - count the remaining `/`, which correspond to their depth (by using LENGTH)\n We now have, for each folder, its depth.\n 2. In order to get the number of folders for each depth:\n - we group them by their depth and use COUNT(*)\n */\n\n const res = (await strapi.db\n .getConnection(folderTable)\n .select(\n strapi.db.connection.raw(\n `LENGTH(${keepOnlySlashesSQLString}) AS depth, COUNT(*) AS occurence`,\n queryParams\n )\n )\n .groupBy('depth')) as Array<{ depth: string; occurence: string }>;\n\n const folderLevelsArray = res.map((map) => ({\n depth: Number(map.depth),\n occurence: Number(map.occurence),\n })); // values can be strings depending on the database\n\n let product = 0;\n let folderNumber = 0;\n let maxDepth = 0;\n for (const folderLevel of folderLevelsArray) {\n product += folderLevel.depth * folderLevel.occurence;\n folderNumber += folderLevel.occurence;\n if (folderLevel.depth > maxDepth) {\n maxDepth = folderLevel.depth;\n }\n }\n const averageDepth = folderNumber !== 0 ? product / folderNumber : 0;\n\n let sumOfDeviation = 0;\n for (const folderLevel of folderLevelsArray) {\n sumOfDeviation += Math.abs(folderLevel.depth - averageDepth) * folderLevel.occurence;\n }\n\n const averageDeviationDepth = folderNumber !== 0 ? sumOfDeviation / folderNumber : 0;\n\n // File metrics\n const assetNumber = await strapi.db.query(FILE_MODEL_UID).count();\n\n // AI metadata generation metrics\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const isAIMediaLibraryConfigured = settings?.aiMetadata;\n\n return {\n assetNumber,\n folderNumber,\n averageDepth,\n maxDepth,\n averageDeviationDepth,\n isAIMediaLibraryConfigured,\n };\n },\n\n async sendMetrics() {\n const metrics = await this.computeMetrics();\n strapi.telemetry.send('didSendUploadPropertiesOnceAWeek', {\n groupProperties: { metrics },\n });\n\n const metricsInfoStored = await getMetricsStoreValue();\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule(): Promise<string> {\n const metricsInfoStored = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!weeklySchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n\n return weeklySchedule;\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n uploadWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n});\n"],"names":["ONE_WEEK","getMetricsStoreValue","value","strapi","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","pathColName","db","metadata","FOLDER_MODEL_UID","attributes","path","columnName","folderTable","getModel","collectionName","keepOnlySlashesSQLString","queryParams","i","push","String","res","getConnection","select","connection","raw","groupBy","folderLevelsArray","map","depth","Number","occurence","product","folderNumber","maxDepth","folderLevel","averageDepth","sumOfDeviation","Math","abs","averageDeviationDepth","assetNumber","query","FILE_MODEL_UID","count","settings","plugin","service","getSettings","isAIMediaLibraryConfigured","aiMetadata","sendMetrics","metrics","telemetry","send","groupProperties","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","getWeeklyCronScheduleAt","add","seconds","registerCron","cron","uploadWeekly","task","bind","options"],"mappings":"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"}
@@ -72,12 +72,16 @@ var weeklyMetrics = (({ strapi: strapi1 })=>({
72
72
  const averageDeviationDepth = folderNumber !== 0 ? sumOfDeviation / folderNumber : 0;
73
73
  // File metrics
74
74
  const assetNumber = await strapi1.db.query(FILE_MODEL_UID).count();
75
+ // AI metadata generation metrics
76
+ const settings = await strapi1.plugin('upload').service('upload').getSettings();
77
+ const isAIMediaLibraryConfigured = settings?.aiMetadata;
75
78
  return {
76
79
  assetNumber,
77
80
  folderNumber,
78
81
  averageDepth,
79
82
  maxDepth,
80
- averageDeviationDepth
83
+ averageDeviationDepth,
84
+ isAIMediaLibraryConfigured
81
85
  };
82
86
  },
83
87
  async sendMetrics () {
@@ -1 +1 @@
1
- {"version":3,"file":"weekly-metrics.mjs","sources":["../../../server/src/services/weekly-metrics.ts"],"sourcesContent":["import { defaultTo } from 'lodash/fp';\nimport { add } from 'date-fns';\n\nimport type { Core } from '@strapi/types';\n\nimport { getWeeklyCronScheduleAt } from '../utils/cron';\nimport { FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\n\ntype MetricStoreValue = {\n lastWeeklyUpdate?: number;\n weeklySchedule?: string;\n};\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getMetricsStoreValue = async (): Promise<MetricStoreValue> => {\n const value = await strapi.store.get({ type: 'plugin', name: 'upload', key: 'metrics' });\n return defaultTo({}, value) as MetricStoreValue;\n};\nconst setMetricsStoreValue = (value: MetricStoreValue) =>\n strapi.store.set({ type: 'plugin', name: 'upload', key: 'metrics', value });\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async computeMetrics() {\n // Folder metrics\n // @ts-expect-error - no dynamic types for the metadata\n const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n\n let keepOnlySlashesSQLString = '??';\n const queryParams = [pathColName];\n for (let i = 0; i < 10; i += 1) {\n keepOnlySlashesSQLString = `REPLACE(${keepOnlySlashesSQLString}, ?, ?)`;\n queryParams.push(String(i), '');\n }\n\n /*\n The following query goal is to count the number of folders with depth 1, depth 2 etc.\n The query returns :\n [\n { depth: 1, occurence: 4 },\n { depth: 2, occurence: 2 },\n { depth: 3, occurence: 5 },\n ]\n\n The query is built as follow:\n 1. In order to get the depth level of a folder:\n - we take their path\n - remove all numbers (by replacing 0123456789 by '', thus the 10 REPLACE in the query)\n - count the remaining `/`, which correspond to their depth (by using LENGTH)\n We now have, for each folder, its depth.\n 2. In order to get the number of folders for each depth:\n - we group them by their depth and use COUNT(*)\n */\n\n const res = (await strapi.db\n .getConnection(folderTable)\n .select(\n strapi.db.connection.raw(\n `LENGTH(${keepOnlySlashesSQLString}) AS depth, COUNT(*) AS occurence`,\n queryParams\n )\n )\n .groupBy('depth')) as Array<{ depth: string; occurence: string }>;\n\n const folderLevelsArray = res.map((map) => ({\n depth: Number(map.depth),\n occurence: Number(map.occurence),\n })); // values can be strings depending on the database\n\n let product = 0;\n let folderNumber = 0;\n let maxDepth = 0;\n for (const folderLevel of folderLevelsArray) {\n product += folderLevel.depth * folderLevel.occurence;\n folderNumber += folderLevel.occurence;\n if (folderLevel.depth > maxDepth) {\n maxDepth = folderLevel.depth;\n }\n }\n const averageDepth = folderNumber !== 0 ? product / folderNumber : 0;\n\n let sumOfDeviation = 0;\n for (const folderLevel of folderLevelsArray) {\n sumOfDeviation += Math.abs(folderLevel.depth - averageDepth) * folderLevel.occurence;\n }\n\n const averageDeviationDepth = folderNumber !== 0 ? sumOfDeviation / folderNumber : 0;\n\n // File metrics\n const assetNumber = await strapi.db.query(FILE_MODEL_UID).count();\n\n return {\n assetNumber,\n folderNumber,\n averageDepth,\n maxDepth,\n averageDeviationDepth,\n };\n },\n\n async sendMetrics() {\n const metrics = await this.computeMetrics();\n strapi.telemetry.send('didSendUploadPropertiesOnceAWeek', {\n groupProperties: { metrics },\n });\n\n const metricsInfoStored = await getMetricsStoreValue();\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule(): Promise<string> {\n const metricsInfoStored = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!weeklySchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n\n return weeklySchedule;\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n uploadWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n});\n"],"names":["ONE_WEEK","getMetricsStoreValue","value","strapi","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","pathColName","db","metadata","FOLDER_MODEL_UID","attributes","path","columnName","folderTable","getModel","collectionName","keepOnlySlashesSQLString","queryParams","i","push","String","res","getConnection","select","connection","raw","groupBy","folderLevelsArray","map","depth","Number","occurence","product","folderNumber","maxDepth","folderLevel","averageDepth","sumOfDeviation","Math","abs","averageDeviationDepth","assetNumber","query","FILE_MODEL_UID","count","sendMetrics","metrics","telemetry","send","groupProperties","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","getWeeklyCronScheduleAt","add","seconds","registerCron","cron","uploadWeekly","task","bind","options"],"mappings":"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"}
1
+ {"version":3,"file":"weekly-metrics.mjs","sources":["../../../server/src/services/weekly-metrics.ts"],"sourcesContent":["import { defaultTo } from 'lodash/fp';\nimport { add } from 'date-fns';\n\nimport type { Core } from '@strapi/types';\n\nimport { getWeeklyCronScheduleAt } from '../utils/cron';\nimport { FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport { Settings } from '../controllers/validation/admin/settings';\n\ntype MetricStoreValue = {\n lastWeeklyUpdate?: number;\n weeklySchedule?: string;\n};\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getMetricsStoreValue = async (): Promise<MetricStoreValue> => {\n const value = await strapi.store.get({ type: 'plugin', name: 'upload', key: 'metrics' });\n return defaultTo({}, value) as MetricStoreValue;\n};\nconst setMetricsStoreValue = (value: MetricStoreValue) =>\n strapi.store.set({ type: 'plugin', name: 'upload', key: 'metrics', value });\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async computeMetrics() {\n // Folder metrics\n // @ts-expect-error - no dynamic types for the metadata\n const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n\n let keepOnlySlashesSQLString = '??';\n const queryParams = [pathColName];\n for (let i = 0; i < 10; i += 1) {\n keepOnlySlashesSQLString = `REPLACE(${keepOnlySlashesSQLString}, ?, ?)`;\n queryParams.push(String(i), '');\n }\n\n /*\n The following query goal is to count the number of folders with depth 1, depth 2 etc.\n The query returns :\n [\n { depth: 1, occurence: 4 },\n { depth: 2, occurence: 2 },\n { depth: 3, occurence: 5 },\n ]\n\n The query is built as follow:\n 1. In order to get the depth level of a folder:\n - we take their path\n - remove all numbers (by replacing 0123456789 by '', thus the 10 REPLACE in the query)\n - count the remaining `/`, which correspond to their depth (by using LENGTH)\n We now have, for each folder, its depth.\n 2. In order to get the number of folders for each depth:\n - we group them by their depth and use COUNT(*)\n */\n\n const res = (await strapi.db\n .getConnection(folderTable)\n .select(\n strapi.db.connection.raw(\n `LENGTH(${keepOnlySlashesSQLString}) AS depth, COUNT(*) AS occurence`,\n queryParams\n )\n )\n .groupBy('depth')) as Array<{ depth: string; occurence: string }>;\n\n const folderLevelsArray = res.map((map) => ({\n depth: Number(map.depth),\n occurence: Number(map.occurence),\n })); // values can be strings depending on the database\n\n let product = 0;\n let folderNumber = 0;\n let maxDepth = 0;\n for (const folderLevel of folderLevelsArray) {\n product += folderLevel.depth * folderLevel.occurence;\n folderNumber += folderLevel.occurence;\n if (folderLevel.depth > maxDepth) {\n maxDepth = folderLevel.depth;\n }\n }\n const averageDepth = folderNumber !== 0 ? product / folderNumber : 0;\n\n let sumOfDeviation = 0;\n for (const folderLevel of folderLevelsArray) {\n sumOfDeviation += Math.abs(folderLevel.depth - averageDepth) * folderLevel.occurence;\n }\n\n const averageDeviationDepth = folderNumber !== 0 ? sumOfDeviation / folderNumber : 0;\n\n // File metrics\n const assetNumber = await strapi.db.query(FILE_MODEL_UID).count();\n\n // AI metadata generation metrics\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const isAIMediaLibraryConfigured = settings?.aiMetadata;\n\n return {\n assetNumber,\n folderNumber,\n averageDepth,\n maxDepth,\n averageDeviationDepth,\n isAIMediaLibraryConfigured,\n };\n },\n\n async sendMetrics() {\n const metrics = await this.computeMetrics();\n strapi.telemetry.send('didSendUploadPropertiesOnceAWeek', {\n groupProperties: { metrics },\n });\n\n const metricsInfoStored = await getMetricsStoreValue();\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule(): Promise<string> {\n const metricsInfoStored = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!weeklySchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n\n return weeklySchedule;\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n uploadWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n});\n"],"names":["ONE_WEEK","getMetricsStoreValue","value","strapi","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","pathColName","db","metadata","FOLDER_MODEL_UID","attributes","path","columnName","folderTable","getModel","collectionName","keepOnlySlashesSQLString","queryParams","i","push","String","res","getConnection","select","connection","raw","groupBy","folderLevelsArray","map","depth","Number","occurence","product","folderNumber","maxDepth","folderLevel","averageDepth","sumOfDeviation","Math","abs","averageDeviationDepth","assetNumber","query","FILE_MODEL_UID","count","settings","plugin","service","getSettings","isAIMediaLibraryConfigured","aiMetadata","sendMetrics","metrics","telemetry","send","groupProperties","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","getWeeklyCronScheduleAt","add","seconds","registerCron","cron","uploadWeekly","task","bind","options"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../server/src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAK1C,wBAAsB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,iBAwClE"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../server/src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAK1C,wBAAsB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,iBA0ClE"}
@@ -1,5 +1,6 @@
1
1
  import type { Context } from 'koa';
2
2
  declare const _default: {
3
+ bulkUpdateFileInfo(ctx: Context): Promise<void>;
3
4
  updateFileInfo(ctx: Context): Promise<void>;
4
5
  replaceFile(ctx: Context): Promise<void>;
5
6
  uploadFiles(ctx: Context): Promise<Context | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"admin-upload.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/admin-upload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;;wBASP,OAAO;qBA0BV,OAAO;qBAgCP,OAAO;gBA4BZ,OAAO;;AAvF3B,wBAuGE"}
1
+ {"version":3,"file":"admin-upload.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/admin-upload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;;4BASH,OAAO;wBA2BX,OAAO;qBA0BV,OAAO;qBAgCP,OAAO;gBA+EZ,OAAO;;AArK3B,wBAqLE"}
@@ -29,6 +29,7 @@ export declare const controllers: {
29
29
  getSettings(ctx: import("koa").Context): Promise<import("koa").Context | undefined>;
30
30
  };
31
31
  'admin-upload': {
32
+ bulkUpdateFileInfo(ctx: import("koa").Context): Promise<void>;
32
33
  updateFileInfo(ctx: import("koa").Context): Promise<void>;
33
34
  replaceFile(ctx: import("koa").Context): Promise<void>;
34
35
  uploadFiles(ctx: import("koa").Context): Promise<import("koa").Context | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/index.ts"],"names":[],"mappings":";AAQA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQvB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/index.ts"],"names":[],"mappings":";AAQA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQvB,CAAC"}
@@ -3,15 +3,18 @@ declare const settingsSchema: import("yup/lib/object").OptionalObjectSchema<{
3
3
  sizeOptimization: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
4
4
  responsiveDimensions: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
5
5
  autoOrientation: yup.BooleanSchema<boolean | undefined, Record<string, any>, boolean | undefined>;
6
+ aiMetadata: yup.BooleanSchema<boolean, Record<string, any>, boolean>;
6
7
  }, Record<string, any>, import("yup/lib/object").TypeOfShape<{
7
8
  sizeOptimization: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
8
9
  responsiveDimensions: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
9
10
  autoOrientation: yup.BooleanSchema<boolean | undefined, Record<string, any>, boolean | undefined>;
11
+ aiMetadata: yup.BooleanSchema<boolean, Record<string, any>, boolean>;
10
12
  }>>;
11
13
  declare const _default: (body: unknown, errorMessage?: string | undefined) => Promise<import("yup/lib/object").AssertsShape<{
12
14
  sizeOptimization: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
13
15
  responsiveDimensions: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
14
16
  autoOrientation: yup.BooleanSchema<boolean | undefined, Record<string, any>, boolean | undefined>;
17
+ aiMetadata: yup.BooleanSchema<boolean, Record<string, any>, boolean>;
15
18
  }>>;
16
19
  export default _default;
17
20
  export type Settings = yup.InferType<typeof settingsSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../../../../server/src/controllers/validation/admin/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAqB,MAAM,eAAe,CAAC;AAEvD,QAAA,MAAM,cAAc;;;;;;;;GAIlB,CAAC;;;;;;AAEH,wBAAiD;AAEjD,MAAM,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../../../../server/src/controllers/validation/admin/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAqB,MAAM,eAAe,CAAC;AAEvD,QAAA,MAAM,cAAc;;;;;;;;;;GAKlB,CAAC;;;;;;;AAEH,wBAAiD;AAEjD,MAAM,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,cAAc,CAAC,CAAC"}
@@ -106,4 +106,46 @@ declare const validateUploadBody: (data?: {}, isMulti?: boolean) => Promise<impo
106
106
  }>>;
107
107
  export { validateUploadBody };
108
108
  export type UploadBody = yup.InferType<typeof uploadSchema> | yup.InferType<typeof multiUploadSchema>;
109
+ export declare const validateBulkUpdateBody: (body: unknown, errorMessage?: string | undefined) => Promise<import("yup/lib/object").AssertsShape<{
110
+ updates: import("yup/lib/array").RequiredArraySchema<import("yup/lib/object").OptionalObjectSchema<{
111
+ id: import("yup/lib/number").RequiredNumberSchema<number | undefined, Record<string, any>>;
112
+ fileInfo: import("yup/lib/object").RequiredObjectSchema<{
113
+ name: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
114
+ alternativeText: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
115
+ caption: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
116
+ folder: import("yup/lib/mixed").MixedSchema<any, import("yup/lib/types").AnyObject, any>;
117
+ }, Record<string, any>, import("yup/lib/object").TypeOfShape<{
118
+ name: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
119
+ alternativeText: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
120
+ caption: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
121
+ folder: import("yup/lib/mixed").MixedSchema<any, import("yup/lib/types").AnyObject, any>;
122
+ }>>;
123
+ }, Record<string, any>, import("yup/lib/object").TypeOfShape<{
124
+ id: import("yup/lib/number").RequiredNumberSchema<number | undefined, Record<string, any>>;
125
+ fileInfo: import("yup/lib/object").RequiredObjectSchema<{
126
+ name: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
127
+ alternativeText: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
128
+ caption: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
129
+ folder: import("yup/lib/mixed").MixedSchema<any, import("yup/lib/types").AnyObject, any>;
130
+ }, Record<string, any>, import("yup/lib/object").TypeOfShape<{
131
+ name: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
132
+ alternativeText: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
133
+ caption: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
134
+ folder: import("yup/lib/mixed").MixedSchema<any, import("yup/lib/types").AnyObject, any>;
135
+ }>>;
136
+ }>>, import("yup/lib/types").AnyObject, import("yup/lib/object").TypeOfShape<{
137
+ id: import("yup/lib/number").RequiredNumberSchema<number | undefined, Record<string, any>>;
138
+ fileInfo: import("yup/lib/object").RequiredObjectSchema<{
139
+ name: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
140
+ alternativeText: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
141
+ caption: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
142
+ folder: import("yup/lib/mixed").MixedSchema<any, import("yup/lib/types").AnyObject, any>;
143
+ }, Record<string, any>, import("yup/lib/object").TypeOfShape<{
144
+ name: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
145
+ alternativeText: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
146
+ caption: import("yup").StringSchema<string | null | undefined, Record<string, any>, string | null | undefined>;
147
+ folder: import("yup/lib/mixed").MixedSchema<any, import("yup/lib/types").AnyObject, any>;
148
+ }>>;
149
+ }>[] | undefined>;
150
+ }>>;
109
151
  //# sourceMappingURL=upload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../../../../server/src/controllers/validation/admin/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAqB,MAAM,eAAe,CAAC;AAsBvD,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;GAEhB,CAAC;AAEH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAErB,CAAC;AAEH,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAIvB,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,MAAM,MAAM,UAAU,GAClB,GAAG,CAAC,SAAS,CAAC,OAAO,YAAY,CAAC,GAClC,GAAG,CAAC,SAAS,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../../../../server/src/controllers/validation/admin/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAqB,MAAM,eAAe,CAAC;AAsBvD,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;GAEhB,CAAC;AAEH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAErB,CAAC;AAEH,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAIvB,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,MAAM,MAAM,UAAU,GAClB,GAAG,CAAC,SAAS,CAAC,OAAO,YAAY,CAAC,GAClC,GAAG,CAAC,SAAS,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAe5C,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAuC,CAAC"}
@@ -81,6 +81,7 @@ declare const _default: () => {
81
81
  getSettings(ctx: import("koa").Context): Promise<import("koa").Context | undefined>;
82
82
  };
83
83
  'admin-upload': {
84
+ bulkUpdateFileInfo(ctx: import("koa").Context): Promise<void>;
84
85
  updateFileInfo(ctx: import("koa").Context): Promise<void>;
85
86
  replaceFile(ctx: import("koa").Context): Promise<void>;
86
87
  uploadFiles(ctx: import("koa").Context): Promise<import("koa").Context | undefined>;
@@ -294,7 +295,7 @@ declare const _default: () => {
294
295
  }) => Promise<Omit<import("./types").UploadableFile, "getStream">>;
295
296
  upload: ({ data, files, }: {
296
297
  data: Record<string, unknown>;
297
- files: import("./types").InputFile | import("./types").InputFile[];
298
+ files: import("./types").InputFile[];
298
299
  }, opts?: {
299
300
  user?: {
300
301
  id: string | number;
@@ -331,11 +332,13 @@ declare const _default: () => {
331
332
  sizeOptimization: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
332
333
  responsiveDimensions: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
333
334
  autoOrientation: import("yup").BooleanSchema<boolean | undefined, Record<string, any>, boolean | undefined>;
335
+ aiMetadata: import("yup").BooleanSchema<boolean, Record<string, any>, boolean>;
334
336
  }> | null>;
335
337
  setSettings: (value: import("yup/lib/object").AssertsShape<{
336
338
  sizeOptimization: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
337
339
  responsiveDimensions: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
338
340
  autoOrientation: import("yup").BooleanSchema<boolean | undefined, Record<string, any>, boolean | undefined>;
341
+ aiMetadata: import("yup").BooleanSchema<boolean, Record<string, any>, boolean>;
339
342
  }>) => Promise<void>;
340
343
  getConfiguration: () => Promise<import("yup/lib/object").AssertsShape<{
341
344
  pageSize: import("yup/lib/number").RequiredNumberSchema<number | undefined, Record<string, any>>;
@@ -389,6 +392,7 @@ declare const _default: () => {
389
392
  averageDepth: number;
390
393
  maxDepth: number;
391
394
  averageDeviationDepth: number;
395
+ isAIMediaLibraryConfigured: boolean;
392
396
  }>;
393
397
  sendMetrics(): Promise<void>;
394
398
  ensureWeeklyStoredCronSchedule(): Promise<string>;
@@ -422,6 +426,15 @@ declare const _default: () => {
422
426
  extensions: {
423
427
  signFileUrlsOnDocumentService: () => Promise<void>;
424
428
  };
429
+ aiMetadata: ({ strapi }: {
430
+ strapi: import("@strapi/types/dist/core").Strapi;
431
+ }) => {
432
+ isEnabled(): Promise<boolean>;
433
+ processFiles(files: import("./types").InputFile[]): Promise<({
434
+ altText: string;
435
+ caption: string;
436
+ } | null)[]>;
437
+ };
425
438
  };
426
439
  };
427
440
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOxC,wBAQG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOxC,wBAQG"}
@@ -1 +1 @@
1
- {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/admin.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;CA4MlB,CAAC"}
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/admin.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;CA4NlB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Core } from '@strapi/types';
2
+ import { InputFile } from '../types';
3
+ declare const createAIMetadataService: ({ strapi }: {
4
+ strapi: Core.Strapi;
5
+ }) => {
6
+ isEnabled(): Promise<boolean>;
7
+ processFiles(files: InputFile[]): Promise<Array<{
8
+ altText: string;
9
+ caption: string;
10
+ } | null>>;
11
+ };
12
+ export { createAIMetadataService };
13
+ //# sourceMappingURL=ai-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-metadata.d.ts","sourceRoot":"","sources":["../../../../server/src/services/ai-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,QAAA,MAAM,uBAAuB,eAAgB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;;wBAyBvD,SAAS,EAAE,GACjB,QAAQ,MAAM;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CA+EjE,CAAC;AAEF,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
@@ -21,7 +21,7 @@ export declare const services: {
21
21
  }) => Promise<Omit<import("../types").UploadableFile, "getStream">>;
22
22
  upload: ({ data, files, }: {
23
23
  data: Record<string, unknown>;
24
- files: import("../types").InputFile | import("../types").InputFile[];
24
+ files: import("../types").InputFile[];
25
25
  }, opts?: {
26
26
  user?: {
27
27
  id: string | number;
@@ -58,11 +58,13 @@ export declare const services: {
58
58
  sizeOptimization: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
59
59
  responsiveDimensions: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
60
60
  autoOrientation: import("yup").BooleanSchema<boolean | undefined, Record<string, any>, boolean | undefined>;
61
+ aiMetadata: import("yup").BooleanSchema<boolean, Record<string, any>, boolean>;
61
62
  }> | null>;
62
63
  setSettings: (value: import("yup/lib/object").AssertsShape<{
63
64
  sizeOptimization: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
64
65
  responsiveDimensions: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
65
66
  autoOrientation: import("yup").BooleanSchema<boolean | undefined, Record<string, any>, boolean | undefined>;
67
+ aiMetadata: import("yup").BooleanSchema<boolean, Record<string, any>, boolean>;
66
68
  }>) => Promise<void>;
67
69
  getConfiguration: () => Promise<import("yup/lib/object").AssertsShape<{
68
70
  pageSize: import("yup/lib/number").RequiredNumberSchema<number | undefined, Record<string, any>>;
@@ -116,6 +118,7 @@ export declare const services: {
116
118
  averageDepth: number;
117
119
  maxDepth: number;
118
120
  averageDeviationDepth: number;
121
+ isAIMediaLibraryConfigured: boolean;
119
122
  }>;
120
123
  sendMetrics(): Promise<void>;
121
124
  ensureWeeklyStoredCronSchedule(): Promise<string>;
@@ -149,5 +152,14 @@ export declare const services: {
149
152
  extensions: {
150
153
  signFileUrlsOnDocumentService: () => Promise<void>;
151
154
  };
155
+ aiMetadata: ({ strapi }: {
156
+ strapi: import("@strapi/types/dist/core").Strapi;
157
+ }) => {
158
+ isEnabled(): Promise<boolean>;
159
+ processFiles(files: import("../types").InputFile[]): Promise<({
160
+ altText: string;
161
+ caption: string;
162
+ } | null)[]>;
163
+ };
152
164
  };
153
165
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/services/index.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAUpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/services/index.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWpB,CAAC"}
@@ -25,7 +25,7 @@ declare const _default: ({ strapi }: {
25
25
  }) => Promise<Omit<UploadableFile, 'getStream'>>;
26
26
  upload: ({ data, files, }: {
27
27
  data: Record<string, unknown>;
28
- files: InputFile | InputFile[];
28
+ files: InputFile[];
29
29
  }, opts?: CommonOptions) => Promise<any[]>;
30
30
  updateFileInfo: (id: ID, { name, alternativeText, caption, folder }: FileInfo, opts?: CommonOptions) => Promise<any>;
31
31
  replace: (id: ID, { data, file }: {
@@ -50,6 +50,7 @@ declare const _default: ({ strapi }: {
50
50
  sizeOptimization: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
51
51
  responsiveDimensions: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
52
52
  autoOrientation: import("yup").BooleanSchema<boolean | undefined, Record<string, any>, boolean | undefined>;
53
+ aiMetadata: import("yup").BooleanSchema<boolean, Record<string, any>, boolean>;
53
54
  }> | null>;
54
55
  setSettings: (value: Settings) => Promise<void>;
55
56
  getConfiguration: () => Promise<import("yup/lib/object").AssertsShape<{
@@ -1 +1 @@
1
- {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../../server/src/services/upload.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,IAAI,EAAO,MAAM,eAAe,CAAC;AAK/C,OAAO,KAAK,EAAU,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAEzE,KAAK,IAAI,GAAG;IACV,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1B,KAAK,aAAa,GAAG;IACnB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb,CAAC;qCAgB0B;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;+CAsErB;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,aAChE,QAAQ,QAAQ,CAAC,UACpB;QACL,KAAK,CAAC,EAAE,EAAE,CAAC;QACX,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,KACA,QAAQ,KAAK,cAAc,EAAE,WAAW,CAAC,CAAC;+BAiGxC;QACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;KAChC,SACM,aAAa;yBAiHhB,EAAE,8CACsC,QAAQ,SAC7C,aAAa;kBAyBhB,EAAE,kBACU;QAAE,IAAI,EAAE;YAAE,QAAQ,EAAE,QAAQ,CAAA;SAAE,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,SAC1D,aAAa;kBAkGK,EAAE;uBAgBE,GAAG,KAAQ,QAAQ,IAAI,EAAE,CAAC;uBAS1B,GAAG;;;;;;;;;mBAgBN,IAAI;;;;;;yBAiCJ,QAAQ;;;;;8BAoBH,iBAAiB;IAoBhD;;;OAGG;6BAjUgC,cAAc;;AAxNrD,wBA4hBE"}
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../../server/src/services/upload.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,IAAI,EAAO,MAAM,eAAe,CAAC;AAK/C,OAAO,KAAK,EAAU,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAEzE,KAAK,IAAI,GAAG;IACV,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1B,KAAK,aAAa,GAAG;IACnB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb,CAAC;qCAgB0B;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;+CAsErB;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,aAChE,QAAQ,QAAQ,CAAC,UACpB;QACL,KAAK,CAAC,EAAE,EAAE,CAAC;QACX,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,KACA,QAAQ,KAAK,cAAc,EAAE,WAAW,CAAC,CAAC;+BAiGxC;QACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,KAAK,EAAE,SAAS,EAAE,CAAC;KACpB,SACM,aAAa;yBAiHhB,EAAE,8CACsC,QAAQ,SAC7C,aAAa;kBAyBhB,EAAE,kBACU;QAAE,IAAI,EAAE;YAAE,QAAQ,EAAE,QAAQ,CAAA;SAAE,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,SAC1D,aAAa;kBAkGK,EAAE;uBAgBE,GAAG,KAAQ,QAAQ,IAAI,EAAE,CAAC;uBAS1B,GAAG;;;;;;;;;mBAgBN,IAAI;;;;;;;yBAiCJ,QAAQ;;;;;8BAoBH,iBAAiB;IAoBhD;;;OAGG;6BAjUgC,cAAc;;AAxNrD,wBA4hBE"}