-- Migration number: 0000 2022-12-05T20:27:34.391Z PRAGMA foreign_keys = ON; CREATE TABLE IF NOT EXISTS actors ( id TEXT PRIMARY KEY, type TEXT NOT NULL, email TEXT, privkey BLOB, privkey_salt BLOB, pubkey TEXT, cdate DATETIME NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), properties TEXT NOT NULL DEFAULT (json_object()) ); CREATE INDEX IF NOT EXISTS actors_email ON actors(email); CREATE TABLE IF NOT EXISTS actor_following ( id TEXT PRIMARY KEY, actor_id TEXT NOT NULL, target_actor_id TEXT NOT NULL, target_actor_acct TEXT NOT NULL, state TEXT NOT NULL DEFAULT 'pending', cdate DATETIME NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), FOREIGN KEY(actor_id) REFERENCES actors(id), FOREIGN KEY(target_actor_id) REFERENCES actors(id) ); CREATE INDEX IF NOT EXISTS actor_following_actor_id ON actor_following(actor_id); CREATE INDEX IF NOT EXISTS actor_following_target_actor_id ON actor_following(target_actor_id); CREATE TABLE IF NOT EXISTS objects ( id TEXT PRIMARY KEY, mastodon_id TEXT UNIQUE NOT NULL, type TEXT NOT NULL, cdate DATETIME NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), original_actor_id TEXT, original_object_id TEXT UNIQUE, reply_to_object_id TEXT, properties TEXT NOT NULL DEFAULT (json_object()), local INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS inbox_objects ( id TEXT PRIMARY KEY, actor_id TEXT NOT NULL, object_id TEXT NOT NULL, cdate DATETIME NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), FOREIGN KEY(actor_id) REFERENCES actors(id), FOREIGN KEY(object_id) REFERENCES objects(id) ); CREATE TABLE IF NOT EXISTS outbox_objects ( id TEXT PRIMARY KEY, actor_id TEXT NOT NULL, object_id TEXT NOT NULL, cdate DATETIME NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), published_date DATETIME NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), FOREIGN KEY(actor_id) REFERENCES actors(id), FOREIGN KEY(object_id) REFERENCES objects(id) ); CREATE TABLE IF NOT EXISTS actor_notifications ( id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT NOT NULL, actor_id TEXT NOT NULL, from_actor_id TEXT NOT NULL, object_id TEXT, cdate DATETIME NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), FOREIGN KEY(actor_id) REFERENCES actors(id), FOREIGN KEY(from_actor_id) REFERENCES actors(id), FOREIGN KEY(object_id) REFERENCES objects(id) ); CREATE INDEX IF NOT EXISTS actor_notifications_actor_id ON actor_notifications(actor_id); CREATE TABLE IF NOT EXISTS actor_favourites ( id TEXT PRIMARY KEY, actor_id TEXT NOT NULL, object_id TEXT NOT NULL, cdate DATETIME NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), FOREIGN KEY(actor_id) REFERENCES actors(id), FOREIGN KEY(object_id) REFERENCES objects(id) ); CREATE INDEX IF NOT EXISTS actor_favourites_actor_id ON actor_favourites(actor_id); CREATE INDEX IF NOT EXISTS actor_favourites_object_id ON actor_favourites(object_id); CREATE TABLE IF NOT EXISTS actor_reblogs ( id TEXT PRIMARY KEY, actor_id TEXT NOT NULL, object_id TEXT NOT NULL, cdate DATETIME NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), FOREIGN KEY(actor_id) REFERENCES actors(id), FOREIGN KEY(object_id) REFERENCES objects(id) ); CREATE INDEX IF NOT EXISTS actor_reblogs_actor_id ON actor_reblogs(actor_id); CREATE INDEX IF NOT EXISTS actor_reblogs_object_id ON actor_reblogs(object_id); CREATE TABLE IF NOT EXISTS clients ( id TEXT PRIMARY KEY, secret TEXT NOT NULL, name TEXT NOT NULL, redirect_uris TEXT NOT NULL, website TEXT, scopes TEXT, cdate DATETIME NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')) ); CREATE TABLE IF NOT EXISTS subscriptions ( id TEXT PRIMARY KEY, actor_id TEXT NOT NULL, client_id TEXT NOT NULL, endpoint TEXT NULL, key_p256dh TEXT NOT NULL, key_auth TEXT NOT NULL, alert_mention INTEGER NOT NULL, alert_status INTEGER NOT NULL, alert_reblog INTEGER NOT NULL, alert_follow INTEGER NOT NULL, alert_follow_request INTEGER NOT NULL, alert_favourite INTEGER NOT NULL, alert_poll INTEGER NOT NULL, alert_update INTEGER NOT NULL, alert_admin_sign_up INTEGER NOT NULL, alert_admin_report INTEGER NOT NULL, policy TEXT, cdate DATETIME NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), UNIQUE(actor_id, client_id) FOREIGN KEY(actor_id) REFERENCES actors(id), FOREIGN KEY(client_id) REFERENCES clients(id) ); CREATE VIRTUAL TABLE IF NOT EXISTS search_fts USING fts5 ( type, name, preferredUsername, status ); CREATE TRIGGER IF NOT EXISTS actors_search_fts_insert AFTER INSERT ON actors BEGIN INSERT INTO search_fts (rowid, type, name, preferredUsername) VALUES (new.rowid, new.type, json_extract(new.properties, '$.name'), json_extract(new.properties, '$.preferredUsername')); END; CREATE TRIGGER IF NOT EXISTS actors_search_fts_delete AFTER DELETE ON actors BEGIN DELETE FROM search_fts WHERE rowid=old.rowid; END; CREATE TRIGGER IF NOT EXISTS actors_search_fts_update AFTER UPDATE ON actors BEGIN DELETE FROM search_fts WHERE rowid=old.rowid; INSERT INTO search_fts (rowid, type, name, preferredUsername) VALUES (new.rowid, new.type, json_extract(new.properties, '$.name'), json_extract(new.properties, '$.preferredUsername')); END; CREATE TABLE IF NOT EXISTS actor_replies ( id TEXT PRIMARY KEY, actor_id TEXT NOT NULL, object_id TEXT NOT NULL, in_reply_to_object_id TEXT NOT NULL, cdate DATETIME NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), FOREIGN KEY(actor_id) REFERENCES actors(id), FOREIGN KEY(object_id) REFERENCES objects(id) FOREIGN KEY(in_reply_to_object_id) REFERENCES objects(id) ); CREATE INDEX IF NOT EXISTS actor_replies_in_reply_to_object_id ON actor_replies(in_reply_to_object_id);