diff --git a/packages/db-postgres/src/transform/write/array.ts b/packages/db-postgres/src/transform/write/array.ts index 87b0c21b7c..b5894f38ae 100644 --- a/packages/db-postgres/src/transform/write/array.ts +++ b/packages/db-postgres/src/transform/write/array.ts @@ -1,7 +1,7 @@ /* eslint-disable no-param-reassign */ import type { ArrayField } from 'payload/types' -import type { ArrayRowToInsert, BlockRowToInsert } from './types' +import type { ArrayRowToInsert, BlockRowToInsert, RelationshipToDelete } from './types' import { isArrayOfRows } from '../../utilities/isArrayOfRows' import { traverseFields } from './traverseFields' @@ -15,8 +15,13 @@ type Args = { data: unknown field: ArrayField locale?: string + numbers: Record[] path: string relationships: Record[] + relationshipsToDelete: RelationshipToDelete[] + selects: { + [tableName: string]: Record[] + } } export const transformArray = ({ @@ -26,8 +31,11 @@ export const transformArray = ({ data, field, locale, + numbers, path, relationships, + relationshipsToDelete, + selects, }: Args) => { const newRows: ArrayRowToInsert[] = [] @@ -60,10 +68,13 @@ export const transformArray = ({ fields: field.fields, locales: newRow.locales, newTableName: arrayTableName, + numbers, parentTableName: arrayTableName, path: `${path || ''}${field.name}.${i}.`, relationships, + relationshipsToDelete, row: newRow.row, + selects, }) newRows.push(newRow) diff --git a/packages/db-postgres/src/transform/write/blocks.ts b/packages/db-postgres/src/transform/write/blocks.ts index a80a3f913d..c23ffbc1cc 100644 --- a/packages/db-postgres/src/transform/write/blocks.ts +++ b/packages/db-postgres/src/transform/write/blocks.ts @@ -3,7 +3,7 @@ import type { BlockField } from 'payload/types' import toSnakeCase from 'to-snake-case' -import type { BlockRowToInsert } from './types' +import type { BlockRowToInsert, RelationshipToDelete } from './types' import { traverseFields } from './traverseFields' @@ -14,8 +14,13 @@ type Args = { data: Record[] field: BlockField locale?: string + numbers: Record[] path: string relationships: Record[] + relationshipsToDelete: RelationshipToDelete[] + selects: { + [tableName: string]: Record[] + } tableName } export const transformBlocks = ({ @@ -23,8 +28,11 @@ export const transformBlocks = ({ data, field, locale, + numbers, path, relationships, + relationshipsToDelete, + selects, tableName, }: Args) => { data.forEach((blockRow, i) => { @@ -55,10 +63,13 @@ export const transformBlocks = ({ fields: matchedBlock.fields, locales: newRow.locales, newTableName: blockTableName, + numbers, parentTableName: blockTableName, path: `${path || ''}${field.name}.${i}.`, relationships, + relationshipsToDelete, row: newRow.row, + selects, }) blocks[blockRow.blockType].push(newRow) diff --git a/packages/db-postgres/src/transform/write/index.ts b/packages/db-postgres/src/transform/write/index.ts index 9dffc1ea3b..d88cf8411d 100644 --- a/packages/db-postgres/src/transform/write/index.ts +++ b/packages/db-postgres/src/transform/write/index.ts @@ -13,14 +13,14 @@ type Args = { } export const transformForWrite = ({ data, fields, path = '', tableName }: Args): RowToInsert => { - // Split out the incoming data into the corresponding: - // base row, locales, relationships, blocks, and arrays + // Split out the incoming data into rows to insert / delete const rowToInsert: RowToInsert = { arrays: {}, blocks: {}, locales: {}, numbers: [], relationships: [], + relationshipsToDelete: [], row: {}, selects: {}, } @@ -39,6 +39,7 @@ export const transformForWrite = ({ data, fields, path = '', tableName }: Args): parentTableName: tableName, path, relationships: rowToInsert.relationships, + relationshipsToDelete: rowToInsert.relationshipsToDelete, row: rowToInsert.row, selects: rowToInsert.selects, }) diff --git a/packages/db-postgres/src/transform/write/traverseFields.ts b/packages/db-postgres/src/transform/write/traverseFields.ts index 0d91ac891e..70fb919535 100644 --- a/packages/db-postgres/src/transform/write/traverseFields.ts +++ b/packages/db-postgres/src/transform/write/traverseFields.ts @@ -4,7 +4,7 @@ import type { Field } from 'payload/types' import { fieldAffectsData } from 'payload/types' import toSnakeCase from 'to-snake-case' -import type { ArrayRowToInsert, BlockRowToInsert } from './types' +import type { ArrayRowToInsert, BlockRowToInsert, RelationshipToDelete } from './types' import { isArrayOfRows } from '../../utilities/isArrayOfRows' import { transformArray } from './array' @@ -33,6 +33,7 @@ type Args = { parentTableName: string path: string relationships: Record[] + relationshipsToDelete: RelationshipToDelete[] row: Record selects: { [tableName: string]: Record[] @@ -53,6 +54,7 @@ export const traverseFields = ({ parentTableName, path, relationships, + relationshipsToDelete, row, selects, }: Args) => { @@ -80,8 +82,11 @@ export const traverseFields = ({ data: localeData, field, locale: localeKey, + numbers, path, relationships, + relationshipsToDelete, + selects, }) arrays[arrayTableName] = arrays[arrayTableName].concat(newRows) @@ -95,8 +100,11 @@ export const traverseFields = ({ columnName, data: data[field.name], field, + numbers, path, relationships, + relationshipsToDelete, + selects, }) arrays[arrayTableName] = arrays[arrayTableName].concat(newRows) @@ -115,8 +123,11 @@ export const traverseFields = ({ data: localeData, field, locale: localeKey, + numbers, path, relationships, + relationshipsToDelete, + selects, tableName: newTableName, }) } @@ -127,8 +138,11 @@ export const traverseFields = ({ blocks, data: fieldData, field, + numbers, path, relationships, + relationshipsToDelete, + selects, tableName: newTableName, }) } @@ -154,6 +168,7 @@ export const traverseFields = ({ parentTableName, path: `${path || ''}${field.name}.`, relationships, + relationshipsToDelete, row, selects, }) @@ -172,6 +187,7 @@ export const traverseFields = ({ parentTableName, path: `${path || ''}${field.name}.`, relationships, + relationshipsToDelete, row, selects, }) @@ -201,6 +217,7 @@ export const traverseFields = ({ parentTableName, path: `${path || ''}${tab.name}.`, relationships, + relationshipsToDelete, row, selects, }) @@ -219,6 +236,7 @@ export const traverseFields = ({ parentTableName, path: `${path || ''}${tab.name}.`, relationships, + relationshipsToDelete, row, selects, }) @@ -238,6 +256,7 @@ export const traverseFields = ({ parentTableName, path, relationships, + relationshipsToDelete, row, selects, }) @@ -259,6 +278,7 @@ export const traverseFields = ({ parentTableName, path, relationships, + relationshipsToDelete, row, selects, }) @@ -270,6 +290,14 @@ export const traverseFields = ({ if (field.localized) { if (typeof fieldData === 'object') { Object.entries(fieldData).forEach(([localeKey, localeData]) => { + if (localeData === null) { + relationshipsToDelete.push({ + locale: localeKey, + path: relationshipPath, + }) + return + } + transformRelationship({ baseRow: { locale: localeKey, @@ -282,6 +310,11 @@ export const traverseFields = ({ }) } } else { + if (fieldData === null) { + relationshipsToDelete.push({ path: relationshipPath }) + return + } + transformRelationship({ baseRow: { path: relationshipPath, @@ -380,10 +413,10 @@ export const traverseFields = ({ valuesToTransform.forEach(({ localeKey, ref, value }) => { if (typeof value !== 'undefined') { - let formattedValue = value; + let formattedValue = value if (field.type === 'date' && field.name === 'updatedAt') { - formattedValue = new Date().toISOString(); + formattedValue = new Date().toISOString() } if (localeKey) { diff --git a/packages/db-postgres/src/transform/write/types.ts b/packages/db-postgres/src/transform/write/types.ts index 3fcaa3ff04..e7e530374e 100644 --- a/packages/db-postgres/src/transform/write/types.ts +++ b/packages/db-postgres/src/transform/write/types.ts @@ -19,6 +19,11 @@ export type BlockRowToInsert = { row: Record } +export type RelationshipToDelete = { + locale?: string + path: string +} + export type RowToInsert = { arrays: { [tableName: string]: ArrayRowToInsert[] @@ -31,6 +36,7 @@ export type RowToInsert = { } numbers: Record[] relationships: Record[] + relationshipsToDelete: RelationshipToDelete[] row: Record selects: { [tableName: string]: Record[] diff --git a/packages/db-postgres/src/upsertRow/deleteExistingRowsByPath.ts b/packages/db-postgres/src/upsertRow/deleteExistingRowsByPath.ts index 09448e6af3..4c39ebf91d 100644 --- a/packages/db-postgres/src/upsertRow/deleteExistingRowsByPath.ts +++ b/packages/db-postgres/src/upsertRow/deleteExistingRowsByPath.ts @@ -6,10 +6,10 @@ type Args = { adapter: PostgresAdapter db: DrizzleDB localeColumnName?: string - newRows: Record[] parentColumnName?: string parentID: unknown pathColumnName?: string + rows: Record[] tableName: string } @@ -17,17 +17,17 @@ export const deleteExistingRowsByPath = async ({ adapter, db, localeColumnName = '_locale', - newRows, parentColumnName = '_parentID', parentID, pathColumnName = '_path', + rows, tableName, }: Args): Promise => { const localizedPathsToDelete = new Set() const pathsToDelete = new Set() const table = adapter.tables[tableName] - newRows.forEach((row) => { + rows.forEach((row) => { const path = row[pathColumnName] const localeData = row[localeColumnName] if (typeof path === 'string') { diff --git a/packages/db-postgres/src/upsertRow/index.ts b/packages/db-postgres/src/upsertRow/index.ts index 2324a99769..2901a77c00 100644 --- a/packages/db-postgres/src/upsertRow/index.ts +++ b/packages/db-postgres/src/upsertRow/index.ts @@ -140,10 +140,10 @@ export const upsertRow = async ({ adapter, db, localeColumnName: 'locale', - newRows: relationsToInsert, parentColumnName: 'parent', parentID: insertedRow.id, pathColumnName: 'path', + rows: [...relationsToInsert, ...rowToInsert.relationshipsToDelete], tableName: relationshipsTableName, }) } @@ -165,10 +165,10 @@ export const upsertRow = async ({ adapter, db, localeColumnName: 'locale', - newRows: numbersToInsert, parentColumnName: 'parent', parentID: insertedRow.id, pathColumnName: 'path', + rows: numbersToInsert, tableName: numbersTableName, }) } @@ -191,9 +191,9 @@ export const upsertRow = async ({ await deleteExistingRowsByPath({ adapter, db, - newRows: blockRows.map(({ row }) => row), parentID: insertedRow.id, pathColumnName: '_path', + rows: blockRows.map(({ row }) => row), tableName: `${tableName}_${blockName}`, }) } diff --git a/test/relationships/int.spec.ts b/test/relationships/int.spec.ts index 9d853f2322..6329a4ce1c 100644 --- a/test/relationships/int.spec.ts +++ b/test/relationships/int.spec.ts @@ -225,7 +225,7 @@ describe('Relationships', () => { }) expect(result.status).toEqual(200) - expect(result.doc.relationField).toBeNull() + expect(result.doc.relationField).toBeFalsy() }) })