Merge branch 'dev' into gruppPP
This commit is contained in:
commit
ae96f67630
5 changed files with 105 additions and 14 deletions
|
@ -3,6 +3,7 @@ package database
|
||||||
import (
|
import (
|
||||||
"embed"
|
"embed"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"ttime/internal/types"
|
"ttime/internal/types"
|
||||||
|
|
||||||
|
@ -19,6 +20,7 @@ type Database interface {
|
||||||
PromoteToAdmin(username string) error
|
PromoteToAdmin(username string) error
|
||||||
GetUserId(username string) (int, error)
|
GetUserId(username string) (int, error)
|
||||||
AddProject(name string, description string, username string) error
|
AddProject(name string, description string, username string) error
|
||||||
|
DeleteProject(name string, username string) error
|
||||||
Migrate() error
|
Migrate() error
|
||||||
MigrateSampleData() error
|
MigrateSampleData() error
|
||||||
GetProjectId(projectname string) (int, error)
|
GetProjectId(projectname string) (int, error)
|
||||||
|
@ -70,6 +72,8 @@ const getProjectsForUser = `SELECT p.id, p.name, p.description FROM projects p
|
||||||
JOIN user_roles ur ON p.id = ur.project_id
|
JOIN user_roles ur ON p.id = ur.project_id
|
||||||
JOIN users u ON ur.user_id = u.id
|
JOIN users u ON ur.user_id = u.id
|
||||||
WHERE u.username = ?`
|
WHERE u.username = ?`
|
||||||
|
const deleteProject = `DELETE FROM projects
|
||||||
|
WHERE id = ? AND owner_username = ?`
|
||||||
|
|
||||||
// DbConnect connects to the database
|
// DbConnect connects to the database
|
||||||
func DbConnect(dbpath string) Database {
|
func DbConnect(dbpath string) Database {
|
||||||
|
@ -225,6 +229,21 @@ func (d *Db) AddProject(name string, description string, username string) error
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Db) DeleteProject(projectID string, username string) error {
|
||||||
|
tx := d.MustBegin()
|
||||||
|
|
||||||
|
_, err := tx.Exec(deleteProject, projectID, username)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
if rollbackErr := tx.Rollback(); rollbackErr != nil {
|
||||||
|
return fmt.Errorf("error rolling back transaction: %v, delete error: %v", rollbackErr, err)
|
||||||
|
}
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Db) GetAllUsersProject(projectname string) ([]UserProjectMember, error) {
|
func (d *Db) GetAllUsersProject(projectname string) ([]UserProjectMember, error) {
|
||||||
// Define the SQL query to fetch users and their roles for a given project
|
// Define the SQL query to fetch users and their roles for a given project
|
||||||
query := `
|
query := `
|
||||||
|
|
|
@ -22,20 +22,19 @@ type GlobalState interface {
|
||||||
PromoteToAdmin(c *fiber.Ctx) error
|
PromoteToAdmin(c *fiber.Ctx) error
|
||||||
GetWeeklyReportsUserHandler(c *fiber.Ctx) error
|
GetWeeklyReportsUserHandler(c *fiber.Ctx) error
|
||||||
IsProjectManagerHandler(c *fiber.Ctx) error
|
IsProjectManagerHandler(c *fiber.Ctx) error
|
||||||
// GetProject(c *fiber.Ctx) error // To get a specific project
|
// UpdateProject(c *fiber.Ctx) error // To update a project // WIP
|
||||||
// UpdateProject(c *fiber.Ctx) error // To update a project
|
DeleteProject(c *fiber.Ctx) error // To delete a project // WIP
|
||||||
// DeleteProject(c *fiber.Ctx) error // To delete a project
|
// CreateTask(c *fiber.Ctx) error // To create a new task // WIP
|
||||||
// CreateTask(c *fiber.Ctx) error // To create a new task
|
// GetTasks(c *fiber.Ctx) error // To get all tasks // WIP
|
||||||
// GetTasks(c *fiber.Ctx) error // To get all tasks
|
// GetTask(c *fiber.Ctx) error // To get a specific task // WIP
|
||||||
// GetTask(c *fiber.Ctx) error // To get a specific task
|
// UpdateTask(c *fiber.Ctx) error // To update a task // WIP
|
||||||
// UpdateTask(c *fiber.Ctx) error // To update a task
|
// DeleteTask(c *fiber.Ctx) error // To delete a task // WIP
|
||||||
// DeleteTask(c *fiber.Ctx) error // To delete a task
|
// CreateCollection(c *fiber.Ctx) error // To create a new collection // WIP
|
||||||
// CreateCollection(c *fiber.Ctx) error // To create a new collection
|
// GetCollections(c *fiber.Ctx) error // To get all collections // WIP
|
||||||
// GetCollections(c *fiber.Ctx) error // To get all collections
|
// GetCollection(c *fiber.Ctx) error // To get a specific collection // WIP
|
||||||
// GetCollection(c *fiber.Ctx) error // To get a specific collection
|
// UpdateCollection(c *fiber.Ctx) error // To update a collection // WIP
|
||||||
// UpdateCollection(c *fiber.Ctx) error // To update a collection
|
// DeleteCollection(c *fiber.Ctx) error // To delete a collection // WIP
|
||||||
// DeleteCollection(c *fiber.Ctx) error // To delete a collection
|
// SignCollection(c *fiber.Ctx) error // To sign a collection // WIP
|
||||||
// SignCollection(c *fiber.Ctx) error // To sign a collection
|
|
||||||
ListAllUsers(c *fiber.Ctx) error // To get a list of all users in the application database
|
ListAllUsers(c *fiber.Ctx) error // To get a list of all users in the application database
|
||||||
ListAllUsersProject(c *fiber.Ctx) error // To get a list of all users for a specific project
|
ListAllUsersProject(c *fiber.Ctx) error // To get a list of all users for a specific project
|
||||||
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
|
||||||
|
|
|
@ -30,6 +30,18 @@ func (gs *GState) CreateProject(c *fiber.Ctx) error {
|
||||||
return c.Status(200).SendString("Project added")
|
return c.Status(200).SendString("Project added")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gs *GState) DeleteProject(c *fiber.Ctx) error {
|
||||||
|
|
||||||
|
projectID := c.Params("projectID")
|
||||||
|
username := c.Params("username")
|
||||||
|
|
||||||
|
if err := gs.Db.DeleteProject(projectID, username); err != nil {
|
||||||
|
return c.Status(500).SendString((err.Error()))
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Status(200).SendString("Project deleted")
|
||||||
|
}
|
||||||
|
|
||||||
// GetUserProjects returns all projects that the user is a member of
|
// GetUserProjects returns all projects that the user is a member of
|
||||||
func (gs *GState) GetUserProjects(c *fiber.Ctx) error {
|
func (gs *GState) GetUserProjects(c *fiber.Ctx) error {
|
||||||
// First we get the username from the token
|
// First we get the username from the token
|
||||||
|
@ -118,6 +130,31 @@ func (gs *GState) ListAllUsersProject(c *fiber.Ctx) error {
|
||||||
return c.Status(400).SendString("No project name provided")
|
return c.Status(400).SendString("No project name provided")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get the user token
|
||||||
|
userToken := c.Locals("user").(*jwt.Token)
|
||||||
|
claims := userToken.Claims.(jwt.MapClaims)
|
||||||
|
username := claims["name"].(string)
|
||||||
|
|
||||||
|
// Check if the user is a project manager for the specified project
|
||||||
|
isManager, err := gs.Db.IsProjectManager(username, projectName)
|
||||||
|
if err != nil {
|
||||||
|
log.Info("Error checking project manager status:", err)
|
||||||
|
return c.Status(500).SendString(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the user is not a project manager, check if the user is a site admin
|
||||||
|
if !isManager {
|
||||||
|
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 manager nor a site admin:", username)
|
||||||
|
return c.Status(403).SendString("User is neither a project manager nor a site admin")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Get all users associated with the project from the database
|
// Get all users associated with the project from the database
|
||||||
users, err := gs.Db.GetAllUsersProject(projectName)
|
users, err := gs.Db.GetAllUsersProject(projectName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -189,3 +226,8 @@ func (gs *GState) IsProjectManagerHandler(c *fiber.Ctx) error {
|
||||||
// Return the result as JSON
|
// Return the result as JSON
|
||||||
return c.JSON(map[string]bool{"isProjectManager": isManager})
|
return c.JSON(map[string]bool{"isProjectManager": isManager})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gs *GState) CreateTask(c *fiber.Ctx) error {
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -87,6 +87,7 @@ func main() {
|
||||||
server.Get("/api/getUserProjects", gs.GetUserProjects)
|
server.Get("/api/getUserProjects", gs.GetUserProjects)
|
||||||
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.Delete("api/project", gs.DeleteProject) // WIP
|
||||||
server.Post("/api/project", gs.CreateProject)
|
server.Post("/api/project", gs.CreateProject)
|
||||||
server.Get("/api/project/:projectId", gs.GetProject)
|
server.Get("/api/project/:projectId", gs.GetProject)
|
||||||
server.Get("/api/getWeeklyReport", gs.GetWeeklyReport)
|
server.Get("/api/getWeeklyReport", gs.GetWeeklyReport)
|
||||||
|
@ -97,6 +98,8 @@ func main() {
|
||||||
server.Get("/api/getWeeklyReportsUser", gs.GetWeeklyReportsUserHandler)
|
server.Get("/api/getWeeklyReportsUser", gs.GetWeeklyReportsUserHandler)
|
||||||
server.Get("api/checkIfProjectManager", gs.IsProjectManagerHandler)
|
server.Get("api/checkIfProjectManager", gs.IsProjectManagerHandler)
|
||||||
server.Post("/api/ProjectRoleChange", gs.ProjectRoleChange)
|
server.Post("/api/ProjectRoleChange", gs.ProjectRoleChange)
|
||||||
|
server.Get("/api/getUsersProject/:projectName", gs.ListAllUsersProject)
|
||||||
|
|
||||||
// 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))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
28
testing.py
28
testing.py
|
@ -40,6 +40,7 @@ getUserProjectsPath = base_url + "/api/getUserProjects"
|
||||||
getWeeklyReportsUserPath = base_url + "/api/getWeeklyReportsUser"
|
getWeeklyReportsUserPath = base_url + "/api/getWeeklyReportsUser"
|
||||||
checkIfProjectManagerPath = base_url + "/api/checkIfProjectManager"
|
checkIfProjectManagerPath = base_url + "/api/checkIfProjectManager"
|
||||||
ProjectRoleChangePath = base_url + "/api/ProjectRoleChange"
|
ProjectRoleChangePath = base_url + "/api/ProjectRoleChange"
|
||||||
|
getUsersProjectPath = base_url + "/api/getUsersProject"
|
||||||
|
|
||||||
#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():
|
||||||
|
@ -338,7 +339,33 @@ def test_check_if_project_manager():
|
||||||
assert response.status_code == 200, "Check if project manager failed"
|
assert response.status_code == 200, "Check if project manager failed"
|
||||||
gprint("test_check_if_project_manager successful")
|
gprint("test_check_if_project_manager successful")
|
||||||
|
|
||||||
|
def test_list_all_users_project():
|
||||||
|
# Log in as a user who is a member of the project
|
||||||
|
admin_username = randomString()
|
||||||
|
admin_password = "admin_password2"
|
||||||
|
dprint(
|
||||||
|
"Registering with username: ", admin_username, " and password: ", admin_password
|
||||||
|
)
|
||||||
|
response = requests.post(
|
||||||
|
registerPath, json={"username": admin_username, "password": admin_password}
|
||||||
|
)
|
||||||
|
dprint(response.text)
|
||||||
|
|
||||||
|
# Log in as the admin
|
||||||
|
admin_token = login(admin_username, admin_password).json()["token"]
|
||||||
|
response = requests.post(
|
||||||
|
promoteToAdminPath,
|
||||||
|
json={"username": admin_username},
|
||||||
|
headers={"Authorization": "Bearer " + admin_token},
|
||||||
|
)
|
||||||
|
|
||||||
|
# Make a request to list all users associated with the project
|
||||||
|
response = requests.get(
|
||||||
|
getUsersProjectPath + "/" + projectName,
|
||||||
|
headers={"Authorization": "Bearer " + admin_token},
|
||||||
|
)
|
||||||
|
assert response.status_code == 200, "List all users project failed"
|
||||||
|
gprint("test_list_all_users_project sucessful")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
@ -354,3 +381,4 @@ if __name__ == "__main__":
|
||||||
test_get_weekly_reports_user()
|
test_get_weekly_reports_user()
|
||||||
test_check_if_project_manager()
|
test_check_if_project_manager()
|
||||||
test_ProjectRoleChange()
|
test_ProjectRoleChange()
|
||||||
|
test_list_all_users_project()
|
||||||
|
|
Loading…
Reference in a new issue