feat(storage): migrate Life OS cloud state to versioned records
This commit is contained in:
1 parent
6972a00445
commit
1606c41f43
17 files changed
+502
-72
No files matched your search
@@ -0,0 +1,88 @@
|
||||
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;
|
||||
@@ -8,6 +8,13 @@
|
||||
"when": 1790389200000,
|
||||
"tag": "0000_lifeos_cloud_state",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 1,
|
||||
"version": "7",
|
||||
"when": 1790640000000,
|
||||
"tag": "0001_lifeos_records",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in new issue
Block a user