@strapi/upload 5.26.0 → 5.27.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 (119) 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 +355 -0
  6. package/dist/admin/ai/components/AIUploadModal.js.map +1 -0
  7. package/dist/admin/ai/components/AIUploadModal.mjs +333 -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/EditAssetDialog/EditAssetContent.js +5 -5
  14. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  15. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +5 -5
  16. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  17. package/dist/admin/hooks/useAiAvailability.js +22 -0
  18. package/dist/admin/hooks/useAiAvailability.js.map +1 -0
  19. package/dist/admin/hooks/useAiAvailability.mjs +20 -0
  20. package/dist/admin/hooks/useAiAvailability.mjs.map +1 -0
  21. package/dist/admin/hooks/useBulkEdit.js +66 -0
  22. package/dist/admin/hooks/useBulkEdit.js.map +1 -0
  23. package/dist/admin/hooks/useBulkEdit.mjs +64 -0
  24. package/dist/admin/hooks/useBulkEdit.mjs.map +1 -0
  25. package/dist/admin/hooks/useSettings.js +22 -0
  26. package/dist/admin/hooks/useSettings.js.map +1 -0
  27. package/dist/admin/hooks/useSettings.mjs +20 -0
  28. package/dist/admin/hooks/useSettings.mjs.map +1 -0
  29. package/dist/admin/hooks/useUpload.js +25 -14
  30. package/dist/admin/hooks/useUpload.js.map +1 -1
  31. package/dist/admin/hooks/useUpload.mjs +25 -14
  32. package/dist/admin/hooks/useUpload.mjs.map +1 -1
  33. package/dist/admin/package.json.js +5 -5
  34. package/dist/admin/package.json.mjs +5 -5
  35. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js +11 -4
  36. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js.map +1 -1
  37. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs +11 -4
  38. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs.map +1 -1
  39. package/dist/admin/pages/SettingsPage/SettingsPage.js +222 -144
  40. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  41. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +225 -147
  42. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  43. package/dist/admin/pages/SettingsPage/reducer.js +9 -10
  44. package/dist/admin/pages/SettingsPage/reducer.js.map +1 -1
  45. package/dist/admin/pages/SettingsPage/reducer.mjs +9 -10
  46. package/dist/admin/pages/SettingsPage/reducer.mjs.map +1 -1
  47. package/dist/admin/src/ai/components/AIAssetCard.d.ts +13 -0
  48. package/dist/admin/src/ai/components/AIUploadModal.d.ts +55 -0
  49. package/dist/admin/src/components/EditAssetDialog/EditAssetContent.d.ts +3 -1
  50. package/dist/admin/src/hooks/useAiAvailability.d.ts +4 -0
  51. package/dist/admin/src/hooks/useBulkEdit.d.ts +91 -0
  52. package/dist/admin/src/hooks/useSettings.d.ts +7 -0
  53. package/dist/admin/src/hooks/useUpload.d.ts +1 -1
  54. package/dist/admin/src/pages/SettingsPage/reducer.d.ts +3 -12
  55. package/dist/admin/translations/en.json.js +7 -1
  56. package/dist/admin/translations/en.json.js.map +1 -1
  57. package/dist/admin/translations/en.json.mjs +7 -1
  58. package/dist/admin/translations/en.json.mjs.map +1 -1
  59. package/dist/server/bootstrap.js +2 -1
  60. package/dist/server/bootstrap.js.map +1 -1
  61. package/dist/server/bootstrap.mjs +2 -1
  62. package/dist/server/bootstrap.mjs.map +1 -1
  63. package/dist/server/controllers/admin-upload.js +54 -2
  64. package/dist/server/controllers/admin-upload.js.map +1 -1
  65. package/dist/server/controllers/admin-upload.mjs +56 -4
  66. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  67. package/dist/server/controllers/content-api.js +3 -1
  68. package/dist/server/controllers/content-api.js.map +1 -1
  69. package/dist/server/controllers/content-api.mjs +3 -1
  70. package/dist/server/controllers/content-api.mjs.map +1 -1
  71. package/dist/server/controllers/validation/admin/settings.js +2 -1
  72. package/dist/server/controllers/validation/admin/settings.js.map +1 -1
  73. package/dist/server/controllers/validation/admin/settings.mjs +2 -1
  74. package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
  75. package/dist/server/controllers/validation/admin/upload.js +8 -0
  76. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  77. package/dist/server/controllers/validation/admin/upload.mjs +8 -1
  78. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  79. package/dist/server/routes/admin.js +18 -0
  80. package/dist/server/routes/admin.js.map +1 -1
  81. package/dist/server/routes/admin.mjs +18 -0
  82. package/dist/server/routes/admin.mjs.map +1 -1
  83. package/dist/server/services/ai-metadata.js +97 -0
  84. package/dist/server/services/ai-metadata.js.map +1 -0
  85. package/dist/server/services/ai-metadata.mjs +95 -0
  86. package/dist/server/services/ai-metadata.mjs.map +1 -0
  87. package/dist/server/services/index.js +3 -1
  88. package/dist/server/services/index.js.map +1 -1
  89. package/dist/server/services/index.mjs +3 -1
  90. package/dist/server/services/index.mjs.map +1 -1
  91. package/dist/server/services/upload.js.map +1 -1
  92. package/dist/server/services/upload.mjs.map +1 -1
  93. package/dist/server/src/bootstrap.d.ts.map +1 -1
  94. package/dist/server/src/controllers/admin-upload.d.ts +1 -0
  95. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  96. package/dist/server/src/controllers/index.d.ts +1 -0
  97. package/dist/server/src/controllers/index.d.ts.map +1 -1
  98. package/dist/server/src/controllers/validation/admin/settings.d.ts +3 -0
  99. package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -1
  100. package/dist/server/src/controllers/validation/admin/upload.d.ts +42 -0
  101. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
  102. package/dist/server/src/index.d.ts +13 -1
  103. package/dist/server/src/index.d.ts.map +1 -1
  104. package/dist/server/src/routes/admin.d.ts.map +1 -1
  105. package/dist/server/src/services/ai-metadata.d.ts +13 -0
  106. package/dist/server/src/services/ai-metadata.d.ts.map +1 -0
  107. package/dist/server/src/services/index.d.ts +12 -1
  108. package/dist/server/src/services/index.d.ts.map +1 -1
  109. package/dist/server/src/services/upload.d.ts +2 -1
  110. package/dist/server/src/services/upload.d.ts.map +1 -1
  111. package/dist/server/src/types.d.ts +1 -0
  112. package/dist/server/src/types.d.ts.map +1 -1
  113. package/dist/server/src/utils/index.d.ts +2 -0
  114. package/dist/server/src/utils/index.d.ts.map +1 -1
  115. package/dist/server/utils/index.js.map +1 -1
  116. package/dist/server/utils/index.mjs.map +1 -1
  117. package/dist/shared/contracts/files.d.ts +22 -0
  118. package/dist/shared/contracts/settings.d.ts +2 -0
  119. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"admin-upload.mjs","sources":["../../../server/src/controllers/admin-upload.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors, async } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FILE_MODEL_UID } from '../constants';\nimport { validateUploadBody } from './validation/admin/upload';\nimport { findEntityAndCheckPermissions } from './utils/find-entity-and-check-permissions';\nimport { FileInfo } from '../types';\n\nexport default {\n async updateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const data = await validateUploadBody(body);\n\n const file = await uploadService.updateFileInfo(id, data.fileInfo as any, { user });\n\n ctx.body = await pm.sanitizeOutput(file, { action: ACTIONS.read });\n },\n\n async replaceFile(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body, files: { files } = {} },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n if (Array.isArray(files)) {\n throw new errors.ApplicationError('Cannot replace a file with multiple ones');\n }\n\n const data = (await validateUploadBody(body)) as { fileInfo: FileInfo };\n const replacedFile = await uploadService.replace(id, { data, file: files }, { user });\n\n // Sign file urls for private providers\n const signedFile = await getService('file').signFileUrls(replacedFile);\n\n ctx.body = await pm.sanitizeOutput(signedFile, { action: ACTIONS.read });\n },\n\n async uploadFiles(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body, files: { files } = {} },\n } = ctx;\n\n const uploadService = getService('upload');\n const pm = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.create,\n model: FILE_MODEL_UID,\n });\n\n if (!pm.isAllowed) {\n return ctx.forbidden();\n }\n\n const data = await validateUploadBody(body);\n const uploadedFiles = await uploadService.upload({ data, files }, { user });\n\n // Sign file urls for private providers\n const signedFiles = await async.map(uploadedFiles, getService('file').signFileUrls);\n\n ctx.body = await pm.sanitizeOutput(signedFiles, { action: ACTIONS.read });\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new errors.ApplicationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n};\n"],"names":["updateFileInfo","ctx","state","userAbility","user","query","id","request","body","errors","ValidationError","uploadService","getService","pm","findEntityAndCheckPermissions","ACTIONS","update","FILE_MODEL_UID","data","validateUploadBody","file","fileInfo","sanitizeOutput","action","read","replaceFile","files","Array","isArray","ApplicationError","replacedFile","replace","signedFile","signFileUrls","uploadFiles","strapi","service","createPermissionsManager","ability","create","model","isAllowed","forbidden","uploadedFiles","upload","signedFiles","async","map","status","_","isEmpty","size"],"mappings":"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"}
