Compare commits
No commits in common. "dbbe4da4014cc0271a5c9428f5ce7b0d42f9322c" and "b48434603125167faba7915c32ceae374dba512b" have entirely different histories.
dbbe4da401
...
b484346031
9 changed files with 94 additions and 301 deletions
|
@ -40,7 +40,8 @@ type Database interface {
|
||||||
IsSiteAdmin(username string) (bool, error)
|
IsSiteAdmin(username string) (bool, error)
|
||||||
IsProjectManager(username string, projectname string) (bool, error)
|
IsProjectManager(username string, projectname string) (bool, error)
|
||||||
GetProjectTimes(projectName string) (map[string]int, error)
|
GetProjectTimes(projectName string) (map[string]int, error)
|
||||||
UpdateWeeklyReport(projectName string, userName string, week int, developmentTime int, meetingTime int, adminTime int, ownWorkTime int, studyTime int, testingTime int) error
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// This struct is a wrapper type that holds the database connection
|
// This struct is a wrapper type that holds the database connection
|
||||||
|
@ -453,26 +454,6 @@ func (d *Db) IsProjectManager(username string, projectname string) (bool, error)
|
||||||
return manager, err
|
return manager, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Db) UpdateWeeklyReport(projectName string, userName string, week int, developmentTime int, meetingTime int, adminTime int, ownWorkTime int, studyTime int, testingTime int) error {
|
|
||||||
query := `
|
|
||||||
UPDATE weekly_reports
|
|
||||||
SET
|
|
||||||
development_time = ?,
|
|
||||||
meeting_time = ?,
|
|
||||||
admin_time = ?,
|
|
||||||
own_work_time = ?,
|
|
||||||
study_time = ?,
|
|
||||||
testing_time = ?
|
|
||||||
WHERE
|
|
||||||
user_id = (SELECT id FROM users WHERE username = ?)
|
|
||||||
AND project_id = (SELECT id FROM projects WHERE name = ?)
|
|
||||||
AND week = ?
|
|
||||||
`
|
|
||||||
|
|
||||||
_, err := d.Exec(query, developmentTime, meetingTime, adminTime, ownWorkTime, studyTime, testingTime, userName, projectName, week)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// MigrateSampleData applies sample data to the database.
|
// MigrateSampleData applies sample data to the database.
|
||||||
func (d *Db) MigrateSampleData() error {
|
func (d *Db) MigrateSampleData() error {
|
||||||
// Insert sample data
|
// Insert sample data
|
||||||
|
|
|
@ -729,6 +729,7 @@ func TestIsProjectManager(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func TestGetProjectTimes(t *testing.T) {
|
func TestGetProjectTimes(t *testing.T) {
|
||||||
// Initialize
|
// Initialize
|
||||||
db, err := setupState()
|
db, err := setupState()
|
||||||
|
@ -846,51 +847,3 @@ func TestEnsureManagerOfCreatedProject(t *testing.T) {
|
||||||
t.Error("Expected testuser to be a project manager, but it's not.")
|
t.Error("Expected testuser to be a project manager, but it's not.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestUpdateWeeklyReport tests the UpdateWeeklyReport function of the database
|
|
||||||
func TestUpdateWeeklyReport(t *testing.T) {
|
|
||||||
db, err := setupState()
|
|
||||||
if err != nil {
|
|
||||||
t.Error("setupState failed:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a user
|
|
||||||
err = db.AddUser("testuser", "password")
|
|
||||||
if err != nil {
|
|
||||||
t.Error("AddUser failed:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a project
|
|
||||||
err = db.AddProject("testproject", "description", "testuser")
|
|
||||||
if err != nil {
|
|
||||||
t.Error("AddProject failed:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a weekly report
|
|
||||||
err = db.AddWeeklyReport("testproject", "testuser", 1, 1, 1, 1, 1, 1, 1)
|
|
||||||
if err != nil {
|
|
||||||
t.Error("AddWeeklyReport failed:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the weekly report
|
|
||||||
err = db.UpdateWeeklyReport("testproject", "testuser", 1, 2, 2, 2, 2, 2, 2)
|
|
||||||
if err != nil {
|
|
||||||
t.Error("UpdateWeeklyReport failed:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieve the updated report
|
|
||||||
updatedReport, err := db.GetWeeklyReport("testuser", "testproject", 1)
|
|
||||||
if err != nil {
|
|
||||||
t.Error("GetWeeklyReport failed:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the report was updated correctly
|
|
||||||
if updatedReport.DevelopmentTime != 2 ||
|
|
||||||
updatedReport.MeetingTime != 2 ||
|
|
||||||
updatedReport.AdminTime != 2 ||
|
|
||||||
updatedReport.OwnWorkTime != 2 ||
|
|
||||||
updatedReport.StudyTime != 2 ||
|
|
||||||
updatedReport.TestingTime != 2 {
|
|
||||||
t.Error("UpdateWeeklyReport failed: report not updated correctly")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -28,7 +28,6 @@ type GlobalState interface {
|
||||||
ProjectRoleChange(c *fiber.Ctx) error // To change a users role in a project
|
ProjectRoleChange(c *fiber.Ctx) error // To change a users role in a project
|
||||||
ChangeUserName(c *fiber.Ctx) error // WIP
|
ChangeUserName(c *fiber.Ctx) error // WIP
|
||||||
GetAllUsersProject(c *fiber.Ctx) error // WIP
|
GetAllUsersProject(c *fiber.Ctx) error // WIP
|
||||||
UpdateWeeklyReport(c *fiber.Ctx) error
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// "Constructor"
|
// "Constructor"
|
||||||
|
|
|
@ -233,57 +233,3 @@ func (gs *GState) IsProjectManagerHandler(c *fiber.Ctx) error {
|
||||||
// Return the result as JSON
|
// Return the result as JSON
|
||||||
return c.JSON(fiber.Map{"isProjectManager": isManager})
|
return c.JSON(fiber.Map{"isProjectManager": isManager})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gs *GState) GetProjectTimesHandler(c *fiber.Ctx) error {
|
|
||||||
// Get the username from the token
|
|
||||||
user := c.Locals("user").(*jwt.Token)
|
|
||||||
claims := user.Claims.(jwt.MapClaims)
|
|
||||||
username := claims["name"].(string)
|
|
||||||
|
|
||||||
// Get project
|
|
||||||
projectName := c.Params("projectName")
|
|
||||||
if projectName == "" {
|
|
||||||
log.Info("No project name provided")
|
|
||||||
return c.Status(400).SendString("No project name provided")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get all users in the project and roles
|
|
||||||
userProjects, err := gs.Db.GetAllUsersProject(projectName)
|
|
||||||
if err != nil {
|
|
||||||
log.Info("Error getting users in project:", err)
|
|
||||||
return c.Status(500).SendString(err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the user is member
|
|
||||||
isMember := false
|
|
||||||
for _, userProject := range userProjects {
|
|
||||||
if userProject.Username == username {
|
|
||||||
isMember = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the user is admin
|
|
||||||
if !isMember {
|
|
||||||
isAdmin, err := gs.Db.IsSiteAdmin(username)
|
|
||||||
if err != nil {
|
|
||||||
log.Info("Error checking admin status:", err)
|
|
||||||
return c.Status(500).SendString(err.Error())
|
|
||||||
}
|
|
||||||
if !isAdmin {
|
|
||||||
log.Info("User is neither a project member nor a site admin:", username)
|
|
||||||
return c.Status(403).SendString("User is neither a project member nor a site admin")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get project times
|
|
||||||
projectTimes, err := gs.Db.GetProjectTimes(projectName)
|
|
||||||
if err != nil {
|
|
||||||
log.Info("Error getting project times:", err)
|
|
||||||
return c.Status(500).SendString(err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return project times as JSON
|
|
||||||
log.Info("Returning project times for project:", projectName)
|
|
||||||
return c.JSON(projectTimes)
|
|
||||||
}
|
|
|
@ -141,37 +141,3 @@ func (gs *GState) GetWeeklyReportsUserHandler(c *fiber.Ctx) error {
|
||||||
// Return the list of reports as JSON
|
// Return the list of reports as JSON
|
||||||
return c.JSON(reports)
|
return c.JSON(reports)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gs *GState) UpdateWeeklyReport(c *fiber.Ctx) error {
|
|
||||||
// Extract the necessary parameters from the token
|
|
||||||
user := c.Locals("user").(*jwt.Token)
|
|
||||||
claims := user.Claims.(jwt.MapClaims)
|
|
||||||
username := claims["name"].(string)
|
|
||||||
|
|
||||||
// Parse the request body into an UpdateWeeklyReport struct
|
|
||||||
var updateReport types.UpdateWeeklyReport
|
|
||||||
if err := c.BodyParser(&updateReport); err != nil {
|
|
||||||
log.Info("Error parsing weekly report")
|
|
||||||
return c.Status(400).SendString(err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure all the fields of the report are valid
|
|
||||||
if updateReport.Week < 1 || updateReport.Week > 52 {
|
|
||||||
log.Info("Invalid week number")
|
|
||||||
return c.Status(400).SendString("Invalid week number")
|
|
||||||
}
|
|
||||||
|
|
||||||
if updateReport.DevelopmentTime < 0 || updateReport.MeetingTime < 0 || updateReport.AdminTime < 0 || updateReport.OwnWorkTime < 0 || updateReport.StudyTime < 0 || updateReport.TestingTime < 0 {
|
|
||||||
log.Info("Invalid time report")
|
|
||||||
return c.Status(400).SendString("Invalid time report")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the weekly report in the database
|
|
||||||
if err := gs.Db.UpdateWeeklyReport(updateReport.ProjectName, username, updateReport.Week, updateReport.DevelopmentTime, updateReport.MeetingTime, updateReport.AdminTime, updateReport.OwnWorkTime, updateReport.StudyTime, updateReport.TestingTime); err != nil {
|
|
||||||
log.Info("Error updating weekly report in db:", err)
|
|
||||||
return c.Status(500).SendString(err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Info("Weekly report updated")
|
|
||||||
return c.Status(200).SendString("Weekly report updated")
|
|
||||||
}
|
|
||||||
|
|
|
@ -65,24 +65,3 @@ type WeeklyReport struct {
|
||||||
// The project manager who signed it
|
// The project manager who signed it
|
||||||
SignedBy *int `json:"signedBy" db:"signed_by"`
|
SignedBy *int `json:"signedBy" db:"signed_by"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type UpdateWeeklyReport struct {
|
|
||||||
// The name of the project, as it appears in the database
|
|
||||||
ProjectName string `json:"projectName"`
|
|
||||||
// The name of the user
|
|
||||||
UserName string `json:"userName"`
|
|
||||||
// The week number
|
|
||||||
Week int `json:"week"`
|
|
||||||
// Total time spent on development
|
|
||||||
DevelopmentTime int `json:"developmentTime"`
|
|
||||||
// Total time spent in meetings
|
|
||||||
MeetingTime int `json:"meetingTime"`
|
|
||||||
// Total time spent on administrative tasks
|
|
||||||
AdminTime int `json:"adminTime"`
|
|
||||||
// Total time spent on personal projects
|
|
||||||
OwnWorkTime int `json:"ownWorkTime"`
|
|
||||||
// Total time spent on studying
|
|
||||||
StudyTime int `json:"studyTime"`
|
|
||||||
// Total time spent on testing
|
|
||||||
TestingTime int `json:"testingTime"`
|
|
||||||
}
|
|
||||||
|
|
|
@ -101,7 +101,6 @@ func main() {
|
||||||
server.Get("/api/checkIfProjectManager/:projectName", gs.IsProjectManagerHandler)
|
server.Get("/api/checkIfProjectManager/:projectName", gs.IsProjectManagerHandler)
|
||||||
server.Post("/api/ProjectRoleChange", gs.ProjectRoleChange)
|
server.Post("/api/ProjectRoleChange", gs.ProjectRoleChange)
|
||||||
server.Get("/api/getUsersProject/:projectName", gs.ListAllUsersProject)
|
server.Get("/api/getUsersProject/:projectName", gs.ListAllUsersProject)
|
||||||
server.Put("/api/updateWeeklyReport", gs.UpdateWeeklyReport)
|
|
||||||
|
|
||||||
// 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))
|
||||||
|
|
|
@ -85,7 +85,7 @@ interface API {
|
||||||
submitWeeklyReport(
|
submitWeeklyReport(
|
||||||
weeklyReport: NewWeeklyReport,
|
weeklyReport: NewWeeklyReport,
|
||||||
token: string,
|
token: string,
|
||||||
): Promise<APIResponse<string>>;
|
): Promise<APIResponse<NewWeeklyReport>>;
|
||||||
|
|
||||||
/** Gets a weekly report for a specific user, project and week
|
/** Gets a weekly report for a specific user, project and week
|
||||||
* @param {string} projectName The name of the project.
|
* @param {string} projectName The name of the project.
|
||||||
|
@ -294,7 +294,7 @@ export const api: API = {
|
||||||
async submitWeeklyReport(
|
async submitWeeklyReport(
|
||||||
weeklyReport: NewWeeklyReport,
|
weeklyReport: NewWeeklyReport,
|
||||||
token: string,
|
token: string,
|
||||||
): Promise<APIResponse<string>> {
|
): Promise<APIResponse<NewWeeklyReport>> {
|
||||||
try {
|
try {
|
||||||
const response = await fetch("/api/submitWeeklyReport", {
|
const response = await fetch("/api/submitWeeklyReport", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
|
@ -312,8 +312,8 @@ export const api: API = {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await response.text();
|
const data = (await response.json()) as NewWeeklyReport;
|
||||||
return { success: true, message: data };
|
return { success: true, data };
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return {
|
return {
|
||||||
success: false,
|
success: false,
|
||||||
|
|
30
testing.py
30
testing.py
|
@ -42,7 +42,6 @@ checkIfProjectManagerPath = base_url + "/api/checkIfProjectManager"
|
||||||
ProjectRoleChangePath = base_url + "/api/ProjectRoleChange"
|
ProjectRoleChangePath = base_url + "/api/ProjectRoleChange"
|
||||||
getUsersProjectPath = base_url + "/api/getUsersProject"
|
getUsersProjectPath = base_url + "/api/getUsersProject"
|
||||||
getChangeUserNamePath = base_url + "/api/changeUserName"
|
getChangeUserNamePath = base_url + "/api/changeUserName"
|
||||||
getUpdateWeeklyReportPath = base_url + "/api/updateWeeklyReport"
|
|
||||||
|
|
||||||
#ta bort auth i handlern för att få testet att gå igenom
|
#ta bort auth i handlern för att få testet att gå igenom
|
||||||
def test_ProjectRoleChange():
|
def test_ProjectRoleChange():
|
||||||
|
@ -434,34 +433,6 @@ def test_list_all_users_project():
|
||||||
assert response.status_code == 200, "List all users project failed"
|
assert response.status_code == 200, "List all users project failed"
|
||||||
gprint("test_list_all_users_project sucessful")
|
gprint("test_list_all_users_project sucessful")
|
||||||
|
|
||||||
def test_update_weekly_report():
|
|
||||||
# Log in as the user
|
|
||||||
token = login(username, "always_same").json()["token"]
|
|
||||||
|
|
||||||
# Prepare the JSON data for updating the weekly report
|
|
||||||
update_data = {
|
|
||||||
"projectName": projectName,
|
|
||||||
"userName": username,
|
|
||||||
"week": 1,
|
|
||||||
"developmentTime": 8,
|
|
||||||
"meetingTime": 6,
|
|
||||||
"adminTime": 4,
|
|
||||||
"ownWorkTime": 11,
|
|
||||||
"studyTime": 8,
|
|
||||||
"testingTime": 18,
|
|
||||||
}
|
|
||||||
|
|
||||||
# Send a request to update the weekly report
|
|
||||||
response = requests.put(
|
|
||||||
getUpdateWeeklyReportPath,
|
|
||||||
json=update_data,
|
|
||||||
headers={"Authorization": "Bearer " + token},
|
|
||||||
)
|
|
||||||
|
|
||||||
# Check if the update was successful
|
|
||||||
assert response.status_code == 200, "Update weekly report failed"
|
|
||||||
gprint("test_update_weekly_report successful")
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
test_get_user_projects()
|
test_get_user_projects()
|
||||||
test_create_user()
|
test_create_user()
|
||||||
|
@ -478,4 +449,3 @@ if __name__ == "__main__":
|
||||||
test_ensure_manager_of_created_project()
|
test_ensure_manager_of_created_project()
|
||||||
test_list_all_users_project()
|
test_list_all_users_project()
|
||||||
test_change_user_name()
|
test_change_user_name()
|
||||||
test_update_weekly_report()
|
|
Loading…
Reference in a new issue