diff --git a/zendesk/ticket.go b/zendesk/ticket.go index cab8a04b..52e1d40e 100644 --- a/zendesk/ticket.go +++ b/zendesk/ticket.go @@ -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 @@ -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 @@ -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 +} diff --git a/zendesk/ticket_test.go b/zendesk/ticket_test.go index e8e3008f..b368eb62 100644 --- a/zendesk/ticket_test.go +++ b/zendesk/ticket_test.go @@ -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) + } +}