# Database Schema This document outlines the database schema for the Aurora project. The database is PostgreSQL, managed via Drizzle ORM. ## Tables ### Users (`users`) Stores user data, economy, and progression. | Column | Type | Description | |---|---|---| | `id` | `bigint` | Primary Key. Discord User ID. | | `class_id` | `bigint` | Foreign Key -> `classes.id`. | | `username` | `varchar(255)` | User's Discord username. | | `is_active` | `boolean` | Whether the user is active (default: true). | | `balance` | `bigint` | User's currency balance. | | `xp` | `bigint` | User's experience points. | | `level` | `integer` | User's level. | | `daily_streak` | `integer` | Current streak of daily command usage. | | `settings` | `jsonb` | User-specific settings. | | `created_at` | `timestamp` | Record creation time. | | `updated_at` | `timestamp` | Last update time. | ### Classes (`classes`) Available character classes. | Column | Type | Description | |---|---|---| | `id` | `bigint` | Primary Key. Custom ID. | | `name` | `varchar(255)` | Class name (Unique). | | `balance` | `bigint` | Class bank balance (shared/flavor). | | `role_id` | `varchar(255)` | Discord Role ID associated with the class. | ### Items (`items`) Definitions of items available in the game. | Column | Type | Description | |---|---|---| | `id` | `serial` | Primary Key. Auto-incrementing ID. | | `name` | `varchar(255)` | Item name (Unique). | | `description` | `text` | Item description. | | `rarity` | `varchar(20)` | Common, Rare, etc. Default: 'Common'. | | `type` | `varchar(50)` | MATERIAL, CONSUMABLE, EQUIPMENT, etc. | | `usage_data` | `jsonb` | Effect data for consumables/usables. | | `price` | `bigint` | Base value of the item. | | `icon_url` | `text` | URL for the item's icon. | | `image_url` | `text` | URL for the item's large image. | ### Inventory (`inventory`) Items held by users. | Column | Type | Description | |---|---|---| | `user_id` | `bigint` | PK/FK -> `users.id`. | | `item_id` | `integer` | PK/FK -> `items.id`. | | `quantity` | `bigint` | Amount held. Must be > 0. | ### Transactions (`transactions`) Currency transaction history. | Column | Type | Description | |---|---|---| | `id` | `bigserial` | Primary Key. | | `user_id` | `bigint` | FK -> `users.id`. The user affecting the balance. | | `related_user_id` | `bigint` | FK -> `users.id`. The other party (if any). | | `amount` | `bigint` | Amount transferred. | | `type` | `varchar(50)` | Transaction type identifier. | | `description` | `text` | Human-readable description. | | `created_at` | `timestamp` | Time of transaction. | ### Item Transactions (`item_transactions`) Item flow history. | Column | Type | Description | |---|---|---| | `id` | `bigserial` | Primary Key. | | `user_id` | `bigint` | FK -> `users.id`. | | `related_user_id` | `bigint` | FK -> `users.id`. | | `item_id` | `integer` | FK -> `items.id`. | | `quantity` | `bigint` | Amount gained (+) or lost (-). | | `type` | `varchar(50)` | TRADE, SHOP_BUY, DROP, etc. | | `description` | `text` | Description. | | `created_at` | `timestamp` | Time of transaction. | ### Quests (`quests`) Quest definitions. | Column | Type | Description | |---|---|---| | `id` | `serial` | Primary Key. | | `name` | `varchar(255)` | Quest title. | | `description` | `text` | Quest text. | | `trigger_event` | `varchar(50)` | Event that triggers progress checks. | | `requirements` | `jsonb` | Completion criteria. | | `rewards` | `jsonb` | Rewards for completion. | ### User Quests (`user_quests`) User progress on quests. | Column | Type | Description | |---|---|---| | `user_id` | `bigint` | PK/FK -> `users.id`. | | `quest_id` | `integer` | PK/FK -> `quests.id`. | | `progress` | `integer` | Current progress value. | | `completed_at` | `timestamp` | Completion time (null if active). | ### User Timers (`user_timers`) Generic timers for cooldowns, temporary effects, etc. | Column | Type | Description | |---|---|---| | `user_id` | `bigint` | PK/FK -> `users.id`. | | `type` | `varchar(50)` | PK. Timer type (COOLDOWN, EFFECT, ACCESS). | | `key` | `varchar(100)` | PK. specific ID (e.g. 'daily'). | | `expires_at` | `timestamp` | When the timer expires. | | `metadata` | `jsonb` | Extra data. | ### Lootdrops (`lootdrops`) Active chat loot drop events. | Column | Type | Description | |---|---|---| | `message_id` | `varchar(255)` | Primary Key. Discord Message ID. | | `channel_id` | `varchar(255)` | Discord Channel ID. | | `reward_amount` | `integer` | Currency amount. | | `currency` | `varchar(50)` | Currency type constant. | | `claimed_by` | `bigint` | FK -> `users.id`. Null if unclaimed. | | `created_at` | `timestamp` | Spawn time. | | `expires_at` | `timestamp` | Despawn time. | ### Moderation Cases (`moderation_cases`) History of moderation actions. | Column | Type | Description | |---|---|---| | `id` | `bigserial` | Primary Key. | | `case_id` | `varchar(50)` | Unique friendly ID. | | `type` | `varchar(20)` | warn, timeout, kick, ban, etc. | | `user_id` | `bigint` | Target user ID. | | `username` | `varchar(255)` | Target username snapshot. | | `moderator_id` | `bigint` | Acting moderator ID. | | `moderator_name` | `varchar(255)` | Moderator username snapshot. | | `reason` | `text` | Reason for action. | | `metadata` | `jsonb` | Extra data. | | `active` | `boolean` | Is this case active? | | `created_at` | `timestamp` | Creation time. | | `resolved_at` | `timestamp` | Resolution/Expiration time. | | `resolved_by` | `bigint` | User ID who resolved it. | | `resolved_reason` | `text` | Reason for resolution. |