package public import ( "strconv" "git.ma-al.com/goc_marek/timetracker/app/config" "git.ma-al.com/goc_marek/timetracker/app/service/repoService" "git.ma-al.com/goc_marek/timetracker/app/utils/pagination" "git.ma-al.com/goc_marek/timetracker/app/view" "github.com/gofiber/fiber/v3" ) // RepoHandler handles endpoints asking for repository data (to create charts) type RepoHandler struct { repoService *repoService.RepoService config *config.Config } // NewRepoHandler creates a new RepoHandler instance func NewRepoHandler() *RepoHandler { repoService := repoService.New() return &RepoHandler{ repoService: repoService, config: config.Get(), } } // RepoHandlerRoutes registers all repo routes func RepoHandlerRoutes(r fiber.Router) fiber.Router { handler := NewRepoHandler() r.Get("/get-repos", handler.GetRepoIDs) r.Get("/get-years", handler.GetYears) r.Get("/get-quarters", handler.GetQuarters) r.Get("/get-issues", handler.GetIssues) return r } func (h *RepoHandler) GetRepoIDs(c fiber.Ctx) error { userID, ok := c.Locals("userID").(uint) if !ok { return c.Status(view.GetErrorStatus(view.ErrInvalidBody)).JSON(fiber.Map{ "error": view.GetErrorCode(c, view.ErrInvalidBody), }) } response, err := h.repoService.GetRepositoriesForUser(userID) if err != nil { return c.Status(view.GetErrorStatus(err)).JSON(fiber.Map{ "error": view.GetErrorCode(c, err), }) } return c.JSON(response) } func (h *RepoHandler) GetYears(c fiber.Ctx) error { userID, ok := c.Locals("userID").(uint) if !ok { return c.Status(view.GetErrorStatus(view.ErrInvalidBody)).JSON(fiber.Map{ "error": view.GetErrorCode(c, view.ErrInvalidBody), }) } repoID_attribute := c.Query("repoID") repoID, err := strconv.Atoi(repoID_attribute) if err != nil { return c.Status(view.GetErrorStatus(view.ErrBadRepoIDAttribute)).JSON(fiber.Map{ "error": view.GetErrorCode(c, view.ErrBadRepoIDAttribute), }) } response, err := h.repoService.GetYearsForUser(userID, uint(repoID)) if err != nil { return c.Status(view.GetErrorStatus(err)).JSON(fiber.Map{ "error": view.GetErrorCode(c, err), }) } return c.JSON(response) } func (h *RepoHandler) GetQuarters(c fiber.Ctx) error { userID, ok := c.Locals("userID").(uint) if !ok { return c.Status(view.GetErrorStatus(view.ErrInvalidBody)).JSON(fiber.Map{ "error": view.GetErrorCode(c, view.ErrInvalidBody), }) } repoID_attribute := c.Query("repoID") repoID, err := strconv.Atoi(repoID_attribute) if err != nil { return c.Status(view.GetErrorStatus(view.ErrBadRepoIDAttribute)).JSON(fiber.Map{ "error": view.GetErrorCode(c, view.ErrBadRepoIDAttribute), }) } year_attribute := c.Query("year") year, err := strconv.Atoi(year_attribute) if err != nil { return c.Status(view.GetErrorStatus(view.ErrBadYearAttribute)).JSON(fiber.Map{ "error": view.GetErrorCode(c, view.ErrBadYearAttribute), }) } response, err := h.repoService.GetQuartersForUser(userID, uint(repoID), uint(year)) if err != nil { return c.Status(view.GetErrorStatus(err)).JSON(fiber.Map{ "error": view.GetErrorCode(c, err), }) } return c.JSON(response) } func (h *RepoHandler) GetIssues(c fiber.Ctx) error { userID, ok := c.Locals("userID").(uint) if !ok { return c.Status(view.GetErrorStatus(view.ErrInvalidBody)).JSON(fiber.Map{ "error": view.GetErrorCode(c, view.ErrInvalidBody), }) } repoID_attribute := c.Query("repoID") repoID, err := strconv.Atoi(repoID_attribute) if err != nil { return c.Status(view.GetErrorStatus(view.ErrBadRepoIDAttribute)).JSON(fiber.Map{ "error": view.GetErrorCode(c, view.ErrBadRepoIDAttribute), }) } year_attribute := c.Query("year") year, err := strconv.Atoi(year_attribute) if err != nil { return c.Status(view.GetErrorStatus(view.ErrBadYearAttribute)).JSON(fiber.Map{ "error": view.GetErrorCode(c, view.ErrBadYearAttribute), }) } quarter_attribute := c.Query("quarter") quarter, err := strconv.Atoi(quarter_attribute) if err != nil { return c.Status(view.GetErrorStatus(view.ErrBadQuarterAttribute)).JSON(fiber.Map{ "error": view.GetErrorCode(c, view.ErrBadQuarterAttribute), }) } page_number_attribute := c.Query("page_number") page_number, err := strconv.Atoi(page_number_attribute) if err != nil { return c.Status(view.GetErrorStatus(view.ErrBadPaging)).JSON(fiber.Map{ "error": view.GetErrorCode(c, view.ErrBadPaging), }) } elements_per_page_attribute := c.Query("quarter") elements_per_page, err := strconv.Atoi(elements_per_page_attribute) if err != nil { return c.Status(view.GetErrorStatus(view.ErrBadPaging)).JSON(fiber.Map{ "error": view.GetErrorCode(c, view.ErrBadPaging), }) } var paging pagination.Paging paging.Page = uint(page_number) paging.Elements = uint(elements_per_page) response, err := h.repoService.GetIssuesForUser(userID, uint(repoID), uint(year), uint(quarter), paging) if err != nil { return c.Status(view.GetErrorStatus(err)).JSON(fiber.Map{ "error": view.GetErrorCode(c, err), }) } return c.JSON(response) }