diff --git a/zendesk/ticket.go b/zendesk/ticket.go index b789bbc..1c74cec 100644 --- a/zendesk/ticket.go +++ b/zendesk/ticket.go @@ -3,6 +3,7 @@ package zendesk import ( "fmt" "github.com/google/go-querystring/query" + "net/url" "strconv" "strings" "time" @@ -67,10 +68,23 @@ type Requester struct { Email *string `json:"email,omitempty"` } -func (c *client) ShowTicket(id int64) (*Ticket, error) { +func (c *client) ShowTicket(id int64, sideloads ...SideLoad) (*TicketResponse, error) { + sideLoads := &SideLoadOptions{} + for _, opt := range sideloads { + opt(sideLoads) + } + params := url.Values{} + if len(sideLoads.Include) > 0 { + params.Set("include", strings.Join(sideLoads.Include, ",")) + } out := new(APIPayload) - err := c.get(fmt.Sprintf("/api/v2/tickets/%d.json", id), out) - return out.Ticket, err + err := c.get(fmt.Sprintf("/api/v2/tickets/%d.json?%s", id, params.Encode()), out) + return &TicketResponse{ + Ticket: out.Ticket, + Users: out.Users, + Groups: out.Groups, + Organizations: out.Organizations, + }, err } func (c *client) CreateTicket(ticket *Ticket) (*Ticket, error) { @@ -80,11 +94,25 @@ func (c *client) CreateTicket(ticket *Ticket) (*Ticket, error) { return out.Ticket, err } -func (c *client) UpdateTicket(id int64, ticket *Ticket) (*Ticket, error) { +func (c *client) UpdateTicket(id int64, ticket *Ticket, sideloads ...SideLoad) (*TicketResponse, error) { + sideLoads := &SideLoadOptions{} + for _, opt := range sideloads { + opt(sideLoads) + } + params := url.Values{} + if len(sideLoads.Include) > 0 { + params.Set("include", strings.Join(sideLoads.Include, ",")) + } + in := &APIPayload{Ticket: ticket} out := new(APIPayload) - err := c.put(fmt.Sprintf("/api/v2/tickets/%d.json", id), in, out) - return out.Ticket, err + err := c.put(fmt.Sprintf("/api/v2/tickets/%d.json?%s", id, params.Encode()), in, out) + return &TicketResponse{ + Ticket: out.Ticket, + Users: out.Users, + Groups: out.Groups, + Organizations: out.Organizations, + }, err } func (c *client) BatchUpdateManyTickets(tickets []Ticket) error { diff --git a/zendesk/ticket_comment_test.go b/zendesk/ticket_comment_test.go index 6d3adac..e6dce04 100644 --- a/zendesk/ticket_comment_test.go +++ b/zendesk/ticket_comment_test.go @@ -32,8 +32,9 @@ func TestTicketCommentCRUD(t *testing.T) { }, } - ticket, err = client.UpdateTicket(*ticket.ID, &in) + ticketRes, err := client.UpdateTicket(*ticket.ID, &in) require.NoError(t, err) + ticket = ticketRes.Ticket // assert that we can list the newly created comment listed, err = client.ListTicketComments(*ticket.ID) @@ -68,8 +69,9 @@ func TestTicketCommentRedaction(t *testing.T) { }, } - ticket, err = client.UpdateTicket(*ticket.ID, &in) + ticketRes, err := client.UpdateTicket(*ticket.ID, &in) require.NoError(t, err) + ticket = ticketRes.Ticket listed, err := client.ListTicketComments(*ticket.ID) require.NoError(t, err) diff --git a/zendesk/ticket_test.go b/zendesk/ticket_test.go index 0431c6d..f0f92d4 100644 --- a/zendesk/ticket_test.go +++ b/zendesk/ticket_test.go @@ -31,11 +31,13 @@ func TestTicketCRUD(t *testing.T) { require.Len(t, created.Tags, 1) require.Len(t, created.CollaboratorIDs, 2) - found, err := client.ShowTicket(*created.ID) + foundRes, err := client.ShowTicket(*created.ID, IncludeCommentCount()) require.NoError(t, err) + found := foundRes.Ticket require.Equal(t, created.Subject, found.Subject) require.Equal(t, created.RequesterID, found.RequesterID) require.Equal(t, created.Tags, found.Tags) + require.NotNil(t, found.CommentCount) colls, err := client.ListTicketCollaborators(*created.ID) require.NoError(t, err) @@ -59,10 +61,11 @@ func TestTicketCRUD(t *testing.T) { AdditionalCollaborators: []interface{}{"email3@example.com"}, } - updated, err := client.UpdateTicket(*created.ID, &input) + updated, err := client.UpdateTicket(*created.ID, &input, IncludeUsers(), IncludeCommentCount()) require.NoError(t, err) - require.Equal(t, input.Status, updated.Status) - require.Len(t, updated.CollaboratorIDs, 3) + require.Equal(t, input.Status, updated.Ticket.Status) + require.Len(t, updated.Ticket.CollaboratorIDs, 3) + require.NotNil(t, updated.Users) requested, err := client.ListRequestedTickets(*user.ID) require.NoError(t, err) diff --git a/zendesk/zendesk.go b/zendesk/zendesk.go index 7c273d7..a70cdf7 100644 --- a/zendesk/zendesk.go +++ b/zendesk/zendesk.go @@ -66,11 +66,11 @@ type Client interface { ShowLocaleByCode(string) (*Locale, error) ShowManyUsers([]int64) ([]User, error) ShowOrganization(int64) (*Organization, error) - ShowTicket(int64) (*Ticket, error) + ShowTicket(int64, ...SideLoad) (*TicketResponse, error) ShowUser(int64) (*User, error) UpdateIdentity(int64, int64, *UserIdentity) (*UserIdentity, error) UpdateOrganization(int64, *Organization) (*Organization, error) - UpdateTicket(int64, *Ticket) (*Ticket, error) + UpdateTicket(int64, *Ticket, ...SideLoad) (*TicketResponse, error) UpdateUser(int64, *User) (*User, error) UploadFile(string, *string, io.Reader) (*Upload, error) } @@ -370,6 +370,14 @@ func String(s string) *string { return &p } +// TicketResponse is a holder for the various returns from the ticket apis +type TicketResponse struct { + Ticket *Ticket + Users []User + Groups []Group + Organizations []Organization +} + // ListResponse is a holder for the various returns from the list apis type ListResponse struct { Comments []TicketComment diff --git a/zendesk/zendesk_test.go b/zendesk/zendesk_test.go index ddca0b6..2d1f6d4 100644 --- a/zendesk/zendesk_test.go +++ b/zendesk/zendesk_test.go @@ -40,9 +40,9 @@ func Example() { if err != nil { log.Fatal(err) } - ticket, err := client.ShowTicket(1) + ticketRes, err := client.ShowTicket(1) if err != nil { log.Fatal(err) } - log.Printf("Requester ID is: %d", *ticket.RequesterID) + log.Printf("Requester ID is: %d", *ticketRes.Ticket.RequesterID) }