Skip to content

Commit 9263900

Browse files
committed
feat: add db provider
1 parent 9ce94f5 commit 9263900

File tree

9 files changed

+59
-27
lines changed

9 files changed

+59
-27
lines changed
Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
1-
import { inject } from "@undb/di"
1+
import { inject, singleton } from "@undb/di"
22

33
export const DB_PROVIDER = Symbol.for("DB_PROVIDER")
44

55
export const injectDbProvider = () => inject(DB_PROVIDER)
6+
7+
export interface IDbProvider {
8+
getDbProvider(): string
9+
10+
isPostgres(): boolean
11+
isSqlite(): boolean
12+
}
13+
14+
@singleton()
15+
export class DbProviderService implements IDbProvider {
16+
constructor(@inject(DB_PROVIDER) private readonly dbProvider: string) {}
17+
getDbProvider(): string {
18+
return this.dbProvider
19+
}
20+
isPostgres(): boolean {
21+
return this.dbProvider === "postgres"
22+
}
23+
isSqlite(): boolean {
24+
return this.dbProvider === "sqlite" || this.dbProvider === "turso" || !this.dbProvider
25+
}
26+
}

packages/persistence/src/record/record-query.helper.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { FieldIdVo, type Field, type IViewSort, type RecordComositeSpecification
55
import { sql, type ExpressionBuilder, type SelectQueryBuilder } from "kysely"
66
import type { ITxContext } from "../ctx.interface"
77
import { injectTxCTX } from "../ctx.provider"
8-
import { injectDbProvider } from "../db.provider"
8+
import { DbProviderService, type IDbProvider } from "../db.provider"
99
import { injectQueryBuilder } from "../qb.provider"
1010
import type { IRecordQueryBuilder } from "../qb.type"
1111
import { UnderlyingTable } from "../underlying/underlying-table"
@@ -26,8 +26,8 @@ export class RecordQueryHelper {
2626
private readonly context: IContext,
2727
@injectTxCTX()
2828
private readonly txContext: ITxContext,
29-
@injectDbProvider()
30-
private readonly dbProvider: string,
29+
@inject(DbProviderService)
30+
private readonly dbProvider: IDbProvider,
3131
@inject(DatabaseFnUtil)
3232
private readonly dbFnUtil: IDatabaseFnUtil,
3333
) {}

packages/persistence/src/record/record-select-field-visitor.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import {
3232
import type { FormulaField } from "@undb/table/src/modules/schema/fields/variants/formula-field"
3333
import { getTableName } from "drizzle-orm"
3434
import { sql, type ExpressionBuilder, type SelectExpression } from "kysely"
35+
import type { IDbProvider } from "../db.provider"
3536
import { users } from "../schema/sqlite"
3637
import type { UnderlyingTable } from "../underlying/underlying-table"
3738
import { getDateRangeFieldName } from "../underlying/underlying-table.util"
@@ -60,15 +61,13 @@ export class RecordSelectFieldVisitor implements IFieldVisitor {
6061
private readonly table: UnderlyingTable,
6162
private readonly foreignTables: Map<string, TableDo>,
6263
private readonly eb: ExpressionBuilder<any, string>,
63-
private readonly dbProvider: string,
64+
private readonly dbProvider: IDbProvider,
6465
private readonly dbFnUtil: IDatabaseFnUtil,
6566
) {
6667
this.#addSelect(this.getField(ID_TYPE))
6768
}
6869

6970
#selectSingelUser(field: UserField | CreatedByField | UpdatedByField) {
70-
const db = this.dbProvider
71-
7271
const as = createDisplayFieldName(field)
7372
const user = getTableName(users)
7473

packages/persistence/src/record/record.mutate-visitor.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ import { startOfDay, startOfToday, startOfTomorrow, startOfYesterday } from "dat
7676
import { sql, type ExpressionBuilder } from "kysely"
7777
import { unique } from "radash"
7878
import { AbstractQBMutationVisitor } from "../abstract-qb.visitor"
79+
import type { IDbProvider } from "../db.provider"
7980
import type { IQueryBuilder, IRecordQueryBuilder } from "../qb.type"
8081
import { JoinTable } from "../underlying/reference/join-table"
8182
import { getDateRangeFieldName } from "../underlying/underlying-table.util"
@@ -90,14 +91,14 @@ export class RecordMutateVisitor extends AbstractQBMutationVisitor implements IR
9091
private readonly qb: IRecordQueryBuilder,
9192
private readonly eb: ExpressionBuilder<any, any>,
9293
private readonly context: IContext,
93-
private readonly dbProvider: string,
94+
private readonly dbProvider: IDbProvider,
9495
) {
9596
super()
9697
}
9798

9899
#setDate(fieldId: string, value: Date | null) {
99100
if (value) {
100-
this.setData(fieldId, this.dbProvider === "postgres" ? value : value.getTime())
101+
this.setData(fieldId, this.dbProvider.isPostgres() ? value : value.getTime())
101102
} else {
102103
this.setData(fieldId, null)
103104
}

packages/persistence/src/record/record.repository.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { chunk } from "es-toolkit/array"
2222
import { sql, type CompiledQuery, type ExpressionBuilder } from "kysely"
2323
import type { ITxContext } from "../ctx.interface"
2424
import { injectTxCTX } from "../ctx.provider"
25-
import { injectDbProvider } from "../db.provider"
25+
import { DbProviderService, type IDbProvider } from "../db.provider"
2626
import { UnderlyingTable } from "../underlying/underlying-table"
2727
import { RecordQueryHelper } from "./record-query.helper"
2828
import { getRecordDTOFromEntity } from "./record-utils"
@@ -44,8 +44,8 @@ export class RecordRepository implements IRecordRepository {
4444
private readonly context: IContext,
4545
@injectTxCTX()
4646
private readonly txContext: ITxContext,
47-
@injectDbProvider()
48-
private readonly dbProvider: string,
47+
@inject(DbProviderService)
48+
private readonly dbProvider: IDbProvider,
4949
) {}
5050

5151
private async getForeignTables(table: TableDo, fields: Field[]): Promise<Map<string, TableDo>> {

packages/persistence/src/underlying/underlying-table-field.visitor.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
type UpdatedAtField,
3232
} from "@undb/table"
3333
import { AlterTableBuilder, AlterTableColumnAlteringBuilder, CompiledQuery, CreateTableBuilder, sql } from "kysely"
34+
import type { IDbProvider } from "../db.provider"
3435
import type { IQueryBuilder } from "../qb.type"
3536
import { JoinTable } from "./reference/join-table"
3637
import { getUnderlyingFormulaType } from "./underlying-formula.util"
@@ -45,7 +46,7 @@ export class UnderlyingTableFieldVisitor<TB extends CreateTableBuilder<any, any>
4546
private readonly qb: IQueryBuilder,
4647
private readonly t: UnderlyingTable,
4748
public tb: TB,
48-
private readonly dbProvider: string,
49+
private readonly dbProvider: IDbProvider,
4950
public readonly isNew: boolean = false,
5051
) {}
5152
public atb: AlterTableColumnAlteringBuilder | CreateTableBuilder<any, any> | null = null
@@ -70,7 +71,7 @@ export class UnderlyingTableFieldVisitor<TB extends CreateTableBuilder<any, any>
7071
const c = this.tb.addColumn(field.id.value, "timestamp", (b) => b.defaultTo(sql`(CURRENT_TIMESTAMP)`).notNull())
7172
this.addColumn(c)
7273

