strapi/packages/core/upload/server/schema.graphql.js

98 lines
2.9 KiB
JavaScript
Raw Normal View History

'use strict';
const _ = require('lodash');
2021-08-19 16:49:33 +02:00
const { streamToBuffer } = require('./utils/file');
const { getService } = require('./utils');
2018-04-10 12:56:13 +02:00
module.exports = {
definition: `
input FileInfoInput {
name: String
alternativeText: String
caption: String
}
`,
mutation: `
upload(refId: ID, ref: String, field: String, source: String, info: FileInfoInput, file: Upload!): UploadFile!
2019-08-21 11:05:33 +02:00
multipleUpload(refId: ID, ref: String, field: String, source: String, files: [Upload]!): [UploadFile]!
updateFileInfo(id: ID!, info: FileInfoInput!): UploadFile!
`,
2018-04-10 12:56:13 +02:00
resolver: {
Query: {
file: false,
2018-04-10 12:56:13 +02:00
files: {
2021-08-06 18:09:49 +02:00
resolver: 'plugin::upload.upload.find',
2019-08-21 11:05:33 +02:00
},
},
Mutation: {
createFile: false,
updateFile: false,
upload: {
2019-08-21 11:05:33 +02:00
description: 'Upload one file',
2021-08-06 18:09:49 +02:00
resolverOf: 'plugin::upload.upload.upload',
resolver: async (obj, { file: upload, info, ...fields }) => {
const file = await formatFile(upload, info, fields);
2019-08-21 11:05:33 +02:00
2021-07-08 22:07:52 +02:00
const uploadedFiles = await getService('upload').uploadFileAndPersist(file);
// Return response.
2019-08-21 11:05:33 +02:00
return uploadedFiles.length === 1 ? uploadedFiles[0] : uploadedFiles;
},
},
multipleUpload: {
description: 'Upload one file',
2021-08-06 18:09:49 +02:00
resolverOf: 'plugin::upload.upload.upload',
2019-08-21 11:05:33 +02:00
resolver: async (obj, { files: uploads, ...fields }) => {
const files = await Promise.all(uploads.map(upload => formatFile(upload, {}, fields)));
2019-08-21 11:05:33 +02:00
2021-07-08 22:07:52 +02:00
const uploadService = getService('upload');
2019-08-21 11:05:33 +02:00
return Promise.all(files.map(file => uploadService.uploadFileAndPersist(file)));
2019-08-21 11:05:33 +02:00
},
},
updateFileInfo: {
description: 'Update file information',
2021-08-06 18:09:49 +02:00
resolverOf: 'plugin::upload.upload.upload',
resolver: async (obj, { id, info }) => {
2021-07-08 22:07:52 +02:00
return await getService('upload').updateFileInfo(id, info);
},
},
deleteFile: {
description: 'Delete one file',
2021-08-06 18:09:49 +02:00
resolverOf: 'plugin::upload.upload.destroy',
resolver: async (obj, options, { context }) => {
2021-07-08 22:07:52 +02:00
const file = await getService('upload').findOne({
id: context.params.id,
});
if (file) {
2021-07-08 22:07:52 +02:00
const fileResult = await getService('upload').remove(file);
return { file: fileResult };
}
},
},
2019-08-21 11:05:33 +02:00
},
},
};
const formatFile = async (upload, extraInfo, metas) => {
2019-08-21 11:05:33 +02:00
const { filename, mimetype, createReadStream } = await upload;
const { optimize } = strapi.plugins.upload.services['image-manipulation'];
const readBuffer = await streamToBuffer(createReadStream());
2019-08-21 11:05:33 +02:00
const { buffer, info } = await optimize(readBuffer);
2019-08-21 11:05:33 +02:00
2021-07-08 22:07:52 +02:00
const uploadService = getService('upload');
const fileInfo = uploadService.formatFileInfo(
{
filename,
type: mimetype,
size: buffer.length,
},
extraInfo || {},
metas
);
2019-08-21 11:05:33 +02:00
return _.assign(fileInfo, info, { buffer });
2018-04-10 12:56:13 +02:00
};