feat: Sort relations on more than 1 field

pull/43/head
Boaz Poolman 2022-01-21 16:21:00 +01:00
parent 6a05393c11
commit 8abf651a46
3 changed files with 25 additions and 15 deletions

View File

@ -99,18 +99,22 @@ const ConfigType = class ConfigType {
const entity = await queryAPI.update({ where: combinedUidWhereFilter, data: query }); const entity = await queryAPI.update({ where: combinedUidWhereFilter, data: query });
// Delete/create relations. // Delete/create relations.
await Promise.all(this.relations.map(async ({ queryString, relationName, parentName, relationSortField }) => { await Promise.all(this.relations.map(async ({ queryString, relationName, parentName, relationSortFields }) => {
const relationQueryApi = strapi.query(queryString); const relationQueryApi = strapi.query(queryString);
existingConfig = sanitizeConfig(existingConfig, relationName, relationSortField); existingConfig = sanitizeConfig(existingConfig, relationName, relationSortFields);
configContent = sanitizeConfig(configContent, relationName, relationSortField); configContent = sanitizeConfig(configContent, relationName, relationSortFields);
const configToAdd = difference(configContent[relationName], existingConfig[relationName], relationSortField); const configToAdd = difference(configContent[relationName], existingConfig[relationName], relationSortFields[0]);
const configToDelete = difference(existingConfig[relationName], configContent[relationName], relationSortField); const configToDelete = difference(existingConfig[relationName], configContent[relationName], relationSortFields[0]);
await Promise.all(configToDelete.map(async (config) => { await Promise.all(configToDelete.map(async (config) => {
const whereClause = {};
relationSortFields.map((sortField) => {
whereClause[sortField] = config[sortField];
});
await relationQueryApi.delete({ await relationQueryApi.delete({
where: { where: {
[relationSortField]: config[relationSortField], ...whereClause,
[parentName]: entity.id, [parentName]: entity.id,
}, },
}); });
@ -168,13 +172,15 @@ const ConfigType = class ConfigType {
if (shouldExclude) return; if (shouldExclude) return;
const formattedConfig = { ...sanitizeConfig(config) }; const formattedConfig = { ...sanitizeConfig(config) };
await Promise.all(this.relations.map(async ({ queryString, relationName, relationSortField, parentName }) => { await Promise.all(this.relations.map(async ({ queryString, relationName, relationSortFields, parentName }) => {
const relations = await noLimit(strapi.query(queryString), { const relations = await noLimit(strapi.query(queryString), {
where: { [parentName]: combinedUidWhereFilter }, where: { [parentName]: combinedUidWhereFilter },
}); });
relations.map((relation) => sanitizeConfig(relation)); relations.map((relation) => sanitizeConfig(relation));
relations.sort(dynamicSort(relationSortField)); relationSortFields.map((sortField) => {
relations.sort(dynamicSort(sortField));
});
formattedConfig[relationName] = relations; formattedConfig[relationName] = relations;
})); }));

View File

@ -17,7 +17,7 @@ const types = (strapi) => {
queryString: 'admin::permission', queryString: 'admin::permission',
relationName: 'permissions', relationName: 'permissions',
parentName: 'role', parentName: 'role',
relationSortField: 'action', relationSortFields: ['action', 'subject'],
}], }],
}, },
]; ];
@ -32,7 +32,7 @@ const types = (strapi) => {
queryString: 'plugin::users-permissions.permission', queryString: 'plugin::users-permissions.permission',
relationName: 'permissions', relationName: 'permissions',
parentName: 'role', parentName: 'role',
relationSortField: 'action', relationSortFields: ['action'],
}], }],
}); });
} }

View File

@ -37,14 +37,16 @@ const dynamicSort = (property) => {
return (a, b) => { return (a, b) => {
if (sortOrder === -1) { if (sortOrder === -1) {
if (b[property]) {
return b[property].localeCompare(a[property]); return b[property].localeCompare(a[property]);
} else { }
} else if (a[property]) {
return a[property].localeCompare(b[property]); return a[property].localeCompare(b[property]);
} }
}; };
}; };
const sanitizeConfig = (config, relation, relationSortField) => { const sanitizeConfig = (config, relation, relationSortFields) => {
delete config._id; delete config._id;
delete config.id; delete config.id;
delete config.updatedAt; delete config.updatedAt;
@ -63,8 +65,10 @@ const sanitizeConfig = (config, relation, relationSortField) => {
formattedRelations.push(relationEntity); formattedRelations.push(relationEntity);
}); });
if (relationSortField) { if (relationSortFields) {
formattedRelations.sort(dynamicSort(relationSortField)); relationSortFields.map((sortField) => {
formattedRelations.sort(dynamicSort(sortField));
});
} }
config[relation] = formattedRelations; config[relation] = formattedRelations;