feat(db): add guild_settings table for per-guild configuration

Store guild-specific settings (roles, channels, moderation options) in
database instead of config file, enabling per-guild configuration and
runtime updates without redeployment.
This commit is contained in:
syntaxbullet
2026-02-12 14:57:24 +01:00
parent 1ff24b0f7f
commit 5f107d03a7
5 changed files with 1369 additions and 0 deletions

View File

@@ -0,0 +1,31 @@
import {
pgTable,
bigint,
timestamp,
text,
jsonb,
} from 'drizzle-orm/pg-core';
import { relations, type InferSelectModel, type InferInsertModel } from 'drizzle-orm';
export type GuildSettings = InferSelectModel<typeof guildSettings>;
export type GuildSettingsInsert = InferInsertModel<typeof guildSettings>;
export const guildSettings = pgTable('guild_settings', {
guildId: bigint('guild_id', { mode: 'bigint' }).primaryKey(),
studentRoleId: bigint('student_role_id', { mode: 'bigint' }),
visitorRoleId: bigint('visitor_role_id', { mode: 'bigint' }),
colorRoleIds: jsonb('color_role_ids').$type<string[]>().default([]),
welcomeChannelId: bigint('welcome_channel_id', { mode: 'bigint' }),
welcomeMessage: text('welcome_message'),
feedbackChannelId: bigint('feedback_channel_id', { mode: 'bigint' }),
terminalChannelId: bigint('terminal_channel_id', { mode: 'bigint' }),
terminalMessageId: bigint('terminal_message_id', { mode: 'bigint' }),
moderationLogChannelId: bigint('moderation_log_channel_id', { mode: 'bigint' }),
moderationDmOnWarn: jsonb('moderation_dm_on_warn').$type<boolean>().default(true),
moderationAutoTimeoutThreshold: jsonb('moderation_auto_timeout_threshold').$type<number>(),
featureOverrides: jsonb('feature_overrides').$type<Record<string, boolean>>().default({}),
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
});
export const guildSettingsRelations = relations(guildSettings, () => ({}));

View File

@@ -5,3 +5,4 @@ export * from './economy';
export * from './quests';
export * from './moderation';
export * from './feature-flags';
export * from './guild-settings';