Skip to content

Commit b1a5b39

Browse files
authoredJan 9, 2025
Merge pull request #2194 from undb-io/release/v1.0.0-137
Release version v1.0.0-137
2 parents 28d22b7 + a1536a2 commit b1a5b39

13 files changed

+89
-95
lines changed
 

‎CHANGELOG.md

+11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
# Changelog
22

3+
## v1.0.0-137
4+
5+
6+
### 🩹 Fixes
7+
8+
- Fix create table handon ([afafcfb](https://github.com/undb-io/undb/commit/afafcfb))
9+
10+
### ❤️ Contributors
11+
12+
- Nichenqin ([@nichenqin](http://github.com/nichenqin))
13+
314
## v1.0.0-136
415

516

‎README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ docker run -p 3721:3721 ghcr.io/undb-io/undb:latest
7171
```bash
7272
docker run -d \
7373
-p 3721:3721 \
74-
-v $(pwd)/undb.sqlite:/usr/src/app/undb.sqlite \
75-
-v $(pwd)/undb:/usr/src/app/undb \
74+
-v $(pwd)/undb:/usr/src/app/.undb/storage
75+
-v $(pwd)/undb:/usr/src/app/.undb \
7676
--name undb \
7777
ghcr.io/undb-io/undb:latest
7878
```

‎package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "undb",
3-
"version": "1.0.0-136",
3+
"version": "1.0.0-137",
44
"private": true,
55
"scripts": {
66
"build": "NODE_ENV=production bun --bun turbo build",

‎packages/persistence/src/dashboard/dashboard.filter-visitor.ts

+6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type {
33
DashboardBaseIdSpecification,
44
DashboardTableIdSpecification,
55
DashboardUniqueSpecification,
6+
IDashboardSpecification,
67
IDashboardSpecVisitor,
78
WithDashboardDescription,
89
WithDashboardId,
@@ -26,6 +27,11 @@ export class DashboardFilterVisitor extends AbstractQBVisitor<Dashboard> impleme
2627
super(eb)
2728
}
2829

30+
$where(spec: IDashboardSpecification) {
31+
spec.accept(this)
32+
return this.cond
33+
}
34+
2935
withDescription(v: WithDashboardDescription): void {
3036
this.addCond(this.eb.eb("description", "=", v.description ?? null))
3137
}

‎packages/persistence/src/dashboard/dashboard.mutate-visitor.ts

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type {
44
DashboardTableIdSpecification,
55
DashboardUniqueSpecification,
66
DuplicatedDashboardSpecification,
7+
IDashboardSpecification,
78
IDashboardSpecVisitor,
89
WithDashboardDescription,
910
WithDashboardId,
@@ -25,6 +26,11 @@ export class DashboardMutateVisitor extends AbstractQBMutationVisitor implements
2526
super()
2627
}
2728

29+
$mutate(spec: IDashboardSpecification) {
30+
spec.accept(this)
31+
return this
32+
}
33+
2834
withUniqueDashboard(v: DashboardUniqueSpecification): void {}
2935
withDescription(v: WithDashboardDescription): void {
3036
this.setData("description", v.description ?? null)

‎packages/persistence/src/dashboard/dashboard.query-repository.ts

+3-13
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,8 @@ export class DashboardQueryRepository implements IDashboardQueryRepository {
3030
const dashboards = await qb
3131
.selectFrom("undb_dashboard")
3232
.selectAll()
33-
.$if(spec.isSome(), (qb) => new DashboardReferenceVisitor(qb).call(spec.unwrap()))
34-
.where((eb) => {
35-
const visitor = new DashboardFilterVisitor(eb, qb)
36-
if (spec.isSome()) {
37-
spec.unwrap().accept(visitor)
38-
}
39-
return visitor.cond
40-
})
33+
.$if(spec.isSome(), (sb) => new DashboardReferenceVisitor(sb).call(spec.unwrap()))
34+
.$if(spec.isSome(), (sb) => sb.where((eb) => new DashboardFilterVisitor(eb, qb).$where(spec.unwrap())))
4135
.execute()
4236

4337
return dashboards.map((b) => this.mapper.toDTO(b))
@@ -51,11 +45,7 @@ export class DashboardQueryRepository implements IDashboardQueryRepository {
5145
.selectFrom("undb_dashboard")
5246
.selectAll()
5347
.$call((qb) => new DashboardReferenceVisitor(qb).call(spec))
54-
.where((eb) => {
55-
const visitor = new DashboardFilterVisitor(eb, qb)
56-
spec.accept(visitor)
57-
return visitor.cond
58-
})
48+
.where((eb) => new DashboardFilterVisitor(eb, qb).$where(spec))
5949
.executeTakeFirst()
6050

6151
return dashboard ? Some(this.mapper.toDTO(dashboard)) : None

‎packages/persistence/src/dashboard/dashboard.repository.ts

+5-17
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,7 @@ export class DashboardRepository implements IDashboardRepository {
3939
.selectFrom("undb_dashboard")
4040
.selectAll()
4141
.$call((qb) => new DashboardReferenceVisitor(qb).call(spec))
42-
.where((eb) => {
43-
const visitor = new DashboardFilterVisitor(eb, this.qb)
44-
spec.accept(visitor)
45-
return visitor.cond
46-
})
42+
.where((eb) => new DashboardFilterVisitor(eb, this.qb).$where(spec))
4743
.execute()
4844

4945
return dashboards.map((dashboard) => this.mapper.toDo(dashboard))
@@ -53,11 +49,7 @@ export class DashboardRepository implements IDashboardRepository {
5349
.selectFrom("undb_dashboard")
5450
.selectAll()
5551
.$call((qb) => new DashboardReferenceVisitor(qb).call(spec))
56-
.where((eb) => {
57-
const visitor = new DashboardFilterVisitor(eb, this.qb)
58-
spec.accept(visitor)
59-
return visitor.cond
60-
})
52+
.where((eb) => new DashboardFilterVisitor(eb, this.qb).$where(spec))
6153
.executeTakeFirst()
6254

6355
return dashboard ? Some(this.mapper.toDo(dashboard)) : None
@@ -70,11 +62,7 @@ export class DashboardRepository implements IDashboardRepository {
7062
.selectFrom("undb_dashboard")
7163
.selectAll()
7264
.$call((qb) => new DashboardReferenceVisitor(qb).call(spec))
73-
.where((eb) => {
74-
const visitor = new DashboardFilterVisitor(eb, this.qb)
75-
spec.accept(visitor)
76-
return visitor.cond
77-
})
65+
.where((eb) => new DashboardFilterVisitor(eb, this.qb).$where(spec))
7866
.executeTakeFirst()
7967

8068
return dashboard ? Some(this.mapper.toDo(dashboard)) : None
@@ -115,8 +103,7 @@ export class DashboardRepository implements IDashboardRepository {
115103
const userId = this.context.mustGetCurrentUserId()
116104

117105
const qb = this.txContext.getCurrentTransaction()
118-
const visitor = new DashboardMutateVisitor(dashboard, qb)
119-
spec.accept(visitor)
106+
const visitor = new DashboardMutateVisitor(dashboard, qb).$mutate(spec)
120107

121108
await qb
122109
.updateTable("undb_dashboard")
@@ -127,6 +114,7 @@ export class DashboardRepository implements IDashboardRepository {
127114
for (const sql of visitor.sql) {
128115
await qb.executeQuery(sql)
129116
}
117+
130118
await this.outboxService.save(dashboard)
131119
}
132120

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

+1-7
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,7 @@ export class RecordQueryHelper {
5656
return qb
5757
.selectFrom(table.id.value)
5858
.$call((qb) => new RecordReferenceVisitor(qb, table).join(visibleFields))
59-
.$call((qb) => {
60-
const visitor = new RecordSpecReferenceVisitor(qb, table)
61-
if (spec.isSome()) {
62-
spec.unwrap().accept(visitor)
63-
}
64-
return visitor.join()
65-
})
59+
.$if(spec.isSome(), (qb) => new RecordSpecReferenceVisitor(qb, table).$join(spec.unwrap()))
6660
.select((sb) => new RecordSelectFieldVisitor(t, foreignTables, sb).$select(visibleFields))
6761
}
6862

‎packages/persistence/src/record/record-reference-visitor.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
import {
2-
DateRangeField,
3-
ID_TYPE,
4-
PercentageField,
52
type AttachmentField,
63
type AutoIncrementField,
74
type ButtonField,
@@ -10,14 +7,18 @@ import {
107
type CreatedByField,
118
type CurrencyField,
129
type DateField,
10+
type DateRangeField,
1311
type DurationField,
1412
type EmailField,
1513
type Field,
14+
type FormulaField,
15+
ID_TYPE,
1616
type IFieldVisitor,
1717
type IdField,
1818
type JsonField,
1919
type LongTextField,
2020
type NumberField,
21+
type PercentageField,
2122
type RatingField,
2223
type ReferenceField,
2324
type RollupField,
@@ -29,7 +30,6 @@ import {
2930
type UrlField,
3031
type UserField,
3132
} from "@undb/table"
32-
import type { FormulaField } from "@undb/table/src/modules/schema/fields/variants/formula-field"
3333
import type { SelectQueryBuilder } from "kysely"
3434

3535
export class RecordReferenceVisitor implements IFieldVisitor {

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

+30-30
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import { createDisplayFieldName } from "./record-utils"
4040
export class RecordSelectFieldVisitor implements IFieldVisitor {
4141
#select: SelectExpression<any, any>[] = []
4242

43-
addSelect(select: SelectExpression<any, any>): void {
43+
#addSelect(select: SelectExpression<any, any>): void {
4444
this.#select.push(select)
4545
}
4646

@@ -60,7 +60,7 @@ export class RecordSelectFieldVisitor implements IFieldVisitor {
6060
private readonly foreignTables: Map<string, TableDo>,
6161
private readonly eb: ExpressionBuilder<any, string>,
6262
) {
63-
this.addSelect(this.getField(ID_TYPE))
63+
this.#addSelect(this.getField(ID_TYPE))
6464
}
6565

6666
#selectSingelUser(field: UserField | CreatedByField | UpdatedByField) {
@@ -83,70 +83,70 @@ export class RecordSelectFieldVisitor implements IFieldVisitor {
8383
.limit(1)
8484
.as(as)
8585

86-
this.addSelect(name)
86+
this.#addSelect(name)
8787
}
8888

8989
select(field: SelectField): void {
90-
this.addSelect(this.getField(field.id.value))
90+
this.#addSelect(this.getField(field.id.value))
9191
}
9292

9393
longText(field: LongTextField): void {
94-
this.addSelect(this.getField(field.id.value))
94+
this.#addSelect(this.getField(field.id.value))
9595
}
9696

9797
id(field: IdField): void {
9898
// this.addSelect(this.getField(field.id.value))
9999
}
100100
autoIncrement(field: AutoIncrementField): void {
101-
this.addSelect(this.getField(field.id.value))
101+
this.#addSelect(this.getField(field.id.value))
102102
}
103103
createdAt(field: CreatedAtField): void {
104-
this.addSelect(this.getField(field.id.value))
104+
this.#addSelect(this.getField(field.id.value))
105105
}
106106
createdBy(field: CreatedByField): void {
107-
this.addSelect(this.getField(field.id.value))
107+
this.#addSelect(this.getField(field.id.value))
108108
this.#selectSingelUser(field)
109109
}
110110
updatedBy(field: UpdatedByField): void {
111-
this.addSelect(this.getField(field.id.value))
111+
this.#addSelect(this.getField(field.id.value))
112112
this.#selectSingelUser(field)
113113
}
114114
updatedAt(field: UpdatedAtField): void {
115-
this.addSelect(this.getField(field.id.value))
115+
this.#addSelect(this.getField(field.id.value))
116116
}
117117
string(field: StringField): void {
118-
this.addSelect(this.getField(field.id.value))
118+
this.#addSelect(this.getField(field.id.value))
119119
}
120120
number(field: NumberField): void {
121-
this.addSelect(this.getField(field.id.value))
121+
this.#addSelect(this.getField(field.id.value))
122122
}
123123
button(field: ButtonField): void {}
124124
currency(field: CurrencyField): void {
125125
const fieldName = this.getField(field.id.value)
126126
const selection = sql`${sql.raw(fieldName)} / 100.0`.as(field.id.value)
127-
this.addSelect(selection)
127+
this.#addSelect(selection)
128128
}
129129
rating(field: RatingField): void {
130-
this.addSelect(this.getField(field.id.value))
130+
this.#addSelect(this.getField(field.id.value))
131131
}
132132
email(field: EmailField): void {
133-
this.addSelect(this.getField(field.id.value))
133+
this.#addSelect(this.getField(field.id.value))
134134
}
135135
url(field: UrlField): void {
136-
this.addSelect(this.getField(field.id.value))
136+
this.#addSelect(this.getField(field.id.value))
137137
}
138138
json(field: JsonField): void {
139-
this.addSelect(this.getField(field.id.value))
139+
this.#addSelect(this.getField(field.id.value))
140140
}
141141
duration(field: DurationField): void {
142-
this.addSelect(this.getField(field.id.value))
142+
this.#addSelect(this.getField(field.id.value))
143143
}
144144
percentage(field: PercentageField): void {
145-
this.addSelect(this.getField(field.id.value))
145+
this.#addSelect(this.getField(field.id.value))
146146
}
147147
reference(field: ReferenceField): void {
148148
const select = `${field.id.value}.${field.id.value} as ${field.id.value}`
149-
this.addSelect(select)
149+
this.#addSelect(select)
150150

151151
const name = createDisplayFieldName(field)
152152

@@ -163,37 +163,37 @@ export class RecordSelectFieldVisitor implements IFieldVisitor {
163163
)
164164
.as(name)
165165

166-
this.addSelect(select)
166+
this.#addSelect(select)
167167
}
168168
}
169169
rollup(field: RollupField): void {
170170
const select = `${field.referenceFieldId}.${field.id.value} as ${field.id.value}`
171-
this.addSelect(select)
171+
this.#addSelect(select)
172172
}
173173
formula(field: FormulaField): void {
174-
this.addSelect(this.getField(field.id.value))
174+
this.#addSelect(this.getField(field.id.value))
175175
}
176176
attachment(field: AttachmentField): void {
177-
this.addSelect(this.getField(field.id.value))
177+
this.#addSelect(this.getField(field.id.value))
178178
}
179179
date(field: DateField): void {
180-
this.addSelect(this.getField(field.id.value))
180+
this.#addSelect(this.getField(field.id.value))
181181
}
182182
dateRange(field: DateRangeField): void {
183183
const { start, end } = getDateRangeFieldName(field)
184-
this.addSelect(this.eb.fn("json_array", [this.getField(start), this.getField(end)]).as(field.id.value))
184+
this.#addSelect(this.eb.fn("json_array", [this.getField(start), this.getField(end)]).as(field.id.value))
185185
}
186186
checkbox(field: CheckboxField): void {
187-
this.addSelect(this.getField(field.id.value))
187+
this.#addSelect(this.getField(field.id.value))
188188
}
189189
user(field: UserField): void {
190190
const as = createDisplayFieldName(field)
191191
if (field.isSingle) {
192-
this.addSelect(this.getField(field.id.value))
192+
this.#addSelect(this.getField(field.id.value))
193193
this.#selectSingelUser(field)
194194
} else {
195-
this.addSelect(this.getField(field.id.value))
196-
this.addSelect(
195+
this.#addSelect(this.getField(field.id.value))
196+
this.#addSelect(
197197
this.eb
198198
.case()
199199
.when(`${this.table.name}.${field.id.value}`, "is", null)

‎packages/persistence/src/record/record-spec-reference-visitor.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import {
5858
UrlEqual,
5959
UserEmpty,
6060
UserEqual,
61+
type IRecordComositeSpecification,
6162
type IRecordVisitor,
6263
type TableDo,
6364
} from "@undb/table"
@@ -70,7 +71,8 @@ export class RecordSpecReferenceVisitor implements IRecordVisitor {
7071
private readonly table: TableDo,
7172
) {}
7273

73-
join() {
74+
$join(spec: IRecordComositeSpecification) {
75+
spec.accept(this)
7476
return this.qb
7577
}
7678

0 commit comments

Comments
 (0)
Failed to load comments.