fix: hasMany number and select fields unable to save within arrays (#4047)

This commit is contained in:
Jarrod Flesch
2023-11-07 22:29:41 -05:00
committed by GitHub
parent 15459fb8e3
commit 182c57b191
6 changed files with 62 additions and 26 deletions

View File

@@ -23,6 +23,7 @@ export const init: Init = async function init(this: PostgresAdapter) {
buildTable({
adapter: this,
buildNumbers: true,
buildRelationships: true,
disableNotNull: !!collection?.versions?.drafts,
disableUnique: false,
@@ -37,6 +38,7 @@ export const init: Init = async function init(this: PostgresAdapter) {
buildTable({
adapter: this,
buildNumbers: true,
buildRelationships: true,
disableNotNull: !!collection.versions?.drafts,
disableUnique: true,
@@ -52,6 +54,7 @@ export const init: Init = async function init(this: PostgresAdapter) {
buildTable({
adapter: this,
buildNumbers: true,
buildRelationships: true,
disableNotNull: !!global?.versions?.drafts,
disableUnique: false,
@@ -66,6 +69,7 @@ export const init: Init = async function init(this: PostgresAdapter) {
buildTable({
adapter: this,
buildNumbers: true,
buildRelationships: true,
disableNotNull: !!global.versions?.drafts,
disableUnique: true,

View File

@@ -26,6 +26,7 @@ type Args = {
adapter: PostgresAdapter
baseColumns?: Record<string, PgColumnBuilder>
baseExtraConfig?: Record<string, (cols: GenericColumns) => IndexBuilder | UniqueConstraintBuilder>
buildNumbers?: boolean
buildRelationships?: boolean
disableNotNull: boolean
disableUnique: boolean
@@ -39,6 +40,7 @@ type Args = {
}
type Result = {
hasManyNumberField: 'index' | boolean
relationsToBuild: Map<string, string>
}
@@ -46,6 +48,7 @@ export const buildTable = ({
adapter,
baseColumns = {},
baseExtraConfig = {},
buildNumbers,
buildRelationships,
disableNotNull,
disableUnique = false,
@@ -53,10 +56,11 @@ export const buildTable = ({
rootRelationsToBuild,
rootRelationships,
rootTableIDColType,
rootTableName,
rootTableName: incomingRootTableName,
tableName,
timestamps,
}: Args): Result => {
const rootTableName = incomingRootTableName || tableName
const columns: Record<string, PgColumnBuilder> = baseColumns
const indexes: Record<string, (cols: GenericColumns) => IndexBuilder> = {}
@@ -102,6 +106,7 @@ export const buildTable = ({
hasManyNumberField,
} = traverseFields({
adapter,
buildNumbers,
buildRelationships,
columns,
disableNotNull,
@@ -116,7 +121,7 @@ export const buildTable = ({
relationships,
rootRelationsToBuild: rootRelationsToBuild || relationsToBuild,
rootTableIDColType: rootTableIDColType || idColType,
rootTableName: rootTableName || tableName,
rootTableName,
}))
if (timestamps) {
@@ -185,8 +190,8 @@ export const buildTable = ({
adapter.relations[`relations_${localeTableName}`] = localesTableRelations
}
if (hasManyNumberField) {
const numbersTableName = `${tableName}_numbers`
if (hasManyNumberField && buildNumbers) {
const numbersTableName = `${rootTableName}_numbers`
const columns: Record<string, PgColumnBuilder> = {
id: serial('id').primaryKey(),
number: numeric('number'),
@@ -327,5 +332,5 @@ export const buildTable = ({
adapter.relations[`relations_${tableName}`] = tableRelations
return { relationsToBuild }
return { hasManyNumberField, relationsToBuild }
}

View File

@@ -1,23 +1,24 @@
/* eslint-disable no-param-reassign */
import type { Relation } from 'drizzle-orm'
import { relations } from 'drizzle-orm'
import type { IndexBuilder, PgColumnBuilder, UniqueConstraintBuilder } from 'drizzle-orm/pg-core'
import type { Field, TabAsField } from 'payload/types'
import { relations } from 'drizzle-orm'
import {
PgNumericBuilder,
PgVarcharBuilder,
boolean,
index,
integer,
jsonb,
numeric,
pgEnum,
PgNumericBuilder,
PgVarcharBuilder,
text,
timestamp,
varchar,
} from 'drizzle-orm/pg-core'
import type { Field, TabAsField } from 'payload/types'
import { fieldAffectsData, optionIsObject } from 'payload/types'
import { InvalidConfiguration } from 'payload/errors'
import { fieldAffectsData, optionIsObject } from 'payload/types'
import toSnakeCase from 'to-snake-case'
import type { GenericColumns, PostgresAdapter } from '../types'
@@ -31,6 +32,7 @@ import { validateExistingBlockIsIdentical } from './validateExistingBlockIsIdent
type Args = {
adapter: PostgresAdapter
buildNumbers: boolean
buildRelationships: boolean
columnPrefix?: string
columns: Record<string, PgColumnBuilder>
@@ -60,6 +62,7 @@ type Result = {
export const traverseFields = ({
adapter,
buildNumbers,
buildRelationships,
columnPrefix,
columns,
@@ -283,19 +286,25 @@ export const traverseFields = ({
baseExtraConfig._localeIdx = (cols) => index('_locale_idx').on(cols._locale)
}
const { relationsToBuild: subRelationsToBuild } = buildTable({
adapter,
baseColumns,
baseExtraConfig,
disableNotNull: disableNotNullFromHere,
disableUnique,
fields: disableUnique ? idToUUID(field.fields) : field.fields,
rootRelationsToBuild,
rootRelationships: relationships,
rootTableIDColType,
rootTableName,
tableName: arrayTableName,
})
const { hasManyNumberField: subHasManyNumberField, relationsToBuild: subRelationsToBuild } =
buildTable({
adapter,
baseColumns,
baseExtraConfig,
disableNotNull: disableNotNullFromHere,
disableUnique,
fields: disableUnique ? idToUUID(field.fields) : field.fields,
rootRelationsToBuild,
rootRelationships: relationships,
rootTableIDColType,
rootTableName,
tableName: arrayTableName,
})
if (subHasManyNumberField) {
if (!hasManyNumberField || subHasManyNumberField === 'index')
hasManyNumberField = subHasManyNumberField
}
relationsToBuild.set(fieldName, arrayTableName)
@@ -351,7 +360,10 @@ export const traverseFields = ({
baseExtraConfig._localeIdx = (cols) => index('locale_idx').on(cols._locale)
}
const { relationsToBuild: subRelationsToBuild } = buildTable({
const {
hasManyNumberField: subHasManyNumberField,
relationsToBuild: subRelationsToBuild,
} = buildTable({
adapter,
baseColumns,
baseExtraConfig,
@@ -365,6 +377,11 @@ export const traverseFields = ({
tableName: blockTableName,
})
if (subHasManyNumberField) {
if (!hasManyNumberField || subHasManyNumberField === 'index')
hasManyNumberField = subHasManyNumberField
}
const blockTableRelations = relations(
adapter.tables[blockTableName],
({ many, one }) => {
@@ -413,6 +430,7 @@ export const traverseFields = ({
hasManyNumberField: groupHasManyNumberField,
} = traverseFields({
adapter,
buildNumbers,
buildRelationships,
columnPrefix,
columns,
@@ -449,6 +467,7 @@ export const traverseFields = ({
hasManyNumberField: groupHasManyNumberField,
} = traverseFields({
adapter,
buildNumbers,
buildRelationships,
columnPrefix: `${columnName}_`,
columns,
@@ -486,6 +505,7 @@ export const traverseFields = ({
hasManyNumberField: tabHasManyNumberField,
} = traverseFields({
adapter,
buildNumbers,
buildRelationships,
columnPrefix,
columns,
@@ -524,6 +544,7 @@ export const traverseFields = ({
hasManyNumberField: rowHasManyNumberField,
} = traverseFields({
adapter,
buildNumbers,
buildRelationships,
columnPrefix,
columns,

View File

@@ -3,16 +3,18 @@ import { isArrayOfRows } from '../../utilities/isArrayOfRows'
type Args = {
data: unknown
id?: unknown
locale?: string
}
export const transformSelects = ({ data, locale }: Args) => {
export const transformSelects = ({ id, data, locale }: Args) => {
const newRows: Record<string, unknown>[] = []
if (isArrayOfRows(data)) {
data.forEach((value, i) => {
const newRow: Record<string, unknown> = {
order: i + 1,
parent: id,
value,
}

View File

@@ -422,6 +422,7 @@ export const traverseFields = ({
Object.entries(data[field.name]).forEach(([localeKey, localeData]) => {
if (Array.isArray(localeData)) {
const newRows = transformSelects({
id: data._uuid || data.id,
data: localeData,
locale: localeKey,
})
@@ -432,6 +433,7 @@ export const traverseFields = ({
}
} else if (Array.isArray(data[field.name])) {
const newRows = transformSelects({
id: data._uuid || data.id,
data: data[field.name],
})

View File

@@ -102,7 +102,9 @@ export const upsertRow = async <T extends TypeWithID>({
if (Object.keys(rowToInsert.selects).length > 0) {
Object.entries(rowToInsert.selects).forEach(([selectTableName, selectRows]) => {
selectRows.forEach((row) => {
row.parent = insertedRow.id
if (typeof row.parent === 'undefined') {
row.parent = insertedRow.id
}
if (!selectsToInsert[selectTableName]) selectsToInsert[selectTableName] = []
selectsToInsert[selectTableName].push(row)
})