Files
aurorabot/shared/db/schema/quests.ts
syntaxbullet b0c3baf5b7 refactor(db): split schema into domain modules
Split the 276-line schema.ts into focused domain modules:
- users.ts: classes, users, userTimers (core identity)
- inventory.ts: items, inventory (item system)
- economy.ts: transactions, itemTransactions (currency flow)
- quests.ts: quests, userQuests (quest system)
- moderation.ts: moderationCases, lootdrops (moderation)

Original schema.ts now re-exports from schema/index.ts for backward
compatibility. All existing imports continue to work.
2026-02-12 12:14:15 +01:00

55 lines
1.6 KiB
TypeScript

import {
pgTable,
bigint,
varchar,
serial,
text,
jsonb,
timestamp,
integer,
primaryKey,
} from 'drizzle-orm/pg-core';
import { relations, type InferSelectModel } from 'drizzle-orm';
import { users } from './users';
// --- TYPES ---
export type Quest = InferSelectModel<typeof quests>;
export type UserQuest = InferSelectModel<typeof userQuests>;
// --- TABLES ---
export const quests = pgTable('quests', {
id: serial('id').primaryKey(),
name: varchar('name', { length: 255 }).notNull(),
description: text('description'),
triggerEvent: varchar('trigger_event', { length: 50 }).notNull(),
requirements: jsonb('requirements').notNull().default({}),
rewards: jsonb('rewards').notNull().default({}),
});
export const userQuests = pgTable('user_quests', {
userId: bigint('user_id', { mode: 'bigint' })
.references(() => users.id, { onDelete: 'cascade' }).notNull(),
questId: integer('quest_id')
.references(() => quests.id, { onDelete: 'cascade' }).notNull(),
progress: integer('progress').default(0),
completedAt: timestamp('completed_at', { withTimezone: true }),
}, (table) => [
primaryKey({ columns: [table.userId, table.questId] })
]);
// --- RELATIONS ---
export const questsRelations = relations(quests, ({ many }) => ({
userEntries: many(userQuests),
}));
export const userQuestsRelations = relations(userQuests, ({ one }) => ({
user: one(users, {
fields: [userQuests.userId],
references: [users.id],
}),
quest: one(quests, {
fields: [userQuests.questId],
references: [quests.id],
}),
}));