Compare commits
18 Commits
db-postgre
...
feat/#3593
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1557735030 | ||
|
|
83eb468ac8 | ||
|
|
ea6879a786 | ||
|
|
033c894b38 | ||
|
|
b7861e2a65 | ||
|
|
0016691975 | ||
|
|
77b4fb1b48 | ||
|
|
76d196a608 | ||
|
|
79ba286814 | ||
|
|
05a9d9e507 | ||
|
|
da77d406f5 | ||
|
|
c089eb4bc9 | ||
|
|
8a34be6946 | ||
|
|
14ce4bdcf1 | ||
|
|
18edcff410 | ||
|
|
3b571bf6a7 | ||
|
|
c517bfb5e5 | ||
|
|
5f8a0950f5 |
@@ -30,6 +30,7 @@ It's often best practice to write your Collections in separate files and then im
|
|||||||
| **`typescript`** | An object with property `interface` as the text used in schema generation. Auto-generated from slug if not defined. |
|
| **`typescript`** | An object with property `interface` as the text used in schema generation. Auto-generated from slug if not defined. |
|
||||||
| **`defaultSort`** | Pass a top-level field to sort by default in the collection List view. Prefix the name of the field with a minus symbol ("-") to sort in descending order. |
|
| **`defaultSort`** | Pass a top-level field to sort by default in the collection List view. Prefix the name of the field with a minus symbol ("-") to sort in descending order. |
|
||||||
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
||||||
|
| **`tableName`** | Custom table name for this collection when using SQL database adapter ([Postgres](/docs/database/postgres)). Auto-generated from slug if not defined.
|
||||||
|
|
||||||
_\* An asterisk denotes that a property is required._
|
_\* An asterisk denotes that a property is required._
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ As with Collection configs, it's often best practice to write your Globals in se
|
|||||||
| **`graphQL.name`** | Text used in schema generation. Auto-generated from slug if not defined. |
|
| **`graphQL.name`** | Text used in schema generation. Auto-generated from slug if not defined. |
|
||||||
| **`typescript`** | An object with property `interface` as the text used in schema generation. Auto-generated from slug if not defined. |
|
| **`typescript`** | An object with property `interface` as the text used in schema generation. Auto-generated from slug if not defined. |
|
||||||
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
||||||
|
| **`tableName`** | Custom table name for this global when using SQL database adapter ([Postgres](/docs/database/postgres)). Auto-generated from slug if not defined.
|
||||||
|
|
||||||
_\* An asterisk denotes that a property is required._
|
_\* An asterisk denotes that a property is required._
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ keywords: array, fields, config, configuration, documentation, Content Managemen
|
|||||||
| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-config). |
|
| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-config). |
|
||||||
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
||||||
| **`interfaceName`** | Create a top level, reusable [Typescript interface](/docs/typescript/generating-types#custom-field-interfaces) & [GraphQL type](/docs/graphql/graphql-schema#custom-field-schemas). |
|
| **`interfaceName`** | Create a top level, reusable [Typescript interface](/docs/typescript/generating-types#custom-field-interfaces) & [GraphQL type](/docs/graphql/graphql-schema#custom-field-schemas). |
|
||||||
|
| **`tableName`** | Custom table name for the field when using SQL database adapter ([Postgres](/docs/database/postgres)). Auto-generated from name if not defined.
|
||||||
|
|
||||||
_\* An asterisk denotes that a property is required._
|
_\* An asterisk denotes that a property is required._
|
||||||
|
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ Blocks are defined as separate configs of their own.
|
|||||||
</Banner>
|
</Banner>
|
||||||
|
|
||||||
| Option | Description |
|
| Option | Description |
|
||||||
| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|----------------------------| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| **`slug`** \* | Identifier for this block type. Will be saved on each block as the `blockType` property. |
|
| **`slug`** \* | Identifier for this block type. Will be saved on each block as the `blockType` property. |
|
||||||
| **`fields`** \* | Array of fields to be stored in this block. |
|
| **`fields`** \* | Array of fields to be stored in this block. |
|
||||||
| **`labels`** | Customize the block labels that appear in the Admin dashboard. Auto-generated from slug if not defined. |
|
| **`labels`** | Customize the block labels that appear in the Admin dashboard. Auto-generated from slug if not defined. |
|
||||||
@@ -80,7 +80,8 @@ Blocks are defined as separate configs of their own.
|
|||||||
| **`imageAltText`** | Customize this block's image thumbnail alt text. |
|
| **`imageAltText`** | Customize this block's image thumbnail alt text. |
|
||||||
| **`interfaceName`** | Create a top level, reusable [Typescript interface](/docs/typescript/generating-types#custom-field-interfaces) & [GraphQL type](/docs/graphql/graphql-schema#custom-field-schemas). |
|
| **`interfaceName`** | Create a top level, reusable [Typescript interface](/docs/typescript/generating-types#custom-field-interfaces) & [GraphQL type](/docs/graphql/graphql-schema#custom-field-schemas). |
|
||||||
| **`graphQL.singularName`** | Text to use for the GraphQL schema name. Auto-generated from slug if not defined. NOTE: this is set for deprecation, prefer `interfaceName`. |
|
| **`graphQL.singularName`** | Text to use for the GraphQL schema name. Auto-generated from slug if not defined. NOTE: this is set for deprecation, prefer `interfaceName`. |
|
||||||
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
| **`tableName`** | Custom table name for this block type when using SQL database adapter ([Postgres](/docs/database/postgres)). Auto-generated from slug if not defined.
|
||||||
|
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
||||||
|
|
||||||
#### Auto-generated data per block
|
#### Auto-generated data per block
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ keywords: radio, fields, config, configuration, documentation, Content Managemen
|
|||||||
| **`required`** | Require this field to have a value. |
|
| **`required`** | Require this field to have a value. |
|
||||||
| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-config). |
|
| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-config). |
|
||||||
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
||||||
|
| **`enumName`** | Custom enum name for this field when using SQL database adapter ([Postgres](/docs/database/postgres)). Auto-generated from name if not defined.
|
||||||
|
|
||||||
_\* An asterisk denotes that a property is required._
|
_\* An asterisk denotes that a property is required._
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ keywords: select, multi-select, fields, config, configuration, documentation, Co
|
|||||||
| **`required`** | Require this field to have a value. |
|
| **`required`** | Require this field to have a value. |
|
||||||
| **`admin`** | Admin-specific configuration. See the [default field admin config](/docs/fields/overview#admin-config) for more details. |
|
| **`admin`** | Admin-specific configuration. See the [default field admin config](/docs/fields/overview#admin-config) for more details. |
|
||||||
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
||||||
|
| **`enumName`** | Custom enum name for this field when using SQL database adapter ([Postgres](/docs/database/postgres)). Auto-generated from name if not defined.
|
||||||
|
| **`tableName`** | Custom table name (if `hasMany` set to `true`) for this field when using SQL database adapter ([Postgres](/docs/database/postgres)). Auto-generated from name if not defined.
|
||||||
|
|
||||||
_\* An asterisk denotes that a property is required._
|
_\* An asterisk denotes that a property is required._
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
import type { Create } from 'payload/database'
|
import type { Create } from 'payload/database'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export const create: Create = async function create(
|
export const create: Create = async function create(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -19,8 +18,8 @@ export const create: Create = async function create(
|
|||||||
db,
|
db,
|
||||||
fields: collection.fields,
|
fields: collection.fields,
|
||||||
operation: 'create',
|
operation: 'create',
|
||||||
tableName: toSnakeCase(collectionSlug),
|
|
||||||
req,
|
req,
|
||||||
|
tableName: getTableName(collection),
|
||||||
})
|
})
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
import type { CreateGlobalArgs } from 'payload/database'
|
import type { CreateGlobalArgs } from 'payload/database'
|
||||||
import type { PayloadRequest, TypeWithID } from 'payload/types'
|
import type { PayloadRequest, TypeWithID } from 'payload/types'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export async function createGlobal<T extends TypeWithID>(
|
export async function createGlobal<T extends TypeWithID>(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -20,8 +19,8 @@ export async function createGlobal<T extends TypeWithID>(
|
|||||||
db,
|
db,
|
||||||
fields: globalConfig.fields,
|
fields: globalConfig.fields,
|
||||||
operation: 'create',
|
operation: 'create',
|
||||||
tableName: toSnakeCase(slug),
|
|
||||||
req,
|
req,
|
||||||
|
tableName: getTableName(globalConfig),
|
||||||
})
|
})
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
import type { TypeWithVersion } from 'payload/database'
|
import type { TypeWithVersion } from 'payload/database'
|
||||||
import { type CreateGlobalVersionArgs } from 'payload/database'
|
|
||||||
import type { PayloadRequest, TypeWithID } from 'payload/types'
|
import type { PayloadRequest, TypeWithID } from 'payload/types'
|
||||||
|
|
||||||
import { sql } from 'drizzle-orm'
|
import { sql } from 'drizzle-orm'
|
||||||
|
import { type CreateGlobalVersionArgs } from 'payload/database'
|
||||||
import { buildVersionGlobalFields } from 'payload/versions'
|
import { buildVersionGlobalFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export async function createGlobalVersion<T extends TypeWithID>(
|
export async function createGlobalVersion<T extends TypeWithID>(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -16,7 +16,7 @@ export async function createGlobalVersion<T extends TypeWithID>(
|
|||||||
) {
|
) {
|
||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const global = this.payload.globals.config.find(({ slug }) => slug === globalSlug)
|
const global = this.payload.globals.config.find(({ slug }) => slug === globalSlug)
|
||||||
const globalTableName = toSnakeCase(globalSlug)
|
const globalTableName = getTableName(global)
|
||||||
const tableName = `_${globalTableName}_v`
|
const tableName = `_${globalTableName}_v`
|
||||||
|
|
||||||
const result = await upsertRow<TypeWithVersion<T>>({
|
const result = await upsertRow<TypeWithVersion<T>>({
|
||||||
@@ -29,8 +29,8 @@ export async function createGlobalVersion<T extends TypeWithID>(
|
|||||||
db,
|
db,
|
||||||
fields: buildVersionGlobalFields(global),
|
fields: buildVersionGlobalFields(global),
|
||||||
operation: 'create',
|
operation: 'create',
|
||||||
tableName,
|
|
||||||
req,
|
req,
|
||||||
|
tableName,
|
||||||
})
|
})
|
||||||
|
|
||||||
const table = this.tables[tableName]
|
const table = this.tables[tableName]
|
||||||
|
|||||||
@@ -3,11 +3,11 @@ import type { PayloadRequest, TypeWithID } from 'payload/types'
|
|||||||
|
|
||||||
import { sql } from 'drizzle-orm'
|
import { sql } from 'drizzle-orm'
|
||||||
import { buildVersionCollectionFields } from 'payload/versions'
|
import { buildVersionCollectionFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export async function createVersion<T extends TypeWithID>(
|
export async function createVersion<T extends TypeWithID>(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -21,7 +21,7 @@ export async function createVersion<T extends TypeWithID>(
|
|||||||
) {
|
) {
|
||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const collection = this.payload.collections[collectionSlug].config
|
const collection = this.payload.collections[collectionSlug].config
|
||||||
const collectionTableName = toSnakeCase(collectionSlug)
|
const collectionTableName = getTableName(collection)
|
||||||
const tableName = `_${collectionTableName}_v`
|
const tableName = `_${collectionTableName}_v`
|
||||||
|
|
||||||
const result = await upsertRow<TypeWithVersion<T>>({
|
const result = await upsertRow<TypeWithVersion<T>>({
|
||||||
@@ -35,8 +35,8 @@ export async function createVersion<T extends TypeWithID>(
|
|||||||
db,
|
db,
|
||||||
fields: buildVersionCollectionFields(collection),
|
fields: buildVersionCollectionFields(collection),
|
||||||
operation: 'create',
|
operation: 'create',
|
||||||
tableName,
|
|
||||||
req,
|
req,
|
||||||
|
tableName,
|
||||||
})
|
})
|
||||||
|
|
||||||
const table = this.tables[tableName]
|
const table = this.tables[tableName]
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import type { DeleteMany } from 'payload/database'
|
|||||||
import type { PayloadRequest } from 'payload/types'
|
import type { PayloadRequest } from 'payload/types'
|
||||||
|
|
||||||
import { inArray } from 'drizzle-orm'
|
import { inArray } from 'drizzle-orm'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export const deleteMany: DeleteMany = async function deleteMany(
|
export const deleteMany: DeleteMany = async function deleteMany(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -14,7 +14,7 @@ export const deleteMany: DeleteMany = async function deleteMany(
|
|||||||
) {
|
) {
|
||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const collectionConfig = this.payload.collections[collection].config
|
const collectionConfig = this.payload.collections[collection].config
|
||||||
const tableName = toSnakeCase(collection)
|
const tableName = getTableName(collectionConfig)
|
||||||
|
|
||||||
const result = await findMany({
|
const result = await findMany({
|
||||||
adapter: this,
|
adapter: this,
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
import type { DeleteOne } from 'payload/database'
|
import type { DeleteOne } from 'payload/database'
|
||||||
import type { PayloadRequest } from 'payload/types'
|
import type { PayloadRequest } from 'payload/types'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { buildFindManyArgs } from './find/buildFindManyArgs'
|
import { buildFindManyArgs } from './find/buildFindManyArgs'
|
||||||
import buildQuery from './queries/buildQuery'
|
import buildQuery from './queries/buildQuery'
|
||||||
import { transform } from './transform/read'
|
import { transform } from './transform/read'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export const deleteOne: DeleteOne = async function deleteOne(
|
export const deleteOne: DeleteOne = async function deleteOne(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -15,7 +14,7 @@ export const deleteOne: DeleteOne = async function deleteOne(
|
|||||||
) {
|
) {
|
||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const collectionConfig = this.payload.collections[collection].config
|
const collectionConfig = this.payload.collections[collection].config
|
||||||
const tableName = toSnakeCase(collection)
|
const tableName = getTableName(collectionConfig)
|
||||||
|
|
||||||
const { where } = await buildQuery({
|
const { where } = await buildQuery({
|
||||||
adapter: this,
|
adapter: this,
|
||||||
|
|||||||
@@ -3,11 +3,11 @@ import type { PayloadRequest, SanitizedCollectionConfig } from 'payload/types'
|
|||||||
|
|
||||||
import { inArray } from 'drizzle-orm'
|
import { inArray } from 'drizzle-orm'
|
||||||
import { buildVersionCollectionFields } from 'payload/versions'
|
import { buildVersionCollectionFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export const deleteVersions: DeleteVersions = async function deleteVersion(
|
export const deleteVersions: DeleteVersions = async function deleteVersion(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -16,7 +16,7 @@ export const deleteVersions: DeleteVersions = async function deleteVersion(
|
|||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
||||||
|
|
||||||
const tableName = `_${toSnakeCase(collection)}_v`
|
const tableName = `_${getTableName(collectionConfig)}_v`
|
||||||
const fields = buildVersionCollectionFields(collectionConfig)
|
const fields = buildVersionCollectionFields(collectionConfig)
|
||||||
|
|
||||||
const { docs } = await findMany({
|
const { docs } = await findMany({
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
import type { Find } from 'payload/database'
|
import type { Find } from 'payload/database'
|
||||||
import type { PayloadRequest, SanitizedCollectionConfig } from 'payload/types'
|
import type { PayloadRequest, SanitizedCollectionConfig } from 'payload/types'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export const find: Find = async function find(
|
export const find: Find = async function find(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -32,7 +31,7 @@ export const find: Find = async function find(
|
|||||||
pagination,
|
pagination,
|
||||||
req,
|
req,
|
||||||
sort,
|
sort,
|
||||||
tableName: toSnakeCase(collection),
|
tableName: getTableName(collectionConfig),
|
||||||
where: whereArg,
|
where: whereArg,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import toSnakeCase from 'to-snake-case'
|
|||||||
import type { PostgresAdapter } from '../types'
|
import type { PostgresAdapter } from '../types'
|
||||||
import type { Result } from './buildFindManyArgs'
|
import type { Result } from './buildFindManyArgs'
|
||||||
|
|
||||||
|
import { getTableName } from '../utilities/getTableName'
|
||||||
|
|
||||||
type TraverseFieldArgs = {
|
type TraverseFieldArgs = {
|
||||||
_locales: Record<string, unknown>
|
_locales: Record<string, unknown>
|
||||||
adapter: PostgresAdapter
|
adapter: PostgresAdapter
|
||||||
@@ -78,7 +80,7 @@ export const traverseFields = ({
|
|||||||
with: {},
|
with: {},
|
||||||
}
|
}
|
||||||
|
|
||||||
const arrayTableName = `${currentTableName}_${toSnakeCase(field.name)}`
|
const arrayTableName = `${currentTableName}_${getTableName(field)}`
|
||||||
|
|
||||||
if (adapter.tables[`${arrayTableName}_locales`]) withArray.with._locales = _locales
|
if (adapter.tables[`${arrayTableName}_locales`]) withArray.with._locales = _locales
|
||||||
currentArgs.with[`${path}${field.name}`] = withArray
|
currentArgs.with[`${path}${field.name}`] = withArray
|
||||||
@@ -128,7 +130,7 @@ export const traverseFields = ({
|
|||||||
with: {},
|
with: {},
|
||||||
}
|
}
|
||||||
|
|
||||||
const tableName = `${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`
|
const tableName = `${topLevelTableName}_blocks_${getTableName(block)}`
|
||||||
|
|
||||||
if (adapter.tables[`${tableName}_locales`]) withBlock.with._locales = _locales
|
if (adapter.tables[`${tableName}_locales`]) withBlock.with._locales = _locales
|
||||||
topLevelArgs.with[blockKey] = withBlock
|
topLevelArgs.with[blockKey] = withBlock
|
||||||
|
|||||||
@@ -1,17 +1,16 @@
|
|||||||
import type { FindGlobal } from 'payload/database'
|
import type { FindGlobal } from 'payload/database'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export const findGlobal: FindGlobal = async function findGlobal(
|
export const findGlobal: FindGlobal = async function findGlobal(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
{ locale, req, slug, where },
|
{ locale, req, slug, where },
|
||||||
) {
|
) {
|
||||||
const globalConfig = this.payload.globals.config.find((config) => config.slug === slug)
|
const globalConfig = this.payload.globals.config.find((config) => config.slug === slug)
|
||||||
const tableName = toSnakeCase(slug)
|
const tableName = getTableName(globalConfig)
|
||||||
|
|
||||||
const {
|
const {
|
||||||
docs: [doc],
|
docs: [doc],
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import type { FindGlobalVersions } from 'payload/database'
|
|||||||
import type { PayloadRequest, SanitizedGlobalConfig } from 'payload/types'
|
import type { PayloadRequest, SanitizedGlobalConfig } from 'payload/types'
|
||||||
|
|
||||||
import { buildVersionGlobalFields } from 'payload/versions'
|
import { buildVersionGlobalFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export const findGlobalVersions: FindGlobalVersions = async function findGlobalVersions(
|
export const findGlobalVersions: FindGlobalVersions = async function findGlobalVersions(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -27,7 +27,7 @@ export const findGlobalVersions: FindGlobalVersions = async function findGlobalV
|
|||||||
)
|
)
|
||||||
const sort = typeof sortArg === 'string' ? sortArg : '-createdAt'
|
const sort = typeof sortArg === 'string' ? sortArg : '-createdAt'
|
||||||
|
|
||||||
const tableName = `_${toSnakeCase(global)}_v`
|
const tableName = `_${getTableName(globalConfig)}_v`
|
||||||
const fields = buildVersionGlobalFields(globalConfig)
|
const fields = buildVersionGlobalFields(globalConfig)
|
||||||
|
|
||||||
return findMany({
|
return findMany({
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
import type { FindOneArgs } from 'payload/database'
|
import type { FindOneArgs } from 'payload/database'
|
||||||
import type { PayloadRequest, SanitizedCollectionConfig, TypeWithID } from 'payload/types'
|
import type { PayloadRequest, SanitizedCollectionConfig, TypeWithID } from 'payload/types'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export async function findOne<T extends TypeWithID>(
|
export async function findOne<T extends TypeWithID>(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
{ collection, locale, req = {} as PayloadRequest, where: incomingWhere }: FindOneArgs,
|
{ collection, locale, req = {} as PayloadRequest, where: incomingWhere }: FindOneArgs,
|
||||||
): Promise<T> {
|
): Promise<T> {
|
||||||
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
||||||
|
const tableName = getTableName(collectionConfig)
|
||||||
|
|
||||||
const { docs } = await findMany({
|
const { docs } = await findMany({
|
||||||
adapter: this,
|
adapter: this,
|
||||||
@@ -22,7 +22,7 @@ export async function findOne<T extends TypeWithID>(
|
|||||||
pagination: false,
|
pagination: false,
|
||||||
req,
|
req,
|
||||||
sort: undefined,
|
sort: undefined,
|
||||||
tableName: toSnakeCase(collection),
|
tableName,
|
||||||
where: incomingWhere,
|
where: incomingWhere,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import type { FindVersions } from 'payload/database'
|
|||||||
import type { PayloadRequest, SanitizedCollectionConfig } from 'payload/types'
|
import type { PayloadRequest, SanitizedCollectionConfig } from 'payload/types'
|
||||||
|
|
||||||
import { buildVersionCollectionFields } from 'payload/versions'
|
import { buildVersionCollectionFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export const findVersions: FindVersions = async function findVersions(
|
export const findVersions: FindVersions = async function findVersions(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -25,7 +25,7 @@ export const findVersions: FindVersions = async function findVersions(
|
|||||||
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
||||||
const sort = typeof sortArg === 'string' ? sortArg : collectionConfig.defaultSort
|
const sort = typeof sortArg === 'string' ? sortArg : collectionConfig.defaultSort
|
||||||
|
|
||||||
const tableName = `_${toSnakeCase(collection)}_v`
|
const tableName = `_${getTableName(collectionConfig)}_v`
|
||||||
const fields = buildVersionCollectionFields(collectionConfig)
|
const fields = buildVersionCollectionFields(collectionConfig)
|
||||||
|
|
||||||
return findMany({
|
return findMany({
|
||||||
|
|||||||
@@ -4,12 +4,12 @@ import type { SanitizedCollectionConfig } from 'payload/types'
|
|||||||
|
|
||||||
import { pgEnum } from 'drizzle-orm/pg-core'
|
import { pgEnum } from 'drizzle-orm/pg-core'
|
||||||
import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload/versions'
|
import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { buildTable } from './schema/build'
|
import { buildTable } from './schema/build'
|
||||||
import { getConfigIDType } from './schema/getConfigIDType'
|
import { getConfigIDType } from './schema/getConfigIDType'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export const init: Init = async function init(this: PostgresAdapter) {
|
export const init: Init = async function init(this: PostgresAdapter) {
|
||||||
if (this.payload.config.localization) {
|
if (this.payload.config.localization) {
|
||||||
@@ -20,7 +20,7 @@ export const init: Init = async function init(this: PostgresAdapter) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.payload.config.collections.forEach((collection: SanitizedCollectionConfig) => {
|
this.payload.config.collections.forEach((collection: SanitizedCollectionConfig) => {
|
||||||
const tableName = toSnakeCase(collection.slug)
|
const tableName = getTableName(collection)
|
||||||
|
|
||||||
buildTable({
|
buildTable({
|
||||||
adapter: this,
|
adapter: this,
|
||||||
@@ -55,7 +55,7 @@ export const init: Init = async function init(this: PostgresAdapter) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
this.payload.config.globals.forEach((global) => {
|
this.payload.config.globals.forEach((global) => {
|
||||||
const tableName = toSnakeCase(global.slug)
|
const tableName = getTableName(global)
|
||||||
|
|
||||||
buildTable({
|
buildTable({
|
||||||
adapter: this,
|
adapter: this,
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ import { v4 as uuid } from 'uuid'
|
|||||||
import type { GenericColumn, GenericTable, PostgresAdapter } from '../types'
|
import type { GenericColumn, GenericTable, PostgresAdapter } from '../types'
|
||||||
import type { BuildQueryJoinAliases, BuildQueryJoins } from './buildQuery'
|
import type { BuildQueryJoinAliases, BuildQueryJoins } from './buildQuery'
|
||||||
|
|
||||||
|
import { getTableName } from '../utilities/getTableName'
|
||||||
|
|
||||||
type Constraint = {
|
type Constraint = {
|
||||||
columnName: string
|
columnName: string
|
||||||
table: GenericTable
|
table: GenericTable
|
||||||
@@ -199,7 +201,7 @@ export const getTableColumnFromPath = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'array': {
|
case 'array': {
|
||||||
newTableName = `${tableName}_${toSnakeCase(field.name)}`
|
newTableName = `${tableName}_${getTableName(field)}`
|
||||||
constraintPath = `${constraintPath}${field.name}.%.`
|
constraintPath = `${constraintPath}${field.name}.%.`
|
||||||
if (locale && field.localized && adapter.payload.config.localization) {
|
if (locale && field.localized && adapter.payload.config.localization) {
|
||||||
joins[newTableName] = and(
|
joins[newTableName] = and(
|
||||||
@@ -239,7 +241,7 @@ export const getTableColumnFromPath = ({
|
|||||||
let blockTableColumn: TableColumn
|
let blockTableColumn: TableColumn
|
||||||
let newTableName: string
|
let newTableName: string
|
||||||
const hasBlockField = field.blocks.some((block) => {
|
const hasBlockField = field.blocks.some((block) => {
|
||||||
newTableName = `${tableName}_blocks_${toSnakeCase(block.slug)}`
|
newTableName = `${tableName}_blocks_${getTableName(block)}`
|
||||||
constraintPath = `${constraintPath}${field.name}.%.`
|
constraintPath = `${constraintPath}${field.name}.%.`
|
||||||
let result
|
let result
|
||||||
const blockConstraints = []
|
const blockConstraints = []
|
||||||
@@ -329,9 +331,10 @@ export const getTableColumnFromPath = ({
|
|||||||
let newAliasTable
|
let newAliasTable
|
||||||
|
|
||||||
if (typeof field.relationTo === 'string') {
|
if (typeof field.relationTo === 'string') {
|
||||||
newTableName = `${toSnakeCase(field.relationTo)}`
|
const relationshipConfig = adapter.payload.collections[field.relationTo].config
|
||||||
|
newTableName = getTableName(relationshipConfig)
|
||||||
// parent to relationship join table
|
// parent to relationship join table
|
||||||
relationshipFields = adapter.payload.collections[field.relationTo].config.fields
|
relationshipFields = relationshipConfig.fields
|
||||||
|
|
||||||
newAliasTable = alias(adapter.tables[newTableName], toSnakeCase(uuid()))
|
newAliasTable = alias(adapter.tables[newTableName], toSnakeCase(uuid()))
|
||||||
|
|
||||||
@@ -350,7 +353,10 @@ export const getTableColumnFromPath = ({
|
|||||||
}
|
}
|
||||||
} else if (newCollectionPath === 'value') {
|
} else if (newCollectionPath === 'value') {
|
||||||
const tableColumnsNames = field.relationTo.map(
|
const tableColumnsNames = field.relationTo.map(
|
||||||
(relationTo) => `"${aliasRelationshipTableName}"."${toSnakeCase(relationTo)}_id"`,
|
(relationTo) =>
|
||||||
|
`"${aliasRelationshipTableName}"."${getTableName(
|
||||||
|
adapter.payload.collections[relationTo].config,
|
||||||
|
)}_id"`,
|
||||||
)
|
)
|
||||||
return {
|
return {
|
||||||
constraints,
|
constraints,
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ import type { PayloadRequest, SanitizedCollectionConfig } from 'payload/types'
|
|||||||
|
|
||||||
import { type QueryDrafts, combineQueries } from 'payload/database'
|
import { type QueryDrafts, combineQueries } from 'payload/database'
|
||||||
import { buildVersionCollectionFields } from 'payload/versions'
|
import { buildVersionCollectionFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export const queryDrafts: QueryDrafts = async function queryDrafts({
|
export const queryDrafts: QueryDrafts = async function queryDrafts({
|
||||||
collection,
|
collection,
|
||||||
@@ -17,7 +17,7 @@ export const queryDrafts: QueryDrafts = async function queryDrafts({
|
|||||||
where,
|
where,
|
||||||
}) {
|
}) {
|
||||||
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
||||||
const tableName = `_${toSnakeCase(collection)}_v`
|
const tableName = `_${getTableName(collectionConfig)}_v`
|
||||||
const fields = buildVersionCollectionFields(collectionConfig)
|
const fields = buildVersionCollectionFields(collectionConfig)
|
||||||
|
|
||||||
const combinedWhere = combineQueries({ latest: { equals: true } }, where)
|
const combinedWhere = combineQueries({ latest: { equals: true } }, where)
|
||||||
|
|||||||
@@ -15,10 +15,10 @@ import {
|
|||||||
varchar,
|
varchar,
|
||||||
} from 'drizzle-orm/pg-core'
|
} from 'drizzle-orm/pg-core'
|
||||||
import { fieldAffectsData } from 'payload/types'
|
import { fieldAffectsData } from 'payload/types'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { GenericColumns, GenericTable, PostgresAdapter } from '../types'
|
import type { GenericColumns, GenericTable, PostgresAdapter } from '../types'
|
||||||
|
|
||||||
|
import { getTableName } from '../utilities/getTableName'
|
||||||
import { getConfigIDType } from './getConfigIDType'
|
import { getConfigIDType } from './getConfigIDType'
|
||||||
import { parentIDColumnMap } from './parentIDColumnMap'
|
import { parentIDColumnMap } from './parentIDColumnMap'
|
||||||
import { traverseFields } from './traverseFields'
|
import { traverseFields } from './traverseFields'
|
||||||
@@ -296,11 +296,12 @@ export const buildTable = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
relationships.forEach((relationTo) => {
|
relationships.forEach((relationTo) => {
|
||||||
const formattedRelationTo = toSnakeCase(relationTo)
|
const relationshipConfig = adapter.payload.collections[relationTo].config
|
||||||
|
const formattedRelationTo = getTableName(relationshipConfig)
|
||||||
let colType = 'integer'
|
let colType = 'integer'
|
||||||
const relatedCollectionCustomID = adapter.payload.collections[
|
const relatedCollectionCustomID = relationshipConfig.fields.find(
|
||||||
relationTo
|
(field) => fieldAffectsData(field) && field.name === 'id',
|
||||||
].config.fields.find((field) => fieldAffectsData(field) && field.name === 'id')
|
)
|
||||||
if (relatedCollectionCustomID?.type === 'number') colType = 'numeric'
|
if (relatedCollectionCustomID?.type === 'number') colType = 'numeric'
|
||||||
if (relatedCollectionCustomID?.type === 'text') colType = 'varchar'
|
if (relatedCollectionCustomID?.type === 'text') colType = 'varchar'
|
||||||
|
|
||||||
@@ -337,7 +338,7 @@ export const buildTable = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
relationships.forEach((relationTo) => {
|
relationships.forEach((relationTo) => {
|
||||||
const relatedTableName = toSnakeCase(relationTo)
|
const relatedTableName = getTableName(adapter.payload.collections[relationTo].config)
|
||||||
const idColumnName = `${relationTo}ID`
|
const idColumnName = `${relationTo}ID`
|
||||||
result[idColumnName] = one(adapter.tables[relatedTableName], {
|
result[idColumnName] = one(adapter.tables[relatedTableName], {
|
||||||
fields: [relationshipsTable[idColumnName]],
|
fields: [relationshipsTable[idColumnName]],
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import toSnakeCase from 'to-snake-case'
|
|||||||
|
|
||||||
import type { GenericColumns, PostgresAdapter } from '../types'
|
import type { GenericColumns, PostgresAdapter } from '../types'
|
||||||
|
|
||||||
|
import { getTableName } from '../utilities/getTableName'
|
||||||
import { hasLocalesTable } from '../utilities/hasLocalesTable'
|
import { hasLocalesTable } from '../utilities/hasLocalesTable'
|
||||||
import { buildTable } from './build'
|
import { buildTable } from './build'
|
||||||
import { createIndex } from './createIndex'
|
import { createIndex } from './createIndex'
|
||||||
@@ -214,7 +215,7 @@ export const traverseFields = ({
|
|||||||
|
|
||||||
case 'radio':
|
case 'radio':
|
||||||
case 'select': {
|
case 'select': {
|
||||||
const enumName = `enum_${newTableName}_${toSnakeCase(field.name)}`
|
const enumName = `enum_${newTableName}_${getTableName(field, { prefer: 'enumName' })}`
|
||||||
|
|
||||||
adapter.enums[enumName] = pgEnum(
|
adapter.enums[enumName] = pgEnum(
|
||||||
enumName,
|
enumName,
|
||||||
@@ -228,7 +229,7 @@ export const traverseFields = ({
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (field.type === 'select' && field.hasMany) {
|
if (field.type === 'select' && field.hasMany) {
|
||||||
const selectTableName = `${newTableName}_${toSnakeCase(field.name)}`
|
const selectTableName = `${newTableName}_${getTableName(field, { prefer: 'tableName' })}`
|
||||||
const baseColumns: Record<string, PgColumnBuilder> = {
|
const baseColumns: Record<string, PgColumnBuilder> = {
|
||||||
order: integer('order').notNull(),
|
order: integer('order').notNull(),
|
||||||
parent: parentIDColumnMap[parentIDColType]('parent_id')
|
parent: parentIDColumnMap[parentIDColType]('parent_id')
|
||||||
@@ -292,7 +293,7 @@ export const traverseFields = ({
|
|||||||
case 'array': {
|
case 'array': {
|
||||||
const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull
|
const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull
|
||||||
|
|
||||||
const arrayTableName = `${newTableName}_${toSnakeCase(field.name)}`
|
const arrayTableName = `${newTableName}_${getTableName(field)}`
|
||||||
const baseColumns: Record<string, PgColumnBuilder> = {
|
const baseColumns: Record<string, PgColumnBuilder> = {
|
||||||
_order: integer('_order').notNull(),
|
_order: integer('_order').notNull(),
|
||||||
_parentID: parentIDColumnMap[parentIDColType]('_parent_id')
|
_parentID: parentIDColumnMap[parentIDColType]('_parent_id')
|
||||||
@@ -370,7 +371,7 @@ export const traverseFields = ({
|
|||||||
const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull
|
const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull
|
||||||
|
|
||||||
field.blocks.forEach((block) => {
|
field.blocks.forEach((block) => {
|
||||||
const blockTableName = `${rootTableName}_blocks_${toSnakeCase(block.slug)}`
|
const blockTableName = `${rootTableName}_blocks_${getTableName(block)}`
|
||||||
if (!adapter.tables[blockTableName]) {
|
if (!adapter.tables[blockTableName]) {
|
||||||
const baseColumns: Record<string, PgColumnBuilder> = {
|
const baseColumns: Record<string, PgColumnBuilder> = {
|
||||||
_order: integer('_order').notNull(),
|
_order: integer('_order').notNull(),
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
/* eslint-disable no-param-reassign */
|
/* eslint-disable no-param-reassign */
|
||||||
import type { BlockField } from 'payload/types'
|
import type { BlockField } from 'payload/types'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from '../../types'
|
import type { PostgresAdapter } from '../../types'
|
||||||
import type { BlockRowToInsert, RelationshipToDelete } from './types'
|
import type { BlockRowToInsert, RelationshipToDelete } from './types'
|
||||||
|
|
||||||
|
import { getTableName } from '../../utilities/getTableName'
|
||||||
import { traverseFields } from './traverseFields'
|
import { traverseFields } from './traverseFields'
|
||||||
|
|
||||||
type Args = {
|
type Args = {
|
||||||
@@ -46,7 +45,7 @@ export const transformBlocks = ({
|
|||||||
if (typeof blockRow.blockType !== 'string') return
|
if (typeof blockRow.blockType !== 'string') return
|
||||||
const matchedBlock = field.blocks.find(({ slug }) => slug === blockRow.blockType)
|
const matchedBlock = field.blocks.find(({ slug }) => slug === blockRow.blockType)
|
||||||
if (!matchedBlock) return
|
if (!matchedBlock) return
|
||||||
const blockType = toSnakeCase(blockRow.blockType)
|
const blockType = getTableName(matchedBlock)
|
||||||
|
|
||||||
if (!blocks[blockType]) blocks[blockType] = []
|
if (!blocks[blockType]) blocks[blockType] = []
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import toSnakeCase from 'to-snake-case'
|
|||||||
import type { PostgresAdapter } from '../../types'
|
import type { PostgresAdapter } from '../../types'
|
||||||
import type { ArrayRowToInsert, BlockRowToInsert, RelationshipToDelete } from './types'
|
import type { ArrayRowToInsert, BlockRowToInsert, RelationshipToDelete } from './types'
|
||||||
|
|
||||||
|
import { getTableName } from '../../utilities/getTableName'
|
||||||
import { isArrayOfRows } from '../../utilities/isArrayOfRows'
|
import { isArrayOfRows } from '../../utilities/isArrayOfRows'
|
||||||
import { transformArray } from './array'
|
import { transformArray } from './array'
|
||||||
import { transformBlocks } from './blocks'
|
import { transformBlocks } from './blocks'
|
||||||
@@ -88,7 +89,7 @@ export const traverseFields = ({
|
|||||||
let fieldData: unknown
|
let fieldData: unknown
|
||||||
|
|
||||||
if (fieldAffectsData(field)) {
|
if (fieldAffectsData(field)) {
|
||||||
columnName = `${columnPrefix || ''}${toSnakeCase(field.name)}`
|
columnName = `${columnPrefix || ''}${getTableName(field)}`
|
||||||
fieldName = `${fieldPrefix || ''}${field.name}`
|
fieldName = `${fieldPrefix || ''}${field.name}`
|
||||||
fieldData = data[field.name]
|
fieldData = data[field.name]
|
||||||
}
|
}
|
||||||
@@ -147,8 +148,8 @@ export const traverseFields = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (field.type === 'blocks') {
|
if (field.type === 'blocks') {
|
||||||
field.blocks.forEach(({ slug }) => {
|
field.blocks.forEach((block) => {
|
||||||
blocksToDelete.add(toSnakeCase(slug))
|
blocksToDelete.add(getTableName(block))
|
||||||
})
|
})
|
||||||
|
|
||||||
if (field.localized) {
|
if (field.localized) {
|
||||||
|
|||||||
@@ -10,6 +10,14 @@ import type { NodePgDatabase, NodePgQueryResultHKT } from 'drizzle-orm/node-post
|
|||||||
import type { PgColumn, PgEnum, PgTableWithColumns, PgTransaction } from 'drizzle-orm/pg-core'
|
import type { PgColumn, PgEnum, PgTableWithColumns, PgTransaction } from 'drizzle-orm/pg-core'
|
||||||
import type { Payload } from 'payload'
|
import type { Payload } from 'payload'
|
||||||
import type { BaseDatabaseAdapter } from 'payload/database'
|
import type { BaseDatabaseAdapter } from 'payload/database'
|
||||||
|
import type { BaseCollectionConfig } from 'payload/dist/collections/config/types'
|
||||||
|
import type {
|
||||||
|
BaseArrayField,
|
||||||
|
BaseBlock,
|
||||||
|
BaseRadioField,
|
||||||
|
BaseSelectField,
|
||||||
|
} from 'payload/dist/fields/config/types'
|
||||||
|
import type { BaseGlobalConfig } from 'payload/dist/globals/config/types'
|
||||||
import type { Pool, PoolConfig } from 'pg'
|
import type { Pool, PoolConfig } from 'pg'
|
||||||
|
|
||||||
export type DrizzleDB = NodePgDatabase<Record<string, unknown>>
|
export type DrizzleDB = NodePgDatabase<Record<string, unknown>>
|
||||||
@@ -51,6 +59,11 @@ export type PostgresAdapter = BaseDatabaseAdapter & {
|
|||||||
drizzle: DrizzleDB
|
drizzle: DrizzleDB
|
||||||
logger: DrizzleConfig['logger']
|
logger: DrizzleConfig['logger']
|
||||||
enums: Record<string, GenericEnum>
|
enums: Record<string, GenericEnum>
|
||||||
|
/**
|
||||||
|
* An object keyed on each table, with a key value pair where the constraint name is the key, followed by the dot-notation field name
|
||||||
|
* Used for returning properly formed errors from unique fields
|
||||||
|
*/
|
||||||
|
fieldConstraints: Record<string, Record<string, string>>
|
||||||
pool: Pool
|
pool: Pool
|
||||||
poolOptions: Args['pool']
|
poolOptions: Args['pool']
|
||||||
push: boolean
|
push: boolean
|
||||||
@@ -64,11 +77,6 @@ export type PostgresAdapter = BaseDatabaseAdapter & {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
tables: Record<string, GenericTable>
|
tables: Record<string, GenericTable>
|
||||||
/**
|
|
||||||
* An object keyed on each table, with a key value pair where the constraint name is the key, followed by the dot-notation field name
|
|
||||||
* Used for returning properly formed errors from unique fields
|
|
||||||
*/
|
|
||||||
fieldConstraints: Record<string, Record<string, string>>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type PostgresAdapterResult = (args: { payload: Payload }) => PostgresAdapter
|
export type PostgresAdapterResult = (args: { payload: Payload }) => PostgresAdapter
|
||||||
@@ -82,6 +90,7 @@ declare module 'payload' {
|
|||||||
BaseDatabaseAdapter {
|
BaseDatabaseAdapter {
|
||||||
drizzle: DrizzleDB
|
drizzle: DrizzleDB
|
||||||
enums: Record<string, GenericEnum>
|
enums: Record<string, GenericEnum>
|
||||||
|
fieldConstraints: Record<string, Record<string, string>>
|
||||||
pool: Pool
|
pool: Pool
|
||||||
push: boolean
|
push: boolean
|
||||||
relations: Record<string, GenericRelation>
|
relations: Record<string, GenericRelation>
|
||||||
@@ -94,6 +103,53 @@ declare module 'payload' {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
tables: Record<string, GenericTable>
|
tables: Record<string, GenericTable>
|
||||||
fieldConstraints: Record<string, Record<string, string>>
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
declare module 'payload/types' {
|
||||||
|
export interface CollectionConfig extends BaseCollectionConfig {
|
||||||
|
/**
|
||||||
|
* Customize the SQL table name
|
||||||
|
*/
|
||||||
|
tableName?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface GlobalConfig extends BaseGlobalConfig {
|
||||||
|
/**
|
||||||
|
* Customize the SQL table name
|
||||||
|
*/
|
||||||
|
tableName?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ArrayField extends BaseArrayField {
|
||||||
|
/**
|
||||||
|
* Customize the SQL table name
|
||||||
|
*/
|
||||||
|
tableName?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface RadioField extends BaseRadioField {
|
||||||
|
/**
|
||||||
|
* Customize the SQL enum name
|
||||||
|
*/
|
||||||
|
enumName?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Block extends BaseBlock {
|
||||||
|
/**
|
||||||
|
* Customize the SQL table name
|
||||||
|
*/
|
||||||
|
tableName?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SelectField extends BaseSelectField {
|
||||||
|
/**
|
||||||
|
* Customize the SQL enum name
|
||||||
|
*/
|
||||||
|
enumName?: string
|
||||||
|
/**
|
||||||
|
* Customize the SQL table name when using `hasMany: true`
|
||||||
|
*/
|
||||||
|
tableName?: string
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import type { UpdateOne } from 'payload/database'
|
import type { UpdateOne } from 'payload/database'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { ChainedMethods } from './find/chainMethods'
|
import type { ChainedMethods } from './find/chainMethods'
|
||||||
import { chainMethods } from './find/chainMethods'
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
|
import { chainMethods } from './find/chainMethods'
|
||||||
import buildQuery from './queries/buildQuery'
|
import buildQuery from './queries/buildQuery'
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export const updateOne: UpdateOne = async function updateOne(
|
export const updateOne: UpdateOne = async function updateOne(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -14,7 +14,7 @@ export const updateOne: UpdateOne = async function updateOne(
|
|||||||
) {
|
) {
|
||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const collection = this.payload.collections[collectionSlug].config
|
const collection = this.payload.collections[collectionSlug].config
|
||||||
const tableName = toSnakeCase(collectionSlug)
|
const tableName = getTableName(collection)
|
||||||
const whereToUse = whereArg || { id: { equals: id } }
|
const whereToUse = whereArg || { id: { equals: id } }
|
||||||
|
|
||||||
const { joinAliases, joins, selectFields, where } = await buildQuery({
|
const { joinAliases, joins, selectFields, where } = await buildQuery({
|
||||||
@@ -70,8 +70,8 @@ export const updateOne: UpdateOne = async function updateOne(
|
|||||||
db,
|
db,
|
||||||
fields: collection.fields,
|
fields: collection.fields,
|
||||||
operation: 'update',
|
operation: 'update',
|
||||||
tableName: toSnakeCase(collectionSlug),
|
|
||||||
req,
|
req,
|
||||||
|
tableName,
|
||||||
})
|
})
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
import type { UpdateGlobalArgs } from 'payload/database'
|
import type { UpdateGlobalArgs } from 'payload/database'
|
||||||
import type { PayloadRequest, TypeWithID } from 'payload/types'
|
import type { PayloadRequest, TypeWithID } from 'payload/types'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export async function updateGlobal<T extends TypeWithID>(
|
export async function updateGlobal<T extends TypeWithID>(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -13,7 +12,7 @@ export async function updateGlobal<T extends TypeWithID>(
|
|||||||
): Promise<T> {
|
): Promise<T> {
|
||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const globalConfig = this.payload.globals.config.find((config) => config.slug === slug)
|
const globalConfig = this.payload.globals.config.find((config) => config.slug === slug)
|
||||||
const tableName = toSnakeCase(slug)
|
const tableName = getTableName(globalConfig)
|
||||||
|
|
||||||
const existingGlobal = await db.query[tableName].findFirst({})
|
const existingGlobal = await db.query[tableName].findFirst({})
|
||||||
|
|
||||||
@@ -23,8 +22,8 @@ export async function updateGlobal<T extends TypeWithID>(
|
|||||||
data,
|
data,
|
||||||
db,
|
db,
|
||||||
fields: globalConfig.fields,
|
fields: globalConfig.fields,
|
||||||
tableName,
|
|
||||||
req,
|
req,
|
||||||
|
tableName,
|
||||||
})
|
})
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ import type { TypeWithVersion, UpdateGlobalVersionArgs } from 'payload/database'
|
|||||||
import type { PayloadRequest, SanitizedGlobalConfig, TypeWithID } from 'payload/types'
|
import type { PayloadRequest, SanitizedGlobalConfig, TypeWithID } from 'payload/types'
|
||||||
|
|
||||||
import { buildVersionGlobalFields } from 'payload/versions'
|
import { buildVersionGlobalFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import buildQuery from './queries/buildQuery'
|
import buildQuery from './queries/buildQuery'
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export async function updateGlobalVersion<T extends TypeWithID>(
|
export async function updateGlobalVersion<T extends TypeWithID>(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -25,7 +25,7 @@ export async function updateGlobalVersion<T extends TypeWithID>(
|
|||||||
({ slug }) => slug === global,
|
({ slug }) => slug === global,
|
||||||
)
|
)
|
||||||
const whereToUse = whereArg || { id: { equals: id } }
|
const whereToUse = whereArg || { id: { equals: id } }
|
||||||
const tableName = `_${toSnakeCase(global)}_v`
|
const tableName = `_${getTableName(globalConfig)}_v`
|
||||||
const fields = buildVersionGlobalFields(globalConfig)
|
const fields = buildVersionGlobalFields(globalConfig)
|
||||||
|
|
||||||
const { where } = await buildQuery({
|
const { where } = await buildQuery({
|
||||||
@@ -43,9 +43,9 @@ export async function updateGlobalVersion<T extends TypeWithID>(
|
|||||||
db,
|
db,
|
||||||
fields,
|
fields,
|
||||||
operation: 'update',
|
operation: 'update',
|
||||||
|
req,
|
||||||
tableName,
|
tableName,
|
||||||
where,
|
where,
|
||||||
req,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ import type { TypeWithVersion, UpdateVersionArgs } from 'payload/database'
|
|||||||
import type { PayloadRequest, SanitizedCollectionConfig, TypeWithID } from 'payload/types'
|
import type { PayloadRequest, SanitizedCollectionConfig, TypeWithID } from 'payload/types'
|
||||||
|
|
||||||
import { buildVersionCollectionFields } from 'payload/versions'
|
import { buildVersionCollectionFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import buildQuery from './queries/buildQuery'
|
import buildQuery from './queries/buildQuery'
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
import { getTableName } from './utilities/getTableName'
|
||||||
|
|
||||||
export async function updateVersion<T extends TypeWithID>(
|
export async function updateVersion<T extends TypeWithID>(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -23,7 +23,7 @@ export async function updateVersion<T extends TypeWithID>(
|
|||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
||||||
const whereToUse = whereArg || { id: { equals: id } }
|
const whereToUse = whereArg || { id: { equals: id } }
|
||||||
const tableName = `_${toSnakeCase(collection)}_v`
|
const tableName = `_${getTableName(collectionConfig)}_v`
|
||||||
const fields = buildVersionCollectionFields(collectionConfig)
|
const fields = buildVersionCollectionFields(collectionConfig)
|
||||||
|
|
||||||
const { where } = await buildQuery({
|
const { where } = await buildQuery({
|
||||||
@@ -41,9 +41,9 @@ export async function updateVersion<T extends TypeWithID>(
|
|||||||
db,
|
db,
|
||||||
fields,
|
fields,
|
||||||
operation: 'update',
|
operation: 'update',
|
||||||
|
req,
|
||||||
tableName,
|
tableName,
|
||||||
where,
|
where,
|
||||||
req,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
21
packages/db-postgres/src/utilities/getTableName.ts
Normal file
21
packages/db-postgres/src/utilities/getTableName.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import toSnakeCase from 'to-snake-case'
|
||||||
|
|
||||||
|
type Options = {
|
||||||
|
prefer: 'enumName' | 'tableName'
|
||||||
|
}
|
||||||
|
|
||||||
|
type EntityConfig = {
|
||||||
|
enumName?: string
|
||||||
|
name?: string
|
||||||
|
slug?: string
|
||||||
|
tableName?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getTableName = (
|
||||||
|
{ name, enumName, slug, tableName }: EntityConfig,
|
||||||
|
{ prefer }: Options = { prefer: 'tableName' },
|
||||||
|
) => {
|
||||||
|
const generated = toSnakeCase(name ?? slug)
|
||||||
|
const custom = prefer === 'tableName' ? tableName ?? enumName : enumName ?? tableName
|
||||||
|
return custom ?? generated
|
||||||
|
}
|
||||||
@@ -159,6 +159,7 @@ const collectionSchema = joi.object().keys({
|
|||||||
.try(joi.string(), joi.object().pattern(joi.string(), [joi.string()])),
|
.try(joi.string(), joi.object().pattern(joi.string(), [joi.string()])),
|
||||||
}),
|
}),
|
||||||
slug: joi.string().required(),
|
slug: joi.string().required(),
|
||||||
|
tableName: joi.string(),
|
||||||
timestamps: joi.boolean(),
|
timestamps: joi.boolean(),
|
||||||
typescript: joi.object().keys({
|
typescript: joi.object().keys({
|
||||||
interface: joi.string(),
|
interface: joi.string(),
|
||||||
|
|||||||
@@ -332,8 +332,7 @@ export type CollectionAdminOptions = {
|
|||||||
useAsTitle?: string
|
useAsTitle?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Manage all aspects of a data collection */
|
export type BaseCollectionConfig = {
|
||||||
export type CollectionConfig = {
|
|
||||||
/**
|
/**
|
||||||
* Access control
|
* Access control
|
||||||
*/
|
*/
|
||||||
@@ -426,6 +425,7 @@ export type CollectionConfig = {
|
|||||||
* @default false // disable uploads
|
* @default false // disable uploads
|
||||||
*/
|
*/
|
||||||
upload?: IncomingUploadType | boolean
|
upload?: IncomingUploadType | boolean
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Customize the handling of incoming file uploads
|
* Customize the handling of incoming file uploads
|
||||||
*
|
*
|
||||||
@@ -434,6 +434,9 @@ export type CollectionConfig = {
|
|||||||
versions?: IncomingCollectionVersions | boolean
|
versions?: IncomingCollectionVersions | boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Manage all aspects of a data collection */
|
||||||
|
export type CollectionConfig = BaseCollectionConfig
|
||||||
|
|
||||||
export interface SanitizedCollectionConfig
|
export interface SanitizedCollectionConfig
|
||||||
extends Omit<
|
extends Omit<
|
||||||
DeepRequired<CollectionConfig>,
|
DeepRequired<CollectionConfig>,
|
||||||
|
|||||||
@@ -196,6 +196,7 @@ export const select = baseField.keys({
|
|||||||
defaultValue: joi
|
defaultValue: joi
|
||||||
.alternatives()
|
.alternatives()
|
||||||
.try(joi.string().allow(''), joi.array().items(joi.string().allow('')), joi.func()),
|
.try(joi.string().allow(''), joi.array().items(joi.string().allow('')), joi.func()),
|
||||||
|
enumName: joi.string(),
|
||||||
hasMany: joi.boolean().default(false),
|
hasMany: joi.boolean().default(false),
|
||||||
options: joi
|
options: joi
|
||||||
.array()
|
.array()
|
||||||
@@ -212,6 +213,7 @@ export const select = baseField.keys({
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.required(),
|
.required(),
|
||||||
|
tableName: joi.string(),
|
||||||
type: joi.string().valid('select').required(),
|
type: joi.string().valid('select').required(),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -225,6 +227,7 @@ export const radio = baseField.keys({
|
|||||||
layout: joi.string().valid('vertical', 'horizontal'),
|
layout: joi.string().valid('vertical', 'horizontal'),
|
||||||
}),
|
}),
|
||||||
defaultValue: joi.alternatives().try(joi.string().allow(''), joi.func()),
|
defaultValue: joi.alternatives().try(joi.string().allow(''), joi.func()),
|
||||||
|
enumName: joi.string(),
|
||||||
options: joi
|
options: joi
|
||||||
.array()
|
.array()
|
||||||
.min(1)
|
.min(1)
|
||||||
@@ -315,6 +318,7 @@ export const array = baseField.keys({
|
|||||||
}),
|
}),
|
||||||
maxRows: joi.number(),
|
maxRows: joi.number(),
|
||||||
minRows: joi.number(),
|
minRows: joi.number(),
|
||||||
|
tableName: joi.string(),
|
||||||
type: joi.string().valid('array').required(),
|
type: joi.string().valid('array').required(),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -416,6 +420,7 @@ export const blocks = baseField.keys({
|
|||||||
.try(joi.string(), joi.object().pattern(joi.string(), [joi.string()])),
|
.try(joi.string(), joi.object().pattern(joi.string(), [joi.string()])),
|
||||||
}),
|
}),
|
||||||
slug: joi.string().required(),
|
slug: joi.string().required(),
|
||||||
|
tableName: joi.string(),
|
||||||
custom: joi.object().pattern(joi.string(), joi.any()),
|
custom: joi.object().pattern(joi.string(), joi.any()),
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -433,7 +433,7 @@ export type JSONField = Omit<FieldBase, 'admin'> & {
|
|||||||
type: 'json'
|
type: 'json'
|
||||||
}
|
}
|
||||||
|
|
||||||
export type SelectField = FieldBase & {
|
export type BaseSelectField = FieldBase & {
|
||||||
admin?: Admin & {
|
admin?: Admin & {
|
||||||
components?: {
|
components?: {
|
||||||
Error?: React.ComponentType<ErrorProps>
|
Error?: React.ComponentType<ErrorProps>
|
||||||
@@ -447,6 +447,8 @@ export type SelectField = FieldBase & {
|
|||||||
type: 'select'
|
type: 'select'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type SelectField = BaseSelectField
|
||||||
|
|
||||||
type SharedRelationshipProperties = FieldBase & {
|
type SharedRelationshipProperties = FieldBase & {
|
||||||
filterOptions?: FilterOptions
|
filterOptions?: FilterOptions
|
||||||
hasMany?: boolean
|
hasMany?: boolean
|
||||||
@@ -528,7 +530,7 @@ export type RichTextField<
|
|||||||
type: 'richText'
|
type: 'richText'
|
||||||
} & ExtraProperties
|
} & ExtraProperties
|
||||||
|
|
||||||
export type ArrayField = FieldBase & {
|
export type BaseArrayField = FieldBase & {
|
||||||
admin?: Admin & {
|
admin?: Admin & {
|
||||||
components?: {
|
components?: {
|
||||||
RowLabel?: RowLabel
|
RowLabel?: RowLabel
|
||||||
@@ -549,7 +551,9 @@ export type ArrayField = FieldBase & {
|
|||||||
type: 'array'
|
type: 'array'
|
||||||
}
|
}
|
||||||
|
|
||||||
export type RadioField = FieldBase & {
|
export type ArrayField = BaseArrayField
|
||||||
|
|
||||||
|
export type BaseRadioField = FieldBase & {
|
||||||
admin?: Admin & {
|
admin?: Admin & {
|
||||||
components?: {
|
components?: {
|
||||||
Error?: React.ComponentType<ErrorProps>
|
Error?: React.ComponentType<ErrorProps>
|
||||||
@@ -561,6 +565,27 @@ export type RadioField = FieldBase & {
|
|||||||
type: 'radio'
|
type: 'radio'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type RadioField = BaseRadioField
|
||||||
|
|
||||||
|
export type BaseBlock = {
|
||||||
|
fields: Field[]
|
||||||
|
/** @deprecated - please migrate to the interfaceName property instead. */
|
||||||
|
graphQL?: {
|
||||||
|
singularName?: string
|
||||||
|
}
|
||||||
|
imageAltText?: string
|
||||||
|
imageURL?: string
|
||||||
|
/** Customize generated GraphQL and Typescript schema names.
|
||||||
|
* The slug is used by default.
|
||||||
|
*
|
||||||
|
* This is useful if you would like to generate a top level type to share amongst collections/fields.
|
||||||
|
* **Note**: Top level types can collide, ensure they are unique among collections, arrays, groups, blocks, tabs.
|
||||||
|
*/
|
||||||
|
interfaceName?: string
|
||||||
|
labels?: Labels
|
||||||
|
slug: string
|
||||||
|
}
|
||||||
|
|
||||||
export type Block = {
|
export type Block = {
|
||||||
fields: Field[]
|
fields: Field[]
|
||||||
/** @deprecated - please migrate to the interfaceName property instead. */
|
/** @deprecated - please migrate to the interfaceName property instead. */
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ const globalSchema = joi
|
|||||||
}),
|
}),
|
||||||
label: joi.alternatives().try(joi.string(), joi.object().pattern(joi.string(), [joi.string()])),
|
label: joi.alternatives().try(joi.string(), joi.object().pattern(joi.string(), [joi.string()])),
|
||||||
slug: joi.string().required(),
|
slug: joi.string().required(),
|
||||||
|
tableName: joi.string(),
|
||||||
typescript: joi.object().keys({
|
typescript: joi.object().keys({
|
||||||
interface: joi.string(),
|
interface: joi.string(),
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ export type GlobalAdminOptions = {
|
|||||||
preview?: GeneratePreviewURL
|
preview?: GeneratePreviewURL
|
||||||
}
|
}
|
||||||
|
|
||||||
export type GlobalConfig = {
|
export type BaseGlobalConfig = {
|
||||||
access?: {
|
access?: {
|
||||||
read?: Access
|
read?: Access
|
||||||
readDrafts?: Access
|
readDrafts?: Access
|
||||||
@@ -198,6 +198,8 @@ export type GlobalConfig = {
|
|||||||
versions?: IncomingGlobalVersions | boolean
|
versions?: IncomingGlobalVersions | boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type GlobalConfig = BaseGlobalConfig
|
||||||
|
|
||||||
export interface SanitizedGlobalConfig
|
export interface SanitizedGlobalConfig
|
||||||
extends Omit<DeepRequired<GlobalConfig>, 'endpoints' | 'fields' | 'versions'> {
|
extends Omit<DeepRequired<GlobalConfig>, 'endpoints' | 'fields' | 'versions'> {
|
||||||
endpoints: Omit<Endpoint, 'root'>[] | false
|
endpoints: Omit<Endpoint, 'root'>[] | false
|
||||||
|
|||||||
@@ -63,7 +63,95 @@ export default buildConfigWithDefaults({
|
|||||||
},
|
},
|
||||||
slug: 'relation-b',
|
slug: 'relation-b',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'text',
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'localizedText',
|
||||||
|
localized: true,
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'relationship',
|
||||||
|
hasMany: true,
|
||||||
|
relationTo: 'relation-a',
|
||||||
|
type: 'relationship',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'select',
|
||||||
|
enumName: 'selectEnum',
|
||||||
|
hasMany: true,
|
||||||
|
options: ['a', 'b', 'c'],
|
||||||
|
tableName: 'customSelect',
|
||||||
|
type: 'select',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'radio',
|
||||||
|
enumName: 'radioEnum',
|
||||||
|
options: ['a', 'b', 'c'],
|
||||||
|
type: 'select',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'array',
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'text',
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'localizedText',
|
||||||
|
localized: true,
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
tableName: 'customArrays',
|
||||||
|
type: 'array',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'blocks',
|
||||||
|
blocks: [
|
||||||
|
{
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'text',
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'localizedText',
|
||||||
|
localized: true,
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
slug: 'block',
|
||||||
|
tableName: 'customBlocks',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
type: 'blocks',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
slug: 'custom-schema',
|
||||||
|
tableName: 'customs',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
|
globals: [
|
||||||
|
{
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'text',
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
slug: 'global',
|
||||||
|
tableName: 'customGlobal',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
localization: {
|
||||||
|
defaultLocale: 'en',
|
||||||
|
locales: ['en', 'es'],
|
||||||
|
},
|
||||||
onInit: async (payload) => {
|
onInit: async (payload) => {
|
||||||
await payload.create({
|
await payload.create({
|
||||||
collection: 'users',
|
collection: 'users',
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { GraphQLClient } from 'graphql-request'
|
import { GraphQLClient } from 'graphql-request'
|
||||||
|
|
||||||
|
import type { PostgresAdapter } from '../../packages/db-postgres/src/types'
|
||||||
import type { TypeWithID } from '../../packages/payload/src/collections/config/types'
|
import type { TypeWithID } from '../../packages/payload/src/collections/config/types'
|
||||||
import type { PayloadRequest } from '../../packages/payload/src/express/types'
|
import type { PayloadRequest } from '../../packages/payload/src/express/types'
|
||||||
|
|
||||||
@@ -16,12 +17,16 @@ describe('database', () => {
|
|||||||
const collection = 'posts'
|
const collection = 'posts'
|
||||||
const title = 'title'
|
const title = 'title'
|
||||||
let user: TypeWithID & Record<string, unknown>
|
let user: TypeWithID & Record<string, unknown>
|
||||||
|
let checkSchema = true
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
const init = await initPayloadTest({ __dirname, init: { local: false } })
|
const init = await initPayloadTest({ __dirname, init: { local: false } })
|
||||||
serverURL = init.serverURL
|
serverURL = init.serverURL
|
||||||
const url = `${serverURL}/api/graphql`
|
const url = `${serverURL}/api/graphql`
|
||||||
client = new GraphQLClient(url)
|
client = new GraphQLClient(url)
|
||||||
|
if (payload.db.name === 'mongoose') {
|
||||||
|
checkSchema = false
|
||||||
|
}
|
||||||
|
|
||||||
const loginResult = await payload.login({
|
const loginResult = await payload.login({
|
||||||
collection: 'users',
|
collection: 'users',
|
||||||
@@ -35,6 +40,46 @@ describe('database', () => {
|
|||||||
user = loginResult.user
|
user = loginResult.user
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('schema', () => {
|
||||||
|
it('should use custom tableNames', () => {
|
||||||
|
const db: PostgresAdapter = payload.db
|
||||||
|
expect(db).toBeDefined()
|
||||||
|
|
||||||
|
if (checkSchema) {
|
||||||
|
// collection
|
||||||
|
expect(db.tables['customs']).toBeDefined()
|
||||||
|
|
||||||
|
// collection relationships
|
||||||
|
expect(db.tables.customs_rels).toBeDefined()
|
||||||
|
|
||||||
|
// collection localized
|
||||||
|
expect(db.tables.customs_locales).toBeDefined()
|
||||||
|
|
||||||
|
// global
|
||||||
|
expect(db.tables.customGlobal).toBeDefined()
|
||||||
|
|
||||||
|
// select
|
||||||
|
expect(db.tables.customs_customSelect).toBeDefined()
|
||||||
|
|
||||||
|
// array
|
||||||
|
expect(db.tables.customs_customArrays).toBeDefined()
|
||||||
|
|
||||||
|
// array localized
|
||||||
|
expect(db.tables.customs_customArrays_locales).toBeDefined()
|
||||||
|
|
||||||
|
// blocks
|
||||||
|
expect(db.tables.customs_blocks_customBlocks).toBeDefined()
|
||||||
|
|
||||||
|
// localized blocks
|
||||||
|
expect(db.tables.customs_blocks_customBlocks_locales).toBeDefined()
|
||||||
|
|
||||||
|
// enum names
|
||||||
|
expect(db.enums.enum_customs_selectEnum).toBeDefined()
|
||||||
|
expect(db.enums.enum_customs_radioEnum).toBeDefined()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('transactions', () => {
|
describe('transactions', () => {
|
||||||
describe('local api', () => {
|
describe('local api', () => {
|
||||||
it('should commit multiple operations in isolation', async () => {
|
it('should commit multiple operations in isolation', async () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user