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