Skip to content

Commit 88b12f0

Browse files
chore: wip
1 parent 04ba4f3 commit 88b12f0

35 files changed

+270
-619
lines changed

storage/framework/core/orm/src/base.ts

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import type { RawBuilder } from '@stacksjs/database'
12
import type { Operator } from '@stacksjs/orm'
23
import { cache } from '@stacksjs/cache'
34
import { sql } from '@stacksjs/database'
45
import { HttpError } from '@stacksjs/error-handling'
56
import { DB } from '@stacksjs/orm'
67

7-
export class BaseOrm<T, C> {
8+
export class BaseOrm<T, C, J> {
89
protected tableName: string
910

1011
protected selectFromQuery: any
@@ -15,14 +16,22 @@ export class BaseOrm<T, C> {
1516

1617
constructor(tableName: string) {
1718
this.tableName = tableName
18-
19+
// TODO: bring back new instantiation from the this parent class
1920
this.selectFromQuery = DB.instance.selectFrom(this.tableName)
2021
this.updateFromQuery = DB.instance.updateTable(this.tableName)
2122
this.deleteFromQuery = DB.instance.deleteFrom(this.tableName)
2223

2324
this.withRelations = []
2425
}
2526

27+
select(params: (keyof J)[] | RawBuilder<string> | string): this {
28+
this.selectFromQuery = this.selectFromQuery.select(params)
29+
30+
this.hasSelect = true
31+
32+
return this
33+
}
34+
2635
// The protected helper method that does the actual work
2736
protected async applyFind(id: number): Promise<T | undefined> {
2837
const model = await DB.instance.selectFrom(this.tableName)
@@ -42,6 +51,28 @@ export class BaseOrm<T, C> {
4251
return model
4352
}
4453

54+
async applyFindMany(ids: number[]): Promise<T[]> {
55+
let query = DB.instance.selectFrom('users').where('id', 'in', ids)
56+
57+
query = query.selectAll()
58+
59+
// TODO: Properly implement soft deletes
60+
// if (this.childClass.hasSelect) {
61+
// query = query.where('deleted_at', 'is', null)
62+
// }
63+
64+
const models = await query.execute()
65+
66+
this.mapCustomGetters(models)
67+
await this.loadRelations(models)
68+
69+
return models
70+
}
71+
72+
async findMany(ids: number[]): Promise<T[]> {
73+
return await this.applyFindMany(ids)
74+
}
75+
4576
async applyFirst(): Promise<T | undefined> {
4677
let model
4778

storage/framework/core/orm/src/generate.ts

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -940,7 +940,7 @@ export async function generateModelString(
940940
page?: number
941941
}
942942
943-
export class ${modelName}Model extends BaseOrm<${modelName}Model, ${formattedTableName}Table> {
943+
export class ${modelName}Model extends BaseOrm<${modelName}Model, ${formattedTableName}Table, ${modelName}JsonResponse> {
944944
private readonly hidden: Array<keyof ${modelName}JsonResponse> = ${hidden}
945945
private readonly fillable: Array<keyof ${modelName}JsonResponse> = ${fillable}
946946
private readonly guarded: Array<keyof ${modelName}JsonResponse> = ${guarded}
@@ -1180,31 +1180,18 @@ export async function generateModelString(
11801180
return await instance.applyFindOrFail(id)
11811181
}
11821182
1183-
async applyFindMany(ids: number[]): Promise<${modelName}Model[]> {
1184-
let query = DB.instance.selectFrom('${tableName}').where('id', 'in', ids)
1185-
1186-
const instance = new ${modelName}Model(undefined)
1187-
1188-
${instanceSoftDeleteStatements}
1189-
1190-
query = query.selectAll()
1191-
1192-
const models = await query.execute()
1193-
1194-
instance.mapCustomGetters(models)
1195-
await instance.loadRelations(models)
1196-
1197-
return models.map((modelItem: ${modelName}JsonResponse) => instance.parseResult(new ${modelName}Model(modelItem)))
1198-
}
1199-
12001183
static async findMany(ids: number[]): Promise<${modelName}Model[]> {
12011184
const instance = new ${modelName}Model(undefined)
1185+
${instanceSoftDeleteStatements}
1186+
const models = await instance.applyFindMany(ids)
12021187
1203-
return await instance.applyFindMany(ids)
1188+
return models.map((modelItem: UserJsonResponse) => instance.parseResult(new ${modelName}Model(modelItem)))
12041189
}
12051190
12061191
async findMany(ids: number[]): Promise<${modelName}Model[]> {
1207-
return await this.applyFindMany(ids)
1192+
const models = await this.applyFindMany(ids)
1193+
1194+
return models.map((modelItem: UserJsonResponse) => this.parseResult(new ${modelName}Model(modelItem)))
12081195
}
12091196
12101197
skip(count: number): ${modelName}Model {

storage/framework/orm/src/models/AccessToken.ts

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ interface QueryOptions {
6060
page?: number
6161
}
6262

63-
export class AccessTokenModel extends BaseOrm<AccessTokenModel, PersonalAccessTokensTable> {
63+
export class AccessTokenModel extends BaseOrm<AccessTokenModel, PersonalAccessTokensTable, AccessTokenJsonResponse> {
6464
private readonly hidden: Array<keyof AccessTokenJsonResponse> = []
6565
private readonly fillable: Array<keyof AccessTokenJsonResponse> = ['name', 'token', 'plain_text_token', 'abilities', 'last_used_at', 'expires_at', 'revoked_at', 'ip_address', 'device_name', 'is_single_use', 'uuid', 'team_id']
6666
private readonly guarded: Array<keyof AccessTokenJsonResponse> = []
@@ -403,29 +403,18 @@ export class AccessTokenModel extends BaseOrm<AccessTokenModel, PersonalAccessTo
403403
return await instance.applyFindOrFail(id)
404404
}
405405

406-
async applyFindMany(ids: number[]): Promise<AccessTokenModel[]> {
407-
let query = DB.instance.selectFrom('personal_access_tokens').where('id', 'in', ids)
408-
409-
const instance = new AccessTokenModel(undefined)
410-
411-
query = query.selectAll()
412-
413-
const models = await query.execute()
414-
415-
instance.mapCustomGetters(models)
416-
await instance.loadRelations(models)
417-
418-
return models.map((modelItem: AccessTokenJsonResponse) => instance.parseResult(new AccessTokenModel(modelItem)))
419-
}
420-
421406
static async findMany(ids: number[]): Promise<AccessTokenModel[]> {
422407
const instance = new AccessTokenModel(undefined)
423408

424-
return await instance.applyFindMany(ids)
409+
const models = await instance.applyFindMany(ids)
410+
411+
return models.map((modelItem: UserJsonResponse) => instance.parseResult(new AccessTokenModel(modelItem)))
425412
}
426413

427414
async findMany(ids: number[]): Promise<AccessTokenModel[]> {
428-
return await this.applyFindMany(ids)
415+
const models = await this.applyFindMany(ids)
416+
417+
return models.map((modelItem: UserJsonResponse) => this.parseResult(new AccessTokenModel(modelItem)))
429418
}
430419

431420
skip(count: number): AccessTokenModel {

storage/framework/orm/src/models/Coupon.ts

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ interface QueryOptions {
6464
page?: number
6565
}
6666

67-
export class CouponModel extends BaseOrm<CouponModel, CouponsTable> {
67+
export class CouponModel extends BaseOrm<CouponModel, CouponsTable, CouponJsonResponse> {
6868
private readonly hidden: Array<keyof CouponJsonResponse> = []
6969
private readonly fillable: Array<keyof CouponJsonResponse> = ['code', 'description', 'discount_type', 'discount_value', 'min_order_amount', 'max_discount_amount', 'free_product_id', 'is_active', 'usage_limit', 'usage_count', 'start_date', 'end_date', 'applicable_products', 'applicable_categories', 'uuid']
7070
private readonly guarded: Array<keyof CouponJsonResponse> = []
@@ -443,29 +443,18 @@ export class CouponModel extends BaseOrm<CouponModel, CouponsTable> {
443443
return await instance.applyFindOrFail(id)
444444
}
445445

446-
async applyFindMany(ids: number[]): Promise<CouponModel[]> {
447-
let query = DB.instance.selectFrom('coupons').where('id', 'in', ids)
448-
449-
const instance = new CouponModel(undefined)
450-
451-
query = query.selectAll()
452-
453-
const models = await query.execute()
454-
455-
instance.mapCustomGetters(models)
456-
await instance.loadRelations(models)
457-
458-
return models.map((modelItem: CouponJsonResponse) => instance.parseResult(new CouponModel(modelItem)))
459-
}
460-
461446
static async findMany(ids: number[]): Promise<CouponModel[]> {
462447
const instance = new CouponModel(undefined)
463448

464-
return await instance.applyFindMany(ids)
449+
const models = await instance.applyFindMany(ids)
450+
451+
return models.map((modelItem: UserJsonResponse) => instance.parseResult(new CouponModel(modelItem)))
465452
}
466453

467454
async findMany(ids: number[]): Promise<CouponModel[]> {
468-
return await this.applyFindMany(ids)
455+
const models = await this.applyFindMany(ids)
456+
457+
return models.map((modelItem: UserJsonResponse) => this.parseResult(new CouponModel(modelItem)))
469458
}
470459

471460
skip(count: number): CouponModel {

storage/framework/orm/src/models/Customer.ts

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ interface QueryOptions {
5757
page?: number
5858
}
5959

60-
export class CustomerModel extends BaseOrm<CustomerModel, CustomersTable> {
60+
export class CustomerModel extends BaseOrm<CustomerModel, CustomersTable, CustomerJsonResponse> {
6161
private readonly hidden: Array<keyof CustomerJsonResponse> = []
6262
private readonly fillable: Array<keyof CustomerJsonResponse> = ['name', 'email', 'phone', 'total_spent', 'last_order', 'status', 'avatar', 'uuid']
6363
private readonly guarded: Array<keyof CustomerJsonResponse> = []
@@ -388,29 +388,18 @@ export class CustomerModel extends BaseOrm<CustomerModel, CustomersTable> {
388388
return await instance.applyFindOrFail(id)
389389
}
390390

391-
async applyFindMany(ids: number[]): Promise<CustomerModel[]> {
392-
let query = DB.instance.selectFrom('customers').where('id', 'in', ids)
393-
394-
const instance = new CustomerModel(undefined)
395-
396-
query = query.selectAll()
397-
398-
const models = await query.execute()
399-
400-
instance.mapCustomGetters(models)
401-
await instance.loadRelations(models)
402-
403-
return models.map((modelItem: CustomerJsonResponse) => instance.parseResult(new CustomerModel(modelItem)))
404-
}
405-
406391
static async findMany(ids: number[]): Promise<CustomerModel[]> {
407392
const instance = new CustomerModel(undefined)
408393

409-
return await instance.applyFindMany(ids)
394+
const models = await instance.applyFindMany(ids)
395+
396+
return models.map((modelItem: UserJsonResponse) => instance.parseResult(new CustomerModel(modelItem)))
410397
}
411398

412399
async findMany(ids: number[]): Promise<CustomerModel[]> {
413-
return await this.applyFindMany(ids)
400+
const models = await this.applyFindMany(ids)
401+
402+
return models.map((modelItem: UserJsonResponse) => this.parseResult(new CustomerModel(modelItem)))
414403
}
415404

416405
skip(count: number): CustomerModel {

storage/framework/orm/src/models/Deployment.ts

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ interface QueryOptions {
5454
page?: number
5555
}
5656

57-
export class DeploymentModel extends BaseOrm<DeploymentModel, DeploymentsTable> {
57+
export class DeploymentModel extends BaseOrm<DeploymentModel, DeploymentsTable, DeploymentJsonResponse> {
5858
private readonly hidden: Array<keyof DeploymentJsonResponse> = []
5959
private readonly fillable: Array<keyof DeploymentJsonResponse> = ['commit_sha', 'commit_message', 'branch', 'status', 'execution_time', 'deploy_script', 'terminal_output', 'uuid', 'user_id']
6060
private readonly guarded: Array<keyof DeploymentJsonResponse> = []
@@ -373,29 +373,18 @@ export class DeploymentModel extends BaseOrm<DeploymentModel, DeploymentsTable>
373373
return await instance.applyFindOrFail(id)
374374
}
375375

376-
async applyFindMany(ids: number[]): Promise<DeploymentModel[]> {
377-
let query = DB.instance.selectFrom('deployments').where('id', 'in', ids)
378-
379-
const instance = new DeploymentModel(undefined)
380-
381-
query = query.selectAll()
382-
383-
const models = await query.execute()
384-
385-
instance.mapCustomGetters(models)
386-
await instance.loadRelations(models)
387-
388-
return models.map((modelItem: DeploymentJsonResponse) => instance.parseResult(new DeploymentModel(modelItem)))
389-
}
390-
391376
static async findMany(ids: number[]): Promise<DeploymentModel[]> {
392377
const instance = new DeploymentModel(undefined)
393378

394-
return await instance.applyFindMany(ids)
379+
const models = await instance.applyFindMany(ids)
380+
381+
return models.map((modelItem: UserJsonResponse) => instance.parseResult(new DeploymentModel(modelItem)))
395382
}
396383

397384
async findMany(ids: number[]): Promise<DeploymentModel[]> {
398-
return await this.applyFindMany(ids)
385+
const models = await this.applyFindMany(ids)
386+
387+
return models.map((modelItem: UserJsonResponse) => this.parseResult(new DeploymentModel(modelItem)))
399388
}
400389

401390
skip(count: number): DeploymentModel {

storage/framework/orm/src/models/Error.ts

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ interface QueryOptions {
4646
page?: number
4747
}
4848

49-
export class ErrorModel extends BaseOrm<ErrorModel, ErrorsTable> {
49+
export class ErrorModel extends BaseOrm<ErrorModel, ErrorsTable, ErrorJsonResponse> {
5050
private readonly hidden: Array<keyof ErrorJsonResponse> = []
5151
private readonly fillable: Array<keyof ErrorJsonResponse> = ['type', 'message', 'stack', 'status', 'additional_info', 'uuid']
5252
private readonly guarded: Array<keyof ErrorJsonResponse> = []
@@ -333,29 +333,18 @@ export class ErrorModel extends BaseOrm<ErrorModel, ErrorsTable> {
333333
return await instance.applyFindOrFail(id)
334334
}
335335

336-
async applyFindMany(ids: number[]): Promise<ErrorModel[]> {
337-
let query = DB.instance.selectFrom('errors').where('id', 'in', ids)
338-
339-
const instance = new ErrorModel(undefined)
340-
341-
query = query.selectAll()
342-
343-
const models = await query.execute()
344-
345-
instance.mapCustomGetters(models)
346-
await instance.loadRelations(models)
347-
348-
return models.map((modelItem: ErrorJsonResponse) => instance.parseResult(new ErrorModel(modelItem)))
349-
}
350-
351336
static async findMany(ids: number[]): Promise<ErrorModel[]> {
352337
const instance = new ErrorModel(undefined)
353338

354-
return await instance.applyFindMany(ids)
339+
const models = await instance.applyFindMany(ids)
340+
341+
return models.map((modelItem: UserJsonResponse) => instance.parseResult(new ErrorModel(modelItem)))
355342
}
356343

357344
async findMany(ids: number[]): Promise<ErrorModel[]> {
358-
return await this.applyFindMany(ids)
345+
const models = await this.applyFindMany(ids)
346+
347+
return models.map((modelItem: UserJsonResponse) => this.parseResult(new ErrorModel(modelItem)))
359348
}
360349

361350
skip(count: number): ErrorModel {

storage/framework/orm/src/models/FailedJob.ts

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ interface QueryOptions {
4646
page?: number
4747
}
4848

49-
export class FailedJobModel extends BaseOrm<FailedJobModel, FailedJobsTable> {
49+
export class FailedJobModel extends BaseOrm<FailedJobModel, FailedJobsTable, FailedJobJsonResponse> {
5050
private readonly hidden: Array<keyof FailedJobJsonResponse> = []
5151
private readonly fillable: Array<keyof FailedJobJsonResponse> = ['connection', 'queue', 'payload', 'exception', 'failed_at', 'uuid']
5252
private readonly guarded: Array<keyof FailedJobJsonResponse> = []
@@ -333,29 +333,18 @@ export class FailedJobModel extends BaseOrm<FailedJobModel, FailedJobsTable> {
333333
return await instance.applyFindOrFail(id)
334334
}
335335

336-
async applyFindMany(ids: number[]): Promise<FailedJobModel[]> {
337-
let query = DB.instance.selectFrom('failed_jobs').where('id', 'in', ids)
338-
339-
const instance = new FailedJobModel(undefined)
340-
341-
query = query.selectAll()
342-
343-
const models = await query.execute()
344-
345-
instance.mapCustomGetters(models)
346-
await instance.loadRelations(models)
347-
348-
return models.map((modelItem: FailedJobJsonResponse) => instance.parseResult(new FailedJobModel(modelItem)))
349-
}
350-
351336
static async findMany(ids: number[]): Promise<FailedJobModel[]> {
352337
const instance = new FailedJobModel(undefined)
353338

354-
return await instance.applyFindMany(ids)
339+
const models = await instance.applyFindMany(ids)
340+
341+
return models.map((modelItem: UserJsonResponse) => instance.parseResult(new FailedJobModel(modelItem)))
355342
}
356343

357344
async findMany(ids: number[]): Promise<FailedJobModel[]> {
358-
return await this.applyFindMany(ids)
345+
const models = await this.applyFindMany(ids)
346+
347+
return models.map((modelItem: UserJsonResponse) => this.parseResult(new FailedJobModel(modelItem)))
359348
}
360349

361350
skip(count: number): FailedJobModel {

0 commit comments

Comments
 (0)