mirror of
https://github.com/strapi/strapi.git
synced 2025-10-27 16:10:08 +00:00
use set format
This commit is contained in:
parent
5d0eb61fae
commit
c1d82b6f9e
@ -15,6 +15,7 @@ const {
|
|||||||
uniqBy,
|
uniqBy,
|
||||||
differenceBy,
|
differenceBy,
|
||||||
groupBy,
|
groupBy,
|
||||||
|
isNumber,
|
||||||
} = require('lodash/fp');
|
} = require('lodash/fp');
|
||||||
const types = require('../types');
|
const types = require('../types');
|
||||||
const { createField } = require('../fields');
|
const { createField } = require('../fields');
|
||||||
@ -32,15 +33,8 @@ const toId = (value) => value.id || value;
|
|||||||
const toIds = (value) => castArray(value || []).map(toId);
|
const toIds = (value) => castArray(value || []).map(toId);
|
||||||
|
|
||||||
const isValidId = (value) => isString(value) || isInteger(value);
|
const isValidId = (value) => isString(value) || isInteger(value);
|
||||||
const toAssocs = (data) => {
|
const toIdArray = (data) => {
|
||||||
if (data?.connect || data?.disconnect || (isPlainObject(data) && !data.id)) {
|
const array = castArray(data)
|
||||||
return {
|
|
||||||
connect: toAssocs(data.connect),
|
|
||||||
disconnect: toAssocs(data.disconnect),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return castArray(data)
|
|
||||||
.filter((datum) => !isNil(datum))
|
.filter((datum) => !isNil(datum))
|
||||||
.map((datum) => {
|
.map((datum) => {
|
||||||
// if it is a string or an integer return an obj with id = to datum
|
// if it is a string or an integer return an obj with id = to datum
|
||||||
@ -55,6 +49,26 @@ const toAssocs = (data) => {
|
|||||||
|
|
||||||
return datum;
|
return datum;
|
||||||
});
|
});
|
||||||
|
return uniqBy('id', array);
|
||||||
|
};
|
||||||
|
|
||||||
|
const toAssocs = (data) => {
|
||||||
|
if (isArray(data) || isString(data) || isNumber(data) || data?.id) {
|
||||||
|
return {
|
||||||
|
set: isNull(data) ? data : toIdArray(data),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data?.set) {
|
||||||
|
return {
|
||||||
|
set: isNull(data.set) ? data.set : toIdArray(data.set),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
connect: toIdArray(data?.connect),
|
||||||
|
disconnect: toIdArray(data?.disconnect),
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const processData = (metadata, data = {}, { withDefaults = false } = {}) => {
|
const processData = (metadata, data = {}, { withDefaults = false } = {}) => {
|
||||||
@ -389,7 +403,7 @@ const createEntityManager = (db) => {
|
|||||||
|
|
||||||
const { idColumn, typeColumn } = morphColumn;
|
const { idColumn, typeColumn } = morphColumn;
|
||||||
|
|
||||||
const rows = toAssocs(data[attributeName]).map((data, idx) => {
|
const rows = toAssocs(data[attributeName]).set.map((data, idx) => {
|
||||||
return {
|
return {
|
||||||
[joinColumn.name]: data.id,
|
[joinColumn.name]: data.id,
|
||||||
[idColumn.name]: id,
|
[idColumn.name]: id,
|
||||||
@ -418,7 +432,7 @@ const createEntityManager = (db) => {
|
|||||||
|
|
||||||
const { idColumn, typeColumn, typeField = '__type' } = morphColumn;
|
const { idColumn, typeColumn, typeField = '__type' } = morphColumn;
|
||||||
|
|
||||||
const rows = toAssocs(data[attributeName]).map((data) => ({
|
const rows = toAssocs(data[attributeName]).set.map((data) => ({
|
||||||
[joinColumn.name]: id,
|
[joinColumn.name]: id,
|
||||||
[idColumn.name]: data.id,
|
[idColumn.name]: data.id,
|
||||||
[typeColumn.name]: data[typeField],
|
[typeColumn.name]: data[typeField],
|
||||||
@ -489,7 +503,7 @@ const createEntityManager = (db) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const cleanRelationData = toAssocs(data[attributeName]);
|
const cleanRelationData = toAssocs(data[attributeName]);
|
||||||
const relsToAdd = uniqBy('id', cleanRelationData.connect || cleanRelationData);
|
const relsToAdd = cleanRelationData.set || cleanRelationData.connect;
|
||||||
const relIdsToadd = toIds(relsToAdd);
|
const relIdsToadd = toIds(relsToAdd);
|
||||||
|
|
||||||
await deletePreviousOneToAnyRelations({ id, attribute, joinTable, relIdsToadd, db });
|
await deletePreviousOneToAnyRelations({ id, attribute, joinTable, relIdsToadd, db });
|
||||||
@ -599,7 +613,7 @@ const createEntityManager = (db) => {
|
|||||||
})
|
})
|
||||||
.execute();
|
.execute();
|
||||||
|
|
||||||
const rows = toAssocs(data[attributeName]).map((data, idx) => ({
|
const rows = toAssocs(data[attributeName]).set.map((data, idx) => ({
|
||||||
[joinColumn.name]: data.id,
|
[joinColumn.name]: data.id,
|
||||||
[idColumn.name]: id,
|
[idColumn.name]: id,
|
||||||
[typeColumn.name]: uid,
|
[typeColumn.name]: uid,
|
||||||
@ -638,7 +652,7 @@ const createEntityManager = (db) => {
|
|||||||
})
|
})
|
||||||
.execute();
|
.execute();
|
||||||
|
|
||||||
const rows = toAssocs(data[attributeName]).map((data) => ({
|
const rows = toAssocs(data[attributeName]).set.map((data) => ({
|
||||||
[joinColumn.name]: id,
|
[joinColumn.name]: id,
|
||||||
[idColumn.name]: data.id,
|
[idColumn.name]: data.id,
|
||||||
[typeColumn.name]: data[typeField],
|
[typeColumn.name]: data[typeField],
|
||||||
@ -705,21 +719,20 @@ const createEntityManager = (db) => {
|
|||||||
await deleteAllRelations({ id, attribute, joinTable, db });
|
await deleteAllRelations({ id, attribute, joinTable, db });
|
||||||
} else {
|
} else {
|
||||||
const cleanRelationData = toAssocs(data[attributeName]);
|
const cleanRelationData = toAssocs(data[attributeName]);
|
||||||
const isPartialUpdate =
|
const isPartialUpdate = !has('set', cleanRelationData);
|
||||||
has('connect', cleanRelationData) || has('disconnect', cleanRelationData);
|
|
||||||
let relIdsToaddOrMove;
|
let relIdsToaddOrMove;
|
||||||
|
|
||||||
if (isPartialUpdate) {
|
if (isPartialUpdate) {
|
||||||
// does not support pivot
|
// does not support pivot
|
||||||
let connect = uniqBy('id', cleanRelationData.connect || []);
|
|
||||||
let disconnect = uniqBy('id', cleanRelationData.disconnect || []);
|
|
||||||
if (isAnyToOne(attribute)) {
|
if (isAnyToOne(attribute)) {
|
||||||
connect = connect.slice(-1);
|
cleanRelationData.connect = cleanRelationData.connect.slice(-1);
|
||||||
disconnect = [];
|
cleanRelationData.disconnect = [];
|
||||||
}
|
}
|
||||||
relIdsToaddOrMove = toIds(connect);
|
relIdsToaddOrMove = toIds(cleanRelationData.connect);
|
||||||
// DELETE relations in disconnect
|
// DELETE relations in disconnect
|
||||||
const relIdsToDelete = toIds(differenceBy('id', disconnect, connect));
|
const relIdsToDelete = toIds(
|
||||||
|
differenceBy('id', cleanRelationData.disconnect, cleanRelationData.connect)
|
||||||
|
);
|
||||||
|
|
||||||
await deleteAllRelations({ id, attribute, joinTable, onlyFor: relIdsToDelete, db });
|
await deleteAllRelations({ id, attribute, joinTable, onlyFor: relIdsToDelete, db });
|
||||||
|
|
||||||
@ -746,8 +759,7 @@ const createEntityManager = (db) => {
|
|||||||
).max;
|
).max;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const relToAddOrMove of connect) {
|
for (const relToAddOrMove of cleanRelationData.connect) {
|
||||||
// const currentRel = currentMovingRelsMap[relToAddOrMove.id]?.[0];
|
|
||||||
const currentRel = currentMovingRelsMap[relToAddOrMove.id]?.[0];
|
const currentRel = currentMovingRelsMap[relToAddOrMove.id]?.[0];
|
||||||
if (currentRel && isAnyToMany(attribute)) {
|
if (currentRel && isAnyToMany(attribute)) {
|
||||||
const currentOrderIsNull = currentRel[orderColumnName] === null;
|
const currentOrderIsNull = currentRel[orderColumnName] === null;
|
||||||
@ -783,6 +795,7 @@ const createEntityManager = (db) => {
|
|||||||
[joinColumn.name]: id,
|
[joinColumn.name]: id,
|
||||||
[inverseJoinColumn.name]: relToAddOrMove.id,
|
[inverseJoinColumn.name]: relToAddOrMove.id,
|
||||||
...(relToAddOrMove.__pivot || {}),
|
...(relToAddOrMove.__pivot || {}),
|
||||||
|
...(joinTable.on || {}),
|
||||||
};
|
};
|
||||||
|
|
||||||
if (isAnyToMany(attribute)) {
|
if (isAnyToMany(attribute)) {
|
||||||
@ -806,8 +819,7 @@ const createEntityManager = (db) => {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// overwrite all relations
|
// overwrite all relations
|
||||||
const relsToAdd = uniqBy('id', cleanRelationData);
|
relIdsToaddOrMove = toIds(cleanRelationData.set);
|
||||||
relIdsToaddOrMove = toIds(relsToAdd);
|
|
||||||
await deleteAllRelations({ id, attribute, joinTable, except: relIdsToaddOrMove, db });
|
await deleteAllRelations({ id, attribute, joinTable, except: relIdsToaddOrMove, db });
|
||||||
|
|
||||||
const currentMovingRels = await this.createQueryBuilder(joinTable.name)
|
const currentMovingRels = await this.createQueryBuilder(joinTable.name)
|
||||||
@ -821,7 +833,7 @@ const createEntityManager = (db) => {
|
|||||||
const currentMovingRelsMap = groupBy(inverseJoinColumn.name, currentMovingRels);
|
const currentMovingRelsMap = groupBy(inverseJoinColumn.name, currentMovingRels);
|
||||||
|
|
||||||
let max = 0;
|
let max = 0;
|
||||||
for (const relToAdd of relsToAdd) {
|
for (const relToAdd of cleanRelationData.set) {
|
||||||
const currentRel = currentMovingRelsMap[relToAdd.id]?.[0];
|
const currentRel = currentMovingRelsMap[relToAdd.id]?.[0];
|
||||||
|
|
||||||
if (currentRel && isAnyToMany(attribute)) {
|
if (currentRel && isAnyToMany(attribute)) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user