73-
if (this.dbProvider === "postgres") {
74+
if (this.dbProvider.isPostgres()) {
7475
const query = sql
7576
.raw(
7677
`
@@ -104,7 +105,7 @@ CREATE TRIGGER update_customer_modtime_${tableName} BEFORE UPDATE ON ${tableName
104105
}
105106
}
106107
autoIncrement(field: AutoIncrementField): void {
107-
if (this.dbProvider === "postgres") {
108+
if (this.dbProvider.isPostgres()) {
108109
const c = this.tb.addColumn(field.id.value, "bigserial", (b) => b.primaryKey())
109110
this.addColumn(c)
110111
} else {
@@ -203,7 +204,7 @@ CREATE TRIGGER update_customer_modtime_${tableName} BEFORE UPDATE ON ${tableName
203204
}
204205
rollup(field: RollupField): void {}
205206
checkbox(field: CheckboxField): void {
206-
const defaultValue = this.dbProvider === "postgres" ? false : 0
207+
const defaultValue = this.dbProvider.isPostgres() ? false : 0
207208
const c = this.tb.addColumn(field.id.value, "boolean", (b) => b.defaultTo(defaultValue).notNull())
208209
this.addColumn(c)
209210
}
@@ -230,7 +231,7 @@ CREATE TRIGGER update_customer_modtime_${tableName} BEFORE UPDATE ON ${tableName
230231
const type = getUnderlyingFormulaType(field.returnType)
231232
const c = this.tb.addColumn(field.id.value, type, (b) => {
232233
const column = b.generatedAlwaysAs(sql.raw(parsed))
233-
if (this.dbProvider === "postgres") {
234+
if (this.dbProvider.isPostgres()) {
234235
return column.stored()
235236
}
236237
return this.isNew ? column.stored() : column

packages/persistence/src/underlying/underlying-table-spec.visitor.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import type {
4747
} from "@undb/table/src/specifications/table-forms.specification"
4848
import type { WithTableRLS } from "@undb/table/src/specifications/table-rls.specification"
4949
import { AlterTableBuilder, AlterTableColumnAlteringBuilder, CompiledQuery, CreateTableBuilder, sql } from "kysely"
50+
import type { IDbProvider } from "../db.provider"
5051
import type { IRecordQueryBuilder } from "../qb.type"
5152
import type { IDatabaseFnUtil } from "../utils/fn.util"
5253
import { ConversionContext } from "./conversion/conversion.context"
@@ -62,7 +63,7 @@ export class UnderlyingTableSpecVisitor implements ITableSpecVisitor {
6263
public readonly table: UnderlyingTable,
6364
public readonly qb: IRecordQueryBuilder,
6465
public readonly context: IContext,
65-
private readonly dbProvider: string,
66+
private readonly dbProvider: IDbProvider,
6667
private readonly dbFnUtil: IDatabaseFnUtil,
6768
) {
6869
this.tb = qb.schema.alterTable(table.name)

packages/persistence/src/underlying/underlying-table.service.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type { TableComositeSpecification, TableDo } from "@undb/table"
55
import type { CompiledQuery } from "kysely"
66
import type { ITxContext } from "../ctx.interface"
77
import { injectTxCTX } from "../ctx.provider"
8-
import { injectDbProvider } from "../db.provider"
8+
import { DbProviderService, type IDbProvider } from "../db.provider"
99
import { DatabaseFnUtil, type IDatabaseFnUtil } from "../utils/fn.util"
1010
import { JoinTable } from "./reference/join-table"
1111
import { UnderlyingTable } from "./underlying-table"
@@ -18,8 +18,8 @@ export class UnderlyingTableService {
1818
@injectContext() private readonly context: IContext,
1919
@injectTxCTX()
2020
private readonly txContext: ITxContext,
21-
@injectDbProvider()
22-
private readonly dbProvider: string,
21+
@inject(DbProviderService)
22+
private readonly dbProvider: IDbProvider,
2323
@inject(DatabaseFnUtil)
2424
private readonly dbFnUtil: IDatabaseFnUtil,
2525
) {}
Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { singleton } from "@undb/di"
1+
import { inject, singleton } from "@undb/di"
22
import { match } from "ts-pattern"
3-
import { injectDbProvider } from "../db.provider"
3+
import { DbProviderService, type IDbProvider } from "../db.provider"
44

55
export interface IDatabaseFnUtil {
66
get jsonGroupArray(): string
@@ -10,23 +10,32 @@ export interface IDatabaseFnUtil {
1010

1111
@singleton()
1212
export class DatabaseFnUtil implements IDatabaseFnUtil {
13-
constructor(@injectDbProvider() private readonly dbProvider: string) {}
13+
constructor(@inject(DbProviderService) private readonly dbProvider: IDbProvider) {}
1414

1515
get jsonGroupArray() {
1616
return match(this.dbProvider)
17-
.with("postgres", () => "json_agg")
17+
.when(
18+
(p) => p.isPostgres(),
19+
() => "json_agg",
20+
)
1821
.otherwise(() => "json_group_array")
1922
}
2023

2124
get jsonObject() {
2225
return match(this.dbProvider)
23-
.with("postgres", () => "json_build_object")
26+
.when(
27+
(p) => p.isPostgres(),
28+
() => "json_build_object",
29+
)
2430
.otherwise(() => "json_object")
2531
}
2632

2733
get jsonArray() {
2834
return match(this.dbProvider)
29-
.with("postgres", () => "json_build_array")
35+
.when(
36+
(p) => p.isPostgres(),
37+
() => "json_build_array",
38+
)
3039
.otherwise(() => "json_array")
3140
}
3241
}

0 commit comments

Comments
 (0)