Skip to content

Commit ef74b72

Browse files
authored
Merge pull request #43 from boazpoolman/feature/multi-sort-relations
Update relation on import
2 parents 6a05393 + dbbdeb5 commit ef74b72

File tree

4 files changed

+71
-20
lines changed

4 files changed

+71
-20
lines changed

server/config/type.js

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const { isEmpty } = require('lodash');
22
const { logMessage, sanitizeConfig, dynamicSort, noLimit, getCombinedUid, getCombinedUidWhereFilter, getUidParamsFromName } = require('../utils');
3-
const difference = require('../utils/getArrayDiff');
3+
const { difference, same } = require('../utils/getArrayDiff');
44

55
const ConfigType = class ConfigType {
66
constructor({ queryString, configName, uid, jsonFields, relations }) {
@@ -99,18 +99,23 @@ const ConfigType = class ConfigType {
9999
const entity = await queryAPI.update({ where: combinedUidWhereFilter, data: query });
100100

101101
// Delete/create relations.
102-
await Promise.all(this.relations.map(async ({ queryString, relationName, parentName, relationSortField }) => {
102+
await Promise.all(this.relations.map(async ({ queryString, relationName, parentName, relationSortFields }) => {
103103
const relationQueryApi = strapi.query(queryString);
104-
existingConfig = sanitizeConfig(existingConfig, relationName, relationSortField);
105-
configContent = sanitizeConfig(configContent, relationName, relationSortField);
104+
existingConfig = sanitizeConfig(existingConfig, relationName, relationSortFields);
105+
configContent = sanitizeConfig(configContent, relationName, relationSortFields);
106106

107-
const configToAdd = difference(configContent[relationName], existingConfig[relationName], relationSortField);
108-
const configToDelete = difference(existingConfig[relationName], configContent[relationName], relationSortField);
107+
const configToAdd = difference(configContent[relationName], existingConfig[relationName], relationSortFields);
108+
const configToDelete = difference(existingConfig[relationName], configContent[relationName], relationSortFields);
109+
const configToUpdate = same(configContent[relationName], existingConfig[relationName], relationSortFields);
109110

110111
await Promise.all(configToDelete.map(async (config) => {
112+
const whereClause = {};
113+
relationSortFields.map((sortField) => {
114+
whereClause[sortField] = config[sortField];
115+
});
111116
await relationQueryApi.delete({
112117
where: {
113-
[relationSortField]: config[relationSortField],
118+
...whereClause,
114119
[parentName]: entity.id,
115120
},
116121
});
@@ -121,6 +126,21 @@ const ConfigType = class ConfigType {
121126
data: { ...config, [parentName]: entity.id },
122127
});
123128
}));
129+
130+
await Promise.all(configToUpdate.map(async (config, index) => {
131+
const whereClause = {};
132+
relationSortFields.map((sortField) => {
133+
whereClause[sortField] = config[sortField];
134+
});
135+
136+
await relationQueryApi.update({
137+
where: {
138+
...whereClause,
139+
[parentName]: entity.id,
140+
},
141+
data: { ...config, [parentName]: entity.id },
142+
});
143+
}));
124144
}));
125145
}
126146
}
@@ -168,13 +188,15 @@ const ConfigType = class ConfigType {
168188
if (shouldExclude) return;
169189

170190
const formattedConfig = { ...sanitizeConfig(config) };
171-
await Promise.all(this.relations.map(async ({ queryString, relationName, relationSortField, parentName }) => {
191+
await Promise.all(this.relations.map(async ({ queryString, relationName, relationSortFields, parentName }) => {
172192
const relations = await noLimit(strapi.query(queryString), {
173193
where: { [parentName]: combinedUidWhereFilter },
174194
});
175195

176196
relations.map((relation) => sanitizeConfig(relation));
177-
relations.sort(dynamicSort(relationSortField));
197+
relationSortFields.map((sortField) => {
198+
relations.sort(dynamicSort(sortField));
199+
});
178200
formattedConfig[relationName] = relations;
179201
}));
180202

server/config/types.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const types = (strapi) => {
1717
queryString: 'admin::permission',
1818
relationName: 'permissions',
1919
parentName: 'role',
20-
relationSortField: 'action',
20+
relationSortFields: ['action', 'subject'],
2121
}],
2222
},
2323
];
@@ -32,7 +32,7 @@ const types = (strapi) => {
3232
queryString: 'plugin::users-permissions.permission',
3333
relationName: 'permissions',
3434
parentName: 'role',
35-
relationSortField: 'action',
35+
relationSortFields: ['action'],
3636
}],
3737
});
3838
}

server/utils/getArrayDiff.js

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,32 @@
1-
const difference = (arrayOne, arrayTwo, compareKey) => {
2-
return arrayOne.filter(({ [compareKey]: id1 }) => {
3-
return !arrayTwo.some(({ [compareKey]: id2 }) => id2 === id1);
1+
const difference = (arrayOne, arrayTwo, compareKeys) => {
2+
return arrayOne.filter(({
3+
[compareKeys[0]]: id1,
4+
[compareKeys[1]]: id2,
5+
}) => {
6+
return !arrayTwo.some(({
7+
[compareKeys[0]]: id3,
8+
[compareKeys[1]]: id4,
9+
}) => id1 === id3 && id2 === id4);
410
});
511
};
612

7-
module.exports = difference;
13+
const same = (arrayOne, arrayTwo, compareKeys) => {
14+
return arrayOne.filter(({
15+
[compareKeys[0]]: id1,
16+
[compareKeys[1]]: id2,
17+
...restOne
18+
}) => {
19+
return !arrayTwo.some(({
20+
[compareKeys[0]]: id3,
21+
[compareKeys[1]]: id4,
22+
...restTwo
23+
}) => id1 === id3
24+
&& id2 === id4
25+
&& JSON.stringify(restOne) === JSON.stringify(restTwo));
26+
});
27+
};
28+
29+
module.exports = {
30+
difference,
31+
same,
32+
};

server/utils/index.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,16 @@ const dynamicSort = (property) => {
3737

3838
return (a, b) => {
3939
if (sortOrder === -1) {
40-
return b[property].localeCompare(a[property]);
41-
} else {
40+
if (b[property]) {
41+
return b[property].localeCompare(a[property]);
42+
}
43+
} else if (a[property]) {
4244
return a[property].localeCompare(b[property]);
4345
}
4446
};
4547
};
4648

47-
const sanitizeConfig = (config, relation, relationSortField) => {
49+
const sanitizeConfig = (config, relation, relationSortFields) => {
4850
delete config._id;
4951
delete config.id;
5052
delete config.updatedAt;
@@ -63,8 +65,10 @@ const sanitizeConfig = (config, relation, relationSortField) => {
6365
formattedRelations.push(relationEntity);
6466
});
6567

66-
if (relationSortField) {
67-
formattedRelations.sort(dynamicSort(relationSortField));
68+
if (relationSortFields) {
69+
relationSortFields.map((sortField) => {
70+
formattedRelations.sort(dynamicSort(sortField));
71+
});
6872
}
6973

7074
config[relation] = formattedRelations;

0 commit comments

Comments
 (0)