/
ticket_field.go
155 lines (131 loc) · 5.86 KB
/
ticket_field.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package zendesk
import (
"context"
"encoding/json"
"fmt"
"time"
)
// TicketFieldSystemFieldOption is struct for value of `system_field_options`
type TicketFieldSystemFieldOption struct {
ID int64 `json:"id"`
Name string `json:"name"`
Position int64 `json:"position"`
RawName string `json:"raw_name"`
URL string `json:"url"`
Value string `json:"value"`
}
// TicketField is struct for ticket_field payload
type TicketField struct {
ID int64 `json:"id,omitempty"`
URL string `json:"url,omitempty"`
Type string `json:"type"`
Title string `json:"title"`
RawTitle string `json:"raw_title,omitempty"`
Description string `json:"description,omitempty"`
RawDescription string `json:"raw_description,omitempty"`
Position int64 `json:"position,omitempty"`
Active bool `json:"active,omitempty"`
Required bool `json:"required,omitempty"`
CollapsedForAgents bool `json:"collapsed_for_agents,omitempty"`
RegexpForValidation string `json:"regexp_for_validation,omitempty"`
TitleInPortal string `json:"title_in_portal,omitempty"`
RawTitleInPortal string `json:"raw_title_in_portal,omitempty"`
VisibleInPortal bool `json:"visible_in_portal,omitempty"`
EditableInPortal bool `json:"editable_in_portal,omitempty"`
RequiredInPortal bool `json:"required_in_portal,omitempty"`
Tag string `json:"tag,omitempty"`
CreatedAt *time.Time `json:"created_at,omitempty"`
UpdatedAt *time.Time `json:"updated_at,omitempty"`
SystemFieldOptions []TicketFieldSystemFieldOption `json:"system_field_options,omitempty"`
CustomFieldOptions []CustomFieldOption `json:"custom_field_options,omitempty"`
SubTypeID int64 `json:"sub_type_id,omitempty"`
Removable bool `json:"removable,omitempty"`
AgentDescription string `json:"agent_description,omitempty"`
}
// TicketFieldAPI an interface containing all of the ticket field related zendesk methods
type TicketFieldAPI interface {
GetTicketFields(ctx context.Context) ([]TicketField, Page, error)
CreateTicketField(ctx context.Context, ticketField TicketField) (TicketField, error)
GetTicketField(ctx context.Context, ticketID int64) (TicketField, error)
UpdateTicketField(ctx context.Context, ticketID int64, field TicketField) (TicketField, error)
DeleteTicketField(ctx context.Context, ticketID int64) error
GetTicketFieldsIterator(ctx context.Context, opts *PaginationOptions) *Iterator[TicketField]
GetTicketFieldsOBP(ctx context.Context, opts *OBPOptions) ([]TicketField, Page, error)
GetTicketFieldsCBP(ctx context.Context, opts *CBPOptions) ([]TicketField, CursorPaginationMeta, error)
}
// GetTicketFields fetches ticket field list
// ref: https://developer.zendesk.com/rest_api/docs/core/ticket_fields#list-ticket-fields
func (z *Client) GetTicketFields(ctx context.Context) ([]TicketField, Page, error) {
var data struct {
TicketFields []TicketField `json:"ticket_fields"`
Page
}
body, err := z.get(ctx, "/ticket_fields.json")
if err != nil {
return []TicketField{}, Page{}, err
}
err = json.Unmarshal(body, &data)
if err != nil {
return []TicketField{}, Page{}, err
}
return data.TicketFields, data.Page, nil
}
// CreateTicketField creates new ticket field
// ref: https://developer.zendesk.com/rest_api/docs/core/ticket_fields#create-ticket-field
func (z *Client) CreateTicketField(ctx context.Context, ticketField TicketField) (TicketField, error) {
var data, result struct {
TicketField TicketField `json:"ticket_field"`
}
data.TicketField = ticketField
body, err := z.post(ctx, "/ticket_fields.json", data)
if err != nil {
return TicketField{}, err
}
err = json.Unmarshal(body, &result)
if err != nil {
return TicketField{}, err
}
return result.TicketField, nil
}
// GetTicketField gets a specified ticket field
// ref: https://developer.zendesk.com/rest_api/docs/support/ticket_fields#show-ticket-field
func (z *Client) GetTicketField(ctx context.Context, ticketID int64) (TicketField, error) {
var result struct {
TicketField TicketField `json:"ticket_field"`
}
body, err := z.get(ctx, fmt.Sprintf("/ticket_fields/%d.json", ticketID))
if err != nil {
return TicketField{}, err
}
err = json.Unmarshal(body, &result)
if err != nil {
return TicketField{}, err
}
return result.TicketField, err
}
// UpdateTicketField updates a field with the specified ticket field
// ref: https://developer.zendesk.com/rest_api/docs/support/ticket_fields#update-ticket-field
func (z *Client) UpdateTicketField(ctx context.Context, ticketID int64, field TicketField) (TicketField, error) {
var result, data struct {
TicketField TicketField `json:"ticket_field"`
}
data.TicketField = field
body, err := z.put(ctx, fmt.Sprintf("/ticket_fields/%d.json", ticketID), data)
if err != nil {
return TicketField{}, err
}
err = json.Unmarshal(body, &result)
if err != nil {
return TicketField{}, err
}
return result.TicketField, err
}
// DeleteTicketField deletes the specified ticket field
// ref: https://developer.zendesk.com/rest_api/docs/support/ticket_fields#delete-ticket-field
func (z *Client) DeleteTicketField(ctx context.Context, ticketID int64) error {
err := z.delete(ctx, fmt.Sprintf("/ticket_fields/%d.json", ticketID))
if err != nil {
return err
}
return nil
}