package handlers import ( "fmt" "git.bhasher.com/bhasher/focus/backend/db" "git.bhasher.com/bhasher/focus/backend/types" "git.bhasher.com/bhasher/focus/backend/utils" "github.com/gofiber/fiber/v2" ) func GetAllProjects(c *fiber.Ctx) error { projects, err := db.GetAllProjects() if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "error": "Cannot retrieve projects", "trace": fmt.Sprint(err), }) } halProjects := make([]fiber.Map, len(projects)) for i, p := range projects { halProjects[i] = fiber.Map{ "project": p, "_links": utils.HALProjectLinks(p.ID), } } return utils.SendHAL(c, fiber.StatusOK, fiber.Map{ "_links": fiber.Map{ "self": fiber.Map{"href": "/api/projects"}, }, "_embedded": fiber.Map{ "projects": halProjects, }, }) } func GetProject(c *fiber.Ctx) error { id, err := c.ParamsInt("id") if err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid project ID"}) } project, err := db.GetProject(id) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "error": "Error fetching project", "trace": fmt.Sprint(err), }) } if project == nil { return c.SendStatus(fiber.StatusNotFound) } return utils.SendHAL(c, fiber.StatusOK, fiber.Map{ "project": project, "_links": utils.HALProjectLinks(project.ID), }) } func CreateProject(c *fiber.Ctx) error { p := new(types.Project) if err := c.BodyParser(p); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Error parsing request"}) } id, err := db.CreateProject(*p) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "error": "Error creating project", "trace": fmt.Sprint(err), }) } c.Location(fmt.Sprintf("/api/projects/%v", id)) return utils.SendHAL(c, fiber.StatusCreated, fiber.Map{ "id": id, "_links": utils.HALProjectLinks(id), }) } func UpdateProject(c *fiber.Ctx) error { id, err := c.ParamsInt("id") if err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid project ID"}) } p := types.Project{ID: id} if err := c.BodyParser(&p); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Error parsing request"}) } exists, err := db.ExistProject(id) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "error": "Error finding project", "trace": fmt.Sprint(err), }) } if !exists { return c.SendStatus(fiber.StatusNotFound) } err = db.UpdateProject(p) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "error": "Error updating project", "trace": fmt.Sprint(err), }) } return c.SendStatus(fiber.StatusNoContent) } func DeleteProject(c *fiber.Ctx) error { id, err := c.ParamsInt("id") if err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid project ID"}) } exists, err := db.ExistProject(id) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "error": "Error finding project", "trace": fmt.Sprint(err), }) } if !exists { return c.SendStatus(fiber.StatusNotFound) } err = db.DeleteProject(id) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "error": "Error deleting project", "trace": fmt.Sprint(err), }) } return c.SendStatus(fiber.StatusNoContent) }