From 06afab3f5abc2fdc74b6f36be6c5da25720a79aa Mon Sep 17 00:00:00 2001 From: Nikolai Rodionov Date: Thu, 21 May 2026 16:48:12 +0200 Subject: [PATCH] WIP: Add a migration for project membmership Signed-off-by: Nikolai Rodionov --- internal/repository/projects.go | 2 ++ ...518193057_project_membership_init.down.sql | 7 ++++ ...60518193057_project_membership_init.up.sql | 35 +++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/internal/repository/projects.go b/internal/repository/projects.go index 648ff94..faa455e 100644 --- a/internal/repository/projects.go +++ b/internal/repository/projects.go @@ -4,6 +4,7 @@ import ( "context" "database/sql" "errors" + "fmt" "time" "github.com/jackc/pgerrcode" @@ -103,5 +104,6 @@ func ListProjects(ctx context.Context, db *sql.DB) ([]*ProjectData, error) { FROM projects p JOIN project_membership pm ON pm.project_id = p.id WHERE pm.user_id = ?` + fmt.Println(query) return nil, nil } diff --git a/migrations/20260518193057_project_membership_init.down.sql b/migrations/20260518193057_project_membership_init.down.sql index e69de29..76e1132 100644 --- a/migrations/20260518193057_project_membership_init.down.sql +++ b/migrations/20260518193057_project_membership_init.down.sql @@ -0,0 +1,7 @@ +DROP INDEX IF EXISTS idx_project_memberships_project; +DROP INDEX IF EXISTS idx_project_memberships_user; + +DROP TABLE IF EXISTS project_memberships; + +DROP TYPE IF EXISTS membership_status; +DROP TYPE IF EXISTS project_role; diff --git a/migrations/20260518193057_project_membership_init.up.sql b/migrations/20260518193057_project_membership_init.up.sql index e69de29..57b56d9 100644 --- a/migrations/20260518193057_project_membership_init.up.sql +++ b/migrations/20260518193057_project_membership_init.up.sql @@ -0,0 +1,35 @@ +CREATE TYPE project_role AS ENUM ( + 'member', + 'admin', + 'owner' +); + +CREATE TYPE membership_status AS ENUM ( + 'invited', + 'active', + 'suspended' +); + +CREATE TABLE project_memberships ( + project_uuid UUID NOT NULL + REFERENCES projects(uuid) + ON DELETE CASCADE, + + user_uuid UUID NOT NULL + REFERENCES accounts(uuid) + ON DELETE CASCADE, + + role project_role NOT NULL, + status membership_status NOT NULL DEFAULT 'active', + + invited_by UUID NULL + REFERENCES accounts(uuid), + joined_at TIMESTAMP NULL, + PRIMARY KEY (project_uuid, user_uuid) +); + +CREATE INDEX idx_project_memberships_user +ON project_memberships(user_uuid); + +CREATE INDEX idx_project_memberships_project +ON project_memberships(project_uuid);