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 ( | ||||
| 	"embed" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"path/filepath" | ||||
| 	"ttime/internal/types" | ||||
| 
 | ||||
|  | @ -19,6 +20,7 @@ type Database interface { | |||
| 	PromoteToAdmin(username string) error | ||||
| 	GetUserId(username string) (int, error) | ||||
| 	AddProject(name string, description string, username string) error | ||||
| 	DeleteProject(name string, username string) error | ||||
| 	Migrate() error | ||||
| 	MigrateSampleData() 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 users u ON ur.user_id = u.id | ||||
| 							WHERE u.username = ?` | ||||
| const deleteProject = `DELETE FROM projects | ||||
| 						WHERE id = ? AND owner_username = ?` | ||||
| 
 | ||||
| // DbConnect connects to the database | ||||
| func DbConnect(dbpath string) Database { | ||||
|  | @ -225,6 +229,21 @@ func (d *Db) AddProject(name string, description string, username string) error | |||
| 	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) { | ||||
| 	// Define the SQL query to fetch users and their roles for a given project | ||||
| 	query := ` | ||||
|  |  | |||
|  | @ -22,20 +22,19 @@ type GlobalState interface { | |||
| 	PromoteToAdmin(c *fiber.Ctx) error | ||||
| 	GetWeeklyReportsUserHandler(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 | ||||
| 	// DeleteProject(c *fiber.Ctx) error        // To delete a project | ||||
| 	// CreateTask(c *fiber.Ctx) error           // To create a new task | ||||
| 	// GetTasks(c *fiber.Ctx) error             // To get all tasks | ||||
| 	// GetTask(c *fiber.Ctx) error              // To get a specific task | ||||
| 	// UpdateTask(c *fiber.Ctx) error           // To update a task | ||||
| 	// DeleteTask(c *fiber.Ctx) error           // To delete a task | ||||
| 	// CreateCollection(c *fiber.Ctx) error     // To create a new collection | ||||
| 	// GetCollections(c *fiber.Ctx) error       // To get all collections | ||||
| 	// GetCollection(c *fiber.Ctx) error        // To get a specific collection | ||||
| 	// UpdateCollection(c *fiber.Ctx) error     // To update a collection | ||||
| 	// DeleteCollection(c *fiber.Ctx) error     // To delete a collection | ||||
| 	// SignCollection(c *fiber.Ctx) error       // To sign a collection | ||||
| 	// UpdateProject(c *fiber.Ctx) error        // To update a project // WIP | ||||
| 	DeleteProject(c *fiber.Ctx) error // To delete a project // WIP | ||||
| 	// CreateTask(c *fiber.Ctx) error           // To create a new task // WIP | ||||
| 	// GetTasks(c *fiber.Ctx) error             // To get all tasks // WIP | ||||
| 	// GetTask(c *fiber.Ctx) error              // To get a specific task // WIP | ||||
| 	// UpdateTask(c *fiber.Ctx) error           // To update a task // WIP | ||||
| 	// DeleteTask(c *fiber.Ctx) error           // To delete a task // WIP | ||||
| 	// CreateCollection(c *fiber.Ctx) error     // To create a new collection // WIP | ||||
| 	// GetCollections(c *fiber.Ctx) error       // To get all collections // WIP | ||||
| 	// GetCollection(c *fiber.Ctx) error        // To get a specific collection // WIP | ||||
| 	// UpdateCollection(c *fiber.Ctx) error     // To update a collection // WIP | ||||
| 	// DeleteCollection(c *fiber.Ctx) error     // To delete a collection // WIP | ||||
| 	// SignCollection(c *fiber.Ctx) error       // To sign a collection // WIP | ||||
| 	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 | ||||
| 	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") | ||||
| } | ||||
| 
 | ||||
| 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 | ||||
| func (gs *GState) GetUserProjects(c *fiber.Ctx) error { | ||||
| 	// 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") | ||||
| 	} | ||||
| 
 | ||||
| 	// 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 | ||||
| 	users, err := gs.Db.GetAllUsersProject(projectName) | ||||
| 	if err != nil { | ||||
|  | @ -189,3 +226,8 @@ func (gs *GState) IsProjectManagerHandler(c *fiber.Ctx) error { | |||
| 	// Return the result as JSON | ||||
| 	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.Post("/api/loginrenew", gs.LoginRenew) | ||||
| 	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.Get("/api/project/:projectId", gs.GetProject) | ||||
| 	server.Get("/api/getWeeklyReport", gs.GetWeeklyReport) | ||||
|  | @ -97,6 +98,8 @@ func main() { | |||
| 	server.Get("/api/getWeeklyReportsUser", gs.GetWeeklyReportsUserHandler) | ||||
| 	server.Get("api/checkIfProjectManager", gs.IsProjectManagerHandler) | ||||
| 	server.Post("/api/ProjectRoleChange", gs.ProjectRoleChange) | ||||
| 	server.Get("/api/getUsersProject/:projectName", gs.ListAllUsersProject) | ||||
| 
 | ||||
| 	// Announce the port we are listening on and start the server | ||||
| 	err = server.Listen(fmt.Sprintf(":%d", conf.Port)) | ||||
| 	if err != nil { | ||||
|  |  | |||
							
								
								
									
										28
									
								
								testing.py
									
										
									
									
									
								
							
							
						
						
									
										28
									
								
								testing.py
									
										
									
									
									
								
							|  | @ -40,6 +40,7 @@ getUserProjectsPath = base_url + "/api/getUserProjects" | |||
| getWeeklyReportsUserPath = base_url + "/api/getWeeklyReportsUser" | ||||
| checkIfProjectManagerPath = base_url + "/api/checkIfProjectManager" | ||||
| ProjectRoleChangePath = base_url + "/api/ProjectRoleChange" | ||||
| getUsersProjectPath = base_url + "/api/getUsersProject" | ||||
| 
 | ||||
| #ta bort auth i handlern för att få testet att gå igenom | ||||
| def test_ProjectRoleChange(): | ||||
|  | @ -338,7 +339,33 @@ def test_check_if_project_manager(): | |||
|     assert response.status_code == 200, "Check if project manager failed" | ||||
|     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__": | ||||
|  | @ -354,3 +381,4 @@ if __name__ == "__main__": | |||
|     test_get_weekly_reports_user() | ||||
|     test_check_if_project_manager() | ||||
|     test_ProjectRoleChange() | ||||
|     test_list_all_users_project() | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Peter KW
						Peter KW