Skip to content

Commit 952a65a

Browse files
committed
fix: extra query not working
1 parent 6a53e37 commit 952a65a

4 files changed

Lines changed: 56 additions & 25 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

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

576-
const primaryColumnTsName = field._.primaryColumnTsName
577564
if (Array.isArray(value)) {
578565
const values = value.map((v) => ({
579566
...mapResultToFields(field.fields, v),
580-
__pk: v[primaryColumnTsName],
567+
__pk: v['__pk'],
568+
__id: v['__id'],
581569
}))
582570
return [[field.fieldName, values]]
583571
}
584572

585573
return [
586574
[
587575
field.fieldName,
588-
{ ...mapResultToFields(field.fields, value), __pk: value[primaryColumnTsName] },
576+
{ ...mapResultToFields(field.fields, value), __pk: value['__pk'], __id: value['__id'] },
589577
],
590578
]
591579
}

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/endpoint.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ export function createEndpoint<
167167
>(schema: TApiEndpointSchema, handler: ApiRouteHandler<TContext, TApiEndpointSchema>) {
168168
return {
169169
schema,
170-
// handler: handler,
171170
handler: withValidator(schema, handler),
172171
}
173172
}

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)