~xenrox/srhtctl

47cf4d616d1e01bcd6bc5865caf45ffa0b2f310c — Thorben Günther 2 years ago 764fa34
todo: Add ability to print tickets

Can be filtered by status, tracker name.
2 files changed, 114 insertions(+), 0 deletions(-)

M api/todo.go
A cmd/todo.go
M api/todo.go => api/todo.go +77 -0
@@ 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
}

A cmd/todo.go => cmd/todo.go +37 -0
@@ 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)
}