Support relations inside of group creation

This commit is contained in:
Alexandre Bodin 2019-07-25 16:43:17 +02:00
parent 9245c32c70
commit f757d4d952
3 changed files with 19 additions and 23 deletions

View File

@ -55,23 +55,25 @@ module.exports = ({ model, modelKey, strapi }) => {
if (repeatable === true) { if (repeatable === true) {
validateRepeatableInput(groupValue, { key, ...attr }); validateRepeatableInput(groupValue, { key, ...attr });
const groups = await Promise.all( const groups = await Promise.all(
groupValue.map(value => groupModel.create(value)) groupValue.map(value => {
return strapi.query(group).create(value);
})
); );
const groupsArr = groups.map(group => ({ const groupsArr = groups.map(groupEntry => ({
kind: groupModel.globalId, kind: groupModel.globalId,
ref: group, ref: groupEntry,
})); }));
entry[key] = groupsArr; entry[key] = groupsArr;
await entry.save(); await entry.save();
} else { } else {
validateNonRepeatableInput(groupValue, { key, ...attr }); validateNonRepeatableInput(groupValue, { key, ...attr });
const group = await groupModel.create(groupValue); const groupEntry = await strapi.query(group).create(groupValue);
entry[key] = [ entry[key] = [
{ {
kind: groupModel.globalId, kind: groupModel.globalId,
ref: group, ref: groupEntry,
}, },
]; ];
await entry.save(); await entry.save();
@ -95,15 +97,14 @@ module.exports = ({ model, modelKey, strapi }) => {
const updateOrCreateGroup = async value => { const updateOrCreateGroup = async value => {
// check if value has an id then update else create // check if value has an id then update else create
if (hasPK(value)) { if (hasPK(value)) {
return groupModel.findOneAndUpdate( return strapi.query(group).update(
{ {
[model.primaryKey]: getPK(value), [model.primaryKey]: getPK(value),
}, },
value, value
{ new: true }
); );
} }
return groupModel.create(value); return strapi.query(group).create(value);
}; };
if (repeatable === true) { if (repeatable === true) {
@ -162,7 +163,9 @@ module.exports = ({ model, modelKey, strapi }) => {
}, []); }, []);
if (idsToDelete.length > 0) { if (idsToDelete.length > 0) {
await groupModel.deleteMany({ [model.primaryKey]: { $in: idsToDelete } }); await strapi
.query(groupModel.uid)
.delete({ [`${model.primaryKey}_in`]: idsToDelete });
} }
} }
@ -175,9 +178,10 @@ module.exports = ({ model, modelKey, strapi }) => {
const groupModel = strapi.groups[group]; const groupModel = strapi.groups[group];
if (Array.isArray(entry[key]) && entry[key].length > 0) { if (Array.isArray(entry[key]) && entry[key].length > 0) {
await groupModel.deleteMany({ const idsToDelete = entry[key].map(el => el.ref);
[model.primaryKey]: { $in: entry[key].map(el => el.ref) }, await strapi
}); .query(groupModel.uid)
.delete({ [`${model.primaryKey}_in`]: idsToDelete });
} }
} }
} }

View File

@ -208,17 +208,9 @@ module.exports = {
case 'manyMorphToOne': case 'manyMorphToOne':
// Update the relational array. // Update the relational array.
acc[current] = property.map(obj => { acc[current] = property.map(obj => {
const globalId =
obj.source && obj.source !== 'content-manager'
? strapi.plugins[obj.source].models[_.toLower(obj.ref)]
.globalId
: strapi.models[_.toLower(obj.ref)].globalId;
// Define the object stored in database.
// The shape is this object is defined by the strapi-hook-mongoose connector.
return { return {
ref: obj.refId, ref: obj.refId,
kind: globalId, kind: obj.ref,
[association.filter]: obj.field, [association.filter]: obj.field,
}; };
}); });

View File

@ -188,7 +188,7 @@ module.exports = {
.findOne({ id: roleID }, ['users', 'permissions']); .findOne({ id: roleID }, ['users', 'permissions']);
if (!role) { if (!role) {
throw new Error('Cannot found this role'); throw new Error('Cannot find this role');
} }
// Group by `type`. // Group by `type`.