diff --git a/internal/repository/projects.go b/internal/repository/projects.go index 720322f..d86c816 100644 --- a/internal/repository/projects.go +++ b/internal/repository/projects.go @@ -31,14 +31,14 @@ func CreateProject(ctx context.Context, db *sql.DB, data *ProjectData) error { return err } defer tx.Rollback() - query := ` + queryProject := ` INSERT INTO projects (uuid, name, slug, description, owner_user_id, billing_account_id, created_by, created_at, updated_by, updated_at) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) ` - if _, err := tx.ExecContext(ctx, query, + if _, err := tx.ExecContext(ctx, queryProject, data.UUID, data.Name, data.Slug, data.Description, data.CreatedBy, data.CreatedBy, data.CreatedBy, data.CreatedAt, data.CreatedBy, data.CreatedAt); err != nil { var pgErr *pgconn.PgError @@ -54,6 +54,28 @@ func CreateProject(ctx context.Context, db *sql.DB, data *ProjectData) error { return err } + queryMembership := ` + INSERT INTO project_membership + (project_uuid, user_uuid, role, status, invited_by, joined_at) + VALUES + ($1, $2, $3, $4, $5, $6); + ` + if _, err := tx.ExecContext(ctx, queryMembership, + data.UUID, data.CreatedBy, "owner", "active", data.CreatedBy, data.CreatedAt, + ); err != nil { + var pgErr *pgconn.PgError + if errors.As(err, &pgErr) { + switch pgErr.Code { + case pgerrcode.UniqueViolation: + return ErrAlreadyExists + case pgerrcode.CheckViolation: + return ErrCheckNotPassed + } + return err + } + return err + } + if err := tx.Commit(); err != nil { return err } diff --git a/migrations/20260518193057_project_membership_init.down.sql b/migrations/20260518193057_project_membership_init.down.sql index 76e1132..cd338a6 100644 --- a/migrations/20260518193057_project_membership_init.down.sql +++ b/migrations/20260518193057_project_membership_init.down.sql @@ -1,7 +1,7 @@ -DROP INDEX IF EXISTS idx_project_memberships_project; -DROP INDEX IF EXISTS idx_project_memberships_user; +DROP INDEX IF EXISTS idx_project_membership_project; +DROP INDEX IF EXISTS idx_project_membership_user; -DROP TABLE IF EXISTS project_memberships; +DROP TABLE IF EXISTS project_membership; 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 57b56d9..e56fa39 100644 --- a/migrations/20260518193057_project_membership_init.up.sql +++ b/migrations/20260518193057_project_membership_init.up.sql @@ -10,7 +10,7 @@ CREATE TYPE membership_status AS ENUM ( 'suspended' ); -CREATE TABLE project_memberships ( +CREATE TABLE project_membership ( project_uuid UUID NOT NULL REFERENCES projects(uuid) ON DELETE CASCADE, @@ -28,8 +28,8 @@ CREATE TABLE project_memberships ( PRIMARY KEY (project_uuid, user_uuid) ); -CREATE INDEX idx_project_memberships_user -ON project_memberships(user_uuid); +CREATE INDEX idx_project_membership_user +ON project_membership(user_uuid); -CREATE INDEX idx_project_memberships_project -ON project_memberships(project_uuid); +CREATE INDEX idx_project_membership_project +ON project_membership(project_uuid);