From 2468fe8fab7a8aa112269e772fa1879f5589654c Mon Sep 17 00:00:00 2001 From: dDogge <> Date: Fri, 15 Mar 2024 15:14:45 +0100 Subject: [PATCH 01/23] Added GetProject in db.go and corresponding test --- backend/internal/database/db.go | 7 ++++++ backend/internal/database/db_test.go | 35 ++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/backend/internal/database/db.go b/backend/internal/database/db.go index b5e1981..a0cf5b9 100644 --- a/backend/internal/database/db.go +++ b/backend/internal/database/db.go @@ -28,6 +28,7 @@ type Database interface { GetAllUsersApplication() ([]string, error) GetProjectsForUser(username string) ([]types.Project, error) GetAllProjects() ([]types.Project, error) + GetProject(projectId int) (types.Project, error) GetUserRole(username string, projectname string) (string, error) } @@ -100,6 +101,12 @@ func (d *Db) GetAllProjects() ([]types.Project, error) { return projects, err } +func (d *Db) GetProject(projectId int) (types.Project, error) { + var project types.Project + err := d.Select(&project, "SELECT * FROM projects WHERE id = ?") + return project, err +} + func (d *Db) AddTimeReport(projectName string, userName string, start time.Time, end time.Time) error { // WIP _, err := d.Exec(addTimeReport, userName, projectName, start, end) return err diff --git a/backend/internal/database/db_test.go b/backend/internal/database/db_test.go index 7650739..117c08a 100644 --- a/backend/internal/database/db_test.go +++ b/backend/internal/database/db_test.go @@ -343,3 +343,38 @@ func TestGetProjectsForUser(t *testing.T) { t.Error("GetProjectsForUser failed: expected 1, got", len(projects)) } } + +func TestAddProject(t *testing.T) { + db, err := setupState() + if err != nil { + t.Error("setupState failed:", err) + } + + err = db.AddUser("testuser", "password") + if err != nil { + t.Error("AddUser failed:", err) + } + + err = db.AddProject("testproject", "description", "testuser") + if err != nil { + t.Error("AddProject failed:", err) + } + + // Retrieve the added project to verify its existence + projects, err := db.GetAllProjects() + if err != nil { + t.Error("GetAllProjects failed:", err) + } + + // Check if the project was added successfully + found := false + for _, project := range projects { + if project.Name == "testproject" { + found = true + break + } + } + if !found { + t.Error("Added project not found") + } +} From 78f5415d9abe407019c4615b94cab35634c3f303 Mon Sep 17 00:00:00 2001 From: dDogge <> Date: Fri, 15 Mar 2024 15:28:45 +0100 Subject: [PATCH 02/23] Handler for GetProject from db.go added in global_stage.go --- backend/internal/handlers/global_state.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/backend/internal/handlers/global_state.go b/backend/internal/handlers/global_state.go index fea0dfd..91d46a9 100644 --- a/backend/internal/handlers/global_state.go +++ b/backend/internal/handlers/global_state.go @@ -1,6 +1,7 @@ package handlers import ( + "strconv" "time" "ttime/internal/database" "ttime/internal/types" @@ -225,3 +226,24 @@ func (gs *GState) ProjectRoleChange(c *fiber.Ctx) error { // Return a success message return c.SendStatus(fiber.StatusOK) } + +// GetProject retrieves a specific project by its ID +func (gs *GState) GetProject(c *fiber.Ctx) error { + // Extract the project ID from the request parameters or body + projectID := c.Params("projectID") + + // Parse the project ID into an integer + projectIDInt, err := strconv.Atoi(projectID) + if err != nil { + return c.Status(400).SendString("Invalid project ID") + } + + // Get the project from the database by its ID + project, err := gs.Db.GetProject(projectIDInt) + if err != nil { + return c.Status(500).SendString(err.Error()) + } + + // Return the project as JSON + return c.JSON(project) +} From 581209742a6d2a45adcd6efdb5444b8fa94b8968 Mon Sep 17 00:00:00 2001 From: dDogge <> Date: Fri, 15 Mar 2024 15:14:45 +0100 Subject: [PATCH 03/23] Added GetProject in db.go and corresponding test --- backend/internal/database/db.go | 7 ++++++ backend/internal/database/db_test.go | 35 ++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/backend/internal/database/db.go b/backend/internal/database/db.go index b5e1981..a0cf5b9 100644 --- a/backend/internal/database/db.go +++ b/backend/internal/database/db.go @@ -28,6 +28,7 @@ type Database interface { GetAllUsersApplication() ([]string, error) GetProjectsForUser(username string) ([]types.Project, error) GetAllProjects() ([]types.Project, error) + GetProject(projectId int) (types.Project, error) GetUserRole(username string, projectname string) (string, error) } @@ -100,6 +101,12 @@ func (d *Db) GetAllProjects() ([]types.Project, error) { return projects, err } +func (d *Db) GetProject(projectId int) (types.Project, error) { + var project types.Project + err := d.Select(&project, "SELECT * FROM projects WHERE id = ?") + return project, err +} + func (d *Db) AddTimeReport(projectName string, userName string, start time.Time, end time.Time) error { // WIP _, err := d.Exec(addTimeReport, userName, projectName, start, end) return err diff --git a/backend/internal/database/db_test.go b/backend/internal/database/db_test.go index 7650739..117c08a 100644 --- a/backend/internal/database/db_test.go +++ b/backend/internal/database/db_test.go @@ -343,3 +343,38 @@ func TestGetProjectsForUser(t *testing.T) { t.Error("GetProjectsForUser failed: expected 1, got", len(projects)) } } + +func TestAddProject(t *testing.T) { + db, err := setupState() + if err != nil { + t.Error("setupState failed:", err) + } + + err = db.AddUser("testuser", "password") + if err != nil { + t.Error("AddUser failed:", err) + } + + err = db.AddProject("testproject", "description", "testuser") + if err != nil { + t.Error("AddProject failed:", err) + } + + // Retrieve the added project to verify its existence + projects, err := db.GetAllProjects() + if err != nil { + t.Error("GetAllProjects failed:", err) + } + + // Check if the project was added successfully + found := false + for _, project := range projects { + if project.Name == "testproject" { + found = true + break + } + } + if !found { + t.Error("Added project not found") + } +} From 018dc24516d5a398d3725bc68be988eb40ec9436 Mon Sep 17 00:00:00 2001 From: dDogge <> Date: Fri, 15 Mar 2024 15:28:45 +0100 Subject: [PATCH 04/23] Handler for GetProject from db.go added in global_stage.go --- backend/internal/handlers/global_state.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/backend/internal/handlers/global_state.go b/backend/internal/handlers/global_state.go index fea0dfd..91d46a9 100644 --- a/backend/internal/handlers/global_state.go +++ b/backend/internal/handlers/global_state.go @@ -1,6 +1,7 @@ package handlers import ( + "strconv" "time" "ttime/internal/database" "ttime/internal/types" @@ -225,3 +226,24 @@ func (gs *GState) ProjectRoleChange(c *fiber.Ctx) error { // Return a success message return c.SendStatus(fiber.StatusOK) } + +// GetProject retrieves a specific project by its ID +func (gs *GState) GetProject(c *fiber.Ctx) error { + // Extract the project ID from the request parameters or body + projectID := c.Params("projectID") + + // Parse the project ID into an integer + projectIDInt, err := strconv.Atoi(projectID) + if err != nil { + return c.Status(400).SendString("Invalid project ID") + } + + // Get the project from the database by its ID + project, err := gs.Db.GetProject(projectIDInt) + if err != nil { + return c.Status(500).SendString(err.Error()) + } + + // Return the project as JSON + return c.JSON(project) +} From 04e17a1721982a2fe619ad8ad56c7a8febe523b0 Mon Sep 17 00:00:00 2001 From: dDogge <> Date: Fri, 15 Mar 2024 16:57:42 +0100 Subject: [PATCH 05/23] Added comments to various functions --- backend/internal/database/db.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/backend/internal/database/db.go b/backend/internal/database/db.go index a0cf5b9..6ed5b17 100644 --- a/backend/internal/database/db.go +++ b/backend/internal/database/db.go @@ -89,29 +89,34 @@ func DbConnect(dbpath string) Database { return &Db{db} } +// GetProjectsForUser retrieves all projects associated with a specific user. func (d *Db) GetProjectsForUser(username string) ([]types.Project, error) { var projects []types.Project err := d.Select(&projects, getProjectsForUser, username) return projects, err } +// GetAllProjects retrieves all projects from the database. func (d *Db) GetAllProjects() ([]types.Project, error) { var projects []types.Project err := d.Select(&projects, "SELECT * FROM projects") return projects, err } +// GetProject retrieves a specific project by its ID. func (d *Db) GetProject(projectId int) (types.Project, error) { var project types.Project err := d.Select(&project, "SELECT * FROM projects WHERE id = ?") return project, err } +// AddTimeReport adds a time report for a specific project and user. func (d *Db) AddTimeReport(projectName string, userName string, start time.Time, end time.Time) error { // WIP _, err := d.Exec(addTimeReport, userName, projectName, start, end) return err } +// AddUserToProject adds a user to a project with a specified role. func (d *Db) AddUserToProject(username string, projectname string, role string) error { // WIP var userid int userid, err := d.GetUserId(username) @@ -129,23 +134,28 @@ func (d *Db) AddUserToProject(username string, projectname string, role string) return err3 } +// ChangeUserRole changes the role of a user within a project. func (d *Db) ChangeUserRole(username string, projectname string, role string) error { + // Get the user ID var userid int userid, err := d.GetUserId(username) if err != nil { panic(err) } + // Get the project ID var projectid int projectid, err2 := d.GetProjectId(projectname) if err2 != nil { panic(err2) } + // Execute the SQL query to change the user's role _, err3 := d.Exec(changeUserRole, role, userid, projectid) return err3 } +// GetUserRole retrieves the role of a user within a project. func (d *Db) GetUserRole(username string, projectname string) (string, error) { var role string err := d.Get(&role, "SELECT p_role FROM user_roles WHERE user_id = (SELECT id FROM users WHERE username = ?) AND project_id = (SELECT id FROM projects WHERE name = ?)", username, projectname) From 148af4e49951bcaf8df29a0f5d2dc7cc76fc2808 Mon Sep 17 00:00:00 2001 From: Mattias Date: Sat, 16 Mar 2024 02:46:58 +0100 Subject: [PATCH 06/23] Removed duplicate path --- frontend/src/main.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 29f168e..35dceea 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -57,10 +57,6 @@ const router = createBrowserRouter([ path: "/register", element: , }, - { - path: "/admin-menu", - element: , - }, { path: "/project-page", element: , From a67c44564fa85d71b57eaf3af39e718e079088c7 Mon Sep 17 00:00:00 2001 From: Mattias Date: Sat, 16 Mar 2024 02:47:17 +0100 Subject: [PATCH 07/23] Visual fixes --- frontend/src/Components/Register.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/Components/Register.tsx b/frontend/src/Components/Register.tsx index e4a3ba0..faa1a88 100644 --- a/frontend/src/Components/Register.tsx +++ b/frontend/src/Components/Register.tsx @@ -14,7 +14,7 @@ export default function Register(): JSX.Element { }; return ( -
+
{ setPassword(e.target.value); From d227ffc6ae323b84c248debbe60081a6c1ac13e9 Mon Sep 17 00:00:00 2001 From: Mattias Date: Sat, 16 Mar 2024 02:47:39 +0100 Subject: [PATCH 08/23] Added the register component to content --- frontend/src/Pages/AdminPages/AdminAddUser.tsx | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/frontend/src/Pages/AdminPages/AdminAddUser.tsx b/frontend/src/Pages/AdminPages/AdminAddUser.tsx index 5e8c01f..c0f9492 100644 --- a/frontend/src/Pages/AdminPages/AdminAddUser.tsx +++ b/frontend/src/Pages/AdminPages/AdminAddUser.tsx @@ -1,18 +1,16 @@ import BasicWindow from "../../Components/BasicWindow"; import Button from "../../Components/Button"; +import Register from "../../Components/Register"; function AdminAddUser(): JSX.Element { - const content = <>; + const content = ( + <> + + + ); const buttons = ( <> -
+
); } - -export default NewTimeReport; From 87c044b5bfe2aadf44576bc0ae6991c52f4ffe0d Mon Sep 17 00:00:00 2001 From: Mattias Date: Sat, 16 Mar 2024 13:11:26 +0100 Subject: [PATCH 10/23] Submit-button has been moved to the timereport --- frontend/src/Pages/UserPages/UserNewTimeReportPage.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/frontend/src/Pages/UserPages/UserNewTimeReportPage.tsx b/frontend/src/Pages/UserPages/UserNewTimeReportPage.tsx index c93527a..ca84770 100644 --- a/frontend/src/Pages/UserPages/UserNewTimeReportPage.tsx +++ b/frontend/src/Pages/UserPages/UserNewTimeReportPage.tsx @@ -13,13 +13,6 @@ function UserNewTimeReportPage(): JSX.Element { const buttons = ( <> -
+ ); } - -export default NewTimeReport; From f3c5ce57ebe139c091ab9236a2915ff891c7131d Mon Sep 17 00:00:00 2001 From: Mattias Date: Sat, 16 Mar 2024 13:11:26 +0100 Subject: [PATCH 21/23] Submit-button has been moved to the timereport --- frontend/src/Pages/UserPages/UserNewTimeReportPage.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/frontend/src/Pages/UserPages/UserNewTimeReportPage.tsx b/frontend/src/Pages/UserPages/UserNewTimeReportPage.tsx index c93527a..ca84770 100644 --- a/frontend/src/Pages/UserPages/UserNewTimeReportPage.tsx +++ b/frontend/src/Pages/UserPages/UserNewTimeReportPage.tsx @@ -13,13 +13,6 @@ function UserNewTimeReportPage(): JSX.Element { const buttons = ( <> -