{"version":3,"file":"admin-folder-file.mjs","sources":["../../../server/src/controllers/admin-folder-file.ts"],"sourcesContent":["import { strings } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport {\n  validateDeleteManyFoldersFiles,\n  validateMoveManyFoldersFiles,\n} from './validation/admin/folder-file';\n\nimport type { File, Folder } from '../types';\n\nexport default {\n  async deleteMany(ctx: Context) {\n    const { body } = ctx.request;\n    const {\n      state: { userAbility },\n    } = ctx;\n\n    const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n      ability: ctx.state.userAbility,\n      model: FOLDER_MODEL_UID,\n    });\n\n    const pmFile = strapi.service('admin::permission').createPermissionsManager({\n      ability: userAbility,\n      action: ACTIONS.read,\n      model: FILE_MODEL_UID,\n    });\n\n    await validateDeleteManyFoldersFiles(body);\n\n    const fileService = getService('file');\n    const folderService = getService('folder');\n\n    const deletedFiles = await fileService.deleteByIds(body.fileIds);\n    const {\n      folders: deletedFolders,\n      totalFolderNumber,\n      totalFileNumber,\n    } = await folderService.deleteByIds(body.folderIds);\n\n    if (deletedFiles.length + deletedFolders.length > 1) {\n      await getService('metrics').trackUsage('didBulkDeleteMediaLibraryElements', {\n        eventProperties: {\n          rootFolderNumber: deletedFolders.length,\n          rootAssetNumber: deletedFiles.length,\n          totalFolderNumber,\n          totalAssetNumber: totalFileNumber + deletedFiles.length,\n        },\n      });\n    }\n\n    ctx.body = {\n      data: {\n        files: await pmFile.sanitizeOutput(deletedFiles),\n        folders: await pmFolder.sanitizeOutput(deletedFolders),\n      },\n    };\n  },\n  async moveMany(ctx: Context) {\n    const { body } = ctx.request;\n    const {\n      state: { userAbility },\n    } = ctx;\n\n    const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n      ability: ctx.state.userAbility,\n      model: FOLDER_MODEL_UID,\n    });\n\n    const pmFile = strapi.service('admin::permission').createPermissionsManager({\n      ability: userAbility,\n      action: ACTIONS.read,\n      model: FILE_MODEL_UID,\n    });\n\n    await validateMoveManyFoldersFiles(body);\n    const { folderIds = [], fileIds = [], destinationFolderId } = body;\n\n    let totalFolderNumber = 0;\n    let totalFileNumber = 0;\n\n    const trx = await strapi.db.transaction();\n    try {\n      // fetch folders\n      const existingFolders = await strapi.db\n        .queryBuilder(FOLDER_MODEL_UID)\n        .select(['id', 'pathId', 'path'])\n        .where({ id: { $in: folderIds } })\n        .transacting(trx.get())\n        .forUpdate()\n        .execute<Folder[]>();\n\n      // fetch files\n      const existingFiles = await strapi.db\n        .queryBuilder(FILE_MODEL_UID)\n        .select(['id'])\n        .where({ id: { $in: fileIds } })\n        .transacting(trx.get())\n        .forUpdate()\n        .execute<File[]>();\n\n      // fetch destinationFolder path\n      let destinationFolderPath = '/';\n      if (destinationFolderId !== null) {\n        const destinationFolder = await strapi.db\n          .queryBuilder(FOLDER_MODEL_UID)\n          .select('path')\n          .where({ id: destinationFolderId })\n          .transacting(trx.get())\n          .first()\n          .execute<Folder>();\n        destinationFolderPath = destinationFolder.path;\n      }\n\n      const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n      const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n      const folderPathColName =\n        // @ts-expect-error - no dynamic typings for the models\n        strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n      // @ts-expect-error - no dynamic typings for the models\n      const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n      if (existingFolders.length > 0) {\n        // update folders' parent relation\n        // @ts-expect-error - no dynamic typings for the models\n        const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n        await strapi.db\n          .queryBuilder(joinTable.name)\n          .transacting(trx.get())\n          .delete()\n          .where({ [joinTable.joinColumn.name]: { $in: folderIds } })\n          .execute();\n\n        if (destinationFolderId !== null) {\n          await strapi.db\n            .queryBuilder(joinTable.name)\n            .transacting(trx.get())\n            .insert(\n              existingFolders.map((folder) => ({\n                [joinTable.inverseJoinColumn.name]: destinationFolderId,\n                [joinTable.joinColumn.name]: folder.id,\n              }))\n            )\n            .execute();\n        }\n\n        for (const existingFolder of existingFolders) {\n          let replaceQuery;\n          switch (strapi.db.dialect.client) {\n            case 'sqlite':\n              replaceQuery = '? || SUBSTRING(??, ?)';\n              break;\n            case 'postgres':\n              replaceQuery = 'CONCAT(?::TEXT, SUBSTRING(??, ?::INTEGER))';\n              break;\n            default:\n              replaceQuery = 'CONCAT(?, SUBSTRING(??, ?))';\n          }\n\n          // update path for folders themselves & folders below\n          totalFolderNumber = await strapi.db\n            .getConnection(folderTable)\n            .transacting(trx.get())\n            .where(pathColName, existingFolder.path)\n            .orWhere(pathColName, 'like', `${existingFolder.path}/%`)\n            .update(\n              pathColName,\n              strapi.db.connection.raw(replaceQuery, [\n                strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n                pathColName,\n                existingFolder.path.length + 1,\n              ])\n            );\n\n          // update path of files below\n          totalFileNumber = await strapi.db\n            .getConnection(fileTable)\n            .transacting(trx.get())\n            .where(folderPathColName, existingFolder.path)\n            .orWhere(folderPathColName, 'like', `${existingFolder.path}/%`)\n            .update(\n              folderPathColName,\n              strapi.db.connection.raw(replaceQuery, [\n                strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n                folderPathColName,\n                existingFolder.path.length + 1,\n              ])\n            );\n        }\n      }\n\n      if (existingFiles.length > 0) {\n        // update files' folder relation (delete + insert; upsert not possible)\n        // @ts-expect-error - no dynamic typings for the models\n        const fileJoinTable = strapi.db.metadata.get(FILE_MODEL_UID).attributes.folder.joinTable;\n        await strapi.db\n          .queryBuilder(fileJoinTable.name)\n          .transacting(trx.get())\n          .delete()\n          .where({ [fileJoinTable.joinColumn.name]: { $in: fileIds } })\n          .execute();\n\n        if (destinationFolderId !== null) {\n          await strapi.db\n            .queryBuilder(fileJoinTable.name)\n            .transacting(trx.get())\n            .insert(\n              existingFiles.map((file) => ({\n                [fileJoinTable.inverseJoinColumn.name]: destinationFolderId,\n                [fileJoinTable.joinColumn.name]: file.id,\n              }))\n            )\n            .execute();\n        }\n\n        // update files main fields (path + updatedBy)\n        await strapi.db\n          .getConnection(fileTable)\n          .transacting(trx.get())\n          .whereIn('id', fileIds)\n          .update(folderPathColName, destinationFolderPath);\n      }\n\n      await trx.commit();\n    } catch (e) {\n      await trx.rollback();\n      throw e;\n    }\n\n    const updatedFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n      where: { id: { $in: folderIds } },\n    });\n\n    const updatedFiles = await strapi.db.query(FILE_MODEL_UID).findMany({\n      where: { id: { $in: fileIds } },\n    });\n\n    await getService('metrics').trackUsage('didBulkMoveMediaLibraryElements', {\n      eventProperties: {\n        rootFolderNumber: updatedFolders.length,\n        rootAssetNumber: updatedFiles.length,\n        totalFolderNumber,\n        totalAssetNumber: totalFileNumber + updatedFiles.length,\n      },\n    });\n\n    ctx.body = {\n      data: {\n        files: await pmFile.sanitizeOutput(updatedFiles),\n        folders: await pmFolder.sanitizeOutput(updatedFolders),\n      },\n    };\n  },\n};\n"],"names":["deleteMany","ctx","body","request","state","userAbility","pmFolder","strapi","service","createPermissionsManager","ability","model","FOLDER_MODEL_UID","pmFile","action","ACTIONS","read","FILE_MODEL_UID","validateDeleteManyFoldersFiles","fileService","getService","folderService","deletedFiles","deleteByIds","fileIds","folders","deletedFolders","totalFolderNumber","totalFileNumber","folderIds","length","trackUsage","eventProperties","rootFolderNumber","rootAssetNumber","totalAssetNumber","data","files","sanitizeOutput","moveMany","validateMoveManyFoldersFiles","destinationFolderId","trx","db","transaction","existingFolders","queryBuilder","select","where","id","$in","transacting","get","forUpdate","execute","existingFiles","destinationFolderPath","destinationFolder","first","path","fileTable","getModel","collectionName","folderTable","folderPathColName","metadata","attributes","folderPath","columnName","pathColName","joinTable","parent","name","delete","joinColumn","insert","map","folder","inverseJoinColumn","existingFolder","replaceQuery","dialect","client","getConnection","orWhere","update","connection","raw","strings","joinBy","pathId","fileJoinTable","file","whereIn","commit","e","rollback","updatedFolders","query","findMany","updatedFiles"],"mappings":"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"}