1
+ {"version":3,"file":"admin-upload.mjs","sources":["../../../server/src/controllers/admin-upload.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors, async } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FILE_MODEL_UID } from '../constants';\nimport { validateBulkUpdateBody, validateUploadBody } from './validation/admin/upload';\nimport { findEntityAndCheckPermissions } from './utils/find-entity-and-check-permissions';\nimport { FileInfo } from '../types';\n\nexport default {\n async bulkUpdateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body },\n } = ctx;\n\n const { updates } = await validateBulkUpdateBody(body);\n const uploadService = getService('upload');\n\n const results = await async.map(\n updates,\n async ({ id, fileInfo }: { id: number; fileInfo: FileInfo }) => {\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const updated = await uploadService.updateFileInfo(id, fileInfo as any, { user });\n return pm.sanitizeOutput(updated, { action: ACTIONS.read });\n }\n );\n\n ctx.body = results;\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const data = await validateUploadBody(body);\n\n const file = await uploadService.updateFileInfo(id, data.fileInfo as any, { user });\n\n ctx.body = await pm.sanitizeOutput(file, { action: ACTIONS.read });\n },\n\n async replaceFile(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body, files: { files } = {} },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n if (Array.isArray(files)) {\n throw new errors.ApplicationError('Cannot replace a file with multiple ones');\n }\n\n const data = (await validateUploadBody(body)) as { fileInfo: FileInfo };\n const replacedFile = await uploadService.replace(id, { data, file: files }, { user });\n\n // Sign file urls for private providers\n const signedFile = await getService('file').signFileUrls(replacedFile);\n\n ctx.body = await pm.sanitizeOutput(signedFile, { action: ACTIONS.read });\n },\n\n async uploadFiles(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body, files: { files } = {} },\n } = ctx;\n\n const uploadService = getService('upload');\n const pm = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.create,\n model: FILE_MODEL_UID,\n });\n\n if (!pm.isAllowed) {\n return ctx.forbidden();\n }\n\n const data = await validateUploadBody(body, Array.isArray(files));\n const filesArray = Array.isArray(files) ? files : [files];\n // Upload files first to get thumbnails\n const uploadedFiles = await uploadService.upload({ data, files: filesArray }, { user });\n\n const aiMetadataService = getService('aiMetadata');\n\n // AFTER upload - use thumbnail versions for AI processing\n if (await aiMetadataService.isEnabled()) {\n try {\n // Use thumbnail URLs instead of original files\n const thumbnailFiles = uploadedFiles.map(\n (file) =>\n ({\n filepath: file.formats?.thumbnail?.url || file.url, // Use thumbnail if available\n mimetype: file.mime,\n originalFilename: file.name,\n size: file.formats?.thumbnail?.size || file.size,\n provider: file.provider,\n }) as unknown as any\n );\n\n const metadataResults = await aiMetadataService.processFiles(thumbnailFiles);\n\n // Update the uploaded files with AI metadata\n await Promise.all(\n uploadedFiles.map(async (uploadedFile, index) => {\n const aiMetadata = metadataResults[index];\n if (aiMetadata) {\n await uploadService.updateFileInfo(\n uploadedFile.id,\n {\n alternativeText: aiMetadata.altText,\n caption: aiMetadata.caption,\n },\n { user }\n );\n\n uploadedFiles[index].alternativeText = aiMetadata.altText;\n uploadedFiles[index].caption = aiMetadata.caption;\n }\n })\n );\n } catch (error) {\n strapi.log.warn('AI metadata generation failed, proceeding without AI enhancements', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Sign file urls for private providers\n const signedFiles = await async.map(uploadedFiles, getService('file').signFileUrls);\n\n ctx.body = await pm.sanitizeOutput(signedFiles, { action: ACTIONS.read });\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new errors.ApplicationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n};\n"],"names":["bulkUpdateFileInfo","ctx","state","userAbility","user","request","body","updates","validateBulkUpdateBody","uploadService","getService","results","async","map","id","fileInfo","pm","findEntityAndCheckPermissions","ACTIONS","update","FILE_MODEL_UID","updated","updateFileInfo","sanitizeOutput","action","read","query","errors","ValidationError","data","validateUploadBody","file","replaceFile","files","Array","isArray","ApplicationError","replacedFile","replace","signedFile","signFileUrls","uploadFiles","strapi","service","createPermissionsManager","ability","create","model","isAllowed","forbidden","filesArray","uploadedFiles","upload","aiMetadataService","isEnabled","thumbnailFiles","filepath","formats","thumbnail","url","mimetype","mime","originalFilename","name","size","provider","metadataResults","processFiles","Promise","all","uploadedFile","index","aiMetadata","alternativeText","altText","caption","error","log","warn","Error","message","String","signedFiles","status","_","isEmpty"],"mappings":"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"}
@@ -99,7 +99,9 @@ var contentApi = (({ strapi })=>{
99
99
  }
100
100
  const uploadedFiles = await index.getService('upload').upload({
101
101
  data,
102
- files
102
+ files: Array.isArray(files) ? files : [
103
+ files
104
+ ]
103
105
  });
104
106
  ctx.body = await sanitizeOutput(uploadedFiles, ctx);
105
107
  ctx.status = 201;
@@ -1 +1 @@
1
- {"version":3,"file":"content-api.js","sources":["../../../server/src/controllers/content-api.ts"],"sourcesContent":["import _ from 'lodash';\nimport utils from '@strapi/utils';\n\nimport type { Context } from 'koa';\nimport type { Core } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { FILE_MODEL_UID } from '../constants';\nimport { validateUploadBody } from './validation/content-api/upload';\nimport { FileInfo } from '../types';\n\nconst { ValidationError } = utils.errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const sanitizeOutput = async (data: unknown | unknown[], ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.sanitize.output(data, schema, { auth });\n };\n\n const validateQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.validate.query(data, schema, { auth });\n };\n\n const sanitizeQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.sanitize.query(data, schema, { auth });\n };\n\n return {\n async find(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const files = await getService('upload').findMany(sanitizedQuery);\n\n ctx.body = await sanitizeOutput(files, ctx);\n },\n\n async findOne(ctx: Context) {\n const {\n params: { id },\n } = ctx;\n\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const file = await getService('upload').findOne(id, sanitizedQuery.populate!);\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n ctx.body = await sanitizeOutput(file, ctx);\n },\n\n async destroy(ctx: Context) {\n const {\n params: { id },\n } = ctx;\n\n const file = await getService('upload').findOne(id);\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n await getService('upload').remove(file);\n\n ctx.body = await sanitizeOutput(file, ctx);\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n query: { id },\n request: { body },\n } = ctx;\n const data = await validateUploadBody(body);\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const result = await getService('upload').updateFileInfo(id, data.fileInfo as any);\n\n ctx.body = await sanitizeOutput(result, ctx);\n },\n\n async replaceFile(ctx: Context) {\n const {\n query: { id },\n request: { body, files: { files } = {} },\n } = ctx;\n\n // cannot replace with more than one file\n if (Array.isArray(files)) {\n throw new ValidationError('Cannot replace a file with multiple ones');\n }\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const data = (await validateUploadBody(body)) as { fileInfo: FileInfo };\n\n const replacedFiles = await getService('upload').replace(id, { data, file: files });\n\n ctx.body = await sanitizeOutput(replacedFiles, ctx);\n },\n\n async uploadFiles(ctx: Context) {\n const {\n request: { body, files: { files } = {} },\n } = ctx;\n\n const data: any = await validateUploadBody(body, Array.isArray(files));\n\n const apiUploadFolderService = getService('api-upload-folder');\n\n const apiUploadFolder = await apiUploadFolderService.getAPIUploadFolder();\n\n if (Array.isArray(files)) {\n data.fileInfo = data.fileInfo || [];\n data.fileInfo = files.map((_f, i) => ({ ...data.fileInfo[i], folder: apiUploadFolder.id }));\n } else {\n data.fileInfo = { ...data.fileInfo, folder: apiUploadFolder.id };\n }\n\n const uploadedFiles = await getService('upload').upload({\n data,\n files,\n });\n\n ctx.body = await sanitizeOutput(uploadedFiles as any, ctx);\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new ValidationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n };\n};\n"],"names":["ValidationError","utils","errors","strapi","sanitizeOutput","data","ctx","schema","getModel","FILE_MODEL_UID","auth","state","contentAPI","sanitize","output","validateQuery","validate","query","sanitizeQuery","find","sanitizedQuery","files","getService","findMany","body","findOne","params","id","file","populate","notFound","destroy","remove","updateFileInfo","request","validateUploadBody","result","fileInfo","replaceFile","Array","isArray","replacedFiles","replace","uploadFiles","apiUploadFolderService","apiUploadFolder","getAPIUploadFolder","map","_f","i","folder","uploadedFiles","upload","status","_","isEmpty","size"],"mappings":"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"}
1
+ {"version":3,"file":"content-api.js","sources":["../../../server/src/controllers/content-api.ts"],"sourcesContent":["import _ from 'lodash';\nimport utils from '@strapi/utils';\n\nimport type { Context } from 'koa';\nimport type { Core } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { FILE_MODEL_UID } from '../constants';\nimport { validateUploadBody } from './validation/content-api/upload';\nimport { FileInfo } from '../types';\n\nconst { ValidationError } = utils.errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const sanitizeOutput = async (data: unknown | unknown[], ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.sanitize.output(data, schema, { auth });\n };\n\n const validateQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.validate.query(data, schema, { auth });\n };\n\n const sanitizeQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.sanitize.query(data, schema, { auth });\n };\n\n return {\n async find(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const files = await getService('upload').findMany(sanitizedQuery);\n\n ctx.body = await sanitizeOutput(files, ctx);\n },\n\n async findOne(ctx: Context) {\n const {\n params: { id },\n } = ctx;\n\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const file = await getService('upload').findOne(id, sanitizedQuery.populate!);\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n ctx.body = await sanitizeOutput(file, ctx);\n },\n\n async destroy(ctx: Context) {\n const {\n params: { id },\n } = ctx;\n\n const file = await getService('upload').findOne(id);\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n await getService('upload').remove(file);\n\n ctx.body = await sanitizeOutput(file, ctx);\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n query: { id },\n request: { body },\n } = ctx;\n const data = await validateUploadBody(body);\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const result = await getService('upload').updateFileInfo(id, data.fileInfo as any);\n\n ctx.body = await sanitizeOutput(result, ctx);\n },\n\n async replaceFile(ctx: Context) {\n const {\n query: { id },\n request: { body, files: { files } = {} },\n } = ctx;\n\n // cannot replace with more than one file\n if (Array.isArray(files)) {\n throw new ValidationError('Cannot replace a file with multiple ones');\n }\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const data = (await validateUploadBody(body)) as { fileInfo: FileInfo };\n\n const replacedFiles = await getService('upload').replace(id, { data, file: files });\n\n ctx.body = await sanitizeOutput(replacedFiles, ctx);\n },\n\n async uploadFiles(ctx: Context) {\n const {\n request: { body, files: { files } = {} },\n } = ctx;\n\n const data: any = await validateUploadBody(body, Array.isArray(files));\n\n const apiUploadFolderService = getService('api-upload-folder');\n\n const apiUploadFolder = await apiUploadFolderService.getAPIUploadFolder();\n\n if (Array.isArray(files)) {\n data.fileInfo = data.fileInfo || [];\n data.fileInfo = files.map((_f, i) => ({ ...data.fileInfo[i], folder: apiUploadFolder.id }));\n } else {\n data.fileInfo = { ...data.fileInfo, folder: apiUploadFolder.id };\n }\n\n const uploadedFiles = await getService('upload').upload({\n data,\n files: Array.isArray(files) ? files : [files],\n });\n\n ctx.body = await sanitizeOutput(uploadedFiles as any, ctx);\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new ValidationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n };\n};\n"],"names":["ValidationError","utils","errors","strapi","sanitizeOutput","data","ctx","schema","getModel","FILE_MODEL_UID","auth","state","contentAPI","sanitize","output","validateQuery","validate","query","sanitizeQuery","find","sanitizedQuery","files","getService","findMany","body","findOne","params","id","file","populate","notFound","destroy","remove","updateFileInfo","request","validateUploadBody","result","fileInfo","replaceFile","Array","isArray","replacedFiles","replace","uploadFiles","apiUploadFolderService","apiUploadFolder","getAPIUploadFolder","map","_f","i","folder","uploadedFiles","upload","status","_","isEmpty","size"],"mappings":"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"}
@@ -97,7 +97,9 @@ var contentApi = (({ strapi })=>{
97
97
  }
98
98
  const uploadedFiles = await getService('upload').upload({
99
99
  data,
100
- files
100
+ files: Array.isArray(files) ? files : [
101
+ files
102
+ ]
101
103
  });
102
104
  ctx.body = await sanitizeOutput(uploadedFiles, ctx);
103
105
  ctx.status = 201;
@@ -1 +1 @@
1
- {"version":3,"file":"content-api.mjs","sources":["../../../server/src/controllers/content-api.ts"],"sourcesContent":["import _ from 'lodash';\nimport utils from '@strapi/utils';\n\nimport type { Context } from 'koa';\nimport type { Core } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { FILE_MODEL_UID } from '../constants';\nimport { validateUploadBody } from './validation/content-api/upload';\nimport { FileInfo } from '../types';\n\nconst { ValidationError } = utils.errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const sanitizeOutput = async (data: unknown | unknown[], ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.sanitize.output(data, schema, { auth });\n };\n\n const validateQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.validate.query(data, schema, { auth });\n };\n\n const sanitizeQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.sanitize.query(data, schema, { auth });\n };\n\n return {\n async find(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const files = await getService('upload').findMany(sanitizedQuery);\n\n ctx.body = await sanitizeOutput(files, ctx);\n },\n\n async findOne(ctx: Context) {\n const {\n params: { id },\n } = ctx;\n\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const file = await getService('upload').findOne(id, sanitizedQuery.populate!);\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n ctx.body = await sanitizeOutput(file, ctx);\n },\n\n async destroy(ctx: Context) {\n const {\n params: { id },\n } = ctx;\n\n const file = await getService('upload').findOne(id);\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n await getService('upload').remove(file);\n\n ctx.body = await sanitizeOutput(file, ctx);\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n query: { id },\n request: { body },\n } = ctx;\n const data = await validateUploadBody(body);\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const result = await getService('upload').updateFileInfo(id, data.fileInfo as any);\n\n ctx.body = await sanitizeOutput(result, ctx);\n },\n\n async replaceFile(ctx: Context) {\n const {\n query: { id },\n request: { body, files: { files } = {} },\n } = ctx;\n\n // cannot replace with more than one file\n if (Array.isArray(files)) {\n throw new ValidationError('Cannot replace a file with multiple ones');\n }\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const data = (await validateUploadBody(body)) as { fileInfo: FileInfo };\n\n const replacedFiles = await getService('upload').replace(id, { data, file: files });\n\n ctx.body = await sanitizeOutput(replacedFiles, ctx);\n },\n\n async uploadFiles(ctx: Context) {\n const {\n request: { body, files: { files } = {} },\n } = ctx;\n\n const data: any = await validateUploadBody(body, Array.isArray(files));\n\n const apiUploadFolderService = getService('api-upload-folder');\n\n const apiUploadFolder = await apiUploadFolderService.getAPIUploadFolder();\n\n if (Array.isArray(files)) {\n data.fileInfo = data.fileInfo || [];\n data.fileInfo = files.map((_f, i) => ({ ...data.fileInfo[i], folder: apiUploadFolder.id }));\n } else {\n data.fileInfo = { ...data.fileInfo, folder: apiUploadFolder.id };\n }\n\n const uploadedFiles = await getService('upload').upload({\n data,\n files,\n });\n\n ctx.body = await sanitizeOutput(uploadedFiles as any, ctx);\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new ValidationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n };\n};\n"],"names":["ValidationError","utils","errors","strapi","sanitizeOutput","data","ctx","schema","getModel","FILE_MODEL_UID","auth","state","contentAPI","sanitize","output","validateQuery","validate","query","sanitizeQuery","find","sanitizedQuery","files","getService","findMany","body","findOne","params","id","file","populate","notFound","destroy","remove","updateFileInfo","request","validateUploadBody","result","fileInfo","replaceFile","Array","isArray","replacedFiles","replace","uploadFiles","apiUploadFolderService","apiUploadFolder","getAPIUploadFolder","map","_f","i","folder","uploadedFiles","upload","status","_","isEmpty","size"],"mappings":"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"}
1
+ {"version":3,"file":"content-api.mjs","sources":["../../../server/src/controllers/content-api.ts"],"sourcesContent":["import _ from 'lodash';\nimport utils from '@strapi/utils';\n\nimport type { Context } from 'koa';\nimport type { Core } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { FILE_MODEL_UID } from '../constants';\nimport { validateUploadBody } from './validation/content-api/upload';\nimport { FileInfo } from '../types';\n\nconst { ValidationError } = utils.errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const sanitizeOutput = async (data: unknown | unknown[], ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.sanitize.output(data, schema, { auth });\n };\n\n const validateQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.validate.query(data, schema, { auth });\n };\n\n const sanitizeQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.sanitize.query(data, schema, { auth });\n };\n\n return {\n async find(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const files = await getService('upload').findMany(sanitizedQuery);\n\n ctx.body = await sanitizeOutput(files, ctx);\n },\n\n async findOne(ctx: Context) {\n const {\n params: { id },\n } = ctx;\n\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const file = await getService('upload').findOne(id, sanitizedQuery.populate!);\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n ctx.body = await sanitizeOutput(file, ctx);\n },\n\n async destroy(ctx: Context) {\n const {\n params: { id },\n } = ctx;\n\n const file = await getService('upload').findOne(id);\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n await getService('upload').remove(file);\n\n ctx.body = await sanitizeOutput(file, ctx);\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n query: { id },\n request: { body },\n } = ctx;\n const data = await validateUploadBody(body);\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const result = await getService('upload').updateFileInfo(id, data.fileInfo as any);\n\n ctx.body = await sanitizeOutput(result, ctx);\n },\n\n async replaceFile(ctx: Context) {\n const {\n query: { id },\n request: { body, files: { files } = {} },\n } = ctx;\n\n // cannot replace with more than one file\n if (Array.isArray(files)) {\n throw new ValidationError('Cannot replace a file with multiple ones');\n }\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const data = (await validateUploadBody(body)) as { fileInfo: FileInfo };\n\n const replacedFiles = await getService('upload').replace(id, { data, file: files });\n\n ctx.body = await sanitizeOutput(replacedFiles, ctx);\n },\n\n async uploadFiles(ctx: Context) {\n const {\n request: { body, files: { files } = {} },\n } = ctx;\n\n const data: any = await validateUploadBody(body, Array.isArray(files));\n\n const apiUploadFolderService = getService('api-upload-folder');\n\n const apiUploadFolder = await apiUploadFolderService.getAPIUploadFolder();\n\n if (Array.isArray(files)) {\n data.fileInfo = data.fileInfo || [];\n data.fileInfo = files.map((_f, i) => ({ ...data.fileInfo[i], folder: apiUploadFolder.id }));\n } else {\n data.fileInfo = { ...data.fileInfo, folder: apiUploadFolder.id };\n }\n\n const uploadedFiles = await getService('upload').upload({\n data,\n files: Array.isArray(files) ? files : [files],\n });\n\n ctx.body = await sanitizeOutput(uploadedFiles as any, ctx);\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new ValidationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n };\n};\n"],"names":["ValidationError","utils","errors","strapi","sanitizeOutput","data","ctx","schema","getModel","FILE_MODEL_UID","auth","state","contentAPI","sanitize","output","validateQuery","validate","query","sanitizeQuery","find","sanitizedQuery","files","getService","findMany","body","findOne","params","id","file","populate","notFound","destroy","remove","updateFileInfo","request","validateUploadBody","result","fileInfo","replaceFile","Array","isArray","replacedFiles","replace","uploadFiles","apiUploadFolderService","apiUploadFolder","getAPIUploadFolder","map","_f","i","folder","uploadedFiles","upload","status","_","isEmpty","size"],"mappings":"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"}
@@ -5,7 +5,8 @@ var utils = require('@strapi/utils');
5
5
  const settingsSchema = utils.yup.object({
6
6
  sizeOptimization: utils.yup.boolean().required(),
7
7
  responsiveDimensions: utils.yup.boolean().required(),
8
- autoOrientation: utils.yup.boolean()
8
+ autoOrientation: utils.yup.boolean(),
9
+ aiMetadata: utils.yup.boolean().default(true)
9
10
  });
10
11
  var validateSettings = utils.validateYupSchema(settingsSchema);
11
12
 
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sources":["../../../../../server/src/controllers/validation/admin/settings.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\n\nconst settingsSchema = yup.object({\n sizeOptimization: yup.boolean().required(),\n responsiveDimensions: yup.boolean().required(),\n autoOrientation: yup.boolean(),\n});\n\nexport default validateYupSchema(settingsSchema);\n\nexport type Settings = yup.InferType<typeof settingsSchema>;\n"],"names":["settingsSchema","yup","object","sizeOptimization","boolean","required","responsiveDimensions","autoOrientation","validateYupSchema"],"mappings":";;;;AAEA,MAAMA,cAAAA,GAAiBC,SAAIC,CAAAA,MAAM,CAAC;IAChCC,gBAAkBF,EAAAA,SAAAA,CAAIG,OAAO,EAAA,CAAGC,QAAQ,EAAA;IACxCC,oBAAsBL,EAAAA,SAAAA,CAAIG,OAAO,EAAA,CAAGC,QAAQ,EAAA;AAC5CE,IAAAA,eAAAA,EAAiBN,UAAIG,OAAO;AAC9B,CAAA,CAAA;AAEA,uBAAeI,wBAAkBR,cAAgB,CAAA;;;;"}
1
+ {"version":3,"file":"settings.js","sources":["../../../../../server/src/controllers/validation/admin/settings.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\n\nconst settingsSchema = yup.object({\n sizeOptimization: yup.boolean().required(),\n responsiveDimensions: yup.boolean().required(),\n autoOrientation: yup.boolean(),\n aiMetadata: yup.boolean().default(true),\n});\n\nexport default validateYupSchema(settingsSchema);\n\nexport type Settings = yup.InferType<typeof settingsSchema>;\n"],"names":["settingsSchema","yup","object","sizeOptimization","boolean","required","responsiveDimensions","autoOrientation","aiMetadata","default","validateYupSchema"],"mappings":";;;;AAEA,MAAMA,cAAAA,GAAiBC,SAAIC,CAAAA,MAAM,CAAC;IAChCC,gBAAkBF,EAAAA,SAAAA,CAAIG,OAAO,EAAA,CAAGC,QAAQ,EAAA;IACxCC,oBAAsBL,EAAAA,SAAAA,CAAIG,OAAO,EAAA,CAAGC,QAAQ,EAAA;AAC5CE,IAAAA,eAAAA,EAAiBN,UAAIG,OAAO,EAAA;AAC5BI,IAAAA,UAAAA,EAAYP,SAAIG,CAAAA,OAAO,EAAGK,CAAAA,OAAO,CAAC,IAAA;AACpC,CAAA,CAAA;AAEA,uBAAeC,wBAAkBV,cAAgB,CAAA;;;;"}
@@ -3,7 +3,8 @@ import { yup, validateYupSchema } from '@strapi/utils';
3
3
  const settingsSchema = yup.object({
4
4
  sizeOptimization: yup.boolean().required(),
5
5
  responsiveDimensions: yup.boolean().required(),
6
- autoOrientation: yup.boolean()
6
+ autoOrientation: yup.boolean(),
7
+ aiMetadata: yup.boolean().default(true)
7
8
  });
8
9
  var validateSettings = validateYupSchema(settingsSchema);
9
10
 
@@ -1 +1 @@
1
- {"version":3,"file":"settings.mjs","sources":["../../../../../server/src/controllers/validation/admin/settings.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\n\nconst settingsSchema = yup.object({\n sizeOptimization: yup.boolean().required(),\n responsiveDimensions: yup.boolean().required(),\n autoOrientation: yup.boolean(),\n});\n\nexport default validateYupSchema(settingsSchema);\n\nexport type Settings = yup.InferType<typeof settingsSchema>;\n"],"names":["settingsSchema","yup","object","sizeOptimization","boolean","required","responsiveDimensions","autoOrientation","validateYupSchema"],"mappings":";;AAEA,MAAMA,cAAAA,GAAiBC,GAAIC,CAAAA,MAAM,CAAC;IAChCC,gBAAkBF,EAAAA,GAAAA,CAAIG,OAAO,EAAA,CAAGC,QAAQ,EAAA;IACxCC,oBAAsBL,EAAAA,GAAAA,CAAIG,OAAO,EAAA,CAAGC,QAAQ,EAAA;AAC5CE,IAAAA,eAAAA,EAAiBN,IAAIG,OAAO;AAC9B,CAAA,CAAA;AAEA,uBAAeI,kBAAkBR,cAAgB,CAAA;;;;"}
1
+ {"version":3,"file":"settings.mjs","sources":["../../../../../server/src/controllers/validation/admin/settings.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\n\nconst settingsSchema = yup.object({\n sizeOptimization: yup.boolean().required(),\n responsiveDimensions: yup.boolean().required(),\n autoOrientation: yup.boolean(),\n aiMetadata: yup.boolean().default(true),\n});\n\nexport default validateYupSchema(settingsSchema);\n\nexport type Settings = yup.InferType<typeof settingsSchema>;\n"],"names":["settingsSchema","yup","object","sizeOptimization","boolean","required","responsiveDimensions","autoOrientation","aiMetadata","default","validateYupSchema"],"mappings":";;AAEA,MAAMA,cAAAA,GAAiBC,GAAIC,CAAAA,MAAM,CAAC;IAChCC,gBAAkBF,EAAAA,GAAAA,CAAIG,OAAO,EAAA,CAAGC,QAAQ,EAAA;IACxCC,oBAAsBL,EAAAA,GAAAA,CAAIG,OAAO,EAAA,CAAGC,QAAQ,EAAA;AAC5CE,IAAAA,eAAAA,EAAiBN,IAAIG,OAAO,EAAA;AAC5BI,IAAAA,UAAAA,EAAYP,GAAIG,CAAAA,OAAO,EAAGK,CAAAA,OAAO,CAAC,IAAA;AACpC,CAAA,CAAA;AAEA,uBAAeC,kBAAkBV,cAAgB,CAAA;;;;"}
@@ -30,6 +30,14 @@ const validateUploadBody = (data = {}, isMulti = false)=>{
30
30
  strict: false
31
31
  })(data);
32
32
  };
