89 lines
2.9 KiB
SQL
89 lines
2.9 KiB
SQL
CREATE TABLE lifeos_migrations (
|
|
user_id TEXT PRIMARY KEY,
|
|
migrated_at TEXT NOT NULL
|
|
);
|
|
|
|
CREATE TABLE lifeos_meta (
|
|
user_id TEXT NOT NULL,
|
|
kind TEXT NOT NULL CHECK (kind IN ('profile', 'settings', 'system')),
|
|
value_json TEXT NOT NULL,
|
|
revision INTEGER NOT NULL DEFAULT 1,
|
|
updated_at TEXT NOT NULL,
|
|
PRIMARY KEY (user_id, kind)
|
|
);
|
|
|
|
CREATE TABLE lifeos_memories (
|
|
user_id TEXT NOT NULL,
|
|
id TEXT NOT NULL,
|
|
memory_date TEXT,
|
|
value_json TEXT NOT NULL,
|
|
revision INTEGER NOT NULL DEFAULT 1,
|
|
updated_at TEXT NOT NULL,
|
|
deleted_at TEXT,
|
|
PRIMARY KEY (user_id, id)
|
|
);
|
|
CREATE INDEX idx_lifeos_memories_user_date ON lifeos_memories(user_id, memory_date DESC) WHERE deleted_at IS NULL;
|
|
|
|
CREATE TABLE lifeos_memory_tags (
|
|
user_id TEXT NOT NULL,
|
|
memory_id TEXT NOT NULL,
|
|
tag TEXT NOT NULL,
|
|
PRIMARY KEY (user_id, memory_id, tag),
|
|
FOREIGN KEY (user_id, memory_id) REFERENCES lifeos_memories(user_id, id)
|
|
);
|
|
CREATE INDEX idx_lifeos_memory_tags_user_tag ON lifeos_memory_tags(user_id, tag);
|
|
CREATE TRIGGER lifeos_memory_tags_insert AFTER INSERT ON lifeos_memories
|
|
WHEN NEW.deleted_at IS NULL
|
|
BEGIN
|
|
INSERT OR IGNORE INTO lifeos_memory_tags(user_id, memory_id, tag)
|
|
SELECT NEW.user_id, NEW.id, value FROM json_each(NEW.value_json, '$.tags')
|
|
WHERE type = 'text' AND value <> '';
|
|
END;
|
|
CREATE TRIGGER lifeos_memory_tags_update AFTER UPDATE OF value_json, deleted_at ON lifeos_memories
|
|
BEGIN
|
|
DELETE FROM lifeos_memory_tags WHERE user_id = NEW.user_id AND memory_id = NEW.id;
|
|
INSERT OR IGNORE INTO lifeos_memory_tags(user_id, memory_id, tag)
|
|
SELECT NEW.user_id, NEW.id, value FROM json_each(NEW.value_json, '$.tags')
|
|
WHERE NEW.deleted_at IS NULL AND type = 'text' AND value <> '';
|
|
END;
|
|
|
|
CREATE TABLE lifeos_goals (
|
|
user_id TEXT NOT NULL,
|
|
id TEXT NOT NULL,
|
|
target_date TEXT,
|
|
done INTEGER NOT NULL DEFAULT 0,
|
|
value_json TEXT NOT NULL,
|
|
revision INTEGER NOT NULL DEFAULT 1,
|
|
updated_at TEXT NOT NULL,
|
|
deleted_at TEXT,
|
|
PRIMARY KEY (user_id, id)
|
|
);
|
|
CREATE INDEX idx_lifeos_goals_user_status_date ON lifeos_goals(user_id, done, target_date) WHERE deleted_at IS NULL;
|
|
|
|
CREATE TABLE lifeos_tasks (
|
|
user_id TEXT NOT NULL,
|
|
id TEXT NOT NULL,
|
|
goal_id TEXT,
|
|
due_date TEXT,
|
|
done INTEGER NOT NULL DEFAULT 0,
|
|
value_json TEXT NOT NULL,
|
|
revision INTEGER NOT NULL DEFAULT 1,
|
|
updated_at TEXT NOT NULL,
|
|
deleted_at TEXT,
|
|
PRIMARY KEY (user_id, id)
|
|
);
|
|
CREATE INDEX idx_lifeos_tasks_user_status_date ON lifeos_tasks(user_id, done, due_date) WHERE deleted_at IS NULL;
|
|
CREATE INDEX idx_lifeos_tasks_user_goal ON lifeos_tasks(user_id, goal_id) WHERE deleted_at IS NULL;
|
|
|
|
CREATE TABLE lifeos_favorites (
|
|
user_id TEXT NOT NULL,
|
|
id TEXT NOT NULL,
|
|
memory_id TEXT,
|
|
value_json TEXT NOT NULL,
|
|
revision INTEGER NOT NULL DEFAULT 1,
|
|
updated_at TEXT NOT NULL,
|
|
deleted_at TEXT,
|
|
PRIMARY KEY (user_id, id)
|
|
);
|
|
CREATE INDEX idx_lifeos_favorites_user_memory ON lifeos_favorites(user_id, memory_id) WHERE deleted_at IS NULL;
|