diff --git a/docker-compose.yml b/docker-compose.yml index ab4d4e2..7b50a43 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,4 +7,4 @@ services: - "8000:8000" volumes: - ./data:/app/data - - ./migrations:/app/migrations + - ./sql:/app/sql diff --git a/migrations/0001-add-appeals.sql b/sql/migrations/0001-add-appeals.sql similarity index 100% rename from migrations/0001-add-appeals.sql rename to sql/migrations/0001-add-appeals.sql diff --git a/sql/structure.sql b/sql/structure.sql new file mode 100644 index 0000000..2eae168 --- /dev/null +++ b/sql/structure.sql @@ -0,0 +1,110 @@ +CREATE TABLE + IF NOT EXISTS discord_names ( + id INTEGER PRIMARY KEY, + user_id INTEGER NOT NULL, + discord_id TEXT NOT NULL, + discord_username TEXT NOT NULL, + added_on datetime NOT NULL DEFAULT (datetime ('now', 'localtime')) + ); + +CREATE TABLE + IF NOT EXISTS settings ( + guild_id TEXT PRIMARY KEY, + general_chat_id TEXT, + new_member_channel_id TEXT, + tickets_channel_id TEXT, + event_logs_channel_id TEXT, + discord_logs_channel_id TEXT, + audit_logs_channel_id TEXT, + voice_logs_channel_id TEXT, + admin_role_id TEXT, + private_help_role_id TEXT, + devwatch_role_id TEXT, + staff_categories TEXT, + safe_channels TEXT, + link_skip_channels TEXT, + github_release_channel TEXT, + moderator_channel_id TEXT, + private_help_channel_id TEXT + ); + +CREATE TABLE + IF NOT EXISTS messages ( + id TEXT PRIMARY KEY ON CONFLICT REPLACE, + author_id TEXT NOT NULL, + author_name TEXT NOT NULL, + channel_id TEXT NOT NULL, + attachments TEXT NOT NULL, + stickers TEXT NOT NULL, + content TEXT NOT NULL + ); + +CREATE INDEX IF NOT EXISTS index_authors ON messages (author_id); + +CREATE INDEX IF NOT EXISTS index_channels ON messages (channel_id); + +CREATE TABLE + IF NOT EXISTS tickets (id INTEGER PRIMARY KEY, message_id TEXT NOT NULL); + +CREATE TABLE + IF NOT EXISTS ticket_phrases ( + id INTEGER PRIMARY KEY, + user_id TEXT NOT NULL, + phrase TEXT NOT NULL + ); + +CREATE TABLE + IF NOT EXISTS notes ( + id INTEGER PRIMARY KEY, + user_id TEXT, + reason TEXT, + mod_id TEXT, + timestamp datetime NOT NULL DEFAULT (datetime ('now', 'localtime')) + ); + +CREATE INDEX IF NOT EXISTS index_user_ids ON notes (user_id); + +CREATE TABLE + IF NOT EXISTS note_edits ( + id INTEGER PRIMARY KEY, + note_id INTEGER, + mod_id TEXT, + previous_reason TEXT, + timestamp datetime NOT NULL DEFAULT (datetime ('now', 'localtime')), + FOREIGN KEY (note_id) REFERENCES notes (id) + ); + +CREATE TABLE + IF NOT EXISTS bans ( + id INTEGER PRIMARY KEY, + user_id TEXT, + expires INTEGER, + expires_at datetime, + full_ban INTEGER + ); + +CREATE TABLE + IF NOT EXISTS github_user_mapping ( + id INTEGER PRIMARY KEY, + discord_id TEXT, + github_username TEXT + ); + +CREATE TABLE + IF NOT EXISTS knowledgebase ( + id INTEGER PRIMARY KEY, + guild_id TEXT NOT NULL, + name TEXT NOT NULL, + content TEXT NOT NULL + ); + +CREATE TABLE + IF NOT EXISTS private_help_tickets ( + id INTEGER PRIMARY KEY, + thread_id TEXT NOT NULL, + user_id TEXT NOT NULL, + status INTEGER NOT NULL, + timestamp datetime NOT NULL DEFAULT (datetime ('now', 'localtime')) + ); + +CREATE INDEX IF NOT EXISTS index_timestamp ON private_help_tickets (timestamp); \ No newline at end of file diff --git a/src/shared/Database.ts b/src/shared/Database.ts index 719c07f..348e0af 100644 --- a/src/shared/Database.ts +++ b/src/shared/Database.ts @@ -5,111 +5,7 @@ import { fileURLToPath } from 'url'; import { Message } from '../events'; import { AppealMessage, Ban, GithubUserMapping, GuildArraySetting, GuildSetting, GuildSettings, KnowledgebaseItem, LoggedMessage, Note, PrivateHelpTicket, TicketMessage, TicketPhrase } from '../types'; import { serializeMessage, wait } from '../utils'; - -const DB_SCHEMA = ` - CREATE TABLE IF NOT EXISTS discord_names ( - id INTEGER PRIMARY KEY, - user_id INTEGER NOT NULL, - discord_id TEXT NOT NULL, - discord_username TEXT NOT NULL, - added_on datetime NOT NULL DEFAULT (datetime('now', 'localtime')) - ); - - CREATE TABLE IF NOT EXISTS settings ( - guild_id TEXT PRIMARY KEY, - general_chat_id TEXT, - new_member_channel_id TEXT, - tickets_channel_id TEXT, - event_logs_channel_id TEXT, - discord_logs_channel_id TEXT, - audit_logs_channel_id TEXT, - voice_logs_channel_id TEXT, - admin_role_id TEXT, - private_help_role_id TEXT, - devwatch_role_id TEXT, - staff_categories TEXT, - safe_channels TEXT, - link_skip_channels TEXT, - github_release_channel TEXT, - moderator_channel_id TEXT, - private_help_channel_id TEXT - ); - - CREATE TABLE IF NOT EXISTS messages ( - id TEXT PRIMARY KEY ON CONFLICT REPLACE, - author_id TEXT NOT NULL, - author_name TEXT NOT NULL, - channel_id TEXT NOT NULL, - attachments TEXT NOT NULL, - stickers TEXT NOT NULL, - content TEXT NOT NULL - ); - - CREATE INDEX IF NOT EXISTS index_authors ON messages (author_id); - - CREATE INDEX IF NOT EXISTS index_channels ON messages (channel_id); - - CREATE TABLE IF NOT EXISTS tickets ( - id INTEGER PRIMARY KEY, - message_id TEXT NOT NULL - ); - - CREATE TABLE IF NOT EXISTS ticket_phrases ( - id INTEGER PRIMARY KEY, - user_id TEXT NOT NULL, - phrase TEXT NOT NULL - ); - - CREATE TABLE IF NOT EXISTS notes ( - id INTEGER PRIMARY KEY, - user_id TEXT, - reason TEXT, - mod_id TEXT, - timestamp datetime NOT NULL DEFAULT (datetime('now', 'localtime')) - ); - - CREATE INDEX IF NOT EXISTS index_user_ids ON notes (user_id); - - CREATE TABLE IF NOT EXISTS note_edits ( - id INTEGER PRIMARY KEY, - note_id INTEGER, - mod_id TEXT, - previous_reason TEXT, - timestamp datetime NOT NULL DEFAULT (datetime('now', 'localtime')), - FOREIGN KEY(note_id) REFERENCES notes(id) - ); - - CREATE TABLE IF NOT EXISTS bans ( - id INTEGER PRIMARY KEY, - user_id TEXT, - expires INTEGER, - expires_at datetime, - full_ban INTEGER - ); - - CREATE TABLE IF NOT EXISTS github_user_mapping ( - id INTEGER PRIMARY KEY, - discord_id TEXT, - github_username TEXT - ); - - CREATE TABLE IF NOT EXISTS knowledgebase ( - id INTEGER PRIMARY KEY, - guild_id TEXT NOT NULL, - name TEXT NOT NULL, - content TEXT NOT NULL - ); - - CREATE TABLE IF NOT EXISTS private_help_tickets ( - id INTEGER PRIMARY KEY, - thread_id TEXT NOT NULL, - user_id TEXT NOT NULL, - status INTEGER NOT NULL, - timestamp datetime NOT NULL DEFAULT (datetime('now', 'localtime')) - ); - - CREATE INDEX IF NOT EXISTS index_timestamp ON private_help_tickets (timestamp); -`; +import { readFileSync } from 'fs'; export const enum PrivateHelpTicketStatus { OPEN = 0, @@ -137,7 +33,9 @@ export class Database { } private static async ensure() { - await Database.db.exec(DB_SCHEMA); + const __dirname = dirname(fileURLToPath(import.meta.url)); + const schema = readFileSync(path.join(__dirname, '..', '..', 'sql', 'structure.sql'), { encoding: 'utf-8' }); + await Database.db.exec(schema); console.log('SQLite database ensured'); } @@ -146,7 +44,7 @@ export class Database { const __dirname = dirname(fileURLToPath(import.meta.url)); await Database.db.migrate({ - migrationsPath: path.join(__dirname, '..', '..', 'migrations') + migrationsPath: path.join(__dirname, '..', '..', 'sql', 'migrations') }); console.log('Database migrations ran');