Add Projects #13
@@ -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
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user