1package graphql
2
3import (
4	"strconv"
5
6	v2 "github.com/sensu/sensu-go/api/core/v2"
7	"github.com/sensu/sensu-go/backend/apid/graphql/suggest"
8)
9
10var (
11	SuggestSchema = DefaultSuggestSchema()
12)
13
14type Subscribable interface {
15	GetSubscriptions() []string
16}
17
18type Commandable interface {
19	GetCommand() string
20}
21
22type Timeoutable interface {
23	GetTimeout() uint32
24}
25
26func subscriptionsFn(res v2.Resource) []string {
27	return res.(Subscribable).GetSubscriptions()
28}
29
30func commandFn(res v2.Resource) []string {
31	return []string{res.(Commandable).GetCommand()}
32}
33
34func timeoutFn(res v2.Resource) []string {
35	t := res.(Timeoutable).GetTimeout()
36	return []string{strconv.FormatUint(uint64(t), 10)}
37}
38
39func DefaultSuggestSchema() suggest.Register {
40	return suggest.Register{
41		&suggest.Resource{
42			Group: "core/v2",
43			Name:  "asset",
44			Path:  "/api/core/v2/namespaces/{namespace}/assets",
45			Fields: []suggest.Field{
46				&suggest.ObjectField{
47					Name: "metadata",
48					Fields: []suggest.Field{
49						suggest.NameField,
50						suggest.LabelsField,
51					},
52				},
53				&suggest.CustomField{
54					Name: "filters",
55					FieldFunc: func(res v2.Resource) []string {
56						return res.(*v2.Asset).Filters
57					},
58				},
59			},
60		},
61		&suggest.Resource{
62			Group: "core/v2",
63			Name:  "check_config",
64			Path:  "/api/core/v2/namespaces/{namespace}/checks",
65			Fields: []suggest.Field{
66				&suggest.ObjectField{
67					Name: "metadata",
68					Fields: []suggest.Field{
69						suggest.NameField,
70						suggest.LabelsField,
71					},
72				},
73				&suggest.CustomField{
74					Name: "proxy_entity_name",
75					FieldFunc: func(res v2.Resource) []string {
76						return []string{res.(*v2.CheckConfig).ProxyEntityName}
77					},
78				},
79				&suggest.CustomField{
80					Name:      "command",
81					FieldFunc: commandFn,
82				},
83				&suggest.CustomField{
84					Name:      "subscriptions",
85					FieldFunc: subscriptionsFn,
86				},
87				&suggest.CustomField{
88					Name:      "timeout",
89					FieldFunc: timeoutFn,
90				},
91			},
92		},
93		&suggest.Resource{
94			Group: "core/v2",
95			Name:  "entity",
96			Path:  "/api/core/v2/namespaces/{namespace}/entities",
97			Fields: []suggest.Field{
98				&suggest.ObjectField{
99					Name: "metadata",
100					Fields: []suggest.Field{
101						suggest.NameField,
102						suggest.LabelsField,
103					},
104				},
105				&suggest.ObjectField{
106					Name: "system",
107					Fields: []suggest.Field{
108						&suggest.CustomField{
109							Name: "os",
110							FieldFunc: func(res v2.Resource) []string {
111								return []string{res.(*v2.Entity).System.OS}
112							},
113						},
114						&suggest.CustomField{
115							Name: "platform",
116							FieldFunc: func(res v2.Resource) []string {
117								return []string{res.(*v2.Entity).System.Platform}
118							},
119						},
120						&suggest.CustomField{
121							Name: "platform_family",
122							FieldFunc: func(res v2.Resource) []string {
123								return []string{res.(*v2.Entity).System.PlatformFamily}
124							},
125						},
126						&suggest.CustomField{
127							Name: "arch",
128							FieldFunc: func(res v2.Resource) []string {
129								return []string{res.(*v2.Entity).System.Arch}
130							},
131						},
132					},
133				},
134				&suggest.CustomField{
135					Name:      "subscriptions",
136					FieldFunc: subscriptionsFn,
137				},
138				&suggest.CustomField{
139					Name: "user",
140					FieldFunc: func(res v2.Resource) []string {
141						return []string{res.(*v2.Entity).User}
142					},
143				},
144			},
145		},
146		&suggest.Resource{
147			Group: "core/v2",
148			Name:  "filter",
149			Path:  "/api/core/v2/namespaces/{namespace}/filters",
150			Fields: []suggest.Field{
151				&suggest.ObjectField{
152					Name: "metadata",
153					Fields: []suggest.Field{
154						suggest.NameField,
155						suggest.LabelsField,
156					},
157				},
158			},
159		},
160		&suggest.Resource{
161			Group: "core/v2",
162			Name:  "handler",
163			Path:  "/api/core/v2/namespaces/{namespace}/handlers",
164			Fields: []suggest.Field{
165				&suggest.ObjectField{
166					Name: "metadata",
167					Fields: []suggest.Field{
168						suggest.NameField,
169						suggest.LabelsField,
170					},
171				},
172				&suggest.CustomField{
173					Name:      "command",
174					FieldFunc: commandFn,
175				},
176				&suggest.CustomField{
177					Name:      "timeout",
178					FieldFunc: timeoutFn,
179				},
180			},
181		},
182		&suggest.Resource{
183			Group: "core/v2",
184			Name:  "hook_config",
185			Path:  "/api/core/v2/namespaces/{namespace}/hooks",
186			Fields: []suggest.Field{
187				&suggest.ObjectField{
188					Name: "metadata",
189					Fields: []suggest.Field{
190						suggest.NameField,
191						suggest.LabelsField,
192					},
193				},
194				&suggest.CustomField{
195					Name:      "command",
196					FieldFunc: commandFn,
197				},
198				&suggest.CustomField{
199					Name:      "timeout",
200					FieldFunc: timeoutFn,
201				},
202			},
203		},
204		&suggest.Resource{
205			Group: "core/v2",
206			Name:  "mutator",
207			Path:  "/api/core/v2/namespaces/{namespace}/mutators",
208			Fields: []suggest.Field{
209				&suggest.ObjectField{
210					Name: "metadata",
211					Fields: []suggest.Field{
212						suggest.NameField,
213						suggest.LabelsField,
214					},
215				},
216				&suggest.CustomField{
217					Name:      "command",
218					FieldFunc: commandFn,
219				},
220				&suggest.CustomField{
221					Name:      "timeout",
222					FieldFunc: timeoutFn,
223				},
224			},
225		},
226		&suggest.Resource{
227			Group: "core/v2",
228			Name:  "silenced",
229			Path:  "/api/core/v2/namespaces/{namespace}/silenced",
230			Fields: []suggest.Field{
231				&suggest.ObjectField{
232					Name: "metadata",
233					Fields: []suggest.Field{
234						suggest.NameField,
235						suggest.LabelsField,
236					},
237				},
238				&suggest.CustomField{
239					Name: "check",
240					FieldFunc: func(res v2.Resource) []string {
241						return []string{res.(*v2.Silenced).Check}
242					},
243				},
244				&suggest.CustomField{
245					Name: "subscription",
246					FieldFunc: func(res v2.Resource) []string {
247						return []string{res.(*v2.Silenced).Subscription}
248					},
249				},
250				&suggest.CustomField{
251					Name: "creator",
252					FieldFunc: func(res v2.Resource) []string {
253						return []string{res.(*v2.Silenced).Creator}
254					},
255				},
256			},
257		},
258		&suggest.Resource{
259			Group: "core/v2",
260			Name:  "user",
261			Path:  "/api/core/v2/users",
262			Fields: []suggest.Field{
263				&suggest.CustomField{
264					Name: "username",
265					FieldFunc: func(res v2.Resource) []string {
266						return []string{res.(*v2.User).Username}
267					},
268				},
269				&suggest.CustomField{
270					Name: "groups",
271					FieldFunc: func(res v2.Resource) []string {
272						return res.(*v2.User).Groups
273					},
274				},
275			},
276		},
277	}
278}
279