Merge branch 'frontend' into gruppDM
This commit is contained in:
		
						commit
						ba58fea1e3
					
				
					 12 changed files with 281 additions and 111 deletions
				
			
		|  | @ -2,6 +2,7 @@ package database | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"embed" | 	"embed" | ||||||
|  | 	"errors" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"ttime/internal/types" | 	"ttime/internal/types" | ||||||
| 
 | 
 | ||||||
|  | @ -30,6 +31,7 @@ type Database interface { | ||||||
| 	GetProject(projectId int) (types.Project, error) | 	GetProject(projectId int) (types.Project, error) | ||||||
| 	GetUserRole(username string, projectname string) (string, error) | 	GetUserRole(username string, projectname string) (string, error) | ||||||
| 	GetWeeklyReport(username string, projectName string, week int) (types.WeeklyReport, error) | 	GetWeeklyReport(username string, projectName string, week int) (types.WeeklyReport, error) | ||||||
|  | 	SignWeeklyReport(reportId int, projectManagerId int) error | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // This struct is a wrapper type that holds the database connection | // This struct is a wrapper type that holds the database connection | ||||||
|  | @ -270,7 +272,8 @@ func (d *Db) GetWeeklyReport(username string, projectName string, week int) (typ | ||||||
|             admin_time, |             admin_time, | ||||||
|             own_work_time, |             own_work_time, | ||||||
|             study_time, |             study_time, | ||||||
|             testing_time |             testing_time, | ||||||
|  | 			signed_by | ||||||
|         FROM |         FROM | ||||||
|             weekly_reports |             weekly_reports | ||||||
|         WHERE |         WHERE | ||||||
|  | @ -282,6 +285,34 @@ func (d *Db) GetWeeklyReport(username string, projectName string, week int) (typ | ||||||
| 	return report, err | 	return report, err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // SignWeeklyReport signs a weekly report by updating the signed_by field | ||||||
|  | // with the provided project manager's ID, but only if the project manager | ||||||
|  | // is in the same project as the report | ||||||
|  | func (d *Db) SignWeeklyReport(reportId int, projectManagerId int) error { | ||||||
|  | 	// Retrieve the project ID associated with the report | ||||||
|  | 	var reportProjectID int | ||||||
|  | 	err := d.Get(&reportProjectID, "SELECT project_id FROM weekly_reports WHERE report_id = ?", reportId) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Retrieve the project ID associated with the project manager | ||||||
|  | 	var managerProjectID int | ||||||
|  | 	err = d.Get(&managerProjectID, "SELECT project_id FROM user_roles WHERE user_id = ? AND p_role = 'project_manager'", projectManagerId) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Check if the project manager is in the same project as the report | ||||||
|  | 	if reportProjectID != managerProjectID { | ||||||
|  | 		return errors.New("project manager doesn't have permission to sign the report") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Update the signed_by field of the specified report | ||||||
|  | 	_, err = d.Exec("UPDATE weekly_reports SET signed_by = ? WHERE report_id = ?", projectManagerId, reportId) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Reads a directory of migration files and applies them to the database. | // Reads a directory of migration files and applies them to the database. | ||||||
| // This will eventually be used on an embedded directory | // This will eventually be used on an embedded directory | ||||||
| func (d *Db) Migrate() error { | func (d *Db) Migrate() error { | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| package database | package database | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"fmt" | ||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -410,3 +411,128 @@ func TestGetWeeklyReport(t *testing.T) { | ||||||
| 	} | 	} | ||||||
| 	// Check other fields similarly | 	// Check other fields similarly | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func TestSignWeeklyReport(t *testing.T) { | ||||||
|  | 	db, err := setupState() | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("setupState failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Add project manager | ||||||
|  | 	err = db.AddUser("projectManager", "password") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("AddUser failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Add a regular user | ||||||
|  | 	err = db.AddUser("testuser", "password") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("AddUser failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Add project | ||||||
|  | 	err = db.AddProject("testproject", "description", "projectManager") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("AddProject failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Add both regular users as members to the project | ||||||
|  | 	err = db.AddUserToProject("testuser", "testproject", "member") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("AddUserToProject failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	err = db.AddUserToProject("projectManager", "testproject", "project_manager") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("AddUserToProject failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Add a weekly report for one of the regular users | ||||||
|  | 	err = db.AddWeeklyReport("testproject", "testuser", 1, 1, 1, 1, 1, 1, 1) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("AddWeeklyReport failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Retrieve the added report | ||||||
|  | 	report, err := db.GetWeeklyReport("testuser", "testproject", 1) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("GetWeeklyReport failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Print project manager's ID | ||||||
|  | 	projectManagerID, err := db.GetUserId("projectManager") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("GetUserId failed:", err) | ||||||
|  | 	} | ||||||
|  | 	fmt.Println("Project Manager's ID:", projectManagerID) | ||||||
|  | 
 | ||||||
|  | 	// Sign the report with the project manager | ||||||
|  | 	err = db.SignWeeklyReport(report.ReportId, projectManagerID) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("SignWeeklyReport failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Retrieve the report again to check if it's signed | ||||||
|  | 	signedReport, err := db.GetWeeklyReport("testuser", "testproject", 1) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("GetWeeklyReport failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Ensure the report is signed by the project manager | ||||||
|  | 	if *signedReport.SignedBy != projectManagerID { | ||||||
|  | 		t.Errorf("Expected SignedBy to be %d, got %d", projectManagerID, *signedReport.SignedBy) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestSignWeeklyReportByAnotherProjectManager(t *testing.T) { | ||||||
|  | 	db, err := setupState() | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("setupState failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Add project manager | ||||||
|  | 	err = db.AddUser("projectManager", "password") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("AddUser failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Add a regular user | ||||||
|  | 	err = db.AddUser("testuser", "password") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("AddUser failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Add project | ||||||
|  | 	err = db.AddProject("testproject", "description", "projectManager") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("AddProject failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Add the regular user as a member to the project | ||||||
|  | 	err = db.AddUserToProject("testuser", "testproject", "member") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("AddUserToProject failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Add a weekly report for the regular user | ||||||
|  | 	err = db.AddWeeklyReport("testproject", "testuser", 1, 1, 1, 1, 1, 1, 1) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("AddWeeklyReport failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Retrieve the added report | ||||||
|  | 	report, err := db.GetWeeklyReport("testuser", "testproject", 1) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("GetWeeklyReport failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	anotherManagerID, err := db.GetUserId("projectManager") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error("GetUserId failed:", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	err = db.SignWeeklyReport(report.ReportId, anotherManagerID) | ||||||
|  | 	if err == nil { | ||||||
|  | 		t.Error("Expected SignWeeklyReport to fail with a project manager who is not in the project, but it didn't") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| CREATE TABLE weekly_reports ( | CREATE TABLE IF NOT EXISTS weekly_reports ( | ||||||
|   report_id INTEGER PRIMARY KEY AUTOINCREMENT, |   report_id INTEGER PRIMARY KEY AUTOINCREMENT, | ||||||
|   user_id INTEGER NOT NULL, |   user_id INTEGER NOT NULL, | ||||||
|   project_id INTEGER NOT NULL, |   project_id INTEGER NOT NULL, | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ type GlobalState interface { | ||||||
| 	GetUserProjects(c *fiber.Ctx) error // To get all projects | 	GetUserProjects(c *fiber.Ctx) error // To get all projects | ||||||
| 	SubmitWeeklyReport(c *fiber.Ctx) error | 	SubmitWeeklyReport(c *fiber.Ctx) error | ||||||
| 	GetWeeklyReport(c *fiber.Ctx) error | 	GetWeeklyReport(c *fiber.Ctx) error | ||||||
|  | 	SignReport(c *fiber.Ctx) error | ||||||
| 	// GetProject(c *fiber.Ctx) error           // To get a specific project | 	// GetProject(c *fiber.Ctx) error           // To get a specific project | ||||||
| 	// UpdateProject(c *fiber.Ctx) error        // To update a project | 	// UpdateProject(c *fiber.Ctx) error        // To update a project | ||||||
| 	// DeleteProject(c *fiber.Ctx) error        // To delete a project | 	// DeleteProject(c *fiber.Ctx) error        // To delete a project | ||||||
|  |  | ||||||
|  | @ -37,13 +37,16 @@ func (gs *GState) SubmitWeeklyReport(c *fiber.Ctx) error { | ||||||
| // Handler for retrieving weekly report | // Handler for retrieving weekly report | ||||||
| func (gs *GState) GetWeeklyReport(c *fiber.Ctx) error { | func (gs *GState) GetWeeklyReport(c *fiber.Ctx) error { | ||||||
| 	// Extract the necessary parameters from the request | 	// Extract the necessary parameters from the request | ||||||
|  | 	println("GetWeeklyReport") | ||||||
| 	user := c.Locals("user").(*jwt.Token) | 	user := c.Locals("user").(*jwt.Token) | ||||||
| 	claims := user.Claims.(jwt.MapClaims) | 	claims := user.Claims.(jwt.MapClaims) | ||||||
| 	username := claims["name"].(string) | 	username := claims["name"].(string) | ||||||
| 
 | 
 | ||||||
| 	// Extract project name and week from query parameters | 	// Extract project name and week from query parameters | ||||||
| 	projectName := c.Query("projectName") | 	projectName := c.Query("projectName") | ||||||
|  | 	println(projectName) | ||||||
| 	week := c.Query("week") | 	week := c.Query("week") | ||||||
|  | 	println(week) | ||||||
| 
 | 
 | ||||||
| 	// Convert week to integer | 	// Convert week to integer | ||||||
| 	weekInt, err := strconv.Atoi(week) | 	weekInt, err := strconv.Atoi(week) | ||||||
|  | @ -60,3 +63,31 @@ func (gs *GState) GetWeeklyReport(c *fiber.Ctx) error { | ||||||
| 	// Return the retrieved weekly report | 	// Return the retrieved weekly report | ||||||
| 	return c.JSON(report) | 	return c.JSON(report) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (gs *GState) SignReport(c *fiber.Ctx) error { | ||||||
|  | 	// Extract the necessary parameters from the token | ||||||
|  | 	user := c.Locals("user").(*jwt.Token) | ||||||
|  | 	claims := user.Claims.(jwt.MapClaims) | ||||||
|  | 	managerUsername := claims["name"].(string) | ||||||
|  | 
 | ||||||
|  | 	// Extract the report ID and project manager ID from request parameters | ||||||
|  | 	reportID, err := strconv.Atoi(c.Params("reportId")) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return c.Status(400).SendString("Invalid report ID") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Call the database function to get the project manager ID | ||||||
|  | 	managerID, err := gs.Db.GetUserId(managerUsername) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return c.Status(500).SendString("Failed to get project manager ID") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Call the database function to sign the weekly report | ||||||
|  | 	err = gs.Db.SignWeeklyReport(reportID, managerID) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return c.Status(500).SendString("Failed to sign the weekly report: " + err.Error()) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Return success response | ||||||
|  | 	return c.Status(200).SendString("Weekly report signed successfully") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -22,13 +22,16 @@ import ( | ||||||
| func (gs *GState) Register(c *fiber.Ctx) error { | func (gs *GState) Register(c *fiber.Ctx) error { | ||||||
| 	u := new(types.NewUser) | 	u := new(types.NewUser) | ||||||
| 	if err := c.BodyParser(u); err != nil { | 	if err := c.BodyParser(u); err != nil { | ||||||
|  | 		println("Error parsing body") | ||||||
| 		return c.Status(400).SendString(err.Error()) | 		return c.Status(400).SendString(err.Error()) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	println("Adding user:", u.Username) | ||||||
| 	if err := gs.Db.AddUser(u.Username, u.Password); err != nil { | 	if err := gs.Db.AddUser(u.Username, u.Password); err != nil { | ||||||
| 		return c.Status(500).SendString(err.Error()) | 		return c.Status(500).SendString(err.Error()) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	println("User added:", u.Username) | ||||||
| 	return c.Status(200).SendString("User added") | 	return c.Status(200).SendString("User added") | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -41,4 +41,6 @@ type WeeklyReport struct { | ||||||
| 	StudyTime int `json:"studyTime" db:"study_time"` | 	StudyTime int `json:"studyTime" db:"study_time"` | ||||||
| 	// Total time spent on testing | 	// Total time spent on testing | ||||||
| 	TestingTime int `json:"testingTime" db:"testing_time"` | 	TestingTime int `json:"testingTime" db:"testing_time"` | ||||||
|  | 	// The project manager who signed it | ||||||
|  | 	SignedBy *int `json:"signedBy" db:"signed_by"` | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -78,6 +78,7 @@ func main() { | ||||||
| 	server.Post("/api/loginrenew", gs.LoginRenew) | 	server.Post("/api/loginrenew", gs.LoginRenew) | ||||||
| 	server.Delete("/api/userdelete/:username", gs.UserDelete) // Perhaps just use POST to avoid headaches | 	server.Delete("/api/userdelete/:username", gs.UserDelete) // Perhaps just use POST to avoid headaches | ||||||
| 	server.Post("/api/project", gs.CreateProject) | 	server.Post("/api/project", gs.CreateProject) | ||||||
|  | 	server.Get("/api/getWeeklyReport", gs.GetWeeklyReport) | ||||||
| 
 | 
 | ||||||
| 	// Announce the port we are listening on and start the server | 	// Announce the port we are listening on and start the server | ||||||
| 	err = server.Listen(fmt.Sprintf(":%d", conf.Port)) | 	err = server.Listen(fmt.Sprintf(":%d", conf.Port)) | ||||||
|  |  | ||||||
|  | @ -1,87 +0,0 @@ | ||||||
| import { describe, expect, test } from "@jest/globals"; |  | ||||||
| import { api } from "../API/API"; |  | ||||||
| import { NewUser, NewWeeklyReport } from "../Types/goTypes"; |  | ||||||
| 
 |  | ||||||
| describe("API", () => { |  | ||||||
|   test("registerUser", async () => { |  | ||||||
|     const user: NewUser = { |  | ||||||
|       username: "lol", // Add the username property
 |  | ||||||
|       password: "lol", |  | ||||||
|     }; |  | ||||||
|     const response = await api.registerUser(user); |  | ||||||
|     console.log(response.message); |  | ||||||
|     expect(response.success).toBe(true); |  | ||||||
|     expect(response.data).toHaveProperty("userId"); |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   test("createProject", async () => { |  | ||||||
|     const project = { |  | ||||||
|       name: "Project X", |  | ||||||
|       description: "This is a test project", |  | ||||||
|     }; |  | ||||||
|     const token = |  | ||||||
|       "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ZmFsc2UsImV4cCI6MTcxMDk0MDIwMywibmFtZSI6InJyZ3VtZHpwbWMifQ.V9NHoYMYV61t"; |  | ||||||
| 
 |  | ||||||
|     const response = await api.createProject(project, token); |  | ||||||
|     console.log(response.message); |  | ||||||
|     expect(response.success).toBe(true); |  | ||||||
|     expect(response.data).toHaveProperty("projectId"); |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   test("renewToken", async () => { |  | ||||||
|     const refreshToken = |  | ||||||
|       "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ZmFsc2UsImV4cCI6MTcxMDk0MDIwMywibmFtZSI6InJyZ3VtZHpwbWMifQ.V9NHoYMYV61t"; |  | ||||||
| 
 |  | ||||||
|     const response = await api.renewToken(refreshToken); |  | ||||||
|     console.log(response.message); |  | ||||||
|     expect(response.success).toBe(true); |  | ||||||
|     expect(response.data).toHaveProperty("accessToken"); |  | ||||||
|     expect(response.data).toHaveProperty("refreshToken"); |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   test("getUserProjects", async () => { |  | ||||||
|     const token = |  | ||||||
|       "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ZmFsc2UsImV4cCI6MTcxMDk0MDIwMywibmFtZSI6InJyZ3VtZHpwbWMifQ.V9NHoYMYV61t"; |  | ||||||
|     const username = "rrgumdzpmc"; |  | ||||||
|     const response = await api.getUserProjects(username, token); |  | ||||||
|     console.log(response.message); |  | ||||||
|     expect(response.success).toBe(true); |  | ||||||
|     expect(response.data).toHaveProperty("projects"); |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   test("submitWeeklyReport", async () => { |  | ||||||
|     const report: NewWeeklyReport = { |  | ||||||
|       projectName: "vtmosxssst", |  | ||||||
|       week: 2, |  | ||||||
|       developmentTime: 40, |  | ||||||
|       meetingTime: 5, |  | ||||||
|       adminTime: 2, |  | ||||||
|       ownWorkTime: 10, |  | ||||||
|       studyTime: 12, |  | ||||||
|       testingTime: 41, |  | ||||||
|     }; |  | ||||||
|     const token = |  | ||||||
|       "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ZmFsc2UsImV4cCI6MTcxMDk0MDIwMywibmFtZSI6InJyZ3VtZHpwbWMifQ.V9NHoYMYV61t"; |  | ||||||
| 
 |  | ||||||
|     const response = await api.submitWeeklyReport(report, token); |  | ||||||
|     console.log(response.message); |  | ||||||
|     expect(response.success).toBe(true); |  | ||||||
|     expect(response.data).toHaveProperty( |  | ||||||
|       "message", |  | ||||||
|       "Report submitted successfully", |  | ||||||
|     ); |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   test("login", async () => { |  | ||||||
|     const user: NewUser = { |  | ||||||
|       username: "rrgumdzpmc", // Add an empty string value for the username property
 |  | ||||||
|       password: "always_same", |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     const response = await api.login(user); |  | ||||||
|     console.log(response.message); |  | ||||||
|     expect(response.success).toBe(true); |  | ||||||
|     expect(response.data).toHaveProperty("accessToken"); |  | ||||||
|     expect(response.data).toHaveProperty("refreshToken"); |  | ||||||
|   }); |  | ||||||
| }); |  | ||||||
|  | @ -20,25 +20,32 @@ interface API { | ||||||
|   registerUser(user: NewUser): Promise<APIResponse<User>>; |   registerUser(user: NewUser): Promise<APIResponse<User>>; | ||||||
|   /** Remove a user */ |   /** Remove a user */ | ||||||
|   removeUser(username: string, token: string): Promise<APIResponse<User>>; |   removeUser(username: string, token: string): Promise<APIResponse<User>>; | ||||||
|  |   /** Login */ | ||||||
|  |   login(NewUser: NewUser): Promise<APIResponse<string>>; | ||||||
|  |   /** Renew the token */ | ||||||
|  |   renewToken(token: string): Promise<APIResponse<string>>; | ||||||
|   /** Create a project */ |   /** Create a project */ | ||||||
|   createProject( |   createProject( | ||||||
|     project: NewProject, |     project: NewProject, | ||||||
|     token: string, |     token: string, | ||||||
|   ): Promise<APIResponse<Project>>; |   ): Promise<APIResponse<Project>>; | ||||||
|   /** Submit a weekly report */ |  | ||||||
|   submitWeeklyReport( |  | ||||||
|     project: NewWeeklyReport, |  | ||||||
|     token: string, |  | ||||||
|   ): Promise<APIResponse<Project>>; |  | ||||||
|   /** Renew the token */ |  | ||||||
|   renewToken(token: string): Promise<APIResponse<string>>; |  | ||||||
|   /** Gets all the projects of a user*/ |   /** Gets all the projects of a user*/ | ||||||
|   getUserProjects( |   getUserProjects( | ||||||
|     username: string, |     username: string, | ||||||
|     token: string, |     token: string, | ||||||
|   ): Promise<APIResponse<Project[]>>; |   ): Promise<APIResponse<Project[]>>; | ||||||
|   /** Login */ |   /** Submit a weekly report */ | ||||||
|   login(NewUser: NewUser): Promise<APIResponse<string>>; |   submitWeeklyReport( | ||||||
|  |     project: NewWeeklyReport, | ||||||
|  |     token: string, | ||||||
|  |   ): Promise<APIResponse<NewWeeklyReport>>; | ||||||
|  |   /**Gets a weekly report*/ | ||||||
|  |   getWeeklyReport( | ||||||
|  |     username: string, | ||||||
|  |     projectName: string, | ||||||
|  |     week: string, | ||||||
|  |     token: string, | ||||||
|  |   ): Promise<APIResponse<NewWeeklyReport>>; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Export an instance of the API
 | // Export an instance of the API
 | ||||||
|  | @ -54,13 +61,19 @@ export const api: API = { | ||||||
|       }); |       }); | ||||||
| 
 | 
 | ||||||
|       if (!response.ok) { |       if (!response.ok) { | ||||||
|         return { success: false, message: "Failed to register user" }; |         return { | ||||||
|  |           success: false, | ||||||
|  |           message: "Failed to register user: " + response.status, | ||||||
|  |         }; | ||||||
|       } else { |       } else { | ||||||
|         const data = (await response.json()) as User; |         // const data = (await response.json()) as User; // The API does not currently return the user
 | ||||||
|         return { success: true, data }; |         return { success: true }; | ||||||
|       } |       } | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
|       return { success: false, message: "Failed to register user" }; |       return { | ||||||
|  |         success: false, | ||||||
|  |         message: "Unknown error while registering user", | ||||||
|  |       }; | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|  | @ -163,9 +176,9 @@ export const api: API = { | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|   async submitWeeklyReport( |   async submitWeeklyReport( | ||||||
|     project: NewWeeklyReport, |     weeklyReport: NewWeeklyReport, | ||||||
|     token: string, |     token: string, | ||||||
|   ): Promise<APIResponse<Project>> { |   ): Promise<APIResponse<NewWeeklyReport>> { | ||||||
|     try { |     try { | ||||||
|       const response = await fetch("/api/submitWeeklyReport", { |       const response = await fetch("/api/submitWeeklyReport", { | ||||||
|         method: "POST", |         method: "POST", | ||||||
|  | @ -173,7 +186,7 @@ export const api: API = { | ||||||
|           "Content-Type": "application/json", |           "Content-Type": "application/json", | ||||||
|           Authorization: "Bearer " + token, |           Authorization: "Bearer " + token, | ||||||
|         }, |         }, | ||||||
|         body: JSON.stringify(project), |         body: JSON.stringify(weeklyReport), | ||||||
|       }); |       }); | ||||||
| 
 | 
 | ||||||
|       if (!response.ok) { |       if (!response.ok) { | ||||||
|  | @ -183,7 +196,7 @@ export const api: API = { | ||||||
|         }; |         }; | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       const data = (await response.json()) as Project; |       const data = (await response.json()) as NewWeeklyReport; | ||||||
|       return { success: true, data }; |       return { success: true, data }; | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
|       return { |       return { | ||||||
|  | @ -193,6 +206,33 @@ export const api: API = { | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|  |   async getWeeklyReport( | ||||||
|  |     username: string, | ||||||
|  |     projectName: string, | ||||||
|  |     week: string, | ||||||
|  |     token: string, | ||||||
|  |   ): Promise<APIResponse<NewWeeklyReport>> { | ||||||
|  |     try { | ||||||
|  |       const response = await fetch("/api/getWeeklyReport", { | ||||||
|  |         method: "GET", | ||||||
|  |         headers: { | ||||||
|  |           "Content-Type": "application/json", | ||||||
|  |           Authorization: "Bearer " + token, | ||||||
|  |         }, | ||||||
|  |         body: JSON.stringify({ username, projectName, week }), | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       if (!response.ok) { | ||||||
|  |         return { success: false, message: "Failed to get weekly report" }; | ||||||
|  |       } else { | ||||||
|  |         const data = (await response.json()) as NewWeeklyReport; | ||||||
|  |         return { success: true, data }; | ||||||
|  |       } | ||||||
|  |     } catch (e) { | ||||||
|  |       return { success: false, message: "Failed to get weekly report" }; | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|   async login(NewUser: NewUser): Promise<APIResponse<string>> { |   async login(NewUser: NewUser): Promise<APIResponse<string>> { | ||||||
|     try { |     try { | ||||||
|       const response = await fetch("/api/login", { |       const response = await fetch("/api/login", { | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ import { NewUser } from "../Types/goTypes"; | ||||||
| import { api } from "../API/API"; | import { api } from "../API/API"; | ||||||
| import Logo from "../assets/Logo.svg"; | import Logo from "../assets/Logo.svg"; | ||||||
| import Button from "./Button"; | import Button from "./Button"; | ||||||
|  | import { useNavigate } from "react-router-dom"; | ||||||
| 
 | 
 | ||||||
| function InputField(props: { | function InputField(props: { | ||||||
|   label: string; |   label: string; | ||||||
|  | @ -31,12 +32,23 @@ function InputField(props: { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export default function Register(): JSX.Element { | export default function Register(): JSX.Element { | ||||||
|   const [username, setUsername] = useState(""); |   const [username, setUsername] = useState<string>(); | ||||||
|   const [password, setPassword] = useState(""); |   const [password, setPassword] = useState<string>(); | ||||||
|  |   const [errMessage, setErrMessage] = useState<string>(); | ||||||
|  | 
 | ||||||
|  |   const nav = useNavigate(); | ||||||
| 
 | 
 | ||||||
|   const handleRegister = async (): Promise<void> => { |   const handleRegister = async (): Promise<void> => { | ||||||
|     const newUser: NewUser = { username: username, password }; |     const newUser: NewUser = { | ||||||
|     await api.registerUser(newUser); // TODO: Handle errors
 |       username: username ?? "", | ||||||
|  |       password: password ?? "", | ||||||
|  |     }; | ||||||
|  |     const response = await api.registerUser(newUser); | ||||||
|  |     if (response.success) { | ||||||
|  |       nav("/"); // Instantly navigate to the login page
 | ||||||
|  |     } else { | ||||||
|  |       setErrMessage(response.message ?? "Unknown error"); | ||||||
|  |     } | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   return ( |   return ( | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								testing.py
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								testing.py
									
										
									
									
									
								
							|  | @ -21,6 +21,7 @@ registerPath = base_url + "/api/register" | ||||||
| loginPath = base_url + "/api/login" | loginPath = base_url + "/api/login" | ||||||
| addProjectPath = base_url + "/api/project" | addProjectPath = base_url + "/api/project" | ||||||
| submitReportPath = base_url + "/api/submitReport" | submitReportPath = base_url + "/api/submitReport" | ||||||
|  | getWeeklyReportPath = base_url + "/api/getWeeklyReport" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # Posts the username and password to the register endpoint | # Posts the username and password to the register endpoint | ||||||
|  | @ -74,7 +75,7 @@ def test_submit_report(): | ||||||
|     response = requests.post( |     response = requests.post( | ||||||
|         submitReportPath, |         submitReportPath, | ||||||
|         json={ |         json={ | ||||||
|             "projectName": "report1", |             "projectName": projectName, | ||||||
|             "week": 1, |             "week": 1, | ||||||
|             "developmentTime": 10, |             "developmentTime": 10, | ||||||
|             "meetingTime": 5, |             "meetingTime": 5, | ||||||
|  | @ -89,9 +90,18 @@ def test_submit_report(): | ||||||
|     assert response.status_code == 200, "Submit report failed" |     assert response.status_code == 200, "Submit report failed" | ||||||
|     print("Submit report successful") |     print("Submit report successful") | ||||||
| 
 | 
 | ||||||
|  | def test_get_weekly_report(): | ||||||
|  |     token = login(username, "always_same").json()["token"] | ||||||
|  |     response = requests.get( | ||||||
|  |         getWeeklyReportPath, | ||||||
|  |         headers={"Authorization": "Bearer " + token}, | ||||||
|  |         params={"username": username, "projectName": projectName , "week": 1} | ||||||
|  |     ) | ||||||
|  |     print(response.text) | ||||||
| 
 | 
 | ||||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||||
|     test_create_user() |     test_create_user() | ||||||
|     test_login() |     test_login() | ||||||
|     test_add_project() |     test_add_project() | ||||||
|     test_submit_report() |     test_submit_report() | ||||||
|  |     test_get_weekly_report() | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Davenludd
						Davenludd