chore: improves semantics of transform write

This commit is contained in:
James
2023-09-23 12:18:04 -07:00
parent 74fcf2fc1f
commit bb7feddbff
16 changed files with 163 additions and 97 deletions

View File

@@ -16,7 +16,7 @@ export const createGlobalVersion: CreateGlobalVersion = async function createGlo
const db = this.sessions?.[req.transactionID] || this.db
const global = this.payload.globals.config.find(({ slug }) => slug === globalSlug)
const globalTableName = toSnakeCase(globalSlug)
const tableName = `_${globalTableName}_versions`
const tableName = `_${globalTableName}_v`
const result = await upsertRow({
adapter: this,

View File

@@ -16,7 +16,7 @@ export const createVersion: CreateVersion = async function createVersion(
const db = this.sessions?.[req.transactionID] || this.db
const collection = this.payload.collections[collectionSlug].config
const collectionTableName = toSnakeCase(collectionSlug)
const tableName = `_${collectionTableName}_versions`
const tableName = `_${collectionTableName}_v`
const result = await upsertRow({
adapter: this,

View File

@@ -16,7 +16,7 @@ export const deleteVersions: DeleteVersions = async function deleteVersion(
const db = this.sessions?.[req.transactionID] || this.db
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
const tableName = `_${toSnakeCase(collection)}_versions`
const tableName = `_${toSnakeCase(collection)}_v`
const fields = buildVersionCollectionFields(collectionConfig)
const { docs } = await findMany({

View File

@@ -22,10 +22,12 @@ export const findGlobalVersions: FindGlobalVersions = async function findGlobalV
where,
},
) {
const globalConfig: SanitizedGlobalConfig = this.payload.globals.config.find(({ slug }) => slug === global)
const globalConfig: SanitizedGlobalConfig = this.payload.globals.config.find(
({ slug }) => slug === global,
)
const sort = typeof sortArg === 'string' ? sortArg : '-createdAt'
const tableName = `_${toSnakeCase(global)}_versions`
const tableName = `_${toSnakeCase(global)}_v`
const fields = buildVersionGlobalFields(globalConfig)
return findMany({

View File

@@ -25,7 +25,7 @@ export const findVersions: FindVersions = async function findVersions(
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
const sort = typeof sortArg === 'string' ? sortArg : collectionConfig.defaultSort
const tableName = `_${toSnakeCase(collection)}_versions`
const tableName = `_${toSnakeCase(collection)}_v`
const fields = buildVersionCollectionFields(collectionConfig)
return findMany({

View File

@@ -28,18 +28,20 @@ export const init: Init = async function init(this: PostgresAdapter) {
buildTable({
adapter: this,
buildRelationships: true,
disableUnique: false,
fields: collection.fields,
tableName,
timestamps: collection.timestamps,
})
if (collection.versions) {
const versionsTableName = `_${tableName}_versions`
const versionsTableName = `_${tableName}_v`
const versionFields = buildVersionCollectionFields(collection)
buildTable({
adapter: this,
buildRelationships: true,
disableUnique: true,
fields: versionFields,
tableName: versionsTableName,
timestamps: true,
@@ -53,18 +55,20 @@ export const init: Init = async function init(this: PostgresAdapter) {
buildTable({
adapter: this,
buildRelationships: true,
disableUnique: false,
fields: global.fields,
tableName,
timestamps: false,
})
if (global.versions) {
const versionsTableName = `_${tableName}_versions`
const versionsTableName = `_${tableName}_v`
const versionFields = buildVersionGlobalFields(global)
buildTable({
adapter: this,
buildRelationships: true,
disableUnique: true,
fields: versionFields,
tableName: versionsTableName,
timestamps: true,

View File

@@ -17,7 +17,7 @@ export const queryDrafts: QueryDrafts = async function queryDrafts({
where,
}) {
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
const tableName = `_${toSnakeCase(collection)}_versions`
const tableName = `_${toSnakeCase(collection)}_v`
const fields = buildVersionCollectionFields(collectionConfig)
const combinedWhere = combineQueries({ latest: { equals: true } }, where)

View File

@@ -4,7 +4,16 @@ import type { IndexBuilder, PgColumnBuilder, UniqueConstraintBuilder } from 'dri
import type { Field } from 'payload/types'
import { relations } from 'drizzle-orm'
import { index, integer, numeric, pgTable, serial, timestamp, unique, varchar, } from 'drizzle-orm/pg-core'
import {
index,
integer,
numeric,
pgTable,
serial,
timestamp,
unique,
varchar,
} from 'drizzle-orm/pg-core'
import { fieldAffectsData } from 'payload/types'
import toSnakeCase from 'to-snake-case'
@@ -18,6 +27,7 @@ type Args = {
baseColumns?: Record<string, PgColumnBuilder>
baseExtraConfig?: Record<string, (cols: GenericColumns) => IndexBuilder | UniqueConstraintBuilder>
buildRelationships?: boolean
disableUnique: boolean
fields: Field[]
tableName: string
timestamps?: boolean
@@ -32,6 +42,7 @@ export const buildTable = ({
baseColumns = {},
baseExtraConfig = {},
buildRelationships,
disableUnique = false,
fields,
tableName,
timestamps,
@@ -43,7 +54,6 @@ export const buildTable = ({
let hasLocalizedRelationshipField = false
let hasManyNumberField: 'index' | boolean = false
let hasLocalizedManyNumberField = false
const disableUnique = tableName.endsWith('_versions')
const localesColumns: Record<string, PgColumnBuilder> = {}
const localesIndexes: Record<string, (cols: GenericColumns) => IndexBuilder> = {}

View File

@@ -1,7 +1,7 @@
/* eslint-disable no-param-reassign */
import type { Relation } from 'drizzle-orm'
import type { IndexBuilder, PgColumnBuilder, UniqueConstraintBuilder } from 'drizzle-orm/pg-core'
import type { Field } from 'payload/types'
import type { Field, TabAsField } from 'payload/types'
import { relations } from 'drizzle-orm'
import {
@@ -36,7 +36,7 @@ type Args = {
columns: Record<string, PgColumnBuilder>
disableUnique?: boolean
fieldPrefix?: string
fields: Field[]
fields: (Field | TabAsField)[]
forceLocalized?: boolean
indexes: Record<string, (cols: GenericColumns) => IndexBuilder>
localesColumns: Record<string, PgColumnBuilder>
@@ -212,6 +212,7 @@ export const traverseFields = ({
adapter,
baseColumns,
baseExtraConfig,
disableUnique,
fields: [],
tableName: selectTableName,
})
@@ -268,6 +269,7 @@ export const traverseFields = ({
adapter,
baseColumns,
baseExtraConfig,
disableUnique,
fields: field.fields,
tableName: arrayTableName,
})
@@ -328,6 +330,7 @@ export const traverseFields = ({
adapter,
baseColumns,
baseExtraConfig,
disableUnique,
fields: block.fields,
tableName: blockTableName,
})
@@ -363,7 +366,39 @@ export const traverseFields = ({
break
}
case 'tab':
case 'group': {
if (!('name' in field)) {
const {
hasLocalizedField: groupHasLocalizedField,
hasLocalizedManyNumberField: groupHasLocalizedManyNumberField,
hasLocalizedRelationshipField: groupHasLocalizedRelationshipField,
hasManyNumberField: groupHasManyNumberField,
} = traverseFields({
adapter,
buildRelationships,
columnPrefix,
columns,
disableUnique,
fieldPrefix,
fields: field.fields,
forceLocalized,
indexes,
localesColumns,
localesIndexes,
newTableName: parentTableName,
parentTableName,
relationsToBuild,
relationships,
})
if (groupHasLocalizedField) hasLocalizedField = true
if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true
if (groupHasManyNumberField) hasManyNumberField = true
if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true
break
}
const {
hasLocalizedField: groupHasLocalizedField,
hasLocalizedManyNumberField: groupHasLocalizedManyNumberField,
@@ -395,63 +430,44 @@ export const traverseFields = ({
}
case 'tabs': {
field.tabs.forEach((tab) => {
if ('name' in tab) {
const {
hasLocalizedField: tabHasLocalizedField,
hasLocalizedManyNumberField: tabHasLocalizedManyNumberField,
hasLocalizedRelationshipField: tabHasLocalizedRelationshipField,
hasManyNumberField: tabHasManyNumberField,
} = traverseFields({
adapter,
buildRelationships,
columnPrefix: `${columnPrefix || ''}${toSnakeCase(tab.name)}_`,
columns,
disableUnique,
fieldPrefix: `${fieldPrefix || ''}${tab.name}_`,
fields: tab.fields,
indexes,
localesColumns,
localesIndexes,
newTableName: `${parentTableName}_${columnPrefix || ''}${toSnakeCase(tab.name)}`,
parentTableName,
relationsToBuild,
relationships,
})
if (tabHasLocalizedField) hasLocalizedField = true
if (tabHasLocalizedRelationshipField) hasLocalizedRelationshipField = true
if (tabHasManyNumberField) hasManyNumberField = true
if (tabHasLocalizedManyNumberField) hasLocalizedManyNumberField = true
} else {
;({ hasLocalizedField, hasLocalizedRelationshipField } = traverseFields({
adapter,
buildRelationships,
columnPrefix,
columns,
disableUnique,
fieldPrefix,
fields: tab.fields,
indexes,
localesColumns,
localesIndexes,
newTableName: parentTableName,
parentTableName,
relationsToBuild,
relationships,
}))
}
const {
hasLocalizedField: tabHasLocalizedField,
hasLocalizedManyNumberField: tabHasLocalizedManyNumberField,
hasLocalizedRelationshipField: tabHasLocalizedRelationshipField,
hasManyNumberField: tabHasManyNumberField,
} = traverseFields({
adapter,
buildRelationships,
columnPrefix,
columns,
disableUnique,
fieldPrefix,
fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),
forceLocalized,
indexes,
localesColumns,
localesIndexes,
newTableName,
parentTableName,
relationsToBuild,
relationships,
})
if (tabHasLocalizedField) hasLocalizedField = true
if (tabHasLocalizedRelationshipField) hasLocalizedRelationshipField = true
if (tabHasManyNumberField) hasManyNumberField = true
if (tabHasLocalizedManyNumberField) hasLocalizedManyNumberField = true
break
}
case 'row':
case 'collapsible': {
;({
hasLocalizedField,
hasLocalizedManyNumberField,
hasLocalizedRelationshipField,
hasManyNumberField,
const {
hasLocalizedField: rowHasLocalizedField,
hasLocalizedManyNumberField: rowHasLocalizedManyNumberField,
hasLocalizedRelationshipField: rowHasLocalizedRelationshipField,
hasManyNumberField: rowHasManyNumberField,
} = traverseFields({
adapter,
buildRelationships,
@@ -460,6 +476,7 @@ export const traverseFields = ({
disableUnique,
fieldPrefix,
fields: field.fields,
forceLocalized,
indexes,
localesColumns,
localesIndexes,
@@ -467,7 +484,12 @@ export const traverseFields = ({
parentTableName,
relationsToBuild,
relationships,
}))
})
if (rowHasLocalizedField) hasLocalizedField = true
if (rowHasLocalizedRelationshipField) hasLocalizedRelationshipField = true
if (rowHasManyNumberField) hasManyNumberField = true
if (rowHasLocalizedManyNumberField) hasLocalizedManyNumberField = true
break
}

View File

@@ -8,10 +8,10 @@ import { traverseFields } from './traverseFields'
type Args = {
arrayTableName: string
baseTableName: string
blocks: {
[blockType: string]: BlockRowToInsert[]
}
columnName: string
data: unknown
field: ArrayField
locale?: string
@@ -26,8 +26,8 @@ type Args = {
export const transformArray = ({
arrayTableName,
baseTableName,
blocks,
columnName,
data,
field,
locale,
@@ -43,7 +43,6 @@ export const transformArray = ({
data.forEach((arrayRow, i) => {
const newRow: ArrayRowToInsert = {
arrays: {},
columnName,
locales: {},
row: {
_order: i + 1,
@@ -62,12 +61,13 @@ export const transformArray = ({
traverseFields({
arrays: newRow.arrays,
baseTableName,
blocks,
columnPrefix: '',
data: arrayRow,
fieldPrefix: '',
fields: field.fields,
locales: newRow.locales,
newTableName: arrayTableName,
numbers,
parentTableName: arrayTableName,
path: `${path || ''}${field.name}.${i}.`,

View File

@@ -8,6 +8,7 @@ import type { BlockRowToInsert, RelationshipToDelete } from './types'
import { traverseFields } from './traverseFields'
type Args = {
baseTableName: string
blocks: {
[blockType: string]: BlockRowToInsert[]
}
@@ -21,9 +22,9 @@ type Args = {
selects: {
[tableName: string]: Record<string, unknown>[]
}
tableName
}
export const transformBlocks = ({
baseTableName,
blocks,
data,
field,
@@ -33,14 +34,14 @@ export const transformBlocks = ({
relationships,
relationshipsToDelete,
selects,
tableName,
}: Args) => {
data.forEach((blockRow, i) => {
if (typeof blockRow.blockType !== 'string') return
const matchedBlock = field.blocks.find(({ slug }) => slug === blockRow.blockType)
if (!matchedBlock) return
const blockType = toSnakeCase(blockRow.blockType)
if (!blocks[blockRow.blockType]) blocks[blockRow.blockType] = []
if (!blocks[blockType]) blocks[blockType] = []
const newRow: BlockRowToInsert = {
arrays: {},
@@ -53,16 +54,17 @@ export const transformBlocks = ({
if (field.localized && locale) newRow.row._locale = locale
const blockTableName = `${tableName}_${toSnakeCase(blockRow.blockType)}`
const blockTableName = `${baseTableName}_${blockType}`
traverseFields({
arrays: newRow.arrays,
baseTableName,
blocks,
columnPrefix: '',
data: blockRow,
fieldPrefix: '',
fields: matchedBlock.fields,
locales: newRow.locales,
newTableName: blockTableName,
numbers,
parentTableName: blockTableName,
path: `${path || ''}${field.name}.${i}.`,
@@ -72,6 +74,6 @@ export const transformBlocks = ({
selects,
})
blocks[blockRow.blockType].push(newRow)
blocks[blockType].push(newRow)
})
}

View File

@@ -29,12 +29,13 @@ export const transformForWrite = ({ data, fields, path = '', tableName }: Args):
// above rowToInsert
traverseFields({
arrays: rowToInsert.arrays,
baseTableName: tableName,
blocks: rowToInsert.blocks,
columnPrefix: '',
data,
fieldPrefix: '',
fields,
locales: rowToInsert.locales,
newTableName: tableName,
numbers: rowToInsert.numbers,
parentTableName: tableName,
path,

View File

@@ -17,19 +17,34 @@ type Args = {
arrays: {
[tableName: string]: ArrayRowToInsert[]
}
/**
* This is the name of the base table
*/
baseTableName: string
blocks: {
[blockType: string]: BlockRowToInsert[]
}
/**
* A snake-case field prefix, representing prior fields
* Ex: my_group_my_named_tab_
*/
columnPrefix: string
data: Record<string, unknown>
existingLocales?: Record<string, unknown>[]
/**
* A prefix that will retain camel-case formatting, representing prior fields
* Ex: myGroup_myNamedTab_
*/
fieldPrefix: string
fields: Field[]
forcedLocale?: string
locales: {
[locale: string]: Record<string, unknown>
}
newTableName: string
numbers: Record<string, unknown>[]
/**
* This is the name of the parent table
*/
parentTableName: string
path: string
relationships: Record<string, unknown>[]
@@ -42,14 +57,15 @@ type Args = {
export const traverseFields = ({
arrays,
baseTableName,
blocks,
columnPrefix,
data,
existingLocales,
fieldPrefix,
fields,
forcedLocale,
locales,
newTableName,
numbers,
parentTableName,
path,
@@ -60,15 +76,17 @@ export const traverseFields = ({
}: Args) => {
fields.forEach((field) => {
let columnName = ''
let fieldName = ''
let fieldData: unknown
if (fieldAffectsData(field)) {
columnName = `${columnPrefix || ''}${toSnakeCase(field.name)}`
fieldName = `${fieldPrefix || ''}${field.name}`
fieldData = data[field.name]
}
if (field.type === 'array') {
const arrayTableName = `${newTableName}_${columnName}`
const arrayTableName = `${parentTableName}_${columnName}`
if (!arrays[arrayTableName]) arrays[arrayTableName] = []
@@ -78,8 +96,8 @@ export const traverseFields = ({
if (Array.isArray(localeData)) {
const newRows = transformArray({
arrayTableName,
baseTableName,
blocks,
columnName,
data: localeData,
field,
locale: localeKey,
@@ -97,8 +115,8 @@ export const traverseFields = ({
} else {
const newRows = transformArray({
arrayTableName,
baseTableName,
blocks,
columnName,
data: data[field.name],
field,
numbers,
@@ -120,6 +138,7 @@ export const traverseFields = ({
Object.entries(data[field.name]).forEach(([localeKey, localeData]) => {
if (Array.isArray(localeData)) {
transformBlocks({
baseTableName,
blocks,
data: localeData,
field,
@@ -129,13 +148,13 @@ export const traverseFields = ({
relationships,
relationshipsToDelete,
selects,
tableName: newTableName,
})
}
})
}
} else if (isArrayOfRows(fieldData)) {
transformBlocks({
baseTableName,
blocks,
data: fieldData,
field,
@@ -144,7 +163,6 @@ export const traverseFields = ({
relationships,
relationshipsToDelete,
selects,
tableName: newTableName,
})
}
@@ -157,14 +175,15 @@ export const traverseFields = ({
Object.entries(data[field.name]).forEach(([localeKey, localeData]) => {
traverseFields({
arrays,
baseTableName,
blocks,
columnPrefix: `${columnName}_`,
data: localeData as Record<string, unknown>,
existingLocales,
fieldPrefix: `${fieldName}_`,
fields: field.fields,
forcedLocale: localeKey,
locales,
newTableName: parentTableName,
numbers,
parentTableName,
path: `${path || ''}${field.name}.`,
@@ -177,13 +196,14 @@ export const traverseFields = ({
} else {
traverseFields({
arrays,
baseTableName,
blocks,
columnPrefix: `${columnName}_`,
data: data[field.name] as Record<string, unknown>,
existingLocales,
fieldPrefix: `${fieldName}_`,
fields: field.fields,
locales,
newTableName: parentTableName,
numbers,
parentTableName,
path: `${path || ''}${field.name}.`,
@@ -206,14 +226,15 @@ export const traverseFields = ({
Object.entries(data[tab.name]).forEach(([localeKey, localeData]) => {
traverseFields({
arrays,
baseTableName,
blocks,
columnPrefix: `${columnPrefix || ''}${toSnakeCase(tab.name)}_`,
data: localeData as Record<string, unknown>,
existingLocales,
fieldPrefix: `${fieldPrefix || ''}${tab.name}_`,
fields: tab.fields,
forcedLocale: localeKey,
locales,
newTableName: parentTableName,
numbers,
parentTableName,
path: `${path || ''}${tab.name}.`,
@@ -226,13 +247,14 @@ export const traverseFields = ({
} else {
traverseFields({
arrays,
baseTableName,
blocks,
columnPrefix: `${columnPrefix || ''}${toSnakeCase(tab.name)}_`,
data: data[tab.name] as Record<string, unknown>,
existingLocales,
fieldPrefix: `${fieldPrefix || ''}${tab.name}_`,
fields: tab.fields,
locales,
newTableName: parentTableName,
numbers,
parentTableName,
path: `${path || ''}${tab.name}.`,
@@ -246,13 +268,14 @@ export const traverseFields = ({
} else {
traverseFields({
arrays,
baseTableName,
blocks,
columnPrefix,
data,
existingLocales,
fieldPrefix,
fields: tab.fields,
locales,
newTableName: parentTableName,
numbers,
parentTableName,
path,
@@ -268,13 +291,14 @@ export const traverseFields = ({
if (field.type === 'row' || field.type === 'collapsible') {
traverseFields({
arrays,
baseTableName,
blocks,
columnPrefix,
data,
existingLocales,
fieldPrefix,
fields: field.fields,
locales,
newTableName: parentTableName,
numbers,
parentTableName,
path,
@@ -359,7 +383,7 @@ export const traverseFields = ({
}
if (field.type === 'select' && field.hasMany && Array.isArray(fieldData)) {
const selectTableName = `${newTableName}_${toSnakeCase(field.name)}`
const selectTableName = `${parentTableName}_${columnName}`
if (!selects[selectTableName]) selects[selectTableName] = []
if (field.localized) {
@@ -421,9 +445,9 @@ export const traverseFields = ({
}
if (localeKey) {
ref[localeKey][columnName] = formattedValue
ref[localeKey][fieldName] = formattedValue
} else {
ref[columnName] = formattedValue
ref[fieldName] = formattedValue
}
}
})

View File

@@ -2,7 +2,6 @@ export type ArrayRowToInsert = {
arrays: {
[tableName: string]: ArrayRowToInsert[]
}
columnName: string
locales: {
[locale: string]: Record<string, unknown>
}

View File

@@ -9,14 +9,16 @@ import type { PostgresAdapter } from './types'
import buildQuery from './queries/buildQuery'
import { upsertRow } from './upsertRow'
export const updateGlobalVersion: UpdateGlobalVersion = async function updateVersion (
export const updateGlobalVersion: UpdateGlobalVersion = async function updateVersion(
this: PostgresAdapter,
{ id, global, locale, req = {} as PayloadRequest, versionData, where: whereArg },
) {
const db = this.sessions?.[req.transactionID] || this.db
const globalConfig: SanitizedGlobalConfig = this.payload.globals.config.find(({ slug }) => slug === global)
const globalConfig: SanitizedGlobalConfig = this.payload.globals.config.find(
({ slug }) => slug === global,
)
const whereToUse = whereArg || { id: { equals: id } }
const tableName = `_${toSnakeCase(global)}_versions`
const tableName = `_${toSnakeCase(global)}_v`
const fields = buildVersionGlobalFields(globalConfig)
const { where } = await buildQuery({

View File

@@ -16,7 +16,7 @@ export const updateVersion: UpdateVersion = async function updateVersion(
const db = this.sessions?.[req.transactionID] || this.db
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
const whereToUse = whereArg || { id: { equals: id } }
const tableName = `_${toSnakeCase(collection)}_versions`
const tableName = `_${toSnakeCase(collection)}_v`
const fields = buildVersionCollectionFields(collectionConfig)
const { where } = await buildQuery({