diff --git a/internal/store/migrations.go b/internal/store/migrations.go index ac2a6cd..007a457 100644 --- a/internal/store/migrations.go +++ b/internal/store/migrations.go @@ -69,90 +69,6 @@ func (d *DB) ensureSchema() error { return nil } -func migrateCoreSchema(d *DB) error { - if _, err := d.sql.Exec(` - CREATE TABLE IF NOT EXISTS chats ( - jid TEXT PRIMARY KEY, - kind TEXT NOT NULL, -- dm|group|broadcast|unknown - name TEXT, - last_message_ts INTEGER - ); - - CREATE TABLE IF NOT EXISTS contacts ( - jid TEXT PRIMARY KEY, - phone TEXT, - push_name TEXT, - full_name TEXT, - first_name TEXT, - business_name TEXT, - updated_at INTEGER NOT NULL - ); - - CREATE TABLE IF NOT EXISTS groups ( - jid TEXT PRIMARY KEY, - name TEXT, - owner_jid TEXT, - created_ts INTEGER, - updated_at INTEGER NOT NULL - ); - - CREATE TABLE IF NOT EXISTS group_participants ( - group_jid TEXT NOT NULL, - user_jid TEXT NOT NULL, - role TEXT, - updated_at INTEGER NOT NULL, - PRIMARY KEY (group_jid, user_jid), - FOREIGN KEY (group_jid) REFERENCES groups(jid) ON DELETE CASCADE - ); - - CREATE TABLE IF NOT EXISTS contact_aliases ( - jid TEXT PRIMARY KEY, - alias TEXT NOT NULL, - notes TEXT, - updated_at INTEGER NOT NULL - ); - - CREATE TABLE IF NOT EXISTS contact_tags ( - jid TEXT NOT NULL, - tag TEXT NOT NULL, - updated_at INTEGER NOT NULL, - PRIMARY KEY (jid, tag) - ); - - CREATE TABLE IF NOT EXISTS messages ( - rowid INTEGER PRIMARY KEY AUTOINCREMENT, - chat_jid TEXT NOT NULL, - chat_name TEXT, - msg_id TEXT NOT NULL, - sender_jid TEXT, - sender_name TEXT, - ts INTEGER NOT NULL, - from_me INTEGER NOT NULL, - text TEXT, - display_text TEXT, - media_type TEXT, - media_caption TEXT, - filename TEXT, - mime_type TEXT, - direct_path TEXT, - media_key BLOB, - file_sha256 BLOB, - file_enc_sha256 BLOB, - file_length INTEGER, - local_path TEXT, - downloaded_at INTEGER, - UNIQUE(chat_jid, msg_id), - FOREIGN KEY (chat_jid) REFERENCES chats(jid) ON DELETE CASCADE - ); - - CREATE INDEX IF NOT EXISTS idx_messages_chat_ts ON messages(chat_jid, ts); - CREATE INDEX IF NOT EXISTS idx_messages_ts ON messages(ts); - `); err != nil { - return fmt.Errorf("create tables: %w", err) - } - return nil -} - func migrateMessagesDisplayText(d *DB) error { hasDisplayText, err := d.tableHasColumn("messages", "display_text") if err != nil { diff --git a/internal/store/schema.go b/internal/store/schema.go new file mode 100644 index 0000000..970ea1b --- /dev/null +++ b/internal/store/schema.go @@ -0,0 +1,89 @@ +package store + +import "fmt" + +const coreSchemaSQL = ` + CREATE TABLE IF NOT EXISTS chats ( + jid TEXT PRIMARY KEY, + kind TEXT NOT NULL, -- dm|group|broadcast|unknown + name TEXT, + last_message_ts INTEGER + ); + + CREATE TABLE IF NOT EXISTS contacts ( + jid TEXT PRIMARY KEY, + phone TEXT, + push_name TEXT, + full_name TEXT, + first_name TEXT, + business_name TEXT, + updated_at INTEGER NOT NULL + ); + + CREATE TABLE IF NOT EXISTS groups ( + jid TEXT PRIMARY KEY, + name TEXT, + owner_jid TEXT, + created_ts INTEGER, + updated_at INTEGER NOT NULL + ); + + CREATE TABLE IF NOT EXISTS group_participants ( + group_jid TEXT NOT NULL, + user_jid TEXT NOT NULL, + role TEXT, + updated_at INTEGER NOT NULL, + PRIMARY KEY (group_jid, user_jid), + FOREIGN KEY (group_jid) REFERENCES groups(jid) ON DELETE CASCADE + ); + + CREATE TABLE IF NOT EXISTS contact_aliases ( + jid TEXT PRIMARY KEY, + alias TEXT NOT NULL, + notes TEXT, + updated_at INTEGER NOT NULL + ); + + CREATE TABLE IF NOT EXISTS contact_tags ( + jid TEXT NOT NULL, + tag TEXT NOT NULL, + updated_at INTEGER NOT NULL, + PRIMARY KEY (jid, tag) + ); + + CREATE TABLE IF NOT EXISTS messages ( + rowid INTEGER PRIMARY KEY AUTOINCREMENT, + chat_jid TEXT NOT NULL, + chat_name TEXT, + msg_id TEXT NOT NULL, + sender_jid TEXT, + sender_name TEXT, + ts INTEGER NOT NULL, + from_me INTEGER NOT NULL, + text TEXT, + display_text TEXT, + media_type TEXT, + media_caption TEXT, + filename TEXT, + mime_type TEXT, + direct_path TEXT, + media_key BLOB, + file_sha256 BLOB, + file_enc_sha256 BLOB, + file_length INTEGER, + local_path TEXT, + downloaded_at INTEGER, + UNIQUE(chat_jid, msg_id), + FOREIGN KEY (chat_jid) REFERENCES chats(jid) ON DELETE CASCADE + ); + + CREATE INDEX IF NOT EXISTS idx_messages_chat_ts ON messages(chat_jid, ts); + CREATE INDEX IF NOT EXISTS idx_messages_ts ON messages(ts); +` + +func migrateCoreSchema(d *DB) error { + if _, err := d.sql.Exec(coreSchemaSQL); err != nil { + return fmt.Errorf("create tables: %w", err) + } + return nil +}