UNPKG

@coursebuilder/adapter-drizzle

Version:

Drizzle adapter for Course Builder.

79 lines (75 loc) 2.42 kB
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', }), })) }