refactor: replace Prisma ORM runtime with Drizzle ORM facade
- Replace Prisma client runtime with Drizzle ORM (zero Prisma engine/query engine in production) - Add Prisma-compatible facade (@/lib/prisma-facade.ts) backed by Drizzle for backwards compatibility - Runtime queries route through Drizzle ORM; @prisma/client is now devDependency (types only) - Remove @prisma/adapter-mariadb dependency; delete prisma-pool.ts and types/prisma.ts - New Drizzle schema layer: src/db/schema.ts (176 tables) and src/lib/db.ts (connection) - Update README documenting the dual-layer ORM architecture - Restore src/generated/ gitignore (build artifact for local type generation) - 0 TypeScript errors, 583 tests passing The facade intentionally uses `any` types to match the Prisma Client API surface, allowing existing code to run unmodified while routing queries through Drizzle at runtime.
This commit is contained in:
1 parent
9d1c71d926
commit
56061e41d4
52 files changed
+5825
-748
No files matched your search
@@ -0,0 +1,140 @@
|
||||
import { relations } from "drizzle-orm";
|
||||
import {
|
||||
AclModelPermission,
|
||||
AclModelRole,
|
||||
AclPermission,
|
||||
AclRole,
|
||||
AdminAuditLog,
|
||||
User,
|
||||
WebsiteEvent,
|
||||
WebsiteEventPrize,
|
||||
WebsiteEventRegistration,
|
||||
WebsiteEventType,
|
||||
WebsiteEventWinner,
|
||||
WebsitePoll,
|
||||
WebsitePollQuestion,
|
||||
WebsitePollVote,
|
||||
WebsiteTicket,
|
||||
WebsiteTicketMessage,
|
||||
} from "@/db/schema";
|
||||
|
||||
export const userRelations = relations(User, ({ many }) => ({
|
||||
createdTickets: many(WebsiteTicket, { relationName: "ticketCreator" }),
|
||||
assignedTickets: many(WebsiteTicket, { relationName: "ticketAssignee" }),
|
||||
ticketMessages: many(WebsiteTicketMessage),
|
||||
auditLogs: many(AdminAuditLog),
|
||||
}));
|
||||
|
||||
export const websiteTicketRelations = relations(WebsiteTicket, ({ one, many }) => ({
|
||||
creator: one(User, {
|
||||
fields: [WebsiteTicket.creatorId],
|
||||
references: [User.id],
|
||||
relationName: "ticketCreator",
|
||||
}),
|
||||
assignee: one(User, {
|
||||
fields: [WebsiteTicket.assigneeId],
|
||||
references: [User.id],
|
||||
relationName: "ticketAssignee",
|
||||
}),
|
||||
messages: many(WebsiteTicketMessage),
|
||||
}));
|
||||
|
||||
export const websiteTicketMessageRelations = relations(
|
||||
WebsiteTicketMessage,
|
||||
({ one }) => ({
|
||||
ticket: one(WebsiteTicket, {
|
||||
fields: [WebsiteTicketMessage.ticketId],
|
||||
references: [WebsiteTicket.id],
|
||||
}),
|
||||
user: one(User, {
|
||||
fields: [WebsiteTicketMessage.userId],
|
||||
references: [User.id],
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
||||
export const adminAuditLogRelations = relations(AdminAuditLog, ({ one }) => ({
|
||||
user: one(User, {
|
||||
fields: [AdminAuditLog.userId],
|
||||
references: [User.id],
|
||||
}),
|
||||
}));
|
||||
|
||||
export const aclRoleRelations = relations(AclRole, ({ many }) => ({
|
||||
rolePermissions: many(AclModelPermission),
|
||||
modelRoles: many(AclModelRole),
|
||||
}));
|
||||
|
||||
export const aclModelPermissionRelations = relations(
|
||||
AclModelPermission,
|
||||
({ one }) => ({
|
||||
role: one(AclRole, {
|
||||
fields: [AclModelPermission.modelId],
|
||||
references: [AclRole.id],
|
||||
}),
|
||||
permission: one(AclPermission, {
|
||||
fields: [AclModelPermission.permissionId],
|
||||
references: [AclPermission.id],
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
||||
export const websiteEventTypeRelations = relations(WebsiteEventType, ({ many }) => ({
|
||||
events: many(WebsiteEvent),
|
||||
}));
|
||||
|
||||
export const websiteEventRelations = relations(WebsiteEvent, ({ one, many }) => ({
|
||||
type: one(WebsiteEventType, {
|
||||
fields: [WebsiteEvent.typeId],
|
||||
references: [WebsiteEventType.id],
|
||||
}),
|
||||
registrations: many(WebsiteEventRegistration),
|
||||
prizes: many(WebsiteEventPrize),
|
||||
winners: many(WebsiteEventWinner),
|
||||
}));
|
||||
|
||||
export const websiteEventRegistrationRelations = relations(
|
||||
WebsiteEventRegistration,
|
||||
({ one }) => ({
|
||||
event: one(WebsiteEvent, {
|
||||
fields: [WebsiteEventRegistration.eventId],
|
||||
references: [WebsiteEvent.id],
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
||||
export const websiteEventPrizeRelations = relations(WebsiteEventPrize, ({ one }) => ({
|
||||
event: one(WebsiteEvent, {
|
||||
fields: [WebsiteEventPrize.eventId],
|
||||
references: [WebsiteEvent.id],
|
||||
}),
|
||||
}));
|
||||
|
||||
export const websiteEventWinnerRelations = relations(WebsiteEventWinner, ({ one }) => ({
|
||||
event: one(WebsiteEvent, {
|
||||
fields: [WebsiteEventWinner.eventId],
|
||||
references: [WebsiteEvent.id],
|
||||
}),
|
||||
}));
|
||||
|
||||
export const websitePollRelations = relations(WebsitePoll, ({ many }) => ({
|
||||
questions: many(WebsitePollQuestion),
|
||||
}));
|
||||
|
||||
export const websitePollQuestionRelations = relations(
|
||||
WebsitePollQuestion,
|
||||
({ one, many }) => ({
|
||||
poll: one(WebsitePoll, {
|
||||
fields: [WebsitePollQuestion.pollId],
|
||||
references: [WebsitePoll.id],
|
||||
}),
|
||||
votes: many(WebsitePollVote),
|
||||
}),
|
||||
);
|
||||
|
||||
export const websitePollVoteRelations = relations(WebsitePollVote, ({ one }) => ({
|
||||
question: one(WebsitePollQuestion, {
|
||||
fields: [WebsitePollVote.questionId],
|
||||
references: [WebsitePollQuestion.id],
|
||||
}),
|
||||
}));
|
||||
Reference in new issue
Block a user