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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Peter KW
						Peter KW