2017-12-11 18:23:15 +01:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
const _ = require('lodash');
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A set of functions called "actions" for `ContentManager`
|
|
|
|
*/
|
|
|
|
module.exports = {
|
2019-07-15 16:25:45 +02:00
|
|
|
fetch(params, source, populate) {
|
|
|
|
return strapi
|
|
|
|
.query(params.model, source)
|
|
|
|
.findOne({ id: params.id }, populate);
|
|
|
|
},
|
|
|
|
|
|
|
|
fetchAll(params, query) {
|
2019-02-02 13:30:38 +01:00
|
|
|
const { query: request, source, populate = [], ...filters } = query;
|
2019-03-13 19:27:18 +01:00
|
|
|
|
2019-04-09 16:01:01 +02:00
|
|
|
const queryFilter = !_.isEmpty(request)
|
|
|
|
? {
|
|
|
|
...filters, // Filters is an object containing the limit/sort and start
|
|
|
|
...request,
|
|
|
|
}
|
2019-04-09 12:09:03 +02:00
|
|
|
: filters;
|
2018-05-23 11:27:39 +02:00
|
|
|
|
2017-12-11 18:23:15 +01:00
|
|
|
// Find entries using `queries` system
|
2019-07-15 16:25:45 +02:00
|
|
|
return strapi.query(params.model, source).find(queryFilter, populate);
|
2018-06-13 17:56:41 +02:00
|
|
|
},
|
|
|
|
|
2019-07-15 16:25:45 +02:00
|
|
|
count(params, query) {
|
2019-02-02 13:30:38 +01:00
|
|
|
const { source, ...filters } = query;
|
2019-07-15 16:25:45 +02:00
|
|
|
return strapi.query(params.model, source).count(filters);
|
2017-12-11 18:23:15 +01:00
|
|
|
},
|
|
|
|
|
2019-08-01 08:52:35 +02:00
|
|
|
async createMultipart(data, { files = {}, model, source } = {}) {
|
|
|
|
const entry = await strapi.query(model, source).create(data);
|
|
|
|
|
|
|
|
await uploadFiles(entry, files, { model, source });
|
|
|
|
|
|
|
|
return strapi.query(model, source).findOne({ id: entry.id });
|
|
|
|
},
|
|
|
|
|
|
|
|
add(params, values, source) {
|
|
|
|
return strapi.query(params.model, source).create(values);
|
2017-12-11 18:23:15 +01:00
|
|
|
},
|
|
|
|
|
2019-08-01 08:52:35 +02:00
|
|
|
async editMultipart(params, data, { files = {}, model, source } = {}) {
|
|
|
|
const entry = await strapi
|
|
|
|
.query(model, source)
|
|
|
|
.update({ id: params.id }, data);
|
|
|
|
|
|
|
|
await uploadFiles(entry, files, { model, source });
|
|
|
|
|
|
|
|
return strapi.query(model, source).findOne({ id: entry.id });
|
|
|
|
},
|
|
|
|
|
|
|
|
edit(params, values, source) {
|
2019-07-15 16:25:45 +02:00
|
|
|
return strapi.query(params.model, source).update({ id: params.id }, values);
|
2017-12-11 18:23:15 +01:00
|
|
|
},
|
|
|
|
|
2019-07-15 16:25:45 +02:00
|
|
|
delete(params, { source }) {
|
|
|
|
return strapi.query(params.model, source).delete({ id: params.id });
|
2017-12-11 18:23:15 +01:00
|
|
|
},
|
2018-06-05 18:35:19 +02:00
|
|
|
|
2019-07-16 20:11:34 +02:00
|
|
|
deleteMany(params, query) {
|
2018-06-05 18:35:19 +02:00
|
|
|
const { source } = query;
|
|
|
|
const { model } = params;
|
2018-06-14 18:27:44 +02:00
|
|
|
|
2019-07-16 18:05:24 +02:00
|
|
|
const toRemove = Object.values(_.omit(query, 'source'));
|
2019-07-16 23:27:34 +02:00
|
|
|
const { primaryKey } = strapi.query(model, source);
|
|
|
|
const filter = { [`${primaryKey}_in`]: toRemove, _limit: 100 };
|
2018-06-05 18:35:19 +02:00
|
|
|
|
2019-07-16 20:11:34 +02:00
|
|
|
return strapi.query(model, source).delete(filter);
|
2019-04-09 12:09:03 +02:00
|
|
|
},
|
2019-07-15 23:16:50 +02:00
|
|
|
|
2019-07-15 16:25:45 +02:00
|
|
|
search(params, query) {
|
2019-07-26 10:57:27 +02:00
|
|
|
const { model } = params;
|
|
|
|
const { source } = query;
|
2019-07-15 16:25:45 +02:00
|
|
|
|
2019-07-26 10:57:27 +02:00
|
|
|
return strapi.query(model, source).search(query);
|
2019-07-15 16:25:45 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
countSearch(params, query) {
|
2019-07-26 10:57:27 +02:00
|
|
|
const { model } = params;
|
2019-07-15 16:25:45 +02:00
|
|
|
const { source, _q } = query;
|
2019-07-26 10:57:27 +02:00
|
|
|
return strapi.query(model, source).countSearch({ _q });
|
2019-07-15 16:25:45 +02:00
|
|
|
},
|
2017-12-11 18:23:15 +01:00
|
|
|
};
|
2019-08-01 08:52:35 +02:00
|
|
|
|
|
|
|
async function uploadFiles(entry, files, { model, source }) {
|
|
|
|
const entity = strapi.getModel(model, source);
|
|
|
|
|
|
|
|
if (!_.has(strapi.plugins, 'upload')) return entry;
|
|
|
|
|
|
|
|
const uploadService = strapi.plugins.upload.services.upload;
|
|
|
|
|
|
|
|
const findModelFromUploadPath = path => {
|
|
|
|
if (path.length === 0) return { model, source };
|
|
|
|
|
|
|
|
// exclude array indexes from path
|
|
|
|
const parts = path.filter(p => !_.isFinite(_.toNumber(p)));
|
|
|
|
|
|
|
|
let tmpModel = entity;
|
|
|
|
let modelName = model;
|
|
|
|
let sourceName;
|
|
|
|
for (let part of parts) {
|
|
|
|
if (!tmpModel) return {};
|
|
|
|
const attr = tmpModel.attributes[part];
|
|
|
|
|
|
|
|
if (!attr) return {};
|
|
|
|
|
|
|
|
if (attr.type === 'group') {
|
|
|
|
modelName = attr.group;
|
|
|
|
tmpModel = strapi.groups[attr.group];
|
|
|
|
} else if (_.has(attr, 'model') || _.has(attr, 'collection')) {
|
|
|
|
sourceName = attr.plugin;
|
|
|
|
modelName = attr.model || attr.collection;
|
|
|
|
tmpModel = strapi.getModel(attr.model || attr.collection, source);
|
|
|
|
} else {
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return { model: modelName, source: sourceName };
|
|
|
|
};
|
|
|
|
|
|
|
|
const doUpload = async (key, files) => {
|
|
|
|
const parts = key.split('.');
|
|
|
|
const [path, field] = [_.initial(parts), _.last(parts)];
|
|
|
|
|
|
|
|
const { model, source } = findModelFromUploadPath(path);
|
|
|
|
|
|
|
|
if (model) {
|
|
|
|
return uploadService.uploadToEntity(
|
|
|
|
{ id: _.get(entry, path.concat('id')), model: model },
|
|
|
|
{ [field]: files },
|
|
|
|
source
|
|
|
|
);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
await Promise.all(Object.keys(files).map(key => doUpload(key, files[key])));
|
|
|
|
}
|