2024-03-17 16:55:40 +01:00
|
|
|
package handlers
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strconv"
|
|
|
|
"ttime/internal/types"
|
|
|
|
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
"github.com/golang-jwt/jwt/v5"
|
|
|
|
)
|
|
|
|
|
|
|
|
// CreateProject is a simple handler that creates a new project
|
|
|
|
func (gs *GState) CreateProject(c *fiber.Ctx) error {
|
|
|
|
user := c.Locals("user").(*jwt.Token)
|
|
|
|
|
|
|
|
p := new(types.NewProject)
|
|
|
|
if err := c.BodyParser(p); err != nil {
|
|
|
|
return c.Status(400).SendString(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the username from the token and set it as the owner of the project
|
|
|
|
// This is ugly but
|
|
|
|
claims := user.Claims.(jwt.MapClaims)
|
|
|
|
owner := claims["name"].(string)
|
|
|
|
|
|
|
|
if err := gs.Db.AddProject(p.Name, p.Description, owner); err != nil {
|
|
|
|
return c.Status(500).SendString(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
return c.Status(200).SendString("Project added")
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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
|
|
|
|
user := c.Locals("user").(*jwt.Token)
|
|
|
|
claims := user.Claims.(jwt.MapClaims)
|
|
|
|
username := claims["name"].(string)
|
|
|
|
|
|
|
|
// Then dip into the database to get the projects
|
|
|
|
projects, err := gs.Db.GetProjectsForUser(username)
|
|
|
|
if err != nil {
|
|
|
|
return c.Status(500).SendString(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return a json serialized list of projects
|
|
|
|
return c.JSON(projects)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ProjectRoleChange is a handler that changes a user's role within a project
|
|
|
|
func (gs *GState) ProjectRoleChange(c *fiber.Ctx) error {
|
|
|
|
// Extract the necessary parameters from the request
|
|
|
|
username := c.Params("username")
|
|
|
|
projectName := c.Params("projectName")
|
|
|
|
role := c.Params("role")
|
|
|
|
|
|
|
|
// Change the user's role within the project in the database
|
|
|
|
if err := gs.Db.ChangeUserRole(username, projectName, role); err != nil {
|
|
|
|
return c.Status(500).SendString(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return a success message
|
|
|
|
return c.SendStatus(fiber.StatusOK)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetProject retrieves a specific project by its ID
|
|
|
|
func (gs *GState) GetProject(c *fiber.Ctx) error {
|
|
|
|
// Extract the project ID from the request parameters or body
|
|
|
|
projectID := c.Params("projectID")
|
2024-03-18 16:42:35 +01:00
|
|
|
if projectID == "" {
|
|
|
|
return c.Status(400).SendString("No project ID provided")
|
|
|
|
}
|
|
|
|
println("Getting project with ID: ", projectID)
|
2024-03-17 16:55:40 +01:00
|
|
|
|
|
|
|
// Parse the project ID into an integer
|
|
|
|
projectIDInt, err := strconv.Atoi(projectID)
|
|
|
|
if err != nil {
|
|
|
|
return c.Status(400).SendString("Invalid project ID")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the project from the database by its ID
|
|
|
|
project, err := gs.Db.GetProject(projectIDInt)
|
|
|
|
if err != nil {
|
|
|
|
return c.Status(500).SendString(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return the project as JSON
|
2024-03-18 16:42:35 +01:00
|
|
|
println("Returning project: ", project.Name)
|
2024-03-17 16:55:40 +01:00
|
|
|
return c.JSON(project)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (gs *GState) ListAllUsersProject(c *fiber.Ctx) error {
|
|
|
|
// Extract the project name from the request parameters or body
|
|
|
|
projectName := c.Params("projectName")
|
|
|
|
|
|
|
|
// Get all users associated with the project from the database
|
|
|
|
users, err := gs.Db.GetAllUsersProject(projectName)
|
|
|
|
if err != nil {
|
|
|
|
return c.Status(500).SendString(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return the list of users as JSON
|
|
|
|
return c.JSON(users)
|
|
|
|
}
|
2024-03-18 14:47:15 +01:00
|
|
|
|
|
|
|
// AddUserToProjectHandler is a handler that adds a user to a project with a specified role
|
|
|
|
func (gs *GState) AddUserToProjectHandler(c *fiber.Ctx) error {
|
|
|
|
// Extract necessary parameters from the request
|
|
|
|
var requestData struct {
|
|
|
|
Username string `json:"username"`
|
|
|
|
ProjectName string `json:"projectName"`
|
|
|
|
Role string `json:"role"`
|
|
|
|
}
|
|
|
|
if err := c.BodyParser(&requestData); err != nil {
|
|
|
|
println("Error parsing request body:", err)
|
|
|
|
return c.Status(400).SendString("Bad request")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check if the user adding another user to the project is a site admin
|
|
|
|
user := c.Locals("user").(*jwt.Token)
|
|
|
|
claims := user.Claims.(jwt.MapClaims)
|
|
|
|
adminUsername := claims["name"].(string)
|
|
|
|
println("Admin username from claims:", adminUsername)
|
|
|
|
|
|
|
|
isAdmin, err := gs.Db.IsSiteAdmin(adminUsername)
|
|
|
|
if err != nil {
|
|
|
|
println("Error checking admin status:", err)
|
|
|
|
return c.Status(500).SendString(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
if !isAdmin {
|
|
|
|
println("User is not a site admin:", adminUsername)
|
|
|
|
return c.Status(403).SendString("User is not a site admin")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add the user to the project with the specified role
|
|
|
|
err = gs.Db.AddUserToProject(requestData.Username, requestData.ProjectName, requestData.Role)
|
|
|
|
if err != nil {
|
|
|
|
println("Error adding user to project:", err)
|
|
|
|
return c.Status(500).SendString(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return success message
|
|
|
|
println("User added to project successfully:", requestData.Username)
|
|
|
|
return c.SendStatus(fiber.StatusOK)
|
|
|
|
}
|