@coursebuilder/adapter-drizzle
Version:
Drizzle adapter for Course Builder.
76 lines (70 loc) • 2.4 kB
text/typescript
import { relations, sql } from 'drizzle-orm'
import {
index,
json,
mysqlEnum,
MySqlTableFn,
timestamp,
varchar,
} from 'drizzle-orm/mysql-core'
import { getUsersSchema } from '../auth/users.js'
import { getPurchaseSchema } from '../commerce/purchase.js'
import { getOrganizationMembershipRolesSchema } from './organization-membership-roles.js'
import { getOrganizationsSchema } from './organizations.js'
export function getOrganizationMembershipsSchema(mysqlTable: MySqlTableFn) {
return mysqlTable(
'OrganizationMembership',
{
id: varchar('id', { length: 255 }).notNull().primaryKey(),
organizationId: varchar('organizationId', { length: 191 }),
role: varchar('role', { length: 191 }).notNull().default('user'),
invitedById: varchar('invitedById', { length: 255 }).notNull(),
userId: varchar('userId', { length: 255 }).notNull(),
fields: json('fields').$type<Record<string, any>>().default({}),
createdAt: timestamp('createdAt', {
mode: 'date',
fsp: 3,
}).default(sql`CURRENT_TIMESTAMP(3)`),
},
(organizationMembership) => ({
roleIdx: index('role_idx').on(organizationMembership.role),
createdAtIdx: index('created_at_idx').on(
organizationMembership.createdAt,
),
organizationIdIdx: index('organizationId_idx').on(
organizationMembership.organizationId,
),
}),
)
}
export function getOrganizationMembershipsRelationsSchema(
mysqlTable: MySqlTableFn,
) {
const users = getUsersSchema(mysqlTable)
const organizationMemberships = getOrganizationMembershipsSchema(mysqlTable)
const purchases = getPurchaseSchema(mysqlTable)
const organizations = getOrganizationsSchema(mysqlTable)
const organizationMembershipRoles =
getOrganizationMembershipRolesSchema(mysqlTable)
return relations(organizationMemberships, ({ one, many }) => ({
user: one(users, {
fields: [organizationMemberships.userId],
references: [users.id],
relationName: 'user',
}),
invitedBy: one(users, {
fields: [organizationMemberships.invitedById],
references: [users.id],
relationName: 'invitedBy',
}),
purchases: many(purchases),
organization: one(organizations, {
fields: [organizationMemberships.organizationId],
references: [organizations.id],
relationName: 'organization',
}),
organizationMembershipRoles: many(organizationMembershipRoles, {
relationName: 'organizationMembership',
}),
}))
}