mirror of
https://github.com/strapi/strapi.git
synced 2025-12-27 23:24:03 +00:00
Implement CM fetch, fetchAll, create, update, delete
This commit is contained in:
parent
cd19e04d6d
commit
078d677526
@ -32,8 +32,10 @@ module.exports = function createQueryBuilder({ model, modelKey, strapi }) {
|
||||
// keys to exclude to get attribute keys
|
||||
const excludedKeys = assocKeys.concat(groupKeys);
|
||||
// Returns an object without relational keys to persist in DB
|
||||
const omitExernalValues = values => {
|
||||
return _.omit(values, excludedKeys);
|
||||
const selectAttributes = values => {
|
||||
return _.pickBy(values, (value, key) => {
|
||||
return !excludedKeys.includes(key) && _.has(model.allAttributes, key);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
@ -78,7 +80,7 @@ module.exports = function createQueryBuilder({ model, modelKey, strapi }) {
|
||||
|
||||
async function create(values) {
|
||||
const relations = pickRelations(values);
|
||||
const data = omitExernalValues(values);
|
||||
const data = selectAttributes(values);
|
||||
|
||||
const runCreate = async trx => {
|
||||
// Create entry with no-relational data.
|
||||
@ -104,7 +106,7 @@ module.exports = function createQueryBuilder({ model, modelKey, strapi }) {
|
||||
|
||||
// Extract values related to relational data.
|
||||
const relations = pickRelations(values);
|
||||
const data = omitExernalValues(values);
|
||||
const data = selectAttributes(values);
|
||||
|
||||
const runUpdate = async trx => {
|
||||
const entry = await model.forge(params).save(data, { transacting: trx });
|
||||
|
||||
@ -20,9 +20,20 @@ const parseFormInput = value => {
|
||||
return _.isArray(value) ? value.map(parseFormInput) : value;
|
||||
};
|
||||
|
||||
/* eslint-disable indent */
|
||||
const parseFormData = fields =>
|
||||
Object.keys(fields).reduce((acc, current) => {
|
||||
acc[current] = parseFormInput(fields[current]);
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
module.exports = {
|
||||
fetchAll: async (params, query) => {
|
||||
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;
|
||||
|
||||
const queryFilter = !_.isEmpty(request)
|
||||
@ -33,83 +44,29 @@ module.exports = {
|
||||
: filters;
|
||||
|
||||
// Find entries using `queries` system
|
||||
return await strapi.plugins['content-manager']
|
||||
.queries(params.model, source)
|
||||
.find(queryFilter, populate);
|
||||
return strapi.query(params.model, source).find(queryFilter, populate);
|
||||
},
|
||||
|
||||
search: async (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 await strapi.plugins['content-manager']
|
||||
.queries(params.model, source)
|
||||
.search(
|
||||
{
|
||||
limit: limit || filters.limit,
|
||||
skip: skip || filters.start || 0,
|
||||
sort: sort || filters.sort,
|
||||
search: _q,
|
||||
},
|
||||
populate
|
||||
);
|
||||
},
|
||||
|
||||
countSearch: async (params, query) => {
|
||||
const { source, _q } = query;
|
||||
|
||||
return await strapi.plugins['content-manager']
|
||||
.queries(params.model, source)
|
||||
.countSearch({ search: _q });
|
||||
},
|
||||
|
||||
count: async (params, query) => {
|
||||
count(params, query) {
|
||||
const { source, ...filters } = query;
|
||||
|
||||
return await strapi.plugins['content-manager']
|
||||
.queries(params.model, source)
|
||||
.count(filters);
|
||||
},
|
||||
|
||||
fetch: async (params, source, populate, raw = true) => {
|
||||
return await strapi.plugins['content-manager']
|
||||
.queries(params.model, source)
|
||||
.findOne(
|
||||
{
|
||||
id: params.id,
|
||||
},
|
||||
populate,
|
||||
raw
|
||||
);
|
||||
return strapi.query(params.model, source).count(filters);
|
||||
},
|
||||
|
||||
async add(params, values, source) {
|
||||
// Multipart/form-data.
|
||||
if (values.hasOwnProperty('fields') && values.hasOwnProperty('files')) {
|
||||
const files = values.files;
|
||||
|
||||
// Parse stringify JSON data.
|
||||
const data = Object.keys(values.fields).reduce((acc, current) => {
|
||||
acc[current] = parseFormInput(values.fields[current]);
|
||||
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
// Update JSON fields.
|
||||
const entry = await strapi.plugins['content-manager']
|
||||
.queries(params.model, source)
|
||||
.create(data);
|
||||
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(files).length > 0) {
|
||||
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,
|
||||
},
|
||||
files,
|
||||
values.files,
|
||||
source
|
||||
);
|
||||
}
|
||||
@ -118,35 +75,23 @@ module.exports = {
|
||||
}
|
||||
|
||||
// Create an entry using `queries` system
|
||||
return await strapi.plugins['content-manager']
|
||||
.queries(params.model, source)
|
||||
.create(values);
|
||||
return await strapi.query(params.model, source).create(values);
|
||||
},
|
||||
|
||||
async edit(params, values, source) {
|
||||
// Multipart/form-data.
|
||||
if (values.hasOwnProperty('fields') && values.hasOwnProperty('files')) {
|
||||
// Silent recursive parser.
|
||||
|
||||
const files = values.files;
|
||||
|
||||
// set empty attributes if old values was cleared
|
||||
_.difference(Object.keys(files), Object.keys(values.fields)).forEach(
|
||||
attr => {
|
||||
values.fields[attr] = [];
|
||||
}
|
||||
);
|
||||
_.difference(
|
||||
Object.keys(values.files),
|
||||
Object.keys(values.fields)
|
||||
).forEach(attr => {
|
||||
values.fields[attr] = [];
|
||||
});
|
||||
|
||||
// Parse stringify JSON data.
|
||||
const data = Object.keys(values.fields).reduce((acc, current) => {
|
||||
acc[current] = parseFormInput(values.fields[current]);
|
||||
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
// Update
|
||||
const updatedEntity = await strapi.plugins['content-manager']
|
||||
.queries(params.model, source)
|
||||
const data = parseFormData(values.fileds);
|
||||
const updatedEntity = await strapi
|
||||
.query(params.model, source)
|
||||
.update({ id: params.id }, data);
|
||||
|
||||
// Then, request plugin upload.
|
||||
@ -154,7 +99,7 @@ module.exports = {
|
||||
// Upload new files and attach them to this entity.
|
||||
await strapi.plugins.upload.services.upload.uploadToEntity(
|
||||
params,
|
||||
files,
|
||||
values.files,
|
||||
source
|
||||
);
|
||||
}
|
||||
@ -163,58 +108,15 @@ module.exports = {
|
||||
}
|
||||
|
||||
// Raw JSON.
|
||||
return strapi.plugins['content-manager']
|
||||
.queries(params.model, source)
|
||||
.update({ id: params.id }, values);
|
||||
return strapi.query(params.model, source).update({ id: params.id }, values);
|
||||
},
|
||||
|
||||
delete: async (params, { source }) => {
|
||||
const query = strapi.plugins['content-manager'].queries(
|
||||
params.model,
|
||||
source
|
||||
);
|
||||
const primaryKey = query.primaryKey;
|
||||
const response = await query.findOne({
|
||||
id: params.id,
|
||||
});
|
||||
|
||||
if (!response) {
|
||||
throw `This resource doesn't exist.`;
|
||||
}
|
||||
|
||||
params[primaryKey] = response[primaryKey];
|
||||
|
||||
params.values = Object.keys(response).reduce((acc, current) => {
|
||||
const association = (
|
||||
strapi.models[params.model] ||
|
||||
strapi.admin.models[params.model] ||
|
||||
strapi.plugins[source].models[params.model]
|
||||
).associations.filter(x => x.alias === current)[0];
|
||||
|
||||
// Remove relationships.
|
||||
if (association) {
|
||||
acc[current] = _.isArray(response[current]) ? [] : null;
|
||||
}
|
||||
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
if (!_.isEmpty(params.values)) {
|
||||
// Run update to remove all relationships.
|
||||
await strapi.plugins['content-manager']
|
||||
.queries(params.model, source)
|
||||
.update(params);
|
||||
}
|
||||
|
||||
// Delete an entry using `queries` system
|
||||
return await strapi.plugins['content-manager']
|
||||
.queries(params.model, source)
|
||||
.delete({
|
||||
id: params.id,
|
||||
});
|
||||
delete(params, { source }) {
|
||||
return strapi.query(params.model, source).delete({ id: params.id });
|
||||
},
|
||||
|
||||
deleteMany: async (params, query) => {
|
||||
//TODO: implement multi delete => might just be a loop
|
||||
async deleteMany(params, query) {
|
||||
const { source } = query;
|
||||
const { model } = params;
|
||||
|
||||
@ -269,4 +171,24 @@ module.exports = {
|
||||
[primaryKey]: toRemove,
|
||||
});
|
||||
},
|
||||
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 });
|
||||
},
|
||||
};
|
||||
|
||||
@ -35,8 +35,8 @@ module.exports = {
|
||||
return Promise.all(
|
||||
files.map(async stream => {
|
||||
const parts = await toArray(fs.createReadStream(stream.path));
|
||||
const buffers = parts.map(
|
||||
part => (_.isBuffer(part) ? part : Buffer.from(part)),
|
||||
const buffers = parts.map(part =>
|
||||
_.isBuffer(part) ? part : Buffer.from(part)
|
||||
);
|
||||
|
||||
const buffer = Buffer.concat(buffers);
|
||||
@ -54,11 +54,11 @@ module.exports = {
|
||||
mime: stream.type,
|
||||
size: (stream.size / 1000).toFixed(2),
|
||||
};
|
||||
}),
|
||||
})
|
||||
);
|
||||
},
|
||||
|
||||
upload: async (files, config) => {
|
||||
async upload(files, config) {
|
||||
// Get upload provider settings to configure the provider to use.
|
||||
const provider = _.find(strapi.plugins.upload.config.providers, {
|
||||
provider: config.provider,
|
||||
@ -66,9 +66,7 @@ module.exports = {
|
||||
|
||||
if (!provider) {
|
||||
throw new Error(
|
||||
`The provider package isn't installed. Please run \`npm install strapi-provider-upload-${
|
||||
config.provider
|
||||
}\``,
|
||||
`The provider package isn't installed. Please run \`npm install strapi-provider-upload-${config.provider}\``
|
||||
);
|
||||
}
|
||||
|
||||
@ -89,28 +87,15 @@ module.exports = {
|
||||
// Remove temp file
|
||||
fs.unlinkSync(file.tmpPath);
|
||||
return res;
|
||||
}),
|
||||
})
|
||||
);
|
||||
},
|
||||
|
||||
add: async values => {
|
||||
// Use Content Manager business logic to handle relation.
|
||||
if (strapi.plugins['content-manager']) {
|
||||
return await strapi.plugins['content-manager'].services[
|
||||
'contentmanager'
|
||||
].add(
|
||||
{
|
||||
model: 'file',
|
||||
},
|
||||
values,
|
||||
'upload',
|
||||
);
|
||||
}
|
||||
|
||||
return strapi.plugins['upload'].queries('file', 'upload').create(values);
|
||||
async add(values) {
|
||||
return strapi.query('file', 'upload').create(values);
|
||||
},
|
||||
|
||||
edit: async (params, values) => {
|
||||
async edit(params, values) {
|
||||
// Use Content Manager business logic to handle relation.
|
||||
if (strapi.plugins['content-manager']) {
|
||||
params.model = 'file';
|
||||
@ -121,25 +106,24 @@ module.exports = {
|
||||
].edit(params, values, 'upload');
|
||||
}
|
||||
|
||||
return strapi.plugins['upload'].queries('file', 'upload').update(_.assign(params, values));
|
||||
return strapi.query('file', 'upload').update(params, values);
|
||||
},
|
||||
|
||||
fetch: params => {
|
||||
params.id = params._id || params.id;
|
||||
return strapi.plugins['upload'].queries('file', 'upload')
|
||||
.findOne(_.pick(params, ['id']));
|
||||
fetch(params) {
|
||||
return strapi.query('file', 'upload').findOne({
|
||||
id: params._id || params.id,
|
||||
});
|
||||
},
|
||||
|
||||
fetchAll: params => {
|
||||
return strapi.plugins['upload'].queries('file', 'upload')
|
||||
.find(params);
|
||||
fetchAll(params) {
|
||||
return strapi.query('file', 'upload').find(params);
|
||||
},
|
||||
|
||||
count: async () => {
|
||||
return await strapi.plugins['upload'].queries('file', 'upload').count();
|
||||
async count() {
|
||||
return strapi.query('file', 'upload').count();
|
||||
},
|
||||
|
||||
remove: async (params, config) => {
|
||||
async remove(params, config) {
|
||||
params.id = params._id || params.id;
|
||||
|
||||
const file = await strapi.plugins['upload'].services.upload.fetch(params);
|
||||
@ -148,7 +132,7 @@ module.exports = {
|
||||
const provider = _.cloneDeep(
|
||||
_.find(strapi.plugins.upload.config.providers, {
|
||||
provider: config.provider,
|
||||
}),
|
||||
})
|
||||
);
|
||||
_.assign(provider, config);
|
||||
const actions = provider.init(config);
|
||||
@ -162,16 +146,15 @@ module.exports = {
|
||||
if (strapi.plugins['content-manager']) {
|
||||
params.model = 'file';
|
||||
|
||||
return await strapi.plugins['content-manager'].services['contentmanager'].delete(
|
||||
params,
|
||||
{ source: 'upload' },
|
||||
);
|
||||
return await strapi.plugins['content-manager'].services[
|
||||
'contentmanager'
|
||||
].delete(params, { source: 'upload' });
|
||||
}
|
||||
|
||||
return strapi.plugins['upload'].queries('file', 'upload').delete(params);
|
||||
return strapi.query('file', 'upload').delete(params);
|
||||
},
|
||||
|
||||
uploadToEntity: async function(params, files, source) {
|
||||
async uploadToEntity(params, files, source) {
|
||||
// Retrieve provider settings from database.
|
||||
const config = await strapi
|
||||
.store({
|
||||
@ -210,7 +193,7 @@ module.exports = {
|
||||
|
||||
// Make upload async.
|
||||
return this.upload(enhancedFiles, config);
|
||||
}),
|
||||
})
|
||||
);
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user