From 191e1187fb3c1c712b54fc7e37a1cdac09f81e0b Mon Sep 17 00:00:00 2001 From: rijkvanzanten Date: Wed, 14 Oct 2020 13:28:01 -0400 Subject: [PATCH] Fix setting o2m to null --- api/src/services/items.ts | 2 +- api/src/services/payload.ts | 57 +++++++++++++++++++------------------ 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/api/src/services/items.ts b/api/src/services/items.ts index e9ad5841df..c6155f87e6 100644 --- a/api/src/services/items.ts +++ b/api/src/services/items.ts @@ -439,8 +439,8 @@ export class ItemsService implements AbstractService { return await this.update(data, keys); } - upsert(data: Partial): Promise; upsert(data: Partial[]): Promise; + upsert(data: Partial): Promise; async upsert(data: Partial | Partial[]): Promise { const primaryKeyField = await this.schemaInspector.primary(this.collection); const payloads = Array.isArray(data) ? data : [data]; diff --git a/api/src/services/payload.ts b/api/src/services/payload.ts index b630476b66..57b5bee145 100644 --- a/api/src/services/payload.ts +++ b/api/src/services/payload.ts @@ -347,10 +347,7 @@ export class PayloadService { const relationsToProcess = relations.filter((relation) => { if (!relation.one_field) return false; - return ( - payload.hasOwnProperty(relation.one_field) && - Array.isArray(payload[relation.one_field]) - ); + return payload.hasOwnProperty(relation.one_field); }); for (const relation of relationsToProcess) { @@ -360,37 +357,43 @@ export class PayloadService { }); const relatedRecords: Partial[] = []; + let savedPrimaryKeys: PrimaryKey[] = []; - for (const relatedRecord of payload[relation.one_field!]) { - let record = cloneDeep(relatedRecord); + if (payload[relation.one_field!] && Array.isArray(payload[relation.one_field!])) { + for (const relatedRecord of payload[relation.one_field!] || []) { + let record = cloneDeep(relatedRecord); - if (typeof relatedRecord === 'string' || typeof relatedRecord === 'number') { - const exists = !!(await this.knex - .select(relation.many_primary) - .from(relation.many_collection) - .where({ [relation.many_primary]: record }) - .first()); + if ( + typeof relatedRecord === 'string' || + typeof relatedRecord === 'number' + ) { + const exists = !!(await this.knex + .select(relation.many_primary) + .from(relation.many_collection) + .where({ [relation.many_primary]: record }) + .first()); - if (exists === false) { - throw new ForbiddenException(undefined, { - item: record, - collection: relation.many_collection, - }); + if (exists === false) { + throw new ForbiddenException(undefined, { + item: record, + collection: relation.many_collection, + }); + } + + record = { + [relation.many_primary]: relatedRecord, + }; } - record = { - [relation.many_primary]: relatedRecord, - }; + relatedRecords.push({ + ...record, + [relation.many_field]: parent || payload[relation.one_primary!], + }); } - relatedRecords.push({ - ...record, - [relation.many_field]: parent || payload[relation.one_primary!], - }); + savedPrimaryKeys = await itemsService.upsert(relatedRecords); } - const primaryKeys = await itemsService.upsert(relatedRecords); - await itemsService.updateByQuery( { [relation.many_field]: null }, { @@ -403,7 +406,7 @@ export class PayloadService { }, { [relation.many_primary]: { - _nin: primaryKeys, + _nin: savedPrimaryKeys, }, }, ],