diff options
| author | soryu <soryu@soryu.co> | 2025-12-24 05:45:22 +0000 |
|---|---|---|
| committer | soryu <soryu@soryu.co> | 2025-12-24 05:45:22 +0000 |
| commit | 2faba0388f93d8e4fb86219eba7883b331d501ff (patch) | |
| tree | 92b83b8d558a652d3777627b2ac95ded250faa48 /makima/migrations | |
| parent | 8f016a0e9d14badc39dffd67ed6fb862f9d08496 (diff) | |
| download | soryu-2faba0388f93d8e4fb86219eba7883b331d501ff.tar.gz soryu-2faba0388f93d8e4fb86219eba7883b331d501ff.zip | |
Add versioning to files
Diffstat (limited to 'makima/migrations')
| -rw-r--r-- | makima/migrations/20241225000000_add_file_versions.sql | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/makima/migrations/20241225000000_add_file_versions.sql b/makima/migrations/20241225000000_add_file_versions.sql new file mode 100644 index 0000000..5074eaa --- /dev/null +++ b/makima/migrations/20241225000000_add_file_versions.sql @@ -0,0 +1,49 @@ +-- Create file_versions table to store version history +CREATE TABLE IF NOT EXISTS file_versions ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + file_id UUID NOT NULL REFERENCES files(id) ON DELETE CASCADE, + version INTEGER NOT NULL, + name VARCHAR(255) NOT NULL, + description TEXT, + summary TEXT, + body JSONB NOT NULL DEFAULT '[]'::jsonb, + source VARCHAR(32) NOT NULL DEFAULT 'user', -- 'user', 'llm', or 'system' + change_description TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + + -- Each file can only have one record per version number + UNIQUE(file_id, version) +); + +-- Index for efficient version lookups +CREATE INDEX idx_file_versions_file_id ON file_versions(file_id); +CREATE INDEX idx_file_versions_file_version ON file_versions(file_id, version DESC); + +-- Function to save a version snapshot before file updates +CREATE OR REPLACE FUNCTION save_file_version() +RETURNS TRIGGER AS $$ +BEGIN + -- Save the current state as a version before the update + INSERT INTO file_versions (file_id, version, name, description, summary, body, source, change_description, created_at) + VALUES ( + OLD.id, + OLD.version, + OLD.name, + OLD.description, + OLD.summary, + OLD.body, + COALESCE(current_setting('app.version_source', true), 'user'), + current_setting('app.change_description', true), + OLD.updated_at + ) + ON CONFLICT (file_id, version) DO NOTHING; + + RETURN NEW; +END; +$$ language 'plpgsql'; + +-- Trigger to automatically save versions on update +CREATE TRIGGER save_file_version_trigger + BEFORE UPDATE ON files + FOR EACH ROW + EXECUTE FUNCTION save_file_version(); |