33
+ const bulkUpdatesSchema = utils.yup.object({
34
+ updates: utils.yup.array().of(utils.yup.object({
35
+ id: utils.yup.number().required(),
36
+ fileInfo: fileInfoSchema.required()
37
+ })).min(1).required()
38
+ });
39
+ const validateBulkUpdateBody = utils.validateYupSchema(bulkUpdatesSchema);
33
40
 
41
+ exports.validateBulkUpdateBody = validateBulkUpdateBody;
34
42
  exports.validateUploadBody = validateUploadBody;
35
43
  //# sourceMappingURL=upload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"upload.js","sources":["../../../../../server/src/controllers/validation/admin/upload.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport { isNil } from 'lodash/fp';\nimport { getService } from '../../../utils';\n\nconst fileInfoSchema = yup.object({\n name: yup.string().nullable(),\n alternativeText: yup.string().nullable(),\n caption: yup.string().nullable(),\n folder: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'the folder does not exist', async (folderId) => {\n if (isNil(folderId)) {\n return true;\n }\n\n const exists = await getService('folder').exists({ id: folderId });\n\n return exists;\n }),\n});\n\nconst uploadSchema = yup.object({\n fileInfo: fileInfoSchema,\n});\n\nconst multiUploadSchema = yup.object({\n fileInfo: yup.array().of(fileInfoSchema),\n});\n\nconst validateUploadBody = (data = {}, isMulti = false) => {\n const schema = isMulti ? multiUploadSchema : uploadSchema;\n\n return validateYupSchema(schema, { strict: false })(data);\n};\n\nexport { validateUploadBody };\n\nexport type UploadBody =\n | yup.InferType<typeof uploadSchema>\n | yup.InferType<typeof multiUploadSchema>;\n"],"names":["fileInfoSchema","yup","object","name","string","nullable","alternativeText","caption","folder","strapiID","test","folderId","isNil","exists","getService","id","uploadSchema","fileInfo","multiUploadSchema","array","of","validateUploadBody","data","isMulti","schema","validateYupSchema","strict"],"mappings":";;;;;;AAIA,MAAMA,cAAAA,GAAiBC,SAAIC,CAAAA,MAAM,CAAC;IAChCC,IAAMF,EAAAA,SAAAA,CAAIG,MAAM,EAAA,CAAGC,QAAQ,EAAA;IAC3BC,eAAiBL,EAAAA,SAAAA,CAAIG,MAAM,EAAA,CAAGC,QAAQ,EAAA;IACtCE,OAASN,EAAAA,SAAAA,CAAIG,MAAM,EAAA,CAAGC,QAAQ,EAAA;IAC9BG,MAAQP,EAAAA,SAAAA,CACLQ,QAAQ,EACRJ,CAAAA,QAAQ,GACRK,IAAI,CAAC,eAAiB,EAAA,2BAAA,EAA6B,OAAOC,QAAAA,GAAAA;AACzD,QAAA,IAAIC,SAAMD,QAAW,CAAA,EAAA;YACnB,OAAO,IAAA;AACT;AAEA,QAAA,MAAME,MAAS,GAAA,MAAMC,gBAAW,CAAA,QAAA,CAAA,CAAUD,MAAM,CAAC;YAAEE,EAAIJ,EAAAA;AAAS,SAAA,CAAA;QAEhE,OAAOE,MAAAA;AACT,KAAA;AACJ,CAAA,CAAA;AAEA,MAAMG,YAAAA,GAAef,SAAIC,CAAAA,MAAM,CAAC;IAC9Be,QAAUjB,EAAAA;AACZ,CAAA,CAAA;AAEA,MAAMkB,iBAAAA,GAAoBjB,SAAIC,CAAAA,MAAM,CAAC;AACnCe,IAAAA,QAAAA,EAAUhB,SAAIkB,CAAAA,KAAK,EAAGC,CAAAA,EAAE,CAACpB,cAAAA;AAC3B,CAAA,CAAA;AAEA,MAAMqB,qBAAqB,CAACC,IAAAA,GAAO,EAAE,EAAEC,UAAU,KAAK,GAAA;IACpD,MAAMC,MAAAA,GAASD,UAAUL,iBAAoBF,GAAAA,YAAAA;AAE7C,IAAA,OAAOS,wBAAkBD,MAAQ,EAAA;QAAEE,MAAQ,EAAA;KAASJ,CAAAA,CAAAA,IAAAA,CAAAA;AACtD;;;;"}
