Merge branch 'frontend' into gruppPP
This commit is contained in:
commit
516784c6bb
12 changed files with 280 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", {
|
||||||
|
|
|
@ -6,12 +6,23 @@ import Button from "./Button";
|
||||||
import InputField from "./InputField";
|
import InputField from "./InputField";
|
||||||
|
|
||||||
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…
Reference in a new issue