strapi/packages/core/upload/server/controllers/admin-folder-file.js

91 lines
2.5 KiB
JavaScript
Raw Normal View History

2022-04-26 11:23:07 +02:00
'use strict';
const { getService } = require('../utils');
2022-05-13 16:10:18 +02:00
const { ACTIONS, FOLDER_MODEL_UID, FILE_MODEL_UID } = require('../constants');
2022-05-02 16:31:27 +02:00
const {
validateDeleteManyFoldersFiles,
validateMoveManyFoldersFiles,
} = require('./validation/admin/folder-file');
2022-04-26 11:23:07 +02:00
module.exports = {
async deleteMany(ctx) {
const { body } = ctx.request;
2022-05-02 16:31:27 +02:00
const {
state: { userAbility },
} = ctx;
const pmFolder = strapi.admin.services.permission.createPermissionsManager({
ability: ctx.state.userAbility,
2022-05-13 16:10:18 +02:00
model: FOLDER_MODEL_UID,
2022-05-02 16:31:27 +02:00
});
const pmFile = strapi.admin.services.permission.createPermissionsManager({
ability: userAbility,
action: ACTIONS.read,
2022-05-13 16:10:18 +02:00
model: FILE_MODEL_UID,
2022-05-02 16:31:27 +02:00
});
2022-04-26 11:23:07 +02:00
await validateDeleteManyFoldersFiles(body);
const fileService = getService('file');
const folderService = getService('folder');
const deletedFiles = await fileService.deleteByIds(body.fileIds);
const deletedFolders = await folderService.deleteByIds(body.folderIds);
ctx.body = {
data: {
2022-05-02 16:31:27 +02:00
files: await pmFile.sanitizeOutput(deletedFiles),
folders: await pmFolder.sanitizeOutput(deletedFolders),
},
};
},
async moveMany(ctx) {
const { body } = ctx.request;
const {
state: { userAbility, user },
} = ctx;
const pmFolder = strapi.admin.services.permission.createPermissionsManager({
ability: ctx.state.userAbility,
2022-05-13 16:10:18 +02:00
model: FOLDER_MODEL_UID,
2022-05-02 16:31:27 +02:00
});
const pmFile = strapi.admin.services.permission.createPermissionsManager({
ability: userAbility,
action: ACTIONS.read,
2022-05-13 16:10:18 +02:00
model: FILE_MODEL_UID,
2022-05-02 16:31:27 +02:00
});
await validateMoveManyFoldersFiles(body);
const { folderIds = [], fileIds = [], destinationFolderId } = body;
const uploadService = getService('upload');
const folderService = getService('folder');
const updatedFolders = [];
// updates are done in order (not in parallele) to avoid mixing queries (path)
for (let folderId of folderIds) {
const updatedFolder = await folderService.update(
folderId,
{ parent: destinationFolderId },
{ user }
);
updatedFolders.push(updatedFolder);
}
const updatedFiles = await Promise.all(
fileIds.map(fileId =>
uploadService.updateFileInfo(fileId, { folder: destinationFolderId }, { user })
)
);
ctx.body = {
data: {
files: await pmFile.sanitizeOutput(updatedFiles),
folders: await pmFolder.sanitizeOutput(updatedFolders),
2022-04-26 11:23:07 +02:00
},
};
},
};