chore: ensures parentID column type is set accordingly
This commit is contained in:
@@ -21,6 +21,7 @@ import { Relation, relations } from 'drizzle-orm';
|
||||
import { fieldAffectsData } from 'payload/dist/fields/config/types';
|
||||
import { GenericColumns, GenericTable, PostgresAdapter } from '../types';
|
||||
import { traverseFields } from './traverseFields';
|
||||
import { parentIDColumnMap } from './parentIDColumnMap';
|
||||
|
||||
type Args = {
|
||||
adapter: PostgresAdapter
|
||||
@@ -56,9 +57,18 @@ export const buildTable = ({
|
||||
const arrayBlockRelations: Map<string, string> = new Map();
|
||||
|
||||
const idField = fields.find((field) => fieldAffectsData(field) && field.name === 'id');
|
||||
let idColType = 'integer';
|
||||
|
||||
if (idField) {
|
||||
columns.id = idField.type === 'number' ? integer('id').primaryKey() : text('id').primaryKey();
|
||||
if (idField.type === 'number') {
|
||||
idColType = 'numeric';
|
||||
columns.id = numeric('id').primaryKey();
|
||||
}
|
||||
|
||||
if (idField.type === 'text') {
|
||||
idColType = 'varchar';
|
||||
columns.id = varchar('id').primaryKey();
|
||||
}
|
||||
} else {
|
||||
columns.id = serial('id').primaryKey();
|
||||
}
|
||||
@@ -89,7 +99,7 @@ export const buildTable = ({
|
||||
const localeTableName = `${formattedTableName}_locales`;
|
||||
localesColumns.id = integer('id').primaryKey();
|
||||
localesColumns._locale = adapter.enums._locales('_locale').notNull();
|
||||
localesColumns._parentID = integer('_parent_id').references(() => table.id).notNull();
|
||||
localesColumns._parentID = parentIDColumnMap[idColType]('_parent_id').references(() => table.id).notNull();
|
||||
|
||||
localesTable = pgTable(localeTableName, localesColumns, (cols) => {
|
||||
return Object.entries(localesIndexes).reduce((acc, [colName, func]) => {
|
||||
@@ -114,7 +124,7 @@ export const buildTable = ({
|
||||
if (relationships.size) {
|
||||
const relationshipColumns: Record<string, AnyPgColumnBuilder> = {
|
||||
id: serial('id').primaryKey(),
|
||||
parent: integer('parent_id').references(() => table.id).notNull(),
|
||||
parent: parentIDColumnMap[idColType]('parent_id').references(() => table.id).notNull(),
|
||||
path: varchar('path').notNull(),
|
||||
order: integer('order'),
|
||||
};
|
||||
|
||||
7
packages/db-postgres/src/schema/parentIDColumnMap.ts
Normal file
7
packages/db-postgres/src/schema/parentIDColumnMap.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
import { integer, numeric, varchar } from 'drizzle-orm/pg-core';
|
||||
|
||||
export const parentIDColumnMap = {
|
||||
integer,
|
||||
varchar,
|
||||
numeric,
|
||||
};
|
||||
@@ -1,5 +1,5 @@
|
||||
/* eslint-disable no-param-reassign */
|
||||
import { AnyPgColumnBuilder, integer, pgEnum, pgTable, serial, uniqueIndex, text, varchar, PgColumn, PgTableExtraConfig, index, numeric, PgColumnHKT, IndexBuilder } from 'drizzle-orm/pg-core';
|
||||
import { AnyPgColumnBuilder, integer, pgEnum, pgTable, serial, uniqueIndex, text, varchar, PgColumn, PgTableExtraConfig, index, numeric, PgColumnHKT, IndexBuilder, PgNumericBuilder, PgVarcharBuilder } from 'drizzle-orm/pg-core';
|
||||
import { Field } from 'payload/types';
|
||||
import toSnakeCase from 'to-snake-case';
|
||||
import { fieldAffectsData } from 'payload/dist/fields/config/types';
|
||||
@@ -7,6 +7,7 @@ import { Relation, relations } from 'drizzle-orm';
|
||||
import { GenericColumns, PostgresAdapter } from '../types';
|
||||
import { createIndex } from './createIndex';
|
||||
import { buildTable } from './build';
|
||||
import { parentIDColumnMap } from './parentIDColumnMap';
|
||||
|
||||
type Args = {
|
||||
adapter: PostgresAdapter
|
||||
@@ -39,7 +40,12 @@ export const traverseFields = ({
|
||||
}: Args): { hasLocalizedField: boolean } => {
|
||||
let hasLocalizedField = false;
|
||||
|
||||
let parentIDColType = 'integer';
|
||||
if (columns.id instanceof PgNumericBuilder) parentIDColType = 'numeric';
|
||||
if (columns.id instanceof PgVarcharBuilder) parentIDColType = 'varchar';
|
||||
|
||||
fields.forEach((field) => {
|
||||
if ('name' in field && field.name === 'id') return;
|
||||
let columnName: string;
|
||||
|
||||
let targetTable = columns;
|
||||
@@ -78,7 +84,7 @@ export const traverseFields = ({
|
||||
case 'array': {
|
||||
const baseColumns: Record<string, AnyPgColumnBuilder> = {
|
||||
_order: integer('_order').notNull(),
|
||||
_parentID: integer('_parent_id').references(() => adapter.tables[tableName].id).notNull(),
|
||||
_parentID: parentIDColumnMap[parentIDColType]('_parent_id').references(() => adapter.tables[tableName].id).notNull(),
|
||||
};
|
||||
|
||||
if (field.localized && adapter.payload.config.localization) {
|
||||
@@ -125,7 +131,7 @@ export const traverseFields = ({
|
||||
const baseColumns: Record<string, AnyPgColumnBuilder> = {
|
||||
_order: integer('_order').notNull(),
|
||||
_path: text('_path').notNull(),
|
||||
_parentID: integer('_parent_id').references(() => adapter.tables[tableName].id).notNull(),
|
||||
_parentID: parentIDColumnMap[parentIDColType]('_parent_id').references(() => adapter.tables[tableName].id).notNull(),
|
||||
};
|
||||
|
||||
if (field.localized && adapter.payload.config.localization) {
|
||||
@@ -183,7 +189,7 @@ export const traverseFields = ({
|
||||
indexes,
|
||||
localesColumns,
|
||||
localesIndexes,
|
||||
tableName: `${tableName}_${toSnakeCase(field.name)}`,
|
||||
tableName,
|
||||
relationships,
|
||||
});
|
||||
|
||||
@@ -192,6 +198,43 @@ export const traverseFields = ({
|
||||
break;
|
||||
}
|
||||
|
||||
case 'tabs': {
|
||||
field.tabs.forEach((tab) => {
|
||||
if ('name' in tab) {
|
||||
const { hasLocalizedField: tabHasLocalizedField } = traverseFields({
|
||||
adapter,
|
||||
arrayBlockRelations,
|
||||
buildRelationships,
|
||||
columnPrefix: `${columnName}_`,
|
||||
columns,
|
||||
fieldPrefix: `${fieldPrefix || ''}${tab.name}_`,
|
||||
fields: tab.fields,
|
||||
indexes,
|
||||
localesColumns,
|
||||
localesIndexes,
|
||||
tableName,
|
||||
relationships,
|
||||
});
|
||||
|
||||
if (tabHasLocalizedField) hasLocalizedField = true;
|
||||
} else {
|
||||
({ hasLocalizedField } = traverseFields({
|
||||
adapter,
|
||||
arrayBlockRelations,
|
||||
buildRelationships,
|
||||
columns,
|
||||
fields: tab.fields,
|
||||
indexes,
|
||||
localesColumns,
|
||||
localesIndexes,
|
||||
tableName,
|
||||
relationships,
|
||||
}));
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
|
||||
case 'row':
|
||||
({ hasLocalizedField } = traverseFields({
|
||||
adapter,
|
||||
|
||||
Reference in New Issue
Block a user