1
+ {"version":3,"file":"upload.js","sources":["../../../../../server/src/controllers/validation/admin/upload.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport { isNil } from 'lodash/fp';\nimport { getService } from '../../../utils';\n\nconst fileInfoSchema = yup.object({\n name: yup.string().nullable(),\n alternativeText: yup.string().nullable(),\n caption: yup.string().nullable(),\n folder: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'the folder does not exist', async (folderId) => {\n if (isNil(folderId)) {\n return true;\n }\n\n const exists = await getService('folder').exists({ id: folderId });\n\n return exists;\n }),\n});\n\nconst uploadSchema = yup.object({\n fileInfo: fileInfoSchema,\n});\n\nconst multiUploadSchema = yup.object({\n fileInfo: yup.array().of(fileInfoSchema),\n});\n\nconst validateUploadBody = (data = {}, isMulti = false) => {\n const schema = isMulti ? multiUploadSchema : uploadSchema;\n\n return validateYupSchema(schema, { strict: false })(data);\n};\n\nexport { validateUploadBody };\n\nexport type UploadBody =\n | yup.InferType<typeof uploadSchema>\n | yup.InferType<typeof multiUploadSchema>;\n\nconst bulkUpdatesSchema = yup.object({\n updates: yup\n .array()\n .of(\n yup.object({\n id: yup.number().required(),\n fileInfo: fileInfoSchema.required(),\n })\n )\n .min(1)\n .required(),\n});\n\nexport const validateBulkUpdateBody = validateYupSchema(bulkUpdatesSchema);\n"],"names":["fileInfoSchema","yup","object","name","string","nullable","alternativeText","caption","folder","strapiID","test","folderId","isNil","exists","getService","id","uploadSchema","fileInfo","multiUploadSchema","array","of","validateUploadBody","data","isMulti","schema","validateYupSchema","strict","bulkUpdatesSchema","updates","number","required","min","validateBulkUpdateBody"],"mappings":";;;;;;AAIA,MAAMA,cAAAA,GAAiBC,SAAIC,CAAAA,MAAM,CAAC;IAChCC,IAAMF,EAAAA,SAAAA,CAAIG,MAAM,EAAA,CAAGC,QAAQ,EAAA;IAC3BC,eAAiBL,EAAAA,SAAAA,CAAIG,MAAM,EAAA,CAAGC,QAAQ,EAAA;IACtCE,OAASN,EAAAA,SAAAA,CAAIG,MAAM,EAAA,CAAGC,QAAQ,EAAA;IAC9BG,MAAQP,EAAAA,SAAAA,CACLQ,QAAQ,EACRJ,CAAAA,QAAQ,GACRK,IAAI,CAAC,eAAiB,EAAA,2BAAA,EAA6B,OAAOC,QAAAA,GAAAA;AACzD,QAAA,IAAIC,SAAMD,QAAW,CAAA,EAAA;YACnB,OAAO,IAAA;AACT;AAEA,QAAA,MAAME,MAAS,GAAA,MAAMC,gBAAW,CAAA,QAAA,CAAA,CAAUD,MAAM,CAAC;YAAEE,EAAIJ,EAAAA;AAAS,SAAA,CAAA;QAEhE,OAAOE,MAAAA;AACT,KAAA;AACJ,CAAA,CAAA;AAEA,MAAMG,YAAAA,GAAef,SAAIC,CAAAA,MAAM,CAAC;IAC9Be,QAAUjB,EAAAA;AACZ,CAAA,CAAA;AAEA,MAAMkB,iBAAAA,GAAoBjB,SAAIC,CAAAA,MAAM,CAAC;AACnCe,IAAAA,QAAAA,EAAUhB,SAAIkB,CAAAA,KAAK,EAAGC,CAAAA,EAAE,CAACpB,cAAAA;AAC3B,CAAA,CAAA;AAEA,MAAMqB,qBAAqB,CAACC,IAAAA,GAAO,EAAE,EAAEC,UAAU,KAAK,GAAA;IACpD,MAAMC,MAAAA,GAASD,UAAUL,iBAAoBF,GAAAA,YAAAA;AAE7C,IAAA,OAAOS,wBAAkBD,MAAQ,EAAA;QAAEE,MAAQ,EAAA;KAASJ,CAAAA,CAAAA,IAAAA,CAAAA;AACtD;AAQA,MAAMK,iBAAAA,GAAoB1B,SAAIC,CAAAA,MAAM,CAAC;AACnC0B,IAAAA,OAAAA,EAAS3B,UACNkB,KAAK,EAAA,CACLC,EAAE,CACDnB,SAAAA,CAAIC,MAAM,CAAC;QACTa,EAAId,EAAAA,SAAAA,CAAI4B,MAAM,EAAA,CAAGC,QAAQ,EAAA;AACzBb,QAAAA,QAAAA,EAAUjB,eAAe8B,QAAQ;KAGpCC,CAAAA,CAAAA,CAAAA,GAAG,CAAC,CAAA,CAAA,CACJD,QAAQ;AACb,CAAA,CAAA;AAEO,MAAME,sBAAyBP,GAAAA,uBAAAA,CAAkBE,iBAAmB;;;;;"}
@@ -28,6 +28,13 @@ const validateUploadBody = (data = {}, isMulti = false)=>{
28
28
  strict: false
29
29
  })(data);
