Skip to content

Commit 8435674

Browse files
committed
fix: extra query not working
1 parent ca99dc6 commit 8435674

3 files changed

Lines changed: 56 additions & 24 deletions

File tree

packages/core/src/builder.handler.ts

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
Many,
88
One,
99
or,
10-
sql,
1110
type TableRelationalConfig,
1211
} from 'drizzle-orm'
1312
import type { NodePgQueryResultHKT } from 'drizzle-orm/node-postgres'
@@ -42,33 +41,25 @@ export function createDefaultApiHandlers<
4241
schema: Record<string, unknown>
4342
fields: TFields
4443
tableTsKey: string
45-
identiferColumn: string
44+
identifierColumn: string
4645
tableNamesMap: Record<string, string>
4746
tables: Record<string, TableRelationalConfig>
4847
}): CollectionAdminApi<TContext, TFields> {
49-
const { fields, tableTsKey, tableNamesMap, tables, schema, identiferColumn } = args
48+
const { fields, tableTsKey, tableNamesMap, tables, schema, identifierColumn } = args
5049

5150
const tableRelationalConfig = tables[tableTsKey]
5251
const primaryKeyColumn = getPrimaryColumn(tableRelationalConfig)
53-
const identifierKeyColumn = tableRelationalConfig.columns[identiferColumn]
52+
const identifierKeyColumn = tableRelationalConfig.columns[identifierColumn]
5453
const tableName = tableRelationalConfig.tsName
5554
const tableSchema = getTableFromSchema(schema, tableTsKey)
56-
const queryPayload = createDrizzleQuery(fields)
57-
58-
const extrasQuery = {
59-
extras: {
60-
__pk: sql<string | number>`${primaryKeyColumn}`.as('__pk'),
61-
__id: sql<string | number>`${identifierKeyColumn}`.as('__id'),
62-
},
63-
}
55+
const queryPayload = createDrizzleQuery(fields, identifierColumn)
6456

6557
const findOne: ApiFindOneHandler<TContext, TFields> = async (args) => {
6658
const db = args.context.db
6759
const query = db.query[tableName as keyof typeof db.query] as RelationalQueryBuilder<any, any>
6860

6961
const result = await query.findFirst({
7062
...queryPayload,
71-
...extrasQuery,
7263
where: eq(primaryKeyColumn, args.id),
7364
})
7465
if (!result) {
@@ -94,7 +85,6 @@ export function createDefaultApiHandlers<
9485

9586
const result = await query.findMany({
9687
...queryPayload,
97-
...extrasQuery,
9888
limit: args.limit,
9989
offset: args.offset,
10090
orderBy: orderBy
@@ -136,7 +126,6 @@ export function createDefaultApiHandlers<
136126

137127
const result = await query.findFirst({
138128
...queryPayload,
139-
...extrasQuery,
140129
where: eq(primaryKeyColumn, pk),
141130
})
142131

@@ -165,7 +154,6 @@ export function createDefaultApiHandlers<
165154
const pk = await apiHandler.update(args.id, tx, args.data)
166155
const result = await query.findFirst({
167156
...queryPayload,
168-
...extrasQuery,
169157
where: eq(primaryKeyColumn, pk),
170158
})
171159

@@ -574,19 +562,19 @@ function mapResultToFields(fields: Fields<any>, result: Record<string, any>): Re
574562
const value = result[field._.relationTsName]
575563
if (!value) return []
576564

577-
const primaryColumnTsName = field._.primaryColumnTsName
578565
if (Array.isArray(value)) {
579566
const values = value.map((v) => ({
580567
...mapResultToFields(field.fields, v),
581-
__pk: v[primaryColumnTsName],
568+
__pk: v['__pk'],
569+
__id: v['__id'],
582570
}))
583571
return [[field.fieldName, values]]
584572
}
585573

586574
return [
587575
[
588576
field.fieldName,
589-
{ ...mapResultToFields(field.fields, value), __pk: value[primaryColumnTsName] },
577+
{ ...mapResultToFields(field.fields, value), __pk: value['__pk'], __id: value['__id'] },
590578
],
591579
]
592580
}

packages/core/src/builder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export class Builder<
8282
const defaultHandlers = createDefaultApiHandlers({
8383
schema: this.config.schema,
8484
fields: config.fields,
85-
identiferColumn: config.identifierColumn as string,
85+
identifierColumn: config.identifierColumn as string,
8686
tableTsKey: tableTsName,
8787
tables: this.tableRelationalConfigByTableTsName,
8888
tableNamesMap: this.tableTsNameByTableDbName,

packages/core/src/utils.ts

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import type { Column, TableRelationalConfig } from 'drizzle-orm'
2-
import { is, Table } from 'drizzle-orm'
1+
import type { Column, SQL, TableRelationalConfig } from 'drizzle-orm'
2+
import { is, sql, Table } from 'drizzle-orm'
33
import type { IsNever, Simplify, ValueOf } from 'type-fest'
44
import type { ZodIssue, ZodObject, ZodOptional, ZodType } from 'zod'
55

@@ -9,7 +9,14 @@ import type {
99
ApiRouteHandlerPayloadWithContext,
1010
ApiRouteSchema,
1111
} from './endpoint'
12-
import type { Field, FieldRelation, Fields, FieldsInitial, FieldsWithFieldName } from './field'
12+
import type {
13+
Field,
14+
FieldMetadataColumns,
15+
FieldRelation,
16+
Fields,
17+
FieldsInitial,
18+
FieldsWithFieldName,
19+
} from './field'
1320

1421
export function isRelationField(field: Field): field is FieldRelation {
1522
return field._.source === 'relation'
@@ -74,7 +81,43 @@ export function getTableFromSchema(schema: Record<string, unknown>, tableTsName:
7481
return schema[tableTsName]
7582
}
7683

77-
export function createDrizzleQuery(fields: Fields<any>): Record<string, any> {
84+
const getExtraField = (fields: Fields<any>, identifierColumn?: string) => {
85+
const firstColumn = Object.values(fields).find((field) => field._.source === 'column')
86+
?._ as FieldMetadataColumns
87+
88+
if (!firstColumn) {
89+
throw new Error('No column fields found in the provided fields')
90+
}
91+
92+
const extraWith: [string, SQL.Aliased<string | number>][] = []
93+
94+
const table = firstColumn.column.table
95+
const tableColumns = Object.values(table)
96+
const primaryKeyColumn = tableColumns.find((col) => col.primary)
97+
98+
extraWith.push(['__pk', sql`${primaryKeyColumn}`.as('__pk') as SQL.Aliased<string | number>])
99+
100+
if (identifierColumn) {
101+
const identifierKeyColumn = tableColumns.find((col) => col.name === identifierColumn)
102+
103+
if (!identifierKeyColumn) {
104+
throw new Error(`Identifier column ${identifierColumn} not found in table ${table._.name}`)
105+
}
106+
107+
if (!primaryKeyColumn) {
108+
throw new Error(`Primary key column not found in table ${table._.name}`)
109+
}
110+
111+
extraWith.push(['__id', sql`${identifierKeyColumn}`.as('__id') as SQL.Aliased<string | number>])
112+
}
113+
114+
return Object.fromEntries(extraWith)
115+
}
116+
117+
export function createDrizzleQuery(
118+
fields: Fields<any>,
119+
identifierColumn?: string
120+
): Record<string, any> {
78121
const queryColumns = Object.fromEntries(
79122
Object.values(fields).flatMap((field) => {
80123
if (field._.source !== 'column') return []
@@ -94,6 +137,7 @@ export function createDrizzleQuery(fields: Fields<any>): Record<string, any> {
94137
return {
95138
columns: queryColumns,
96139
with: queryWith,
140+
extras: getExtraField(fields, identifierColumn),
97141
}
98142
}
99143

0 commit comments

Comments
 (0)