Skip to content

Commit c686e07

Browse files
chore: wip
1 parent 687b78f commit c686e07

34 files changed

+2544
-2
lines changed

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

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -904,7 +904,7 @@ export async function generateModelString(
904904
import { manageCharge, manageCheckout, manageCustomer, manageInvoice, managePaymentMethod, manageSubscription, manageTransaction, managePrice, manageSetupIntent, type Stripe } from '@stacksjs/payments'
905905
import { sql } from '@stacksjs/database'
906906
import { DB, BaseOrm } from '@stacksjs/orm'
907-
import type { CheckoutLineItem, CheckoutOptions, StripeCustomerOptions } from '@stacksjs/types'
907+
import type { CheckoutLineItem, CheckoutOptions, Operator, StripeCustomerOptions } from '@stacksjs/types'
908908
import { HttpError } from '@stacksjs/error-handling'
909909
import { dispatch } from '@stacksjs/events'
910910
import { generateTwoFactorSecret } from '@stacksjs/auth'
@@ -1163,6 +1163,18 @@ export async function generateModelString(
11631163
return instance.applyWhereBetween<V>(column, range)
11641164
}
11651165
1166+
static whereRef(column: keyof ${formattedTableName}Table, ...args: string[]): ${modelName}Model {
1167+
const instance = new ${modelName}Model(undefined)
1168+
1169+
return instance.applyWhereRef(column, ...args)
1170+
}
1171+
1172+
static when(condition: boolean, callback: (query: ${modelName}Model) => ${modelName}Model): ${modelName}Model {
1173+
const instance = new ${modelName}Model(undefined)
1174+
1175+
return instance.applyWhen(condition, callback as any)
1176+
}
1177+
11661178
static whereLike(column: keyof ${formattedTableName}Table, value: string): ${modelName}Model {
11671179
const instance = new ${modelName}Model(undefined)
11681180
@@ -1187,6 +1199,18 @@ export async function generateModelString(
11871199
return instance.applyOrderByDesc(column)
11881200
}
11891201
1202+
static inRandomOrder(): ${modelName}Model {
1203+
const instance = new ${modelName}Model(undefined)
1204+
1205+
return instance.applyInRandomOrder()
1206+
}
1207+
1208+
static whereColumn(first: keyof ${formattedTableName}Table, operator: Operator, second: keyof ${formattedTableName}Table): ${modelName}Model {
1209+
const instance = new ${modelName}Model(undefined)
1210+
1211+
return instance.applyWhereColumn(first, operator, second)
1212+
}
1213+
11901214
static async max(field: keyof ${formattedTableName}Table): Promise<number> {
11911215
const instance = new ${modelName}Model(undefined)
11921216
@@ -1217,6 +1241,29 @@ export async function generateModelString(
12171241
return instance.applyCount()
12181242
}
12191243
1244+
static async get(): Promise<${modelName}Model[]> {
1245+
const instance = new ${modelName}Model(undefined)
1246+
1247+
const results = await instance.applyGet()
1248+
1249+
return results.map((item: ${modelName}JsonResponse) => new ${modelName}Model(item))
1250+
}
1251+
1252+
static async pluck<K extends keyof ${modelName}Model>(field: K): Promise<${modelName}Model[K][]> {
1253+
const instance = new ${modelName}Model(undefined)
1254+
1255+
return await instance.applyPluck(field)
1256+
}
1257+
1258+
static async chunk(size: number, callback: (models: ${modelName}Model[]) => Promise<void>): Promise<void> {
1259+
const instance = new ${modelName}Model(undefined)
1260+
1261+
await instance.applyChunk(size, async (models) => {
1262+
const modelInstances = models.map((item: ${modelName}JsonResponse) => new ${modelName}Model(item))
1263+
await callback(modelInstances)
1264+
})
1265+
}
1266+
12201267
static async paginate(options: { limit?: number, offset?: number, page?: number } = { limit: 10, offset: 0, page: 1 }): Promise<{
12211268
data: ${modelName}Model[],
12221269
paging: {
@@ -1269,6 +1316,27 @@ export async function generateModelString(
12691316
return await instance.applyCreate(new${modelName})
12701317
}
12711318
1319+
static async firstOrCreate(search: Partial<${formattedTableName}Table>, values: New${modelName} = {} as New${modelName}): Promise<${modelName}Model> {
1320+
// First try to find a record matching the search criteria
1321+
const instance = new ${modelName}Model(undefined)
1322+
1323+
// Apply all search conditions
1324+
for (const [key, value] of Object.entries(search)) {
1325+
instance.selectFromQuery = instance.selectFromQuery.where(key, '=', value)
1326+
}
1327+
1328+
// Try to find the record
1329+
const existingRecord = await instance.applyFirst()
1330+
1331+
if (existingRecord) {
1332+
return new ${modelName}Model(existingRecord)
1333+
}
1334+
1335+
// If no record exists, create a new one with combined search criteria and values
1336+
const createData = { ...search, ...values } as New${modelName}
1337+
return await ${modelName}Model.create(createData)
1338+
}
1339+
12721340
async update(new${modelName}: ${modelName}Update): Promise<${modelName}Model | undefined> {
12731341
const filteredValues = Object.fromEntries(
12741342
Object.entries(new${modelName}).filter(([key]) =>

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

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { Generated, Insertable, RawBuilder, Selectable, Updateable } from '@stacksjs/database'
2+
import type { Operator } from '@stacksjs/types'
23
import type { TeamModel } from './Team'
34
import type { UserModel } from './User'
45
import { sql } from '@stacksjs/database'
@@ -372,6 +373,24 @@ export class AccessTokenModel extends BaseOrm<AccessTokenModel, PersonalAccessTo
372373
return instance.applyWhereNotIn<V>(column, values)
373374
}
374375

376+
static whereBetween<V = number>(column: keyof PersonalAccessTokensTable, range: [V, V]): AccessTokenModel {
377+
const instance = new AccessTokenModel(undefined)
378+
379+
return instance.applyWhereBetween<V>(column, range)
380+
}
381+
382+
static whereRef(column: keyof PersonalAccessTokensTable, ...args: string[]): AccessTokenModel {
383+
const instance = new AccessTokenModel(undefined)
384+
385+
return instance.applyWhereRef(column, ...args)
386+
}
387+
388+
static when(condition: boolean, callback: (query: AccessTokenModel) => AccessTokenModel): AccessTokenModel {
389+
const instance = new AccessTokenModel(undefined)
390+
391+
return instance.applyWhen(condition, callback as any)
392+
}
393+
375394
static whereLike(column: keyof PersonalAccessTokensTable, value: string): AccessTokenModel {
376395
const instance = new AccessTokenModel(undefined)
377396

@@ -396,6 +415,18 @@ export class AccessTokenModel extends BaseOrm<AccessTokenModel, PersonalAccessTo
396415
return instance.applyOrderByDesc(column)
397416
}
398417

418+
static inRandomOrder(): AccessTokenModel {
419+
const instance = new AccessTokenModel(undefined)
420+
421+
return instance.applyInRandomOrder()
422+
}
423+
424+
static whereColumn(first: keyof PersonalAccessTokensTable, operator: Operator, second: keyof PersonalAccessTokensTable): AccessTokenModel {
425+
const instance = new AccessTokenModel(undefined)
426+
427+
return instance.applyWhereColumn(first, operator, second)
428+
}
429+
399430
static async max(field: keyof PersonalAccessTokensTable): Promise<number> {
400431
const instance = new AccessTokenModel(undefined)
401432

@@ -426,6 +457,29 @@ export class AccessTokenModel extends BaseOrm<AccessTokenModel, PersonalAccessTo
426457
return instance.applyCount()
427458
}
428459

460+
static async get(): Promise<AccessTokenModel[]> {
461+
const instance = new AccessTokenModel(undefined)
462+
463+
const results = await instance.applyGet()
464+
465+
return results.map((item: AccessTokenJsonResponse) => new AccessTokenModel(item))
466+
}
467+
468+
static async pluck<K extends keyof AccessTokenModel>(field: K): Promise<AccessTokenModel[K][]> {
469+
const instance = new AccessTokenModel(undefined)
470+
471+
return await instance.applyPluck(field)
472+
}
473+
474+
static async chunk(size: number, callback: (models: AccessTokenModel[]) => Promise<void>): Promise<void> {
475+
const instance = new AccessTokenModel(undefined)
476+
477+
await instance.applyChunk(size, async (models) => {
478+
const modelInstances = models.map((item: AccessTokenJsonResponse) => new AccessTokenModel(item))
479+
await callback(modelInstances)
480+
})
481+
}
482+
429483
static async paginate(options: { limit?: number, offset?: number, page?: number } = { limit: 10, offset: 0, page: 1 }): Promise<{
430484
data: AccessTokenModel[]
431485
paging: {
@@ -474,6 +528,27 @@ export class AccessTokenModel extends BaseOrm<AccessTokenModel, PersonalAccessTo
474528
return await instance.applyCreate(newAccessToken)
475529
}
476530

531+
static async firstOrCreate(search: Partial<PersonalAccessTokensTable>, values: NewAccessToken = {} as NewAccessToken): Promise<AccessTokenModel> {
532+
// First try to find a record matching the search criteria
533+
const instance = new AccessTokenModel(undefined)
534+
535+
// Apply all search conditions
536+
for (const [key, value] of Object.entries(search)) {
537+
instance.selectFromQuery = instance.selectFromQuery.where(key, '=', value)
538+
}
539+
540+
// Try to find the record
541+
const existingRecord = await instance.applyFirst()
542+
543+
if (existingRecord) {
544+
return new AccessTokenModel(existingRecord)
545+
}
546+
547+
// If no record exists, create a new one with combined search criteria and values
548+
const createData = { ...search, ...values } as NewAccessToken
549+
return await AccessTokenModel.create(createData)
550+
}
551+
477552
async update(newAccessToken: AccessTokenUpdate): Promise<AccessTokenModel | undefined> {
478553
const filteredValues = Object.fromEntries(
479554
Object.entries(newAccessToken).filter(([key]) =>

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

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { Generated, Insertable, RawBuilder, Selectable, Updateable } from '@stacksjs/database'
2+
import type { Operator } from '@stacksjs/types'
23
import type { OrderModel } from './Order'
34
import type { ProductModel } from './Product'
45
import { randomUUIDv7 } from 'bun'
@@ -414,6 +415,24 @@ export class CouponModel extends BaseOrm<CouponModel, CouponsTable, CouponJsonRe
414415
return instance.applyWhereNotIn<V>(column, values)
415416
}
416417

418+
static whereBetween<V = number>(column: keyof CouponsTable, range: [V, V]): CouponModel {
419+
const instance = new CouponModel(undefined)
420+
421+
return instance.applyWhereBetween<V>(column, range)
422+
}
423+
424+
static whereRef(column: keyof CouponsTable, ...args: string[]): CouponModel {
425+
const instance = new CouponModel(undefined)
426+
427+
return instance.applyWhereRef(column, ...args)
428+
}
429+
430+
static when(condition: boolean, callback: (query: CouponModel) => CouponModel): CouponModel {
431+
const instance = new CouponModel(undefined)
432+
433+
return instance.applyWhen(condition, callback as any)
434+
}
435+
417436
static whereLike(column: keyof CouponsTable, value: string): CouponModel {
418437
const instance = new CouponModel(undefined)
419438

@@ -438,6 +457,18 @@ export class CouponModel extends BaseOrm<CouponModel, CouponsTable, CouponJsonRe
438457
return instance.applyOrderByDesc(column)
439458
}
440459

460+
static inRandomOrder(): CouponModel {
461+
const instance = new CouponModel(undefined)
462+
463+
return instance.applyInRandomOrder()
464+
}
465+
466+
static whereColumn(first: keyof CouponsTable, operator: Operator, second: keyof CouponsTable): CouponModel {
467+
const instance = new CouponModel(undefined)
468+
469+
return instance.applyWhereColumn(first, operator, second)
470+
}
471+
441472
static async max(field: keyof CouponsTable): Promise<number> {
442473
const instance = new CouponModel(undefined)
443474

@@ -468,6 +499,29 @@ export class CouponModel extends BaseOrm<CouponModel, CouponsTable, CouponJsonRe
468499
return instance.applyCount()
469500
}
470501

502+
static async get(): Promise<CouponModel[]> {
503+
const instance = new CouponModel(undefined)
504+
505+
const results = await instance.applyGet()
506+
507+
return results.map((item: CouponJsonResponse) => new CouponModel(item))
508+
}
509+
510+
static async pluck<K extends keyof CouponModel>(field: K): Promise<CouponModel[K][]> {
511+
const instance = new CouponModel(undefined)
512+
513+
return await instance.applyPluck(field)
514+
}
515+
516+
static async chunk(size: number, callback: (models: CouponModel[]) => Promise<void>): Promise<void> {
517+
const instance = new CouponModel(undefined)
518+
519+
await instance.applyChunk(size, async (models) => {
520+
const modelInstances = models.map((item: CouponJsonResponse) => new CouponModel(item))
521+
await callback(modelInstances)
522+
})
523+
}
524+
471525
static async paginate(options: { limit?: number, offset?: number, page?: number } = { limit: 10, offset: 0, page: 1 }): Promise<{
472526
data: CouponModel[]
473527
paging: {
@@ -521,6 +575,27 @@ export class CouponModel extends BaseOrm<CouponModel, CouponsTable, CouponJsonRe
521575
return await instance.applyCreate(newCoupon)
522576
}
523577

578+
static async firstOrCreate(search: Partial<CouponsTable>, values: NewCoupon = {} as NewCoupon): Promise<CouponModel> {
579+
// First try to find a record matching the search criteria
580+
const instance = new CouponModel(undefined)
581+
582+
// Apply all search conditions
583+
for (const [key, value] of Object.entries(search)) {
584+
instance.selectFromQuery = instance.selectFromQuery.where(key, '=', value)
585+
}
586+
587+
// Try to find the record
588+
const existingRecord = await instance.applyFirst()
589+
590+
if (existingRecord) {
591+
return new CouponModel(existingRecord)
592+
}
593+
594+
// If no record exists, create a new one with combined search criteria and values
595+
const createData = { ...search, ...values } as NewCoupon
596+
return await CouponModel.create(createData)
597+
}
598+
524599
async update(newCoupon: CouponUpdate): Promise<CouponModel | undefined> {
525600
const filteredValues = Object.fromEntries(
526601
Object.entries(newCoupon).filter(([key]) =>

0 commit comments

Comments
 (0)