30
30
  };
31
+ const bulkUpdatesSchema = yup.object({
32
+ updates: yup.array().of(yup.object({
33
+ id: yup.number().required(),
34
+ fileInfo: fileInfoSchema.required()
35
+ })).min(1).required()
36
+ });
37
+ const validateBulkUpdateBody = validateYupSchema(bulkUpdatesSchema);
31
38
 
32
- export { validateUploadBody };
39
+ export { validateBulkUpdateBody, validateUploadBody };
33
40
  //# sourceMappingURL=upload.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"upload.mjs","sources":["../../../../../server/src/controllers/validation/admin/upload.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport { isNil } from 'lodash/fp';\nimport { getService } from '../../../utils';\n\nconst fileInfoSchema = yup.object({\n name: yup.string().nullable(),\n alternativeText: yup.string().nullable(),\n caption: yup.string().nullable(),\n folder: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'the folder does not exist', async (folderId) => {\n if (isNil(folderId)) {\n return true;\n }\n\n const exists = await getService('folder').exists({ id: folderId });\n\n return exists;\n }),\n});\n\nconst uploadSchema = yup.object({\n fileInfo: fileInfoSchema,\n});\n\nconst multiUploadSchema = yup.object({\n fileInfo: yup.array().of(fileInfoSchema),\n});\n\nconst validateUploadBody = (data = {}, isMulti = false) => {\n const schema = isMulti ? multiUploadSchema : uploadSchema;\n\n return validateYupSchema(schema, { strict: false })(data);\n};\n\nexport { validateUploadBody };\n\nexport type UploadBody =\n | yup.InferType<typeof uploadSchema>\n | yup.InferType<typeof multiUploadSchema>;\n"],"names":["fileInfoSchema","yup","object","name","string","nullable","alternativeText","caption","folder","strapiID","test","folderId","isNil","exists","getService","id","uploadSchema","fileInfo","multiUploadSchema","array","of","validateUploadBody","data","isMulti","schema","validateYupSchema","strict"],"mappings":";;;;AAIA,MAAMA,cAAAA,GAAiBC,GAAIC,CAAAA,MAAM,CAAC;IAChCC,IAAMF,EAAAA,GAAAA,CAAIG,MAAM,EAAA,CAAGC,QAAQ,EAAA;IAC3BC,eAAiBL,EAAAA,GAAAA,CAAIG,MAAM,EAAA,CAAGC,QAAQ,EAAA;IACtCE,OAASN,EAAAA,GAAAA,CAAIG,MAAM,EAAA,CAAGC,QAAQ,EAAA;IAC9BG,MAAQP,EAAAA,GAAAA,CACLQ,QAAQ,EACRJ,CAAAA,QAAQ,GACRK,IAAI,CAAC,eAAiB,EAAA,2BAAA,EAA6B,OAAOC,QAAAA,GAAAA;AACzD,QAAA,IAAIC,MAAMD,QAAW,CAAA,EAAA;YACnB,OAAO,IAAA;AACT;AAEA,QAAA,MAAME,MAAS,GAAA,MAAMC,UAAW,CAAA,QAAA,CAAA,CAAUD,MAAM,CAAC;YAAEE,EAAIJ,EAAAA;AAAS,SAAA,CAAA;QAEhE,OAAOE,MAAAA;AACT,KAAA;AACJ,CAAA,CAAA;AAEA,MAAMG,YAAAA,GAAef,GAAIC,CAAAA,MAAM,CAAC;IAC9Be,QAAUjB,EAAAA;AACZ,CAAA,CAAA;AAEA,MAAMkB,iBAAAA,GAAoBjB,GAAIC,CAAAA,MAAM,CAAC;AACnCe,IAAAA,QAAAA,EAAUhB,GAAIkB,CAAAA,KAAK,EAAGC,CAAAA,EAAE,CAACpB,cAAAA;AAC3B,CAAA,CAAA;AAEA,MAAMqB,qBAAqB,CAACC,IAAAA,GAAO,EAAE,EAAEC,UAAU,KAAK,GAAA;IACpD,MAAMC,MAAAA,GAASD,UAAUL,iBAAoBF,GAAAA,YAAAA;AAE7C,IAAA,OAAOS,kBAAkBD,MAAQ,EAAA;QAAEE,MAAQ,EAAA;KAASJ,CAAAA,CAAAA,IAAAA,CAAAA;AACtD;;;;"}
1
+ {"version":3,"file":"upload.mjs","sources":["../../../../../server/src/controllers/validation/admin/upload.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport { isNil } from 'lodash/fp';\nimport { getService } from '../../../utils';\n\nconst fileInfoSchema = yup.object({\n name: yup.string().nullable(),\n alternativeText: yup.string().nullable(),\n caption: yup.string().nullable(),\n folder: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'the folder does not exist', async (folderId) => {\n if (isNil(folderId)) {\n return true;\n }\n\n const exists = await getService('folder').exists({ id: folderId });\n\n return exists;\n }),\n});\n\nconst uploadSchema = yup.object({\n fileInfo: fileInfoSchema,\n});\n\nconst multiUploadSchema = yup.object({\n fileInfo: yup.array().of(fileInfoSchema),\n});\n\nconst validateUploadBody = (data = {}, isMulti = false) => {\n const schema = isMulti ? multiUploadSchema : uploadSchema;\n\n return validateYupSchema(schema, { strict: false })(data);\n};\n\nexport { validateUploadBody };\n\nexport type UploadBody =\n | yup.InferType<typeof uploadSchema>\n | yup.InferType<typeof multiUploadSchema>;\n\nconst bulkUpdatesSchema = yup.object({\n updates: yup\n .array()\n .of(\n yup.object({\n id: yup.number().required(),\n fileInfo: fileInfoSchema.required(),\n })\n )\n .min(1)\n .required(),\n});\n\nexport const validateBulkUpdateBody = validateYupSchema(bulkUpdatesSchema);\n"],"names":["fileInfoSchema","yup","object","name","string","nullable","alternativeText","caption","folder","strapiID","test","folderId","isNil","exists","getService","id","uploadSchema","fileInfo","multiUploadSchema","array","of","validateUploadBody","data","isMulti","schema","validateYupSchema","strict","bulkUpdatesSchema","updates","number","required","min","validateBulkUpdateBody"],"mappings":";;;;AAIA,MAAMA,cAAAA,GAAiBC,GAAIC,CAAAA,MAAM,CAAC;IAChCC,IAAMF,EAAAA,GAAAA,CAAIG,MAAM,EAAA,CAAGC,QAAQ,EAAA;IAC3BC,eAAiBL,EAAAA,GAAAA,CAAIG,MAAM,EAAA,CAAGC,QAAQ,EAAA;IACtCE,OAASN,EAAAA,GAAAA,CAAIG,MAAM,EAAA,CAAGC,QAAQ,EAAA;IAC9BG,MAAQP,EAAAA,GAAAA,CACLQ,QAAQ,EACRJ,CAAAA,QAAQ,GACRK,IAAI,CAAC,eAAiB,EAAA,2BAAA,EAA6B,OAAOC,QAAAA,GAAAA;AACzD,QAAA,IAAIC,MAAMD,QAAW,CAAA,EAAA;YACnB,OAAO,IAAA;AACT;AAEA,QAAA,MAAME,MAAS,GAAA,MAAMC,UAAW,CAAA,QAAA,CAAA,CAAUD,MAAM,CAAC;YAAEE,EAAIJ,EAAAA;AAAS,SAAA,CAAA;QAEhE,OAAOE,MAAAA;AACT,KAAA;AACJ,CAAA,CAAA;AAEA,MAAMG,YAAAA,GAAef,GAAIC,CAAAA,MAAM,CAAC;IAC9Be,QAAUjB,EAAAA;AACZ,CAAA,CAAA;AAEA,MAAMkB,iBAAAA,GAAoBjB,GAAIC,CAAAA,MAAM,CAAC;AACnCe,IAAAA,QAAAA,EAAUhB,GAAIkB,CAAAA,KAAK,EAAGC,CAAAA,EAAE,CAACpB,cAAAA;AAC3B,CAAA,CAAA;AAEA,MAAMqB,qBAAqB,CAACC,IAAAA,GAAO,EAAE,EAAEC,UAAU,KAAK,GAAA;IACpD,MAAMC,MAAAA,GAASD,UAAUL,iBAAoBF,GAAAA,YAAAA;AAE7C,IAAA,OAAOS,kBAAkBD,MAAQ,EAAA;QAAEE,MAAQ,EAAA;KAASJ,CAAAA,CAAAA,IAAAA,CAAAA;AACtD;AAQA,MAAMK,iBAAAA,GAAoB1B,GAAIC,CAAAA,MAAM,CAAC;AACnC0B,IAAAA,OAAAA,EAAS3B,IACNkB,KAAK,EAAA,CACLC,EAAE,CACDnB,GAAAA,CAAIC,MAAM,CAAC;QACTa,EAAId,EAAAA,GAAAA,CAAI4B,MAAM,EAAA,CAAGC,QAAQ,EAAA;AACzBb,QAAAA,QAAAA,EAAUjB,eAAe8B,QAAQ;KAGpCC,CAAAA,CAAAA,CAAAA,GAAG,CAAC,CAAA,CAAA,CACJD,QAAQ;AACb,CAAA,CAAA;AAEO,MAAME,sBAAyBP,GAAAA,iBAAAA,CAAkBE,iBAAmB;;;;"}
@@ -228,6 +228,24 @@ const routes = {
228
228
  }
229
229
  ]
230
230
  }
231
+ },
232
+ {
233
+ method: 'POST',
234
+ path: '/actions/bulk-update',
235
+ handler: 'admin-upload.bulkUpdateFileInfo',
236
+ config: {
237
+ policies: [
238
+ 'admin::isAuthenticatedAdmin',
239
+ {
240
+ name: 'admin::hasPermissions',
241
+ config: {
242
+ actions: [
243
+ 'plugin::upload.assets.update'
244
+ ]
245
+ }
246
+ }
247
+ ]
248
+ }
231
249
  }
232
250
  ]
233
251
  };
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["export const routes = {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/settings',\n handler: 'admin-settings.getSettings',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.settings.read'],\n },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/settings',\n handler: 'admin-settings.updateSettings',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.settings.read'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/',\n handler: 'admin-upload.upload',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/files',\n handler: 'admin-file.find',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/files/:id',\n handler: 'admin-file.findOne',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/files/:id',\n handler: 'admin-file.destroy',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/folders/:id',\n handler: 'admin-folder.findOne',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/folders',\n handler: 'admin-folder.find',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/folders',\n handler: 'admin-folder.create',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.create'],\n },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/folders/:id',\n handler: 'admin-folder.update',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/folder-structure',\n handler: 'admin-folder.getStructure',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/actions/bulk-delete',\n handler: 'admin-folder-file.deleteMany',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/actions/bulk-move',\n handler: 'admin-folder-file.moveMany',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n ],\n};\n"],"names":["routes","type","method","path","handler","config","policies","name","actions"],"mappings":"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"}
1
+ {"version":3,"file":"admin.js","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["export const routes = {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/settings',\n handler: 'admin-settings.getSettings',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.settings.read'],\n },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/settings',\n handler: 'admin-settings.updateSettings',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.settings.read'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/',\n handler: 'admin-upload.upload',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/files',\n handler: 'admin-file.find',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/files/:id',\n handler: 'admin-file.findOne',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/files/:id',\n handler: 'admin-file.destroy',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/folders/:id',\n handler: 'admin-folder.findOne',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/folders',\n handler: 'admin-folder.find',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/folders',\n handler: 'admin-folder.create',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.create'],\n },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/folders/:id',\n handler: 'admin-folder.update',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/folder-structure',\n handler: 'admin-folder.getStructure',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/actions/bulk-delete',\n handler: 'admin-folder-file.deleteMany',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/actions/bulk-move',\n handler: 'admin-folder-file.moveMany',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/actions/bulk-update',\n handler: 'admin-upload.bulkUpdateFileInfo',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n ],\n};\n"],"names":["routes","type","method","path","handler","config","policies","name","actions"],"mappings":"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"}
@@ -226,6 +226,24 @@ const routes = {
226
226
  }
227
227
  ]
228
228
  }
229
+ },
230
+ {
231
+ method: 'POST',
232
+ path: '/actions/bulk-update',
233
+ handler: 'admin-upload.bulkUpdateFileInfo',
234
+ config: {
235
+ policies: [
236
+ 'admin::isAuthenticatedAdmin',
237
+ {
238
+ name: 'admin::hasPermissions',
239
+ config: {
240
+ actions: [
241
+ 'plugin::upload.assets.update'
242
+ ]
243
+ }
244
+ }
245
+ ]
246
+ }
229
247
  }
230
248
  ]
231
249
  };
@@ -1 +1 @@
1
- {"version":3,"file":"admin.mjs","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["export const routes = {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/settings',\n handler: 'admin-settings.getSettings',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.settings.read'],\n },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/settings',\n handler: 'admin-settings.updateSettings',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.settings.read'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/',\n handler: 'admin-upload.upload',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/files',\n handler: 'admin-file.find',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/files/:id',\n handler: 'admin-file.findOne',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/files/:id',\n handler: 'admin-file.destroy',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/folders/:id',\n handler: 'admin-folder.findOne',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/folders',\n handler: 'admin-folder.find',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/folders',\n handler: 'admin-folder.create',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.create'],\n },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/folders/:id',\n handler: 'admin-folder.update',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/folder-structure',\n handler: 'admin-folder.getStructure',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/actions/bulk-delete',\n handler: 'admin-folder-file.deleteMany',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/actions/bulk-move',\n handler: 'admin-folder-file.moveMany',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n ],\n};\n"],"names":["routes","type","method","path","handler","config","policies","name","actions"],"mappings":"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"}
1
+ {"version":3,"file":"admin.mjs","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["export const routes = {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/settings',\n handler: 'admin-settings.getSettings',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.settings.read'],\n },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/settings',\n handler: 'admin-settings.updateSettings',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.settings.read'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/',\n handler: 'admin-upload.upload',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/files',\n handler: 'admin-file.find',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/files/:id',\n handler: 'admin-file.findOne',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/files/:id',\n handler: 'admin-file.destroy',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/folders/:id',\n handler: 'admin-folder.findOne',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/folders',\n handler: 'admin-folder.find',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/folders',\n handler: 'admin-folder.create',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.create'],\n },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/folders/:id',\n handler: 'admin-folder.update',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/folder-structure',\n handler: 'admin-folder.getStructure',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.read'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/actions/bulk-delete',\n handler: 'admin-folder-file.deleteMany',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/actions/bulk-move',\n handler: 'admin-folder-file.moveMany',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/actions/bulk-update',\n handler: 'admin-upload.bulkUpdateFileInfo',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'admin::hasPermissions',\n config: {\n actions: ['plugin::upload.assets.update'],\n },\n },\n ],\n },\n },\n ],\n};\n"],"names":["routes","type","method","path","handler","config","policies","name","actions"],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+
5
+ const createAIMetadataService = ({ strapi })=>{
6
+ const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';
7
+ return {
8
+ async isEnabled () {
9
+ // Check if user disabled AI features globally
10
+ const isAIEnabled = strapi.config.get('admin.ai.enabled', true);
11
+ if (!isAIEnabled) {
12
+ return false;
13
+ }
14
+ // Check if the user's license grants access to AI features
15
+ const hasAccess = strapi.ee.features.isEnabled('cms-ai');
16
+ if (!hasAccess) {
17
+ return false;
18
+ }
19
+ // Check if feature is specifically enabled, defaulting to true
20
+ const settings = await strapi.plugin('upload').service('upload').getSettings();
21
+ const aiMetadata = settings.aiMetadata ?? true;
22
+ return aiMetadata;
23
+ },
24
+ async processFiles (files) {
25
+ if (!await this.isEnabled() || !aiServerUrl) {
26
+ throw new Error('AI Metadata service is not enabled');
27
+ }
28
+ // Filter for image files only and track their original positions
29
+ // We need to maintain the original indices so we can map AI results back correctly
30
+ const imageFiles = files.map((file, index)=>({
31
+ file,
32
+ originalIndex: index
33
+ })).filter(({ file })=>file.mimetype?.startsWith('image/'));
34
+ // If no image files, return sparse array with all nulls to avoid calling the AI server
35
+ // This maintains the same array length as input files for proper index alignment
36
+ if (imageFiles.length === 0) {
37
+ return new Array(files.length).fill(null);
38
+ }
39
+ const formData = new FormData();
40
+ for (const { file } of imageFiles){
41
+ const fullUrl = file.provider === 'local' ? strapi.config.get('server.absoluteUrl') + file.filepath : file.filepath;
42
+ const resp = await fetch(fullUrl);
43
+ if (!resp.ok) {
44
+ throw new Error(`Failed to fetch image from URL: ${fullUrl} (${resp.status})`);
45
+ }
46
+ const ab = await resp.arrayBuffer();
47
+ const blob = new Blob([
48
+ ab
49
+ ], {
50
+ type: file.mimetype || undefined
51
+ });
52
+ formData.append('files', blob);
53
+ }
54
+ let token;
55
+ try {
56
+ const tokenData = await strapi.service('admin::user').getAiToken();
57
+ token = tokenData.token;
58
+ } catch (error) {
59
+ throw new Error('Failed to retrieve AI token', {
60
+ cause: error instanceof Error ? error : undefined
61
+ });
62
+ }
63
+ strapi.log.http('Contacting AI Server for media metadata generation');
64
+ const res = await fetch(`${aiServerUrl}/media-library/generate-metadata`, {
65
+ method: 'POST',
66
+ body: formData,
67
+ headers: {
68
+ Authorization: `Bearer ${token}`
69
+ }
70
+ });
71
+ if (!res.ok) {
72
+ throw Error(`AI metadata generation failed`, {
73
+ cause: await res.text()
74
+ });
75
+ }
76
+ const responseSchema = zod.z.object({
77
+ results: zod.z.array(zod.z.object({
78
+ altText: zod.z.string(),
79
+ caption: zod.z.string()
80
+ }))
81
+ });
82
+ const { results } = responseSchema.parse(await res.json());
83
+ strapi.log.http(`Media metadata generated successfully for ${results.length} files`);
84
+ // Create sparse array with results at original indices
85
+ // Example: files=[img1, pdf, img2] -> imageFiles=[{img1, index:0}, {img2, index:2}]
86
+ // AI results=[meta1, meta2] -> sparse=[meta1, null, meta2]
87
+ // This ensures metadata[i] corresponds to files[i], with null for non-images
88
+ return imageFiles.reduce((sparseResults, { originalIndex }, resultIndex)=>{
89
+ sparseResults[originalIndex] = results[resultIndex];
90
+ return sparseResults;
91
+ }, new Array(files.length).fill(null));
92
+ }
93
+ };
94
+ };
95
+
96
+ exports.createAIMetadataService = createAIMetadataService;
97
+ //# sourceMappingURL=ai-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-metadata.js","sources":["../../../server/src/services/ai-metadata.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { z } from 'zod';\nimport { InputFile } from '../types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst createAIMetadataService = ({ strapi }: { strapi: Core.Strapi }) => {\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return {\n async isEnabled() {\n // Check if user disabled AI features globally\n const isAIEnabled = strapi.config.get('admin.ai.enabled', true);\n if (!isAIEnabled) {\n return false;\n }\n\n // Check if the user's license grants access to AI features\n const hasAccess = strapi.ee.features.isEnabled('cms-ai');\n if (!hasAccess) {\n return false;\n }\n\n // Check if feature is specifically enabled, defaulting to true\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const aiMetadata: boolean = settings.aiMetadata ?? true;\n\n return aiMetadata;\n },\n\n async processFiles(\n files: InputFile[]\n ): Promise<Array<{ altText: string; caption: string } | null>> {\n if (!(await this.isEnabled()) || !aiServerUrl) {\n throw new Error('AI Metadata service is not enabled');\n }\n\n // Filter for image files only and track their original positions\n // We need to maintain the original indices so we can map AI results back correctly\n const imageFiles = files\n .map((file, index) => ({ file, originalIndex: index }))\n .filter(({ file }) => file.mimetype?.startsWith('image/'));\n\n // If no image files, return sparse array with all nulls to avoid calling the AI server\n // This maintains the same array length as input files for proper index alignment\n if (imageFiles.length === 0) {\n return new Array(files.length).fill(null);\n }\n\n const formData = new FormData();\n\n for (const { file } of imageFiles) {\n const fullUrl =\n file.provider === 'local'\n ? strapi.config.get('server.absoluteUrl') + file.filepath\n : file.filepath;\n\n const resp = await fetch(fullUrl);\n if (!resp.ok) {\n throw new Error(`Failed to fetch image from URL: ${fullUrl} (${resp.status})`);\n }\n const ab = await resp.arrayBuffer();\n const blob: Blob = new Blob([ab], { type: file.mimetype || undefined });\n formData.append('files', blob);\n }\n\n let token: string;\n try {\n const tokenData = await strapi.service('admin::user').getAiToken();\n token = tokenData.token;\n } catch (error) {\n throw new Error('Failed to retrieve AI token', {\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n strapi.log.http('Contacting AI Server for media metadata generation');\n const res = await fetch(`${aiServerUrl}/media-library/generate-metadata`, {\n method: 'POST',\n body: formData,\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!res.ok) {\n throw Error(`AI metadata generation failed`, { cause: await res.text() });\n }\n\n const responseSchema = z.object({\n results: z.array(\n z.object({\n altText: z.string(),\n caption: z.string(),\n })\n ),\n });\n\n const { results } = responseSchema.parse(await res.json());\n strapi.log.http(`Media metadata generated successfully for ${results.length} files`);\n\n // Create sparse array with results at original indices\n // Example: files=[img1, pdf, img2] -> imageFiles=[{img1, index:0}, {img2, index:2}]\n // AI results=[meta1, meta2] -> sparse=[meta1, null, meta2]\n // This ensures metadata[i] corresponds to files[i], with null for non-images\n return imageFiles.reduce((sparseResults, { originalIndex }, resultIndex) => {\n sparseResults[originalIndex] = results[resultIndex];\n return sparseResults;\n }, new Array(files.length).fill(null));\n },\n };\n};\n\nexport { createAIMetadataService };\n"],"names":["createAIMetadataService","strapi","aiServerUrl","process","env","STRAPI_AI_URL","isEnabled","isAIEnabled","config","get","hasAccess","ee","features","settings","plugin","service","getSettings","aiMetadata","processFiles","files","Error","imageFiles","map","file","index","originalIndex","filter","mimetype","startsWith","length","Array","fill","formData","FormData","fullUrl","provider","filepath","resp","fetch","ok","status","ab","arrayBuffer","blob","Blob","type","undefined","append","token","tokenData","getAiToken","error","cause","log","http","res","method","body","headers","Authorization","text","responseSchema","z","object","results","array","altText","string","caption","parse","json","reduce","sparseResults","resultIndex"],"mappings":"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"}