chore: builds enum pattern

This commit is contained in:
James
2023-08-02 20:52:14 -04:00
parent dffb88e947
commit 3ccdcc5c29
5 changed files with 44 additions and 8 deletions

View File

@@ -30,8 +30,9 @@ export function postgresAdapter(args: Args): PostgresAdapterResult {
// @ts-expect-error
return createDatabaseAdapter<PostgresAdapter>({
...args,
tables: {},
enums: {},
relations: {},
tables: {},
payload,
connect,
db: undefined,

View File

@@ -3,12 +3,17 @@ import { buildVersionCollectionFields } from 'payload/dist/versions/buildCollect
import { SanitizedCollectionConfig } from 'payload/dist/collections/config/types';
import { getVersionsModelName } from 'payload/dist/versions/getVersionsModelName';
import type { Init } from 'payload/dist/database/types';
import { pgEnum } from 'drizzle-orm/pg-core';
import type { PostgresAdapter } from './types';
import { buildTable } from './schema/build';
export const init: Init = async function init(
this: PostgresAdapter,
) {
if (this.payload.config.localization) {
this.enums._locales = pgEnum('_locales', this.payload.config.localization.locales as [string, ...string[]]);
}
this.payload.config.collections.forEach(
(collection: SanitizedCollectionConfig) => {
buildTable({

View File

@@ -24,6 +24,7 @@ import { traverseFields } from './traverseFields';
type Args = {
adapter: PostgresAdapter
baseColumns?: Record<string, AnyPgColumnBuilder>,
buildRelationships?: boolean
fields: Field[]
tableName: string
@@ -31,15 +32,17 @@ type Args = {
export const buildTable = ({
adapter,
baseColumns = {},
buildRelationships,
fields,
tableName,
}: Args): void => {
const formattedTableName = toSnakeCase(tableName);
const columns: Record<string, AnyPgColumnBuilder> = {};
const columns: Record<string, AnyPgColumnBuilder> = baseColumns;
const indexes: Record<string, (cols: GenericColumns) => IndexBuilder> = {};
let hasLocalizedField = false;
const localesColumns: Record<string, AnyPgColumnBuilder> = {};
const localesIndexes: Record<string, (cols: GenericColumns) => IndexBuilder> = {};
let localesTable: GenericTable;
@@ -78,6 +81,9 @@ export const buildTable = ({
if (hasLocalizedField) {
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();
localesTable = pgTable(localeTableName, localesColumns, (cols) => {
return Object.entries(localesIndexes).reduce((acc, [colName, func]) => {
@@ -109,7 +115,6 @@ export const buildTable = ({
}
}
const tableRelations = relations(table, ({ many }) => {
const result: Record<string, Relation<string>> = {};

View File

@@ -5,6 +5,7 @@ import toSnakeCase from 'to-snake-case';
import { fieldAffectsData } from 'payload/dist/fields/config/types';
import { GenericColumns, PostgresAdapter } from '../types';
import { createIndex } from './createIndex';
import { buildTable } from './build';
type Args = {
adapter: PostgresAdapter
@@ -61,15 +62,38 @@ export const traverseFields = ({
case 'text':
case 'email':
case 'code':
case 'textarea':
case 'textarea': {
targetTable[`${fieldPrefix || ''}${field.name}`] = varchar(columnName);
break;
}
case 'number':
case 'number': {
targetTable[`${fieldPrefix || ''}${field.name}`] = numeric(columnName);
break;
}
case 'array': {
const baseColumns: Record<string, AnyPgColumnBuilder> = {
_order: integer('_order').notNull(),
_parentID: integer('_parent_id').references(() => adapter.tables[tableName].id).notNull(),
};
if (field.localized && adapter.payload.config.localization) {
baseColumns._locale = adapter.enums._locales('_locale').notNull();
}
buildTable({
adapter,
baseColumns,
fields: field.fields,
tableName: `${tableName}_${toSnakeCase(field.name)}`,
});
break;
}
case 'group': {
// Todo: determine what should happen if groups are set to localized
const { hasLocalizedField: groupHasLocalizedField } = traverseFields({
adapter,
buildRelationships,
@@ -80,7 +104,7 @@ export const traverseFields = ({
indexes,
localesColumns,
localesIndexes,
tableName,
tableName: `${tableName}_${toSnakeCase(field.name)}`,
relationships,
});

View File

@@ -1,6 +1,6 @@
import { Relation, Relations } from 'drizzle-orm';
import { NodePgDatabase } from 'drizzle-orm/node-postgres';
import { PgColumn, PgColumnHKT, PgTableWithColumns } from 'drizzle-orm/pg-core';
import { PgColumn, PgColumnHKT, PgEnum, PgTableWithColumns } from 'drizzle-orm/pg-core';
import { Payload } from 'payload';
import { DatabaseAdapter } from 'payload/dist/database/types';
import { ClientConfig, PoolConfig } from 'pg';
@@ -42,8 +42,9 @@ export type GenericTable = PgTableWithColumns<{
export type PostgresAdapter = DatabaseAdapter & Args & {
db: DrizzleDB
tables: Record<string, GenericTable>
enums: Record<string, PgEnum<[string, ...string[]]>>
relations: Record<string, Relations<string, Record<string, Relation<string>>>>
tables: Record<string, GenericTable>
}
export type PostgresAdapterResult = (args: { payload: Payload }) => PostgresAdapter