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	"strings"
19)
20
21// PolicyClient contains the methods for the Policy group.
22// Don't use this type directly, use NewPolicyClient() instead.
23type PolicyClient struct {
24	con            *armcore.Connection
25	subscriptionID string
26}
27
28// NewPolicyClient creates a new instance of PolicyClient with the specified values.
29func NewPolicyClient(con *armcore.Connection, subscriptionID string) *PolicyClient {
30	return &PolicyClient{con: con, subscriptionID: subscriptionID}
31}
32
33// CreateOrUpdate - Creates or updates the global policy configuration of the Api Management service.
34// If the operation fails it returns the *ErrorResponse error type.
35func (client *PolicyClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, serviceName string, policyID PolicyIDName, parameters PolicyContract, options *PolicyCreateOrUpdateOptions) (PolicyCreateOrUpdateResponse, error) {
36	req, err := client.createOrUpdateCreateRequest(ctx, resourceGroupName, serviceName, policyID, parameters, options)
37	if err != nil {
38		return PolicyCreateOrUpdateResponse{}, err
39	}
40	resp, err := client.con.Pipeline().Do(req)
41	if err != nil {
42		return PolicyCreateOrUpdateResponse{}, err
43	}
44	if !resp.HasStatusCode(http.StatusOK, http.StatusCreated) {
45		return PolicyCreateOrUpdateResponse{}, client.createOrUpdateHandleError(resp)
46	}
47	return client.createOrUpdateHandleResponse(resp)
48}
49
50// createOrUpdateCreateRequest creates the CreateOrUpdate request.
51func (client *PolicyClient) createOrUpdateCreateRequest(ctx context.Context, resourceGroupName string, serviceName string, policyID PolicyIDName, parameters PolicyContract, options *PolicyCreateOrUpdateOptions) (*azcore.Request, error) {
52	urlPath := "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/policies/{policyId}"
53	if resourceGroupName == "" {
54		return nil, errors.New("parameter resourceGroupName cannot be empty")
55	}
56	urlPath = strings.ReplaceAll(urlPath, "{resourceGroupName}", url.PathEscape(resourceGroupName))
57	if serviceName == "" {
58		return nil, errors.New("parameter serviceName cannot be empty")
59	}
60	urlPath = strings.ReplaceAll(urlPath, "{serviceName}", url.PathEscape(serviceName))
61	if policyID == "" {
62		return nil, errors.New("parameter policyID cannot be empty")
63	}
64	urlPath = strings.ReplaceAll(urlPath, "{policyId}", url.PathEscape(string(policyID)))
65	if client.subscriptionID == "" {
66		return nil, errors.New("parameter client.subscriptionID cannot be empty")
67	}
68	urlPath = strings.ReplaceAll(urlPath, "{subscriptionId}", url.PathEscape(client.subscriptionID))
69	req, err := azcore.NewRequest(ctx, http.MethodPut, azcore.JoinPaths(client.con.Endpoint(), urlPath))
70	if err != nil {
71		return nil, err
72	}
73	req.Telemetry(telemetryInfo)
74	reqQP := req.URL.Query()
75	reqQP.Set("api-version", "2020-12-01")
76	req.URL.RawQuery = reqQP.Encode()
77	if options != nil && options.IfMatch != nil {
78		req.Header.Set("If-Match", *options.IfMatch)
79	}
80	req.Header.Set("Accept", "application/json")
81	return req, req.MarshalAsJSON(parameters)
82}
83
84// createOrUpdateHandleResponse handles the CreateOrUpdate response.
85func (client *PolicyClient) createOrUpdateHandleResponse(resp *azcore.Response) (PolicyCreateOrUpdateResponse, error) {
86	result := PolicyCreateOrUpdateResponse{RawResponse: resp.Response}
87	if val := resp.Header.Get("ETag"); val != "" {
88		result.ETag = &val
89	}
90	if err := resp.UnmarshalAsJSON(&result.PolicyContract); err != nil {
91		return PolicyCreateOrUpdateResponse{}, err
92	}
93	return result, nil
94}
95
96// createOrUpdateHandleError handles the CreateOrUpdate error response.
97func (client *PolicyClient) createOrUpdateHandleError(resp *azcore.Response) error {
98	body, err := resp.Payload()
99	if err != nil {
100		return azcore.NewResponseError(err, resp.Response)
101	}
102	errType := ErrorResponse{raw: string(body)}
103	if err := resp.UnmarshalAsJSON(&errType.InnerError); err != nil {
104		return azcore.NewResponseError(fmt.Errorf("%s\n%s", string(body), err), resp.Response)
105	}
106	return azcore.NewResponseError(&errType, resp.Response)
107}
108
109// Delete - Deletes the global policy configuration of the Api Management Service.
110// If the operation fails it returns the *ErrorResponse error type.
111func (client *PolicyClient) Delete(ctx context.Context, resourceGroupName string, serviceName string, policyID PolicyIDName, ifMatch string, options *PolicyDeleteOptions) (PolicyDeleteResponse, error) {
112	req, err := client.deleteCreateRequest(ctx, resourceGroupName, serviceName, policyID, ifMatch, options)
113	if err != nil {
114		return PolicyDeleteResponse{}, err
115	}
116	resp, err := client.con.Pipeline().Do(req)
117	if err != nil {
118		return PolicyDeleteResponse{}, err
119	}
120	if !resp.HasStatusCode(http.StatusOK, http.StatusNoContent) {
121		return PolicyDeleteResponse{}, client.deleteHandleError(resp)
122	}
123	return PolicyDeleteResponse{RawResponse: resp.Response}, nil
124}
125
126// deleteCreateRequest creates the Delete request.
127func (client *PolicyClient) deleteCreateRequest(ctx context.Context, resourceGroupName string, serviceName string, policyID PolicyIDName, ifMatch string, options *PolicyDeleteOptions) (*azcore.Request, error) {
128	urlPath := "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/policies/{policyId}"
129	if resourceGroupName == "" {
130		return nil, errors.New("parameter resourceGroupName cannot be empty")
131	}
132	urlPath = strings.ReplaceAll(urlPath, "{resourceGroupName}", url.PathEscape(resourceGroupName))
133	if serviceName == "" {
134		return nil, errors.New("parameter serviceName cannot be empty")
135	}
136	urlPath = strings.ReplaceAll(urlPath, "{serviceName}", url.PathEscape(serviceName))
137	if policyID == "" {
138		return nil, errors.New("parameter policyID cannot be empty")
139	}
140	urlPath = strings.ReplaceAll(urlPath, "{policyId}", url.PathEscape(string(policyID)))
141	if client.subscriptionID == "" {
142		return nil, errors.New("parameter client.subscriptionID cannot be empty")
143	}
144	urlPath = strings.ReplaceAll(urlPath, "{subscriptionId}", url.PathEscape(client.subscriptionID))
145	req, err := azcore.NewRequest(ctx, http.MethodDelete, azcore.JoinPaths(client.con.Endpoint(), urlPath))
146	if err != nil {
147		return nil, err
148	}
149	req.Telemetry(telemetryInfo)
150	reqQP := req.URL.Query()
151	reqQP.Set("api-version", "2020-12-01")
152	req.URL.RawQuery = reqQP.Encode()
153	req.Header.Set("If-Match", ifMatch)
154	req.Header.Set("Accept", "application/json")
155	return req, nil
156}
157
158// deleteHandleError handles the Delete error response.
159func (client *PolicyClient) deleteHandleError(resp *azcore.Response) error {
160	body, err := resp.Payload()
161	if err != nil {
162		return azcore.NewResponseError(err, resp.Response)
163	}
164	errType := ErrorResponse{raw: string(body)}
165	if err := resp.UnmarshalAsJSON(&errType.InnerError); err != nil {
166		return azcore.NewResponseError(fmt.Errorf("%s\n%s", string(body), err), resp.Response)
167	}
168	return azcore.NewResponseError(&errType, resp.Response)
169}
170
171// Get - Get the Global policy definition of the Api Management service.
172// If the operation fails it returns the *ErrorResponse error type.
173func (client *PolicyClient) Get(ctx context.Context, resourceGroupName string, serviceName string, policyID PolicyIDName, options *PolicyGetOptions) (PolicyGetResponse, error) {
174	req, err := client.getCreateRequest(ctx, resourceGroupName, serviceName, policyID, options)
175	if err != nil {
176		return PolicyGetResponse{}, err
177	}
178	resp, err := client.con.Pipeline().Do(req)
179	if err != nil {
180		return PolicyGetResponse{}, err
181	}
182	if !resp.HasStatusCode(http.StatusOK) {
183		return PolicyGetResponse{}, client.getHandleError(resp)
184	}
185	return client.getHandleResponse(resp)
186}
187
188// getCreateRequest creates the Get request.
189func (client *PolicyClient) getCreateRequest(ctx context.Context, resourceGroupName string, serviceName string, policyID PolicyIDName, options *PolicyGetOptions) (*azcore.Request, error) {
190	urlPath := "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/policies/{policyId}"
191	if resourceGroupName == "" {
192		return nil, errors.New("parameter resourceGroupName cannot be empty")
193	}
194	urlPath = strings.ReplaceAll(urlPath, "{resourceGroupName}", url.PathEscape(resourceGroupName))
195	if serviceName == "" {
196		return nil, errors.New("parameter serviceName cannot be empty")
197	}
198	urlPath = strings.ReplaceAll(urlPath, "{serviceName}", url.PathEscape(serviceName))
199	if policyID == "" {
200		return nil, errors.New("parameter policyID cannot be empty")
201	}
202	urlPath = strings.ReplaceAll(urlPath, "{policyId}", url.PathEscape(string(policyID)))
203	if client.subscriptionID == "" {
204		return nil, errors.New("parameter client.subscriptionID cannot be empty")
205	}
206	urlPath = strings.ReplaceAll(urlPath, "{subscriptionId}", url.PathEscape(client.subscriptionID))
207	req, err := azcore.NewRequest(ctx, http.MethodGet, azcore.JoinPaths(client.con.Endpoint(), urlPath))
208	if err != nil {
209		return nil, err
210	}
211	req.Telemetry(telemetryInfo)
212	reqQP := req.URL.Query()
213	if options != nil && options.Format != nil {
214		reqQP.Set("format", string(*options.Format))
215	}
216	reqQP.Set("api-version", "2020-12-01")
217	req.URL.RawQuery = reqQP.Encode()
218	req.Header.Set("Accept", "application/json")
219	return req, nil
220}
221
222// getHandleResponse handles the Get response.
223func (client *PolicyClient) getHandleResponse(resp *azcore.Response) (PolicyGetResponse, error) {
224	result := PolicyGetResponse{RawResponse: resp.Response}
225	if val := resp.Header.Get("ETag"); val != "" {
226		result.ETag = &val
227	}
228	if err := resp.UnmarshalAsJSON(&result.PolicyContract); err != nil {
229		return PolicyGetResponse{}, err
230	}
231	return result, nil
232}
233
234// getHandleError handles the Get error response.
235func (client *PolicyClient) getHandleError(resp *azcore.Response) error {
236	body, err := resp.Payload()
237	if err != nil {
238		return azcore.NewResponseError(err, resp.Response)
239	}
240	errType := ErrorResponse{raw: string(body)}
241	if err := resp.UnmarshalAsJSON(&errType.InnerError); err != nil {
242		return azcore.NewResponseError(fmt.Errorf("%s\n%s", string(body), err), resp.Response)
243	}
244	return azcore.NewResponseError(&errType, resp.Response)
245}
246
247// GetEntityTag - Gets the entity state (Etag) version of the Global policy definition in the Api Management service.
248// If the operation fails it returns the *ErrorResponse error type.
249func (client *PolicyClient) GetEntityTag(ctx context.Context, resourceGroupName string, serviceName string, policyID PolicyIDName, options *PolicyGetEntityTagOptions) (PolicyGetEntityTagResponse, error) {
250	req, err := client.getEntityTagCreateRequest(ctx, resourceGroupName, serviceName, policyID, options)
251	if err != nil {
252		return PolicyGetEntityTagResponse{}, err
253	}
254	resp, err := client.con.Pipeline().Do(req)
255	if err != nil {
256		return PolicyGetEntityTagResponse{}, err
257	}
258	return client.getEntityTagHandleResponse(resp)
259}
260
261// getEntityTagCreateRequest creates the GetEntityTag request.
262func (client *PolicyClient) getEntityTagCreateRequest(ctx context.Context, resourceGroupName string, serviceName string, policyID PolicyIDName, options *PolicyGetEntityTagOptions) (*azcore.Request, error) {
263	urlPath := "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/policies/{policyId}"
264	if resourceGroupName == "" {
265		return nil, errors.New("parameter resourceGroupName cannot be empty")
266	}
267	urlPath = strings.ReplaceAll(urlPath, "{resourceGroupName}", url.PathEscape(resourceGroupName))
268	if serviceName == "" {
269		return nil, errors.New("parameter serviceName cannot be empty")
270	}
271	urlPath = strings.ReplaceAll(urlPath, "{serviceName}", url.PathEscape(serviceName))
272	if policyID == "" {
273		return nil, errors.New("parameter policyID cannot be empty")
274	}
275	urlPath = strings.ReplaceAll(urlPath, "{policyId}", url.PathEscape(string(policyID)))
276	if client.subscriptionID == "" {
277		return nil, errors.New("parameter client.subscriptionID cannot be empty")
278	}
279	urlPath = strings.ReplaceAll(urlPath, "{subscriptionId}", url.PathEscape(client.subscriptionID))
280	req, err := azcore.NewRequest(ctx, http.MethodHead, azcore.JoinPaths(client.con.Endpoint(), urlPath))
281	if err != nil {
282		return nil, err
283	}
284	req.Telemetry(telemetryInfo)
285	reqQP := req.URL.Query()
286	reqQP.Set("api-version", "2020-12-01")
287	req.URL.RawQuery = reqQP.Encode()
288	req.Header.Set("Accept", "application/json")
289	return req, nil
290}
291
292// getEntityTagHandleResponse handles the GetEntityTag response.
293func (client *PolicyClient) getEntityTagHandleResponse(resp *azcore.Response) (PolicyGetEntityTagResponse, error) {
294	result := PolicyGetEntityTagResponse{RawResponse: resp.Response}
295	if val := resp.Header.Get("ETag"); val != "" {
296		result.ETag = &val
297	}
298	if resp.StatusCode >= 200 && resp.StatusCode < 300 {
299		result.Success = true
300	}
301	return result, nil
302}
303
304// ListByService - Lists all the Global Policy definitions of the Api Management service.
305// If the operation fails it returns the *ErrorResponse error type.
306func (client *PolicyClient) ListByService(ctx context.Context, resourceGroupName string, serviceName string, options *PolicyListByServiceOptions) (PolicyListByServiceResponse, error) {
307	req, err := client.listByServiceCreateRequest(ctx, resourceGroupName, serviceName, options)
308	if err != nil {
309		return PolicyListByServiceResponse{}, err
310	}
311	resp, err := client.con.Pipeline().Do(req)
312	if err != nil {
313		return PolicyListByServiceResponse{}, err
314	}
315	if !resp.HasStatusCode(http.StatusOK) {
316		return PolicyListByServiceResponse{}, client.listByServiceHandleError(resp)
317	}
318	return client.listByServiceHandleResponse(resp)
319}
320
321// listByServiceCreateRequest creates the ListByService request.
322func (client *PolicyClient) listByServiceCreateRequest(ctx context.Context, resourceGroupName string, serviceName string, options *PolicyListByServiceOptions) (*azcore.Request, error) {
323	urlPath := "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/policies"
324	if resourceGroupName == "" {
325		return nil, errors.New("parameter resourceGroupName cannot be empty")
326	}
327	urlPath = strings.ReplaceAll(urlPath, "{resourceGroupName}", url.PathEscape(resourceGroupName))
328	if serviceName == "" {
329		return nil, errors.New("parameter serviceName cannot be empty")
330	}
331	urlPath = strings.ReplaceAll(urlPath, "{serviceName}", url.PathEscape(serviceName))
332	if client.subscriptionID == "" {
333		return nil, errors.New("parameter client.subscriptionID cannot be empty")
334	}
335	urlPath = strings.ReplaceAll(urlPath, "{subscriptionId}", url.PathEscape(client.subscriptionID))
336	req, err := azcore.NewRequest(ctx, http.MethodGet, azcore.JoinPaths(client.con.Endpoint(), urlPath))
337	if err != nil {
338		return nil, err
339	}
340	req.Telemetry(telemetryInfo)
341	reqQP := req.URL.Query()
342	reqQP.Set("api-version", "2020-12-01")
343	req.URL.RawQuery = reqQP.Encode()
344	req.Header.Set("Accept", "application/json")
345	return req, nil
346}
347
348// listByServiceHandleResponse handles the ListByService response.
349func (client *PolicyClient) listByServiceHandleResponse(resp *azcore.Response) (PolicyListByServiceResponse, error) {
350	result := PolicyListByServiceResponse{RawResponse: resp.Response}
351	if err := resp.UnmarshalAsJSON(&result.PolicyCollection); err != nil {
352		return PolicyListByServiceResponse{}, err
353	}
354	return result, nil
355}
356
357// listByServiceHandleError handles the ListByService error response.
358func (client *PolicyClient) listByServiceHandleError(resp *azcore.Response) error {
359	body, err := resp.Payload()
360	if err != nil {
361		return azcore.NewResponseError(err, resp.Response)
362	}
363	errType := ErrorResponse{raw: string(body)}
364	if err := resp.UnmarshalAsJSON(&errType.InnerError); err != nil {
365		return azcore.NewResponseError(fmt.Errorf("%s\n%s", string(body), err), resp.Response)
366	}
367	return azcore.NewResponseError(&errType, resp.Response)
368}
369