From 387810676b3d36a894ba3d348d75c50dbb9b855d Mon Sep 17 00:00:00 2001 From: Matthew Knight Date: Sat, 14 Feb 2026 02:31:47 -0800 Subject: [PATCH] customer label --- internal/forgejo/client.go | 53 ++++++++-------------------- internal/handlers/admin/dashboard.go | 2 +- internal/handlers/admin/tickets.go | 4 +-- internal/handlers/admin/users.go | 2 +- internal/handlers/public/tickets.go | 4 +-- 5 files changed, 20 insertions(+), 45 deletions(-) diff --git a/internal/forgejo/client.go b/internal/forgejo/client.go index 4b7a647..e4586c8 100644 --- a/internal/forgejo/client.go +++ b/internal/forgejo/client.go @@ -174,8 +174,7 @@ func (c *Client) InitBotLogin() error { return nil } -func (c *Client) GetOrCreateLabel(owner, repo, labelName, color string) (*Label, error) { - // Try to find existing label +func (c *Client) GetLabel(owner, repo, labelName string) (*Label, error) { listURL := fmt.Sprintf("%s/api/v1/repos/%s/%s/labels", c.baseURL, owner, repo) httpReq, err := http.NewRequest("GET", listURL, nil) if err != nil { @@ -189,45 +188,21 @@ func (c *Client) GetOrCreateLabel(owner, repo, labelName, color string) (*Label, } defer resp.Body.Close() - if resp.StatusCode == http.StatusOK { - var labels []Label - if err := json.NewDecoder(resp.Body).Decode(&labels); err == nil { - for _, l := range labels { - if l.Name == labelName { - return &l, nil - } - } + if resp.StatusCode != http.StatusOK { + respBody, _ := io.ReadAll(resp.Body) + return nil, fmt.Errorf("forgejo API returned %d: %s", resp.StatusCode, string(respBody)) + } + + var labels []Label + if err := json.NewDecoder(resp.Body).Decode(&labels); err != nil { + return nil, err + } + for _, l := range labels { + if l.Name == labelName { + return &l, nil } } - - // Create the label - createBody, _ := json.Marshal(map[string]string{ - "name": labelName, - "color": color, - }) - httpReq, err = http.NewRequest("POST", listURL, bytes.NewReader(createBody)) - if err != nil { - return nil, err - } - httpReq.Header.Set("Content-Type", "application/json") - httpReq.Header.Set("Authorization", "token "+c.apiToken) - - resp2, err := c.httpClient.Do(httpReq) - if err != nil { - return nil, fmt.Errorf("forgejo API request failed: %w", err) - } - defer resp2.Body.Close() - - if resp2.StatusCode != http.StatusCreated { - respBody, _ := io.ReadAll(resp2.Body) - return nil, fmt.Errorf("forgejo API returned %d: %s", resp2.StatusCode, string(respBody)) - } - - var label Label - if err := json.NewDecoder(resp2.Body).Decode(&label); err != nil { - return nil, err - } - return &label, nil + return nil, fmt.Errorf("label %q not found in %s/%s", labelName, owner, repo) } func (c *Client) CreateIssue(owner, repo string, req CreateIssueRequest) (*Issue, error) { diff --git a/internal/handlers/admin/dashboard.go b/internal/handlers/admin/dashboard.go index f818986..54ae96c 100644 --- a/internal/handlers/admin/dashboard.go +++ b/internal/handlers/admin/dashboard.go @@ -57,7 +57,7 @@ func (h *DashboardHandler) Index(c *gin.Context) { var openTickets, inProgressTickets, closedTickets int64 for _, repo := range repos { - issues, err := h.deps.ForgejoClient.ListIssues(repo.ForgejoOwner, repo.ForgejoRepo, "all", "customer") + issues, err := h.deps.ForgejoClient.ListIssues(repo.ForgejoOwner, repo.ForgejoRepo, "all", "") if err != nil { log.Error().Err(err).Str("repo", repo.ForgejoOwner+"/"+repo.ForgejoRepo).Msg("dashboard: forgejo list issues error") continue diff --git a/internal/handlers/admin/tickets.go b/internal/handlers/admin/tickets.go index 322eba6..10cb4b0 100644 --- a/internal/handlers/admin/tickets.go +++ b/internal/handlers/admin/tickets.go @@ -78,7 +78,7 @@ func (h *TicketHandler) List(c *gin.Context) { // Fetch issues from Forgejo per repo and match var tickets []ticketListRow for _, group := range repoGroups { - issues, err := h.deps.ForgejoClient.ListIssues(group.owner, group.repo, apiState, "customer") + issues, err := h.deps.ForgejoClient.ListIssues(group.owner, group.repo, apiState, "") if err != nil { log.Error().Err(err).Str("repo", group.owner+"/"+group.repo).Msg("forgejo list issues error") for _, m := range group.mappings { @@ -206,7 +206,7 @@ func (h *TicketHandler) UpdateStatus(c *gin.Context) { newStatus := c.PostForm("status") // Get or create the in_progress label - inProgressLabel, err := h.deps.ForgejoClient.GetOrCreateLabel(repo.ForgejoOwner, repo.ForgejoRepo, "in_progress", "#fbca04") + inProgressLabel, err := h.deps.ForgejoClient.GetLabel(repo.ForgejoOwner, repo.ForgejoRepo, "in_progress") if err != nil { log.Error().Err(err).Msg("forgejo get/create in_progress label error") h.deps.Renderer.RenderError(c.Writer, c.Request, http.StatusServiceUnavailable, "Service temporarily unavailable") diff --git a/internal/handlers/admin/users.go b/internal/handlers/admin/users.go index ac55f23..d7328cf 100644 --- a/internal/handlers/admin/users.go +++ b/internal/handlers/admin/users.go @@ -71,7 +71,7 @@ func (h *UserHandler) Detail(c *gin.Context) { } for _, group := range repoMap { - issues, err := h.deps.ForgejoClient.ListIssues(group.repo.ForgejoOwner, group.repo.ForgejoRepo, "all", "customer") + issues, err := h.deps.ForgejoClient.ListIssues(group.repo.ForgejoOwner, group.repo.ForgejoRepo, "all", "") if err != nil { log.Error().Err(err).Str("repo", group.repo.Name).Msg("forgejo list issues error") for _, t := range group.tickets { diff --git a/internal/handlers/public/tickets.go b/internal/handlers/public/tickets.go index 7ef8d88..cfa297b 100644 --- a/internal/handlers/public/tickets.go +++ b/internal/handlers/public/tickets.go @@ -56,7 +56,7 @@ func (h *TicketHandler) List(c *gin.Context) { var views []ticketView for _, group := range repoMap { - issues, err := h.deps.ForgejoClient.ListIssues(group.repo.ForgejoOwner, group.repo.ForgejoRepo, "all", "customer") + issues, err := h.deps.ForgejoClient.ListIssues(group.repo.ForgejoOwner, group.repo.ForgejoRepo, "all", "") if err != nil { log.Error().Err(err).Str("repo", group.repo.Name).Msg("forgejo list issues error") // Show tickets with unknown status on API failure @@ -159,7 +159,7 @@ func (h *TicketHandler) Create(c *gin.Context) { // Synchronous Forgejo issue creation var labelIDs []int64 - label, err := h.deps.ForgejoClient.GetOrCreateLabel(repo.ForgejoOwner, repo.ForgejoRepo, "customer", "#0075ca") + label, err := h.deps.ForgejoClient.GetLabel(repo.ForgejoOwner, repo.ForgejoRepo, "customer") if err != nil { log.Error().Err(err).Msg("forgejo get/create label error") } else {