91 lines
2.4 KiB
PL/PgSQL
91 lines
2.4 KiB
PL/PgSQL
--------------- WORKSPACES ---------------
|
|
|
|
-- TABLE --
|
|
|
|
CREATE TABLE IF NOT EXISTS workspaces (
|
|
-- ID
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
|
|
-- RELATIONSHIPS
|
|
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
|
|
-- METADATA
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMPTZ,
|
|
|
|
-- SHARING
|
|
sharing TEXT NOT NULL DEFAULT 'private',
|
|
|
|
-- REQUIRED
|
|
default_context_length INTEGER NOT NULL,
|
|
default_model TEXT NOT NULL CHECK (char_length(default_model) <= 1000),
|
|
default_prompt TEXT NOT NULL CHECK (char_length(default_prompt) <= 100000),
|
|
default_temperature REAL NOT NULL,
|
|
description TEXT NOT NULL CHECK (char_length(description) <= 500),
|
|
embeddings_provider TEXT NOT NULL CHECK (char_length(embeddings_provider) <= 1000),
|
|
include_profile_context BOOLEAN NOT NULL,
|
|
include_workspace_instructions BOOLEAN NOT NULL,
|
|
instructions TEXT NOT NULL CHECK (char_length(instructions) <= 1500),
|
|
is_home BOOLEAN NOT NULL DEFAULT FALSE,
|
|
name TEXT NOT NULL CHECK (char_length(name) <= 100)
|
|
);
|
|
|
|
-- INDEXES --
|
|
|
|
CREATE INDEX idx_workspaces_user_id ON workspaces (user_id);
|
|
|
|
-- RLS --
|
|
|
|
ALTER TABLE workspaces ENABLE ROW LEVEL SECURITY;
|
|
|
|
CREATE POLICY "Allow full access to own workspaces"
|
|
ON workspaces
|
|
USING (user_id = auth.uid())
|
|
WITH CHECK (user_id = auth.uid());
|
|
|
|
CREATE POLICY "Allow view access to non-private workspaces"
|
|
ON workspaces
|
|
FOR SELECT
|
|
USING (sharing <> 'private');
|
|
|
|
-- FUNCTIONS --
|
|
|
|
CREATE OR REPLACE FUNCTION prevent_home_field_update()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
IF NEW.is_home IS DISTINCT FROM OLD.is_home THEN
|
|
RAISE EXCEPTION 'Updating the home field of workspace is not allowed.';
|
|
END IF;
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- TRIGGERS --
|
|
|
|
CREATE TRIGGER update_workspaces_updated_at
|
|
BEFORE UPDATE ON workspaces
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE update_updated_at_column();
|
|
|
|
CREATE OR REPLACE FUNCTION prevent_home_workspace_deletion()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
IF OLD.is_home THEN
|
|
RAISE EXCEPTION 'Home workspace deletion is not allowed.';
|
|
END IF;
|
|
|
|
RETURN OLD;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER prevent_update_of_home_field
|
|
BEFORE UPDATE ON workspaces
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE prevent_home_field_update();
|
|
|
|
-- INDEXES --
|
|
|
|
CREATE UNIQUE INDEX idx_unique_home_workspace_per_user
|
|
ON workspaces(user_id)
|
|
WHERE is_home; |