149 lines
4.0 KiB
JavaScript
Raw Normal View History

'use strict';
const _ = require('lodash');
/**
* A set of functions called "actions" for `ContentManager`
*/
2019-07-15 15:33:42 +02:00
const parseFormInput = value => {
try {
const parsed = JSON.parse(value);
// do not modify initial value if it is string except 'null'
if (typeof parsed !== 'string') {
value = parsed;
}
} catch (e) {
// Silent.
}
return _.isArray(value) ? value.map(parseFormInput) : value;
};
const parseFormData = fields =>
Object.keys(fields).reduce((acc, current) => {
acc[current] = parseFormInput(fields[current]);
return acc;
}, {});
module.exports = {
fetch(params, source, populate) {
return strapi
.query(params.model, source)
.findOne({ id: params.id }, populate);
},
fetchAll(params, query) {
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,
}
: filters;
2018-05-23 11:27:39 +02:00
// Find entries using `queries` system
return strapi.query(params.model, source).find(queryFilter, populate);
2018-06-13 17:56:41 +02:00
},
count(params, query) {
const { source, ...filters } = query;
return strapi.query(params.model, source).count(filters);
},
2019-07-15 15:33:42 +02:00
async add(params, values, source) {
// Multipart/form-data.
if (values.hasOwnProperty('fields') && values.hasOwnProperty('files')) {
const data = parseFormData(values.fields);
const entry = await strapi.query(params.model, source).create(data);
// Then, request plugin upload.
if (strapi.plugins.upload && Object.keys(values.files).length > 0) {
// Upload new files and attach them to this entity.
await strapi.plugins.upload.services.upload.uploadToEntity(
{
id: entry.id || entry._id,
model: params.model,
},
values.files,
source
);
}
2019-07-15 15:33:42 +02:00
return entry;
}
// Create an entry using `queries` system
return await strapi.query(params.model, source).create(values);
},
2019-07-15 15:33:42 +02:00
async edit(params, values, source) {
// Multipart/form-data.
if (values.hasOwnProperty('fields') && values.hasOwnProperty('files')) {
// set empty attributes if old values was cleared
_.difference(
Object.keys(values.files),
Object.keys(values.fields)
).forEach(attr => {
values.fields[attr] = [];
});
const data = parseFormData(values.fields);
const updatedEntity = await strapi
.query(params.model, source)
2019-07-15 15:33:42 +02:00
.update({ id: params.id }, data);
// Then, request plugin upload.
if (strapi.plugins.upload) {
// Upload new files and attach them to this entity.
await strapi.plugins.upload.services.upload.uploadToEntity(
params,
values.files,
source
);
}
2019-07-15 15:33:42 +02:00
return updatedEntity;
}
// Raw JSON.
return strapi.query(params.model, source).update({ id: params.id }, values);
},
delete(params, { source }) {
return strapi.query(params.model, source).delete({ id: params.id });
},
2019-07-16 20:11:34 +02:00
deleteMany(params, query) {
const { source } = query;
const { model } = params;
const toRemove = Object.values(_.omit(query, 'source'));
2019-07-16 20:11:34 +02:00
const filter = { [`id_in`]: toRemove, _limit: 100 };
2019-07-16 20:11:34 +02:00
return strapi.query(model, source).delete(filter);
},
search(params, query) {
const { limit, skip, sort, source, _q, populate = [] } = query; // eslint-disable-line no-unused-vars
const filters = strapi.utils.models.convertParams(params.model, query);
// Find entries using `queries` system
return strapi.query(params.model, source).search(
{
limit: limit || filters.limit,
skip: skip || filters.start || 0,
sort: sort || filters.sort,
search: _q,
},
populate
);
},
countSearch(params, query) {
const { source, _q } = query;
return strapi.query(params.model, source).countSearch({ search: _q });
},
};