From 58efe8417e90931736575f6a9b4dd5b6869f0b1c Mon Sep 17 00:00:00 2001 From: Zack Fu Zi Xiang Date: Mon, 4 Nov 2024 14:16:48 +0800 Subject: [PATCH] feat: update migration --- .../20241101063559_af_workspace_namespace.sql | 39 +++++++++++++++---- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/migrations/20241101063559_af_workspace_namespace.sql b/migrations/20241101063559_af_workspace_namespace.sql index 3806a6c9..342d3272 100644 --- a/migrations/20241101063559_af_workspace_namespace.sql +++ b/migrations/20241101063559_af_workspace_namespace.sql @@ -7,19 +7,21 @@ ALTER TABLE af_workspace DROP CONSTRAINT af_workspace_publish_namespace_key; -- Table to store user defined namespace for workspace CREATE TABLE IF NOT EXISTS af_workspace_namespace ( - workspace_id UUID, - namespace TEXT NOT NULL UNIQUE, - created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + namespace TEXT NOT NULL PRIMARY KEY, + workspace_id UUID NOT NULL, + is_original BOOLEAN NOT NULL, + created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (workspace_id) REFERENCES af_workspace (workspace_id) ON DELETE CASCADE ); --- Create index for workspace_id +-- Create index to ensure fast lookup by workspace_id CREATE INDEX idx_af_workspace_namespace_workspace_id ON af_workspace_namespace (workspace_id); --- Create index for namespace -CREATE INDEX idx_af_workspace_namespace_namespace ON af_workspace_namespace (namespace); +-- Create a partial unique index to enforce that only one original namespace exists per workspace +CREATE UNIQUE INDEX ON af_workspace_namespace (workspace_id) +WHERE is_original = TRUE; -- Create a function to update the updated_at column CREATE OR REPLACE FUNCTION update_updated_at_column() @@ -35,3 +37,26 @@ CREATE TRIGGER trigger_update_updated_at BEFORE UPDATE ON af_workspace_namespace FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); + +-- Create a trigger that will create a row in `af_workspace_namespace` when a record is inserted in `af_workspace` +CREATE OR REPLACE FUNCTION create_workspace_namespace() +RETURNS TRIGGER AS $$ +BEGIN + INSERT INTO af_workspace_namespace (namespace, workspace_id, is_original) + VALUES (uuid_generate_v4()::text, NEW.workspace_id, TRUE); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; +CREATE TRIGGER trigger_create_workspace_namespace +AFTER INSERT ON af_workspace +FOR EACH ROW +EXECUTE FUNCTION create_workspace_namespace(); + +-- Insert existing workspace records into `af_workspace_namespace` +INSERT INTO af_workspace_namespace (namespace, workspace_id) +SELECT publish_namespace, workspace_id +FROM af_workspace +ON CONFLICT (namespace) DO NOTHING; -- if there happens to be a workspace creation during migration + +-- Drop existing `publish_namespace` column for workspace_id +ALTER TABLE af_workspace DROP COLUMN publish_namespace;