diff --git a/backend/internal/database/db.go b/backend/internal/database/db.go index 82a3551..e2aa366 100644 --- a/backend/internal/database/db.go +++ b/backend/internal/database/db.go @@ -107,7 +107,10 @@ func (d *Db) GetAllProjects() ([]types.Project, error) { // 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 = ?") + err := d.Get(&project, "SELECT * FROM projects WHERE id = ?", projectId) + if err != nil { + println("Error getting project: ", err) + } return project, err } diff --git a/backend/internal/database/db_test.go b/backend/internal/database/db_test.go index 2378b3d..a7f3878 100644 --- a/backend/internal/database/db_test.go +++ b/backend/internal/database/db_test.go @@ -537,45 +537,32 @@ func TestSignWeeklyReportByAnotherProjectManager(t *testing.T) { } } -func TestIsSiteAdmin(t *testing.T) { +func TestGetProject(t *testing.T) { db, err := setupState() if err != nil { t.Error("setupState failed:", err) } - // Add a site admin - err = db.AddUser("admin", "password") + // Add a user + err = db.AddUser("testuser", "password") if err != nil { t.Error("AddUser failed:", err) } - // Promote the user to site admin - err = db.PromoteToAdmin("admin") + // Add a project + err = db.AddProject("testproject", "description", "testuser") if err != nil { - t.Error("PromoteToAdmin failed:", err) + t.Error("AddProject failed:", err) } - // Check if the user is a site admin - isAdmin, err := db.IsSiteAdmin("admin") + // Retrieve the added project + project, err := db.GetProject(1) if err != nil { - t.Error("IsSiteAdmin failed:", err) - } - if !isAdmin { - t.Error("IsSiteAdmin failed: expected true, got false") + t.Error("GetProject failed:", err) } - // Add a regular user - err = db.AddUser("regularuser", "password") - if err != nil { - t.Error("AddUser failed:", err) - } - - // Check if the regular user is not a site admin - isRegularUserAdmin, err := db.IsSiteAdmin("regularuser") - if err != nil { - t.Error("IsSiteAdmin failed:", err) - } - if isRegularUserAdmin { - t.Error("IsSiteAdmin failed: expected false, got true") + // Check if the retrieved project matches the expected values + if project.Name != "testproject" { + t.Errorf("Expected Name to be testproject, got %s", project.Name) } } diff --git a/backend/internal/handlers/global_state.go b/backend/internal/handlers/global_state.go index ef7e48d..566d549 100644 --- a/backend/internal/handlers/global_state.go +++ b/backend/internal/handlers/global_state.go @@ -17,6 +17,7 @@ type GlobalState interface { SubmitWeeklyReport(c *fiber.Ctx) error GetWeeklyReport(c *fiber.Ctx) error SignReport(c *fiber.Ctx) error + GetProject(c *fiber.Ctx) error AddUserToProjectHandler(c *fiber.Ctx) error PromoteToAdmin(c *fiber.Ctx) error // GetProject(c *fiber.Ctx) error // To get a specific project diff --git a/backend/internal/handlers/handlers_project_related.go b/backend/internal/handlers/handlers_project_related.go index 74f57f7..3732249 100644 --- a/backend/internal/handlers/handlers_project_related.go +++ b/backend/internal/handlers/handlers_project_related.go @@ -66,6 +66,10 @@ func (gs *GState) ProjectRoleChange(c *fiber.Ctx) error { func (gs *GState) GetProject(c *fiber.Ctx) error { // Extract the project ID from the request parameters or body projectID := c.Params("projectID") + if projectID == "" { + return c.Status(400).SendString("No project ID provided") + } + println("Getting project with ID: ", projectID) // Parse the project ID into an integer projectIDInt, err := strconv.Atoi(projectID) @@ -80,6 +84,7 @@ func (gs *GState) GetProject(c *fiber.Ctx) error { } // Return the project as JSON + println("Returning project: ", project.Name) return c.JSON(project) } diff --git a/backend/main.go b/backend/main.go index 7cf6c9f..3e2fb75 100644 --- a/backend/main.go +++ b/backend/main.go @@ -78,6 +78,7 @@ func main() { server.Post("/api/loginrenew", gs.LoginRenew) server.Delete("/api/userdelete/:username", gs.UserDelete) // Perhaps just use POST to avoid headaches server.Post("/api/project", gs.CreateProject) + server.Get("/api/project/:projectId", gs.GetProject) server.Get("/api/getWeeklyReport", gs.GetWeeklyReport) server.Post("/api/signReport", gs.SignReport) server.Put("/api/addUserToProject", gs.AddUserToProjectHandler) diff --git a/frontend/src/API/API.ts b/frontend/src/API/API.ts index 7a1ccd0..b512e1d 100644 --- a/frontend/src/API/API.ts +++ b/frontend/src/API/API.ts @@ -46,6 +46,13 @@ interface API { week: string, token: string, ): Promise>; + /** Gets all the projects of a user*/ + getUserProjects( + username: string, + token: string, + ): Promise>; + /** Gets a project from id*/ + getProject(id: number): Promise>; } // Export an instance of the API @@ -253,4 +260,30 @@ export const api: API = { return Promise.resolve({ success: false, message: "Failed to login" }); } }, + + // Gets a projet by id, currently untested since we have no javascript-based tests + async getProject(id: number): Promise> { + try { + const response = await fetch(`/api/project/${id}`, { + method: "GET", + }); + + if (!response.ok) { + return { + success: false, + message: "Failed to get project: Response code " + response.status, + }; + } else { + const data = (await response.json()) as Project; + return { success: true, data }; + } + // The code below is garbage but satisfies the linter + // This needs fixing, do not copy this pattern + } catch (e: unknown) { + return { + success: false, + message: "Failed to get project: " + (e as Error).toString(), + }; + } + }, }; diff --git a/testing.py b/testing.py index 164c64e..e342598 100644 --- a/testing.py +++ b/testing.py @@ -22,9 +22,13 @@ loginPath = base_url + "/api/login" addProjectPath = base_url + "/api/project" submitReportPath = base_url + "/api/submitReport" getWeeklyReportPath = base_url + "/api/getWeeklyReport" +<<<<<<< HEAD +getProjectPath = base_url + "/api/project" +======= signReportPath = base_url + "/api/signReport" addUserToProjectPath = base_url + "/api/addUserToProject" promoteToAdminPath = base_url + "/api/promoteToAdmin" +>>>>>>> 9ad89d60636ac6091d71b0bf307982becc9b89fe # Posts the username and password to the register endpoint @@ -102,6 +106,17 @@ def test_get_weekly_report(): params={"username": username, "projectName": projectName , "week": 1} ) print(response.text) + assert response.status_code == 200, "Get weekly report failed" + +# Tests getting a project by id +def test_get_project(): + token = login(username, "always_same").json()["token"] + response = requests.get( + getProjectPath + "/1", # Assumes that the project with id 1 exists + headers={"Authorization": "Bearer " + token}, + ) + print(response.text) + assert response.status_code == 200, "Get project failed" # Test function to add a user to a project def test_add_user_to_project(): @@ -217,5 +232,9 @@ if __name__ == "__main__": test_add_project() test_submit_report() test_get_weekly_report() +<<<<<<< HEAD + test_get_project() +======= test_sign_report() - test_add_user_to_project() \ No newline at end of file + test_add_user_to_project() +>>>>>>> 9ad89d60636ac6091d71b0bf307982becc9b89fe