@coursebuilder/adapter-drizzle
Version:
Drizzle adapter for Course Builder.
79 lines (75 loc) • 2.42 kB
text/typescript
import { relations, sql } from 'drizzle-orm'
import {
boolean,
decimal,
index,
int,
json,
MySqlTableFn,
primaryKey,
timestamp,
unique,
varchar,
} from 'drizzle-orm/mysql-core'
import { getMerchantCouponSchema } from './merchant-coupon.js'
import { getProductSchema } from './product.js'
import { getPurchaseSchema } from './purchase.js'
export function getCouponSchema(mysqlTable: MySqlTableFn) {
return mysqlTable(
'Coupon',
{
id: varchar('id', { length: 191 }).notNull(),
organizationId: varchar('organizationId', { length: 191 }),
code: varchar('code', { length: 191 }),
createdAt: timestamp('createdAt', { mode: 'date', fsp: 3 })
.default(sql`CURRENT_TIMESTAMP(3)`)
.notNull(),
expires: timestamp('expires', { mode: 'date', fsp: 3 }),
fields: json('fields').$type<Record<string, any>>().default({}),
maxUses: int('maxUses').default(-1).notNull(),
default: boolean('default').default(false).notNull(),
merchantCouponId: varchar('merchantCouponId', { length: 191 }),
status: int('status').default(0).notNull(),
usedCount: int('usedCount').default(0).notNull(),
percentageDiscount: decimal('percentageDiscount', {
precision: 3,
scale: 2,
}).notNull(),
restrictedToProductId: varchar('restrictedToProductId', { length: 191 }),
},
(table) => {
return {
couponIdCodeIndex: index('Coupon_id_code_index').on(
table.id,
table.code,
),
couponId: primaryKey({ columns: [table.id], name: 'Coupon_id' }),
couponCodeKey: unique('Coupon_code_key').on(table.code),
organizationIdIdx: index('organizationId_idx').on(table.organizationId),
}
},
)
}
export function getCouponRelationsSchema(mysqlTable: MySqlTableFn) {
const purchase = getPurchaseSchema(mysqlTable)
const coupon = getCouponSchema(mysqlTable)
const merchantCoupon = getMerchantCouponSchema(mysqlTable)
return relations(coupon, ({ many, one }) => ({
redeemedBulkCouponPurchases: many(purchase, {
relationName: 'redeemedBulkCoupon',
}),
merchantCoupon: one(merchantCoupon, {
fields: [coupon.merchantCouponId],
references: [merchantCoupon.id],
relationName: 'merchantCoupon',
}),
product: one(getProductSchema(mysqlTable), {
fields: [coupon.restrictedToProductId],
references: [getProductSchema(mysqlTable).id],
relationName: 'product',
}),
bulkPurchases: many(purchase, {
relationName: 'bulkCoupon',
}),
}))
}