From 47cf4d616d1e01bcd6bc5865caf45ffa0b2f310c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorben=20G=C3=BCnther?= Date: Mon, 31 May 2021 01:32:09 +0200 Subject: [PATCH] todo: Add ability to print tickets Can be filtered by status, tracker name. --- api/todo.go | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++ cmd/todo.go | 37 +++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 cmd/todo.go diff --git a/api/todo.go b/api/todo.go index b65802c..171a338 100644 --- a/api/todo.go +++ b/api/todo.go @@ -1,5 +1,18 @@ package api +import ( + "fmt" + "strings" + + "git.xenrox.net/~xenrox/srhtctl/config" +) + +// TicketStatus is the status of a ticket +var TicketStatus string + +// TrackerName is the name of a tracker +var TrackerName string + type permissionStruct struct { Anonymous []string `json:"anonymous"` Submitter []string `json:"submitter"` @@ -45,3 +58,67 @@ type ticketPagerStruct struct { Total int `json:"total"` ResultsPerPage int `json:"results_per_page"` } + +// PrintTickets prints out tickets of a user +func PrintTickets(args []string) error { + var tickets ticketPagerStruct + + if TrackerName != "" { + _ = getTickets(&tickets, TrackerName) + for _, ticket := range tickets.Results { + fmt.Print(ticket.filterByStatus()) + } + return nil + } + + var trackers trackerPagerStruct + _ = getTrackers(&trackers) + + for _, tracker := range trackers.Results { + _ = getTickets(&tickets, tracker.Name) + + for i, ticket := range tickets.Results { + if i == 0 { + fmt.Printf("Tracker %s:\n\n", tracker.Name) + } + fmt.Print(ticket.filterByStatus()) + } + } + + return nil +} + +func getTickets(response *ticketPagerStruct, trackerName string) error { + url := fmt.Sprintf("%s/api/trackers/%s/tickets", config.GetURL("todo"), trackerName) + err := Request(url, "GET", "", &response) + if err != nil { + return err + } + return nil +} + +func (ticket ticketStruct) filterByStatus() string { + if TicketStatus == "all" || TicketStatus == ticket.Status { + return fmt.Sprintln(ticket) + } + return "" +} + +func getTrackers(response *trackerPagerStruct) error { + url := fmt.Sprintf("%s/api/trackers", config.GetURL("todo")) + err := Request(url, "GET", "", &response) + if err != nil { + return err + } + return nil +} + +func (ticket ticketStruct) String() string { + str := fmt.Sprintf("Ticket %d: %s\n", ticket.ID, ticket.Title) + str += fmt.Sprintf("Submitter: %s\n", ticket.Submitter.Name) + str += fmt.Sprintf("Status: %s with %s\n", ticket.Status, ticket.Resolution) + // Trim newline in tickets submitted by email + str += fmt.Sprintln(strings.TrimSpace(ticket.Description)) + + return str +} diff --git a/cmd/todo.go b/cmd/todo.go new file mode 100644 index 0000000..161d69c --- /dev/null +++ b/cmd/todo.go @@ -0,0 +1,37 @@ +package cmd + +import ( + "git.xenrox.net/~xenrox/srhtctl/api" + "git.xenrox.net/~xenrox/srhtctl/helpers/errorhelper" + "github.com/spf13/cobra" +) + +var todoCmd = &cobra.Command{ + Use: "todo", + Short: "Use the srht todo API", + Run: func(cmd *cobra.Command, args []string) { + }, +} + +var ticketsCmd = &cobra.Command{ + Use: "tickets", + Short: "List tickets", + Run: func(cmd *cobra.Command, args []string) { + err := api.PrintTickets(args) + errorhelper.ExitError(err) + }, +} + +func init() { + rootCmd.AddCommand(todoCmd) + + todoCmd.AddCommand(ticketsCmd) + ticketsCmd.Flags().StringVarP(&api.TicketStatus, "status", "s", "reported", "Ticket status") + ticketsCmd.RegisterFlagCompletionFunc("status", func(cmd *cobra.Command, args []string, toComplete string) ( + []string, cobra.ShellCompDirective) { + return []string{"reported", "confirmed", "in_progress", "pending", "resolved", "all"}, + cobra.ShellCompDirectiveNoFileComp + }) + ticketsCmd.Flags().StringVarP(&api.TrackerName, "tracker", "t", "", "Tracker name") + ticketsCmd.RegisterFlagCompletionFunc("tracker", completeNoFiles) +} -- 2.44.0