1// +build go1.13
2
3// Copyright (c) Microsoft Corporation. All rights reserved.
4// Licensed under the MIT License. See License.txt in the project root for license information.
5// Code generated by Microsoft (R) AutoRest Code Generator.
6// Changes may cause incorrect behavior and will be lost if the code is regenerated.
7
8package armapimanagement
9
10import (
11	"context"
12	"errors"
13	"fmt"
14	"github.com/Azure/azure-sdk-for-go/sdk/armcore"
15	"github.com/Azure/azure-sdk-for-go/sdk/azcore"
16	"net/http"
17	"net/url"
18	"strconv"
19	"strings"
20)
21
22// GroupClient contains the methods for the Group group.
23// Don't use this type directly, use NewGroupClient() instead.
24type GroupClient struct {
25	con            *armcore.Connection
26	subscriptionID string
27}
28
29// NewGroupClient creates a new instance of GroupClient with the specified values.
30func NewGroupClient(con *armcore.Connection, subscriptionID string) *GroupClient {
31	return &GroupClient{con: con, subscriptionID: subscriptionID}
32}
33
34// CreateOrUpdate - Creates or Updates a group.
35// If the operation fails it returns the *ErrorResponse error type.
36func (client *GroupClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, serviceName string, groupID string, parameters GroupCreateParameters, options *GroupCreateOrUpdateOptions) (GroupCreateOrUpdateResponse, error) {
37	req, err := client.createOrUpdateCreateRequest(ctx, resourceGroupName, serviceName, groupID, parameters, options)
38	if err != nil {
39		return GroupCreateOrUpdateResponse{}, err
40	}
41	resp, err := client.con.Pipeline().Do(req)
42	if err != nil {
43		return GroupCreateOrUpdateResponse{}, err
44	}
45	if !resp.HasStatusCode(http.StatusOK, http.StatusCreated) {
46		return GroupCreateOrUpdateResponse{}, client.createOrUpdateHandleError(resp)
47	}
48	return client.createOrUpdateHandleResponse(resp)
49}
50
51// createOrUpdateCreateRequest creates the CreateOrUpdate request.
52func (client *GroupClient) createOrUpdateCreateRequest(ctx context.Context, resourceGroupName string, serviceName string, groupID string, parameters GroupCreateParameters, options *GroupCreateOrUpdateOptions) (*azcore.Request, error) {
53	urlPath := "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/groups/{groupId}"
54	if resourceGroupName == "" {
55		return nil, errors.New("parameter resourceGroupName cannot be empty")
56	}
57	urlPath = strings.ReplaceAll(urlPath, "{resourceGroupName}", url.PathEscape(resourceGroupName))
58	if serviceName == "" {
59		return nil, errors.New("parameter serviceName cannot be empty")
60	}
61	urlPath = strings.ReplaceAll(urlPath, "{serviceName}", url.PathEscape(serviceName))
62	if groupID == "" {
63		return nil, errors.New("parameter groupID cannot be empty")
64	}
65	urlPath = strings.ReplaceAll(urlPath, "{groupId}", url.PathEscape(groupID))
66	if client.subscriptionID == "" {
67		return nil, errors.New("parameter client.subscriptionID cannot be empty")
68	}
69	urlPath = strings.ReplaceAll(urlPath, "{subscriptionId}", url.PathEscape(client.subscriptionID))
70	req, err := azcore.NewRequest(ctx, http.MethodPut, azcore.JoinPaths(client.con.Endpoint(), urlPath))
71	if err != nil {
72		return nil, err
73	}
74	req.Telemetry(telemetryInfo)
75	reqQP := req.URL.Query()
76	reqQP.Set("api-version", "2020-12-01")
77	req.URL.RawQuery = reqQP.Encode()
78	if options != nil && options.IfMatch != nil {
79		req.Header.Set("If-Match", *options.IfMatch)
80	}
81	req.Header.Set("Accept", "application/json")
82	return req, req.MarshalAsJSON(parameters)
83}
84
85// createOrUpdateHandleResponse handles the CreateOrUpdate response.
86func (client *GroupClient) createOrUpdateHandleResponse(resp *azcore.Response) (GroupCreateOrUpdateResponse, error) {
87	result := GroupCreateOrUpdateResponse{RawResponse: resp.Response}
88	if val := resp.Header.Get("ETag"); val != "" {
89		result.ETag = &val
90	}
91	if err := resp.UnmarshalAsJSON(&result.GroupContract); err != nil {
92		return GroupCreateOrUpdateResponse{}, err
93	}
94	return result, nil
95}
96
97// createOrUpdateHandleError handles the CreateOrUpdate error response.
98func (client *GroupClient) createOrUpdateHandleError(resp *azcore.Response) error {
99	body, err := resp.Payload()
100	if err != nil {
101		return azcore.NewResponseError(err, resp.Response)
102	}
103	errType := ErrorResponse{raw: string(body)}
104	if err := resp.UnmarshalAsJSON(&errType.InnerError); err != nil {
105		return azcore.NewResponseError(fmt.Errorf("%s\n%s", string(body), err), resp.Response)
106	}
107	return azcore.NewResponseError(&errType, resp.Response)
108}
109
110// Delete - Deletes specific group of the API Management service instance.
111// If the operation fails it returns the *ErrorResponse error type.
112func (client *GroupClient) Delete(ctx context.Context, resourceGroupName string, serviceName string, groupID string, ifMatch string, options *GroupDeleteOptions) (GroupDeleteResponse, error) {
113	req, err := client.deleteCreateRequest(ctx, resourceGroupName, serviceName, groupID, ifMatch, options)
114	if err != nil {
115		return GroupDeleteResponse{}, err
116	}
117	resp, err := client.con.Pipeline().Do(req)
118	if err != nil {
119		return GroupDeleteResponse{}, err
120	}
121	if !resp.HasStatusCode(http.StatusOK, http.StatusNoContent) {
122		return GroupDeleteResponse{}, client.deleteHandleError(resp)
123	}
124	return GroupDeleteResponse{RawResponse: resp.Response}, nil
125}
126
127// deleteCreateRequest creates the Delete request.
128func (client *GroupClient) deleteCreateRequest(ctx context.Context, resourceGroupName string, serviceName string, groupID string, ifMatch string, options *GroupDeleteOptions) (*azcore.Request, error) {
129	urlPath := "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/groups/{groupId}"
130	if resourceGroupName == "" {
131		return nil, errors.New("parameter resourceGroupName cannot be empty")
132	}
133	urlPath = strings.ReplaceAll(urlPath, "{resourceGroupName}", url.PathEscape(resourceGroupName))
134	if serviceName == "" {
135		return nil, errors.New("parameter serviceName cannot be empty")
136	}
137	urlPath = strings.ReplaceAll(urlPath, "{serviceName}", url.PathEscape(serviceName))
138	if groupID == "" {
139		return nil, errors.New("parameter groupID cannot be empty")
140	}
141	urlPath = strings.ReplaceAll(urlPath, "{groupId}", url.PathEscape(groupID))
142	if client.subscriptionID == "" {
143		return nil, errors.New("parameter client.subscriptionID cannot be empty")
144	}
145	urlPath = strings.ReplaceAll(urlPath, "{subscriptionId}", url.PathEscape(client.subscriptionID))
146	req, err := azcore.NewRequest(ctx, http.MethodDelete, azcore.JoinPaths(client.con.Endpoint(), urlPath))
147	if err != nil {
148		return nil, err
149	}
150	req.Telemetry(telemetryInfo)
151	reqQP := req.URL.Query()
152	reqQP.Set("api-version", "2020-12-01")
153	req.URL.RawQuery = reqQP.Encode()
154	req.Header.Set("If-Match", ifMatch)
155	req.Header.Set("Accept", "application/json")
156	return req, nil
157}
158
159// deleteHandleError handles the Delete error response.
160func (client *GroupClient) deleteHandleError(resp *azcore.Response) error {
161	body, err := resp.Payload()
162	if err != nil {
163		return azcore.NewResponseError(err, resp.Response)
164	}
165	errType := ErrorResponse{raw: string(body)}
166	if err := resp.UnmarshalAsJSON(&errType.InnerError); err != nil {
167		return azcore.NewResponseError(fmt.Errorf("%s\n%s", string(body), err), resp.Response)
168	}
169	return azcore.NewResponseError(&errType, resp.Response)
170}
171
172// Get - Gets the details of the group specified by its identifier.
173// If the operation fails it returns the *ErrorResponse error type.
174func (client *GroupClient) Get(ctx context.Context, resourceGroupName string, serviceName string, groupID string, options *GroupGetOptions) (GroupGetResponse, error) {
175	req, err := client.getCreateRequest(ctx, resourceGroupName, serviceName, groupID, options)
176	if err != nil {
177		return GroupGetResponse{}, err
178	}
179	resp, err := client.con.Pipeline().Do(req)
180	if err != nil {
181		return GroupGetResponse{}, err
182	}
183	if !resp.HasStatusCode(http.StatusOK) {
184		return GroupGetResponse{}, client.getHandleError(resp)
185	}
186	return client.getHandleResponse(resp)
187}
188
189// getCreateRequest creates the Get request.
190func (client *GroupClient) getCreateRequest(ctx context.Context, resourceGroupName string, serviceName string, groupID string, options *GroupGetOptions) (*azcore.Request, error) {
191	urlPath := "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/groups/{groupId}"
192	if resourceGroupName == "" {
193		return nil, errors.New("parameter resourceGroupName cannot be empty")
194	}
195	urlPath = strings.ReplaceAll(urlPath, "{resourceGroupName}", url.PathEscape(resourceGroupName))
196	if serviceName == "" {
197		return nil, errors.New("parameter serviceName cannot be empty")
198	}
199	urlPath = strings.ReplaceAll(urlPath, "{serviceName}", url.PathEscape(serviceName))
200	if groupID == "" {
201		return nil, errors.New("parameter groupID cannot be empty")
202	}
203	urlPath = strings.ReplaceAll(urlPath, "{groupId}", url.PathEscape(groupID))
204	if client.subscriptionID == "" {
205		return nil, errors.New("parameter client.subscriptionID cannot be empty")
206	}
207	urlPath = strings.ReplaceAll(urlPath, "{subscriptionId}", url.PathEscape(client.subscriptionID))
208	req, err := azcore.NewRequest(ctx, http.MethodGet, azcore.JoinPaths(client.con.Endpoint(), urlPath))
209	if err != nil {
210		return nil, err
211	}
212	req.Telemetry(telemetryInfo)
213	reqQP := req.URL.Query()
214	reqQP.Set("api-version", "2020-12-01")
215	req.URL.RawQuery = reqQP.Encode()
216	req.Header.Set("Accept", "application/json")
217	return req, nil
218}
219
220// getHandleResponse handles the Get response.
221func (client *GroupClient) getHandleResponse(resp *azcore.Response) (GroupGetResponse, error) {
222	result := GroupGetResponse{RawResponse: resp.Response}
223	if val := resp.Header.Get("ETag"); val != "" {
224		result.ETag = &val
225	}
226	if err := resp.UnmarshalAsJSON(&result.GroupContract); err != nil {
227		return GroupGetResponse{}, err
228	}
229	return result, nil
230}
231
232// getHandleError handles the Get error response.
233func (client *GroupClient) getHandleError(resp *azcore.Response) error {
234	body, err := resp.Payload()
235	if err != nil {
236		return azcore.NewResponseError(err, resp.Response)
237	}
238	errType := ErrorResponse{raw: string(body)}
239	if err := resp.UnmarshalAsJSON(&errType.InnerError); err != nil {
240		return azcore.NewResponseError(fmt.Errorf("%s\n%s", string(body), err), resp.Response)
241	}
242	return azcore.NewResponseError(&errType, resp.Response)
243}
244
245// GetEntityTag - Gets the entity state (Etag) version of the group specified by its identifier.
246// If the operation fails it returns the *ErrorResponse error type.
247func (client *GroupClient) GetEntityTag(ctx context.Context, resourceGroupName string, serviceName string, groupID string, options *GroupGetEntityTagOptions) (GroupGetEntityTagResponse, error) {
248	req, err := client.getEntityTagCreateRequest(ctx, resourceGroupName, serviceName, groupID, options)
249	if err != nil {
250		return GroupGetEntityTagResponse{}, err
251	}
252	resp, err := client.con.Pipeline().Do(req)
253	if err != nil {
254		return GroupGetEntityTagResponse{}, err
255	}
256	return client.getEntityTagHandleResponse(resp)
257}
258
259// getEntityTagCreateRequest creates the GetEntityTag request.
260func (client *GroupClient) getEntityTagCreateRequest(ctx context.Context, resourceGroupName string, serviceName string, groupID string, options *GroupGetEntityTagOptions) (*azcore.Request, error) {
261	urlPath := "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/groups/{groupId}"
262	if resourceGroupName == "" {
263		return nil, errors.New("parameter resourceGroupName cannot be empty")
264	}
265	urlPath = strings.ReplaceAll(urlPath, "{resourceGroupName}", url.PathEscape(resourceGroupName))
266	if serviceName == "" {
267		return nil, errors.New("parameter serviceName cannot be empty")
268	}
269	urlPath = strings.ReplaceAll(urlPath, "{serviceName}", url.PathEscape(serviceName))
270	if groupID == "" {
271		return nil, errors.New("parameter groupID cannot be empty")
272	}
273	urlPath = strings.ReplaceAll(urlPath, "{groupId}", url.PathEscape(groupID))
274	if client.subscriptionID == "" {
275		return nil, errors.New("parameter client.subscriptionID cannot be empty")
276	}
277	urlPath = strings.ReplaceAll(urlPath, "{subscriptionId}", url.PathEscape(client.subscriptionID))
278	req, err := azcore.NewRequest(ctx, http.MethodHead, azcore.JoinPaths(client.con.Endpoint(), urlPath))
279	if err != nil {
280		return nil, err
281	}
282	req.Telemetry(telemetryInfo)
283	reqQP := req.URL.Query()
284	reqQP.Set("api-version", "2020-12-01")
285	req.URL.RawQuery = reqQP.Encode()
286	req.Header.Set("Accept", "application/json")
287	return req, nil
288}
289
290// getEntityTagHandleResponse handles the GetEntityTag response.
291func (client *GroupClient) getEntityTagHandleResponse(resp *azcore.Response) (GroupGetEntityTagResponse, error) {
292	result := GroupGetEntityTagResponse{RawResponse: resp.Response}
293	if val := resp.Header.Get("ETag"); val != "" {
294		result.ETag = &val
295	}
296	if resp.StatusCode >= 200 && resp.StatusCode < 300 {
297		result.Success = true
298	}
299	return result, nil
300}
301
302// ListByService - Lists a collection of groups defined within a service instance.
303// If the operation fails it returns the *ErrorResponse error type.
304func (client *GroupClient) ListByService(resourceGroupName string, serviceName string, options *GroupListByServiceOptions) GroupListByServicePager {
305	return &groupListByServicePager{
306		client: client,
307		requester: func(ctx context.Context) (*azcore.Request, error) {
308			return client.listByServiceCreateRequest(ctx, resourceGroupName, serviceName, options)
309		},
310		advancer: func(ctx context.Context, resp GroupListByServiceResponse) (*azcore.Request, error) {
311			return azcore.NewRequest(ctx, http.MethodGet, *resp.GroupCollection.NextLink)
312		},
313	}
314}
315
316// listByServiceCreateRequest creates the ListByService request.
317func (client *GroupClient) listByServiceCreateRequest(ctx context.Context, resourceGroupName string, serviceName string, options *GroupListByServiceOptions) (*azcore.Request, error) {
318	urlPath := "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/groups"
319	if resourceGroupName == "" {
320		return nil, errors.New("parameter resourceGroupName cannot be empty")
321	}
322	urlPath = strings.ReplaceAll(urlPath, "{resourceGroupName}", url.PathEscape(resourceGroupName))
323	if serviceName == "" {
324		return nil, errors.New("parameter serviceName cannot be empty")
325	}
326	urlPath = strings.ReplaceAll(urlPath, "{serviceName}", url.PathEscape(serviceName))
327	if client.subscriptionID == "" {
328		return nil, errors.New("parameter client.subscriptionID cannot be empty")
329	}
330	urlPath = strings.ReplaceAll(urlPath, "{subscriptionId}", url.PathEscape(client.subscriptionID))
331	req, err := azcore.NewRequest(ctx, http.MethodGet, azcore.JoinPaths(client.con.Endpoint(), urlPath))
332	if err != nil {
333		return nil, err
334	}
335	req.Telemetry(telemetryInfo)
336	reqQP := req.URL.Query()
337	if options != nil && options.Filter != nil {
338		reqQP.Set("$filter", *options.Filter)
339	}
340	if options != nil && options.Top != nil {
341		reqQP.Set("$top", strconv.FormatInt(int64(*options.Top), 10))
342	}
343	if options != nil && options.Skip != nil {
344		reqQP.Set("$skip", strconv.FormatInt(int64(*options.Skip), 10))
345	}
346	reqQP.Set("api-version", "2020-12-01")
347	req.URL.RawQuery = reqQP.Encode()
348	req.Header.Set("Accept", "application/json")
349	return req, nil
350}
351
352// listByServiceHandleResponse handles the ListByService response.
353func (client *GroupClient) listByServiceHandleResponse(resp *azcore.Response) (GroupListByServiceResponse, error) {
354	result := GroupListByServiceResponse{RawResponse: resp.Response}
355	if err := resp.UnmarshalAsJSON(&result.GroupCollection); err != nil {
356		return GroupListByServiceResponse{}, err
357	}
358	return result, nil
359}
360
361// listByServiceHandleError handles the ListByService error response.
362func (client *GroupClient) listByServiceHandleError(resp *azcore.Response) error {
363	body, err := resp.Payload()
364	if err != nil {
365		return azcore.NewResponseError(err, resp.Response)
366	}
367	errType := ErrorResponse{raw: string(body)}
368	if err := resp.UnmarshalAsJSON(&errType.InnerError); err != nil {
369		return azcore.NewResponseError(fmt.Errorf("%s\n%s", string(body), err), resp.Response)
370	}
371	return azcore.NewResponseError(&errType, resp.Response)
372}
373
374// Update - Updates the details of the group specified by its identifier.
375// If the operation fails it returns the *ErrorResponse error type.
376func (client *GroupClient) Update(ctx context.Context, resourceGroupName string, serviceName string, groupID string, ifMatch string, parameters GroupUpdateParameters, options *GroupUpdateOptions) (GroupUpdateResponse, error) {
377	req, err := client.updateCreateRequest(ctx, resourceGroupName, serviceName, groupID, ifMatch, parameters, options)
378	if err != nil {
379		return GroupUpdateResponse{}, err
380	}
381	resp, err := client.con.Pipeline().Do(req)
382	if err != nil {
383		return GroupUpdateResponse{}, err
384	}
385	if !resp.HasStatusCode(http.StatusOK) {
386		return GroupUpdateResponse{}, client.updateHandleError(resp)
387	}
388	return client.updateHandleResponse(resp)
389}
390
391// updateCreateRequest creates the Update request.
392func (client *GroupClient) updateCreateRequest(ctx context.Context, resourceGroupName string, serviceName string, groupID string, ifMatch string, parameters GroupUpdateParameters, options *GroupUpdateOptions) (*azcore.Request, error) {
393	urlPath := "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/groups/{groupId}"
394	if resourceGroupName == "" {
395		return nil, errors.New("parameter resourceGroupName cannot be empty")
396	}
397	urlPath = strings.ReplaceAll(urlPath, "{resourceGroupName}", url.PathEscape(resourceGroupName))
398	if serviceName == "" {
399		return nil, errors.New("parameter serviceName cannot be empty")
400	}
401	urlPath = strings.ReplaceAll(urlPath, "{serviceName}", url.PathEscape(serviceName))
402	if groupID == "" {
403		return nil, errors.New("parameter groupID cannot be empty")
404	}
405	urlPath = strings.ReplaceAll(urlPath, "{groupId}", url.PathEscape(groupID))
406	if client.subscriptionID == "" {
407		return nil, errors.New("parameter client.subscriptionID cannot be empty")
408	}
409	urlPath = strings.ReplaceAll(urlPath, "{subscriptionId}", url.PathEscape(client.subscriptionID))
410	req, err := azcore.NewRequest(ctx, http.MethodPatch, azcore.JoinPaths(client.con.Endpoint(), urlPath))
411	if err != nil {
412		return nil, err
413	}
414	req.Telemetry(telemetryInfo)
415	reqQP := req.URL.Query()
416	reqQP.Set("api-version", "2020-12-01")
417	req.URL.RawQuery = reqQP.Encode()
418	req.Header.Set("If-Match", ifMatch)
419	req.Header.Set("Accept", "application/json")
420	return req, req.MarshalAsJSON(parameters)
421}
422
423// updateHandleResponse handles the Update response.
424func (client *GroupClient) updateHandleResponse(resp *azcore.Response) (GroupUpdateResponse, error) {
425	result := GroupUpdateResponse{RawResponse: resp.Response}
426	if val := resp.Header.Get("ETag"); val != "" {
427		result.ETag = &val
428	}
429	if err := resp.UnmarshalAsJSON(&result.GroupContract); err != nil {
430		return GroupUpdateResponse{}, err
431	}
432	return result, nil
433}
434
435// updateHandleError handles the Update error response.
436func (client *GroupClient) updateHandleError(resp *azcore.Response) error {
437	body, err := resp.Payload()
438	if err != nil {
439		return azcore.NewResponseError(err, resp.Response)
440	}
441	errType := ErrorResponse{raw: string(body)}
442	if err := resp.UnmarshalAsJSON(&errType.InnerError); err != nil {
443		return azcore.NewResponseError(fmt.Errorf("%s\n%s", string(body), err), resp.Response)
444	}
445	return azcore.NewResponseError(&errType, resp.Response)
446}
447