From f0745c5a75c1b0f7f18231f82b46ab12a7feb708 Mon Sep 17 00:00:00 2001 From: dDogge <> Date: Thu, 14 Mar 2024 13:27:57 +0100 Subject: [PATCH] Added ChangeUserRole and corresponding test, also GetProjectId should be fixed. --- backend/internal/database/db.go | 34 ++++++++++++++++--- backend/internal/database/db_test.go | 26 ++++++++++++++ .../database/migrations/0049_project_role.sql | 2 +- .../database/migrations/0050_user_roles.sql | 2 +- 4 files changed, 57 insertions(+), 7 deletions(-) diff --git a/backend/internal/database/db.go b/backend/internal/database/db.go index 5a88873..9e63395 100644 --- a/backend/internal/database/db.go +++ b/backend/internal/database/db.go @@ -1,7 +1,9 @@ package database import ( + "database/sql" "embed" + "fmt" "os" "path/filepath" "time" @@ -25,7 +27,8 @@ type Database interface { // ChangeUserRole(username string, projectname string, role string) error // AddTimeReport(projectname string, start time.Time, end time.Time) error // AddUserToProject(username string, projectname string) error - // ChangeUserRole(username string, projectname string, role string) error + ChangeUserRole(username string, projectname string, role string) error + GetProjectId(projectname string) (int, error) } // This struct is a wrapper type that holds the database connection @@ -42,7 +45,6 @@ const projectInsert = "INSERT INTO projects (name, description, owner_user_id) S const promoteToAdmin = "INSERT INTO site_admin (admin_id) SELECT id FROM users WHERE username = ?" const addTimeReport = "INSERT INTO activity (report_id, activity_nbr, start_time, end_time, break, comment) VALUES (?, ?, ?, ?, ?, ?)" // WIP const addUserToProject = "INSERT INTO project_member (project_id, user_id, role) VALUES (?, ?, ?)" // WIP -// const changeUserRole = "" // DbConnect connects to the database func DbConnect(dbpath string) Database { @@ -61,6 +63,22 @@ func DbConnect(dbpath string) Database { return &Db{db} } +func (d *Db) ChangeUserRole(username string, projectname string, role string) error { + userID, err := d.GetUserId(username) + if err != nil { + return err + } + + projectID, err := d.GetProjectId(projectname) + if err != nil { + return err + } + + // Update user role in the project using the correct table name + _, err = d.Exec("INSERT OR REPLACE INTO user_roles (user_id, project_id, p_role) VALUES (?, ?, ?)", userID, projectID, role) + return err +} + func (d *Db) AddTimeReport(projectname string, start time.Time, end time.Time, breakTime uint32) error { // WIP _, err := d.Exec(addTimeReport, projectname, 0, start, end, breakTime, false) return err @@ -110,10 +128,16 @@ func (d *Db) GetUserId(username string) (int, error) { return id, err } -func (d *Db) GetProjectId(projectname string) (int, error) { // WIP, denna kan vara goof +func (d *Db) GetProjectId(projectname string) (int, error) { var id int - err := d.Get(&id, "SELECT id FROM project WHERE project_name = ?", projectname) - return id, err + err := d.Get(&id, "SELECT id FROM projects WHERE name = ?", projectname) + if err != nil { + if err == sql.ErrNoRows { + return 0, fmt.Errorf("project '%s' not found", projectname) + } + return 0, err + } + return id, nil } // Creates a new project in the database, associated with a user diff --git a/backend/internal/database/db_test.go b/backend/internal/database/db_test.go index 96eb9b7..08eee32 100644 --- a/backend/internal/database/db_test.go +++ b/backend/internal/database/db_test.go @@ -92,6 +92,32 @@ func TestPromoteToAdmin(t *testing.T) { } } +func TestDbChangeUserRole(t *testing.T) { + // Set up the initial state + db, err := setupState() + if err != nil { + t.Error("setupState failed:", err) + } + + // Add a user + err = db.AddUser("test", "password") + if err != nil { + t.Error("AddUser failed:", err) + } + + // Add a project + err = db.AddProject("test_project", "project description", "test") + if err != nil { + t.Error("AddProject failed:", err) + } + + // Change user role + err = db.ChangeUserRole("test", "test_project", "project_manager") + if err != nil { + t.Error("ChangeUserRole failed:", err) + } +} + // func TestAddTimeReport(t *testing.T) { // } diff --git a/backend/internal/database/migrations/0049_project_role.sql b/backend/internal/database/migrations/0049_project_role.sql index 8716800..f7e7151 100644 --- a/backend/internal/database/migrations/0049_project_role.sql +++ b/backend/internal/database/migrations/0049_project_role.sql @@ -5,5 +5,5 @@ CREATE TABLE IF NOT EXISTS project_role ( ); -- Insert the possible roles a user can have in a project. -INSERT OR IGNORE INTO project_role (p_role) VALUES ('admin'); +INSERT OR IGNORE INTO project_role (p_role) VALUES ('project_manager'); INSERT OR IGNORE INTO project_role (p_role) VALUES ('member'); diff --git a/backend/internal/database/migrations/0050_user_roles.sql b/backend/internal/database/migrations/0050_user_roles.sql index aad25f7..d3e614d 100644 --- a/backend/internal/database/migrations/0050_user_roles.sql +++ b/backend/internal/database/migrations/0050_user_roles.sql @@ -1,7 +1,7 @@ CREATE TABLE IF NOT EXISTS user_roles ( user_id INTEGER NOT NULL, project_id INTEGER NOT NULL, - p_role TEXT NOT NULL, -- 'admin' or 'member' + p_role TEXT NOT NULL, -- 'project_manager' or 'member' FOREIGN KEY (user_id) REFERENCES users (id) FOREIGN KEY (project_id) REFERENCES projects (id) FOREIGN KEY (p_role) REFERENCES project_role (p_role)