Skip to content

Commit

Permalink
Add CreateTicket
Browse files Browse the repository at this point in the history
  • Loading branch information
nukosuke committed Jun 6, 2019
1 parent 589c083 commit 4cadbc4
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 24 deletions.
83 changes: 59 additions & 24 deletions zendesk/ticket.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,30 +8,29 @@ import (
)

type Ticket struct {
ID int64 `json:"id,omitempty"`
URL string `json:"url,omitempty"`
ExternalID string `json:"external_id,omitempty"`
Type string `json:"type,omitempty"`
Subject string `json:"subject,omitempty"`
RawSubject string `json:"raw_subject,omitempty"`
Description string `json:"description,omitempty"`
Priority string `json:"priority,omitempty"`
Status string `json:"status,omitempty"`
Recipient string `json:"recipient,omitempty"`
RequesterID int64 `json:"requester_id"`
SubmitterID int64 `json:"submitter_id,omitempty"`
AssigneeID int64 `json:"assignee_id,omitempty"`
OrganizationID int64 `json:"organization_id,omitempty"`
GroupID int64 `json:"group_id,omitempty"`
CollaboratorIDs []int64 `json:"collaborator_ids,omitempty"`
Collaborators Collaborators `json:"collaborators,omitempty"`
FollowerIDs []int64 `json:"follower_ids,omitempty"`
EmailCCIDs []int64 `json:"email_cc_ids,omitempty"`
ForumTopicID int64 `json:"forum_topic_id,omitempty"`
ProblemID int64 `json:"problem_id,omitempty"`
HasIncidents bool `json:"has_incidents,omitempty"`
DueAt time.Time `json:"due_at,omitempty"`
Tags []string `json:"tags,omitempty"`
ID int64 `json:"id,omitempty"`
URL string `json:"url,omitempty"`
ExternalID string `json:"external_id,omitempty"`
Type string `json:"type,omitempty"`
Subject string `json:"subject,omitempty"`
RawSubject string `json:"raw_subject,omitempty"`
Description string `json:"description,omitempty"`
Priority string `json:"priority,omitempty"`
Status string `json:"status,omitempty"`
Recipient string `json:"recipient,omitempty"`
RequesterID int64 `json:"requester_id,omitempty"`
SubmitterID int64 `json:"submitter_id,omitempty"`
AssigneeID int64 `json:"assignee_id,omitempty"`
OrganizationID int64 `json:"organization_id,omitempty"`
GroupID int64 `json:"group_id,omitempty"`
CollaboratorIDs []int64 `json:"collaborator_ids,omitempty"`
FollowerIDs []int64 `json:"follower_ids,omitempty"`
EmailCCIDs []int64 `json:"email_cc_ids,omitempty"`
ForumTopicID int64 `json:"forum_topic_id,omitempty"`
ProblemID int64 `json:"problem_id,omitempty"`
HasIncidents bool `json:"has_incidents,omitempty"`
DueAt time.Time `json:"due_at,omitempty"`
Tags []string `json:"tags,omitempty"`

// TODO: Via #123
// TODO: CustomFields #122
Expand All @@ -53,6 +52,21 @@ type Ticket struct {
IsPublic bool `json:"is_public,omitempty"`
CreatedAt time.Time `json:"created_at,omitempty"`
UpdatedAt time.Time `json:"updated_at,omitempty"`

// Collaborators is POST only
Collaborators Collaborators `json:"collaborators,omitempty"`

// Comment is POST only and required
Comment TicketComment `json:"comment,omitempty"`

// TODO: TicketAudit (POST only)
}

// TODO: This is temporary struct for ticket support.
// Need to make it into correct TicketComment structure.
// https://developer.zendesk.com/rest_api/docs/support/ticket_comments
type TicketComment struct {
Body string `json:"body"`
}

// TicketAPI an interface containing all ticket related methods
Expand Down Expand Up @@ -80,3 +94,24 @@ func (z *Client) GetTicket(ctx context.Context, ticketID int64) (Ticket, error)

return result.Ticket, err
}

// CreateTicket create a new ticket
//
// ref: https://developer.zendesk.com/rest_api/docs/support/tickets#create-ticket
func (z *Client) CreateTicket(ctx context.Context, ticket Ticket) (Ticket, error) {
var data, result struct {
Ticket Ticket `json:"ticket"`
}
data.Ticket = ticket

body, err := z.post(ctx, "/tickets.json", data)
if err != nil {
return Ticket{}, err
}

err = json.Unmarshal(body, &result)
if err != nil {
return Ticket{}, err
}
return result.Ticket, nil
}
21 changes: 21 additions & 0 deletions zendesk/ticket_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,24 @@ func TestGetTicket(t *testing.T) {
t.Fatalf("Returned ticket does not have the expected ID %d. Ticket id is %d", expectedID, ticket.ID)
}
}

func TestCreateTicket(t *testing.T) {
mockAPI := newMockAPIWithStatus(http.MethodPost, "ticket.json", http.StatusCreated)
client := newTestClient(mockAPI)
defer mockAPI.Close()

ticket, err := client.CreateTicket(ctx, Ticket{
Subject: "nyanyanyanya",
Comment: TicketComment{
Body: "(●ↀ ω ↀ )",
},
})
if err != nil {
t.Fatalf("Failed to create ticket: %s", err)
}

expectedID := int64(4)
if ticket.ID != expectedID {
t.Fatalf("Returned ticket does not have the expected ID %d. Ticket id is %d", expectedID, ticket.ID)
}
}

0 comments on commit 4cadbc4

Please sign in to comment.