refactor: split core store schema

This commit is contained in:
Peter Steinberger 2026-04-21 03:54:48 +01:00
parent bd92cc49a7
commit 3c8de4d9b1
No known key found for this signature in database
2 changed files with 89 additions and 84 deletions

View File

@ -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 {

89
internal/store/schema.go Normal file
View File

@ -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
}