refactor: split core store schema
This commit is contained in:
parent
bd92cc49a7
commit
3c8de4d9b1
@ -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
89
internal/store/schema.go
Normal 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
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user