@gradientedge/cdk-utils 9.73.0 → 9.74.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/lib/azure/services/api-management/main.d.ts +1 -9
- package/dist/src/lib/azure/services/api-management/main.js +22 -96
- package/dist/src/lib/azure/services/api-management/types.d.ts +3 -5
- package/package.json +1 -1
- package/src/lib/azure/services/api-management/main.ts +23 -112
- package/src/lib/azure/services/api-management/types.ts +4 -6
|
@@ -5,7 +5,7 @@ import { ApiManagementApi } from '@cdktf/provider-azurerm/lib/api-management-api
|
|
|
5
5
|
import { ApiManagementLoggerApplicationInsights } from '@cdktf/provider-azurerm/lib/api-management-logger';
|
|
6
6
|
import { Resource } from '../../.gen/providers/azapi/resource';
|
|
7
7
|
import { CommonAzureConstruct } from '../../common';
|
|
8
|
-
import { ApiManagementProps, ApiManagementBackendProps, ApiManagementApiProps,
|
|
8
|
+
import { ApiManagementProps, ApiManagementBackendProps, ApiManagementApiProps, ApiManagementCustomDomainProps } from './types';
|
|
9
9
|
/**
|
|
10
10
|
* @classdesc Provides operations on Azure Api Management
|
|
11
11
|
* - A new instance of this class is injected into {@link CommonAzureConstruct} constructor.
|
|
@@ -40,14 +40,6 @@ export declare class AzureApiManagementManager {
|
|
|
40
40
|
* @see [CDKTF Api management Module]{@link https://github.com/cdktf/cdktf-provider-azurerm/blob/main/docs/apiManagement.typescript.md}
|
|
41
41
|
*/
|
|
42
42
|
resolveApiManagement(id: string, scope: CommonAzureConstruct, props: DataAzurermApiManagementConfig): DataAzurermApiManagement;
|
|
43
|
-
/**
|
|
44
|
-
* @summary Method to create a new api management
|
|
45
|
-
* @param id scoped id of the resource
|
|
46
|
-
* @param scope scope in which this resource is defined
|
|
47
|
-
* @param props api management properties
|
|
48
|
-
* @see [CDKTF Api management Module]{@link https://github.com/cdktf/cdktf-provider-azurerm/blob/main/docs/apiManagement.typescript.md}
|
|
49
|
-
*/
|
|
50
|
-
createApiManagementv2(id: string, scope: CommonAzureConstruct, props: ApiManagementV2Props, applicationInsightsKey?: ApiManagementLoggerApplicationInsights['instrumentationKey']): Resource;
|
|
51
43
|
/**
|
|
52
44
|
* @summary Method to create a new api management backend
|
|
53
45
|
* @param id scoped id of the resource
|
|
@@ -99,67 +99,6 @@ class AzureApiManagementManager {
|
|
|
99
99
|
});
|
|
100
100
|
return apiManagement;
|
|
101
101
|
}
|
|
102
|
-
/**
|
|
103
|
-
* @summary Method to create a new api management
|
|
104
|
-
* @param id scoped id of the resource
|
|
105
|
-
* @param scope scope in which this resource is defined
|
|
106
|
-
* @param props api management properties
|
|
107
|
-
* @see [CDKTF Api management Module]{@link https://github.com/cdktf/cdktf-provider-azurerm/blob/main/docs/apiManagement.typescript.md}
|
|
108
|
-
*/
|
|
109
|
-
createApiManagementv2(id, scope, props, applicationInsightsKey) {
|
|
110
|
-
if (!props)
|
|
111
|
-
throw `Props undefined for ${id}`;
|
|
112
|
-
const resourceGroup = new data_azurerm_resource_group_1.DataAzurermResourceGroup(scope, `${id}-am-rg`, {
|
|
113
|
-
name: scope.props.resourceGroupName
|
|
114
|
-
? scope.resourceNameFormatter.format(scope.props.resourceGroupName)
|
|
115
|
-
: `${props.resourceGroupName}`,
|
|
116
|
-
});
|
|
117
|
-
if (!resourceGroup)
|
|
118
|
-
throw `Resource group undefined for ${id}`;
|
|
119
|
-
const apiManagement = new resource_1.Resource(scope, `${id}-am`, {
|
|
120
|
-
type: 'Microsoft.ApiManagement/service@2024-05-01',
|
|
121
|
-
name: scope.resourceNameFormatter.format(props.name, scope.props.resourceNameOptions?.apiManagement),
|
|
122
|
-
location: resourceGroup.location,
|
|
123
|
-
parentId: resourceGroup.id,
|
|
124
|
-
body: {
|
|
125
|
-
properties: {
|
|
126
|
-
apiVersionConstraint: {
|
|
127
|
-
minApiVersion: '2019-12-01',
|
|
128
|
-
},
|
|
129
|
-
publisherName: props.publisherName,
|
|
130
|
-
publisherEmail: props.publisherEmail,
|
|
131
|
-
},
|
|
132
|
-
sku: {
|
|
133
|
-
capacity: 1,
|
|
134
|
-
name: props.skuName,
|
|
135
|
-
},
|
|
136
|
-
},
|
|
137
|
-
responseExportValues: ['*'],
|
|
138
|
-
identity: [
|
|
139
|
-
{
|
|
140
|
-
type: 'SystemAssigned',
|
|
141
|
-
},
|
|
142
|
-
],
|
|
143
|
-
ignoreMissingProperty: true,
|
|
144
|
-
ignoreCasing: true,
|
|
145
|
-
schemaValidationEnabled: false,
|
|
146
|
-
lifecycle: props.lifecycle,
|
|
147
|
-
});
|
|
148
|
-
if (applicationInsightsKey) {
|
|
149
|
-
new api_management_logger_1.ApiManagementLogger(scope, `${id}-am-logger`, {
|
|
150
|
-
name: scope.resourceNameFormatter.format(props.name, scope.props.resourceNameOptions?.apiManagementLogger),
|
|
151
|
-
resourceGroupName: resourceGroup.name,
|
|
152
|
-
apiManagementName: apiManagement.name,
|
|
153
|
-
applicationInsights: {
|
|
154
|
-
instrumentationKey: applicationInsightsKey,
|
|
155
|
-
},
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
(0, utils_1.createAzureTfOutput)(`${id}-apiManagementName`, scope, apiManagement.name);
|
|
159
|
-
(0, utils_1.createAzureTfOutput)(`${id}-apiManagementFriendlyUniqueId`, scope, apiManagement.friendlyUniqueId);
|
|
160
|
-
(0, utils_1.createAzureTfOutput)(`${id}-apiManagementId`, scope, apiManagement.id);
|
|
161
|
-
return apiManagement;
|
|
162
|
-
}
|
|
163
102
|
/**
|
|
164
103
|
* @summary Method to create a new api management backend
|
|
165
104
|
* @param id scoped id of the resource
|
|
@@ -239,11 +178,12 @@ class AzureApiManagementManager {
|
|
|
239
178
|
(0, utils_1.createAzureTfOutput)(`${id}-${operation.displayName}-${operation.method}-apimOperationFriendlyUniqueId`, scope, apimOperation.friendlyUniqueId);
|
|
240
179
|
(0, utils_1.createAzureTfOutput)(`${id}-${operation.displayName}-${operation.method}-apimOperationId`, scope, apimOperation.id);
|
|
241
180
|
// Define Caching Policy if enabled
|
|
242
|
-
let
|
|
243
|
-
let
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
181
|
+
let cacheSetVariablePolicy = '';
|
|
182
|
+
let cacheInvalidateInboundPolicy = '';
|
|
183
|
+
let cacheSetInboundPolicy = '';
|
|
184
|
+
let cacheSetOutboundPolicy = '';
|
|
185
|
+
if (operation.caching) {
|
|
186
|
+
cacheSetVariablePolicy = `<!-- Generate a comprehensive custom cache key (without query params or Accept header) -->
|
|
247
187
|
<set-variable name="customCacheKey" value="@{
|
|
248
188
|
// Instance identification
|
|
249
189
|
|
|
@@ -253,13 +193,15 @@ class AzureApiManagementManager {
|
|
|
253
193
|
|
|
254
194
|
// Full path construction (without query parameters)
|
|
255
195
|
string fullPath = context.Request.Url.Path.ToLower();
|
|
256
|
-
|
|
257
|
-
// Construct final cache key (no Accept header needed for JSON-only APIs)
|
|
258
|
-
return $"{apiName}:{apiVersion}:{fullPath}";
|
|
259
|
-
}" />
|
|
260
|
-
<set-variable name="bypassCache" value="@(context.Request.Headers.GetValueOrDefault("X-Bypass-Cache", "false").ToLower())" />
|
|
261
196
|
|
|
262
|
-
|
|
197
|
+
// Query parameters
|
|
198
|
+
string query = context.Request.Url.Query.ToLower();
|
|
199
|
+
|
|
200
|
+
// Construct final cache key (no Accept header needed for JSON-only APIs)
|
|
201
|
+
return $"{apiName}:{apiVersion}:{fullPath}:{query}";
|
|
202
|
+
}" />`;
|
|
203
|
+
if (operation.caching.enableCacheSet) {
|
|
204
|
+
cacheSetInboundPolicy = `<choose>
|
|
263
205
|
<when condition="@((string)context.Variables["bypassCache"] != "true")">
|
|
264
206
|
<!-- Attempt to retrieve cached response -->
|
|
265
207
|
<cache-lookup-value key="@((string)context.Variables["customCacheKey"])" variable-name="cachedResponse" />
|
|
@@ -284,12 +226,12 @@ class AzureApiManagementManager {
|
|
|
284
226
|
</choose>
|
|
285
227
|
</when>
|
|
286
228
|
</choose>`;
|
|
287
|
-
|
|
229
|
+
cacheSetOutboundPolicy = `<choose>
|
|
288
230
|
<when condition="@((string)context.Variables["bypassCache"] != "true")">
|
|
289
231
|
<!-- Store the response body in cache -->
|
|
290
232
|
<choose>
|
|
291
233
|
<when condition="@(context.Response.StatusCode == 200)">
|
|
292
|
-
<cache-store-value key="@((string)context.Variables["customCacheKey"])" value="@(context.Response.Body.As<string>(preserveContent: true))" duration="${
|
|
234
|
+
<cache-store-value key="@((string)context.Variables["customCacheKey"])" value="@(context.Response.Body.As<string>(preserveContent: true))" duration="${operation.caching.ttlInSecs ?? 900}" />
|
|
293
235
|
<!-- Add cache status header -->
|
|
294
236
|
<set-header name="X-Apim-Cache-Status" exists-action="override">
|
|
295
237
|
<value>MISS</value>
|
|
@@ -306,26 +248,8 @@ class AzureApiManagementManager {
|
|
|
306
248
|
</when>
|
|
307
249
|
</choose>`;
|
|
308
250
|
}
|
|
309
|
-
if (operation.
|
|
310
|
-
|
|
311
|
-
<set-variable name="customCacheKey" value="@{
|
|
312
|
-
// Instance identification
|
|
313
|
-
|
|
314
|
-
// API identification
|
|
315
|
-
string apiName = context.Api.Name.Replace(" ", "").ToLower();
|
|
316
|
-
string apiVersion = context.Api.Version ?? "v1";
|
|
317
|
-
|
|
318
|
-
// Full path construction (without query parameters)
|
|
319
|
-
string fullPath = context.Request.Url.Path.ToLower();
|
|
320
|
-
|
|
321
|
-
// Query arameters
|
|
322
|
-
string query = context.Request.Url.Query.ToLower();
|
|
323
|
-
|
|
324
|
-
// Construct final cache key (no Accept header needed for JSON-only APIs)
|
|
325
|
-
return $"{apiName}:{apiVersion}:{fullPath}:{query}";
|
|
326
|
-
}" />
|
|
327
|
-
<set-variable name="clearCache" value="@(context.Request.Headers.GetValueOrDefault("X-Apim-Clear-Cache", "false").ToLower())" />
|
|
328
|
-
|
|
251
|
+
if (operation.caching.enableCacheInvalidation) {
|
|
252
|
+
cacheInvalidateInboundPolicy = `<set-variable name="clearCache" value="@(context.Request.Headers.GetValueOrDefault("X-Apim-Clear-Cache", "false").ToLower())" />
|
|
329
253
|
<!-- Allow admin to clear specific cache entries -->
|
|
330
254
|
<choose>
|
|
331
255
|
<when condition="@((string)context.Variables["clearCache"] == "true")">
|
|
@@ -347,7 +271,9 @@ class AzureApiManagementManager {
|
|
|
347
271
|
<inbound>
|
|
348
272
|
<base />
|
|
349
273
|
${rateLimitPolicy}
|
|
350
|
-
${
|
|
274
|
+
${cacheSetVariablePolicy}
|
|
275
|
+
${cacheInvalidateInboundPolicy}
|
|
276
|
+
${cacheSetInboundPolicy}
|
|
351
277
|
${props.commonInboundPolicyXml ?? ''}
|
|
352
278
|
</inbound>
|
|
353
279
|
<backend>
|
|
@@ -355,7 +281,7 @@ class AzureApiManagementManager {
|
|
|
355
281
|
</backend>
|
|
356
282
|
<outbound>
|
|
357
283
|
<base />
|
|
358
|
-
${
|
|
284
|
+
${cacheSetOutboundPolicy}
|
|
359
285
|
${props.commonOutboundPolicyXml ?? ''}
|
|
360
286
|
</outbound>
|
|
361
287
|
<on-error>
|
|
@@ -16,16 +16,14 @@ export interface ApiManagementApiProps extends ApiManagementApiConfig {
|
|
|
16
16
|
operations: ApiManagementApiOperationProps[];
|
|
17
17
|
commonInboundPolicyXml: string;
|
|
18
18
|
commonOutboundPolicyXml: string;
|
|
19
|
-
caching?: ApiManagementApiCaching;
|
|
20
19
|
rateLimit?: ApiManagementApiRateLimit;
|
|
21
20
|
}
|
|
22
|
-
export interface ApiManagementV2Props extends ApiManagementConfig {
|
|
23
|
-
body: any;
|
|
24
|
-
}
|
|
25
21
|
export interface ApiManagementApiOperationProps extends ApiManagementApiOperationConfig {
|
|
22
|
+
caching?: ApiManagementApiCaching;
|
|
26
23
|
}
|
|
27
24
|
export interface ApiManagementApiCaching {
|
|
28
|
-
|
|
25
|
+
enableCacheSet?: boolean;
|
|
26
|
+
enableCacheInvalidation?: boolean;
|
|
29
27
|
ttlInSecs?: number;
|
|
30
28
|
}
|
|
31
29
|
export interface ApiManagementApiRateLimit {
|
package/package.json
CHANGED
|
@@ -4,7 +4,6 @@ import {
|
|
|
4
4
|
DataAzurermApiManagementConfig,
|
|
5
5
|
} from '@cdktf/provider-azurerm/lib/data-azurerm-api-management'
|
|
6
6
|
import { ApiManagementCustomDomain } from '@cdktf/provider-azurerm/lib/api-management-custom-domain'
|
|
7
|
-
import { ApiManagementBackend } from '@cdktf/provider-azurerm/lib/api-management-backend'
|
|
8
7
|
import { ApiManagement } from '@cdktf/provider-azurerm/lib/api-management'
|
|
9
8
|
import { ApiManagementApi } from '@cdktf/provider-azurerm/lib/api-management-api'
|
|
10
9
|
import { ApiManagementApiOperation } from '@cdktf/provider-azurerm/lib/api-management-api-operation'
|
|
@@ -20,7 +19,6 @@ import {
|
|
|
20
19
|
ApiManagementProps,
|
|
21
20
|
ApiManagementBackendProps,
|
|
22
21
|
ApiManagementApiProps,
|
|
23
|
-
ApiManagementV2Props,
|
|
24
22
|
ApiManagementCustomDomainProps,
|
|
25
23
|
} from './types'
|
|
26
24
|
import _ from 'lodash'
|
|
@@ -122,82 +120,6 @@ export class AzureApiManagementManager {
|
|
|
122
120
|
return apiManagement
|
|
123
121
|
}
|
|
124
122
|
|
|
125
|
-
/**
|
|
126
|
-
* @summary Method to create a new api management
|
|
127
|
-
* @param id scoped id of the resource
|
|
128
|
-
* @param scope scope in which this resource is defined
|
|
129
|
-
* @param props api management properties
|
|
130
|
-
* @see [CDKTF Api management Module]{@link https://github.com/cdktf/cdktf-provider-azurerm/blob/main/docs/apiManagement.typescript.md}
|
|
131
|
-
*/
|
|
132
|
-
public createApiManagementv2(
|
|
133
|
-
id: string,
|
|
134
|
-
scope: CommonAzureConstruct,
|
|
135
|
-
props: ApiManagementV2Props,
|
|
136
|
-
applicationInsightsKey?: ApiManagementLoggerApplicationInsights['instrumentationKey']
|
|
137
|
-
) {
|
|
138
|
-
if (!props) throw `Props undefined for ${id}`
|
|
139
|
-
|
|
140
|
-
const resourceGroup = new DataAzurermResourceGroup(scope, `${id}-am-rg`, {
|
|
141
|
-
name: scope.props.resourceGroupName
|
|
142
|
-
? scope.resourceNameFormatter.format(scope.props.resourceGroupName)
|
|
143
|
-
: `${props.resourceGroupName}`,
|
|
144
|
-
})
|
|
145
|
-
|
|
146
|
-
if (!resourceGroup) throw `Resource group undefined for ${id}`
|
|
147
|
-
|
|
148
|
-
const apiManagement = new Resource(scope, `${id}-am`, {
|
|
149
|
-
type: 'Microsoft.ApiManagement/service@2024-05-01',
|
|
150
|
-
name: scope.resourceNameFormatter.format(props.name, scope.props.resourceNameOptions?.apiManagement),
|
|
151
|
-
location: resourceGroup.location,
|
|
152
|
-
parentId: resourceGroup.id,
|
|
153
|
-
|
|
154
|
-
body: {
|
|
155
|
-
properties: {
|
|
156
|
-
apiVersionConstraint: {
|
|
157
|
-
minApiVersion: '2019-12-01',
|
|
158
|
-
},
|
|
159
|
-
publisherName: props.publisherName,
|
|
160
|
-
publisherEmail: props.publisherEmail,
|
|
161
|
-
},
|
|
162
|
-
sku: {
|
|
163
|
-
capacity: 1,
|
|
164
|
-
name: props.skuName,
|
|
165
|
-
},
|
|
166
|
-
},
|
|
167
|
-
|
|
168
|
-
responseExportValues: ['*'],
|
|
169
|
-
|
|
170
|
-
identity: [
|
|
171
|
-
{
|
|
172
|
-
type: 'SystemAssigned',
|
|
173
|
-
},
|
|
174
|
-
],
|
|
175
|
-
|
|
176
|
-
ignoreMissingProperty: true,
|
|
177
|
-
ignoreCasing: true,
|
|
178
|
-
schemaValidationEnabled: false,
|
|
179
|
-
|
|
180
|
-
lifecycle: props.lifecycle,
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
if (applicationInsightsKey) {
|
|
184
|
-
new ApiManagementLogger(scope, `${id}-am-logger`, {
|
|
185
|
-
name: scope.resourceNameFormatter.format(props.name, scope.props.resourceNameOptions?.apiManagementLogger),
|
|
186
|
-
resourceGroupName: resourceGroup.name,
|
|
187
|
-
apiManagementName: apiManagement.name,
|
|
188
|
-
applicationInsights: {
|
|
189
|
-
instrumentationKey: applicationInsightsKey,
|
|
190
|
-
},
|
|
191
|
-
})
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
createAzureTfOutput(`${id}-apiManagementName`, scope, apiManagement.name)
|
|
195
|
-
createAzureTfOutput(`${id}-apiManagementFriendlyUniqueId`, scope, apiManagement.friendlyUniqueId)
|
|
196
|
-
createAzureTfOutput(`${id}-apiManagementId`, scope, apiManagement.id)
|
|
197
|
-
|
|
198
|
-
return apiManagement
|
|
199
|
-
}
|
|
200
|
-
|
|
201
123
|
/**
|
|
202
124
|
* @summary Method to create a new api management backend
|
|
203
125
|
* @param id scoped id of the resource
|
|
@@ -301,12 +223,13 @@ export class AzureApiManagementManager {
|
|
|
301
223
|
createAzureTfOutput(`${id}-${operation.displayName}-${operation.method}-apimOperationId`, scope, apimOperation.id)
|
|
302
224
|
|
|
303
225
|
// Define Caching Policy if enabled
|
|
304
|
-
let
|
|
305
|
-
let
|
|
226
|
+
let cacheSetVariablePolicy = ''
|
|
227
|
+
let cacheInvalidateInboundPolicy = ''
|
|
228
|
+
let cacheSetInboundPolicy = ''
|
|
229
|
+
let cacheSetOutboundPolicy = ''
|
|
306
230
|
|
|
307
|
-
if (
|
|
308
|
-
|
|
309
|
-
cacheInboundPolicy = `<!-- Generate a comprehensive custom cache key (without query params or Accept header) -->
|
|
231
|
+
if (operation.caching) {
|
|
232
|
+
cacheSetVariablePolicy = `<!-- Generate a comprehensive custom cache key (without query params or Accept header) -->
|
|
310
233
|
<set-variable name="customCacheKey" value="@{
|
|
311
234
|
// Instance identification
|
|
312
235
|
|
|
@@ -316,13 +239,16 @@ export class AzureApiManagementManager {
|
|
|
316
239
|
|
|
317
240
|
// Full path construction (without query parameters)
|
|
318
241
|
string fullPath = context.Request.Url.Path.ToLower();
|
|
319
|
-
|
|
242
|
+
|
|
243
|
+
// Query parameters
|
|
244
|
+
string query = context.Request.Url.Query.ToLower();
|
|
245
|
+
|
|
320
246
|
// Construct final cache key (no Accept header needed for JSON-only APIs)
|
|
321
|
-
return $"{apiName}:{apiVersion}:{fullPath}";
|
|
322
|
-
}"
|
|
323
|
-
<set-variable name="bypassCache" value="@(context.Request.Headers.GetValueOrDefault("X-Bypass-Cache", "false").ToLower())" />
|
|
247
|
+
return $"{apiName}:{apiVersion}:{fullPath}:{query}";
|
|
248
|
+
}" />`
|
|
324
249
|
|
|
325
|
-
|
|
250
|
+
if (operation.caching.enableCacheSet) {
|
|
251
|
+
cacheSetInboundPolicy = `<choose>
|
|
326
252
|
<when condition="@((string)context.Variables["bypassCache"] != "true")">
|
|
327
253
|
<!-- Attempt to retrieve cached response -->
|
|
328
254
|
<cache-lookup-value key="@((string)context.Variables["customCacheKey"])" variable-name="cachedResponse" />
|
|
@@ -347,12 +273,12 @@ export class AzureApiManagementManager {
|
|
|
347
273
|
</choose>
|
|
348
274
|
</when>
|
|
349
275
|
</choose>`
|
|
350
|
-
|
|
276
|
+
cacheSetOutboundPolicy = `<choose>
|
|
351
277
|
<when condition="@((string)context.Variables["bypassCache"] != "true")">
|
|
352
278
|
<!-- Store the response body in cache -->
|
|
353
279
|
<choose>
|
|
354
280
|
<when condition="@(context.Response.StatusCode == 200)">
|
|
355
|
-
<cache-store-value key="@((string)context.Variables["customCacheKey"])" value="@(context.Response.Body.As<string>(preserveContent: true))" duration="${
|
|
281
|
+
<cache-store-value key="@((string)context.Variables["customCacheKey"])" value="@(context.Response.Body.As<string>(preserveContent: true))" duration="${operation.caching.ttlInSecs ?? 900}" />
|
|
356
282
|
<!-- Add cache status header -->
|
|
357
283
|
<set-header name="X-Apim-Cache-Status" exists-action="override">
|
|
358
284
|
<value>MISS</value>
|
|
@@ -370,26 +296,8 @@ export class AzureApiManagementManager {
|
|
|
370
296
|
</choose>`
|
|
371
297
|
}
|
|
372
298
|
|
|
373
|
-
if (operation.
|
|
374
|
-
|
|
375
|
-
<set-variable name="customCacheKey" value="@{
|
|
376
|
-
// Instance identification
|
|
377
|
-
|
|
378
|
-
// API identification
|
|
379
|
-
string apiName = context.Api.Name.Replace(" ", "").ToLower();
|
|
380
|
-
string apiVersion = context.Api.Version ?? "v1";
|
|
381
|
-
|
|
382
|
-
// Full path construction (without query parameters)
|
|
383
|
-
string fullPath = context.Request.Url.Path.ToLower();
|
|
384
|
-
|
|
385
|
-
// Query arameters
|
|
386
|
-
string query = context.Request.Url.Query.ToLower();
|
|
387
|
-
|
|
388
|
-
// Construct final cache key (no Accept header needed for JSON-only APIs)
|
|
389
|
-
return $"{apiName}:{apiVersion}:{fullPath}:{query}";
|
|
390
|
-
}" />
|
|
391
|
-
<set-variable name="clearCache" value="@(context.Request.Headers.GetValueOrDefault("X-Apim-Clear-Cache", "false").ToLower())" />
|
|
392
|
-
|
|
299
|
+
if (operation.caching.enableCacheInvalidation) {
|
|
300
|
+
cacheInvalidateInboundPolicy = `<set-variable name="clearCache" value="@(context.Request.Headers.GetValueOrDefault("X-Apim-Clear-Cache", "false").ToLower())" />
|
|
393
301
|
<!-- Allow admin to clear specific cache entries -->
|
|
394
302
|
<choose>
|
|
395
303
|
<when condition="@((string)context.Variables["clearCache"] == "true")">
|
|
@@ -408,11 +316,14 @@ export class AzureApiManagementManager {
|
|
|
408
316
|
if (props.rateLimit && scope.props.subscriptionId) {
|
|
409
317
|
rateLimitPolicy = `<rate-limit-by-key calls="${props.rateLimit.calls}" renewal-period="${props.rateLimit.renewalPeriodInSecs}" counter-key="${scope.props.subscriptionId}-${apimOperation.operationId}"/>`
|
|
410
318
|
}
|
|
319
|
+
|
|
411
320
|
const policyXmlContent = `<policies>
|
|
412
321
|
<inbound>
|
|
413
322
|
<base />
|
|
414
323
|
${rateLimitPolicy}
|
|
415
|
-
${
|
|
324
|
+
${cacheSetVariablePolicy}
|
|
325
|
+
${cacheInvalidateInboundPolicy}
|
|
326
|
+
${cacheSetInboundPolicy}
|
|
416
327
|
${props.commonInboundPolicyXml ?? ''}
|
|
417
328
|
</inbound>
|
|
418
329
|
<backend>
|
|
@@ -420,7 +331,7 @@ export class AzureApiManagementManager {
|
|
|
420
331
|
</backend>
|
|
421
332
|
<outbound>
|
|
422
333
|
<base />
|
|
423
|
-
${
|
|
334
|
+
${cacheSetOutboundPolicy}
|
|
424
335
|
${props.commonOutboundPolicyXml ?? ''}
|
|
425
336
|
</outbound>
|
|
426
337
|
<on-error>
|
|
@@ -18,18 +18,16 @@ export interface ApiManagementApiProps extends ApiManagementApiConfig {
|
|
|
18
18
|
operations: ApiManagementApiOperationProps[]
|
|
19
19
|
commonInboundPolicyXml: string
|
|
20
20
|
commonOutboundPolicyXml: string
|
|
21
|
-
caching?: ApiManagementApiCaching
|
|
22
21
|
rateLimit?: ApiManagementApiRateLimit
|
|
23
22
|
}
|
|
24
23
|
|
|
25
|
-
export interface
|
|
26
|
-
|
|
24
|
+
export interface ApiManagementApiOperationProps extends ApiManagementApiOperationConfig {
|
|
25
|
+
caching?: ApiManagementApiCaching
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
export interface ApiManagementApiOperationProps extends ApiManagementApiOperationConfig {}
|
|
30
|
-
|
|
31
28
|
export interface ApiManagementApiCaching {
|
|
32
|
-
|
|
29
|
+
enableCacheSet?: boolean
|
|
30
|
+
enableCacheInvalidation?: boolean
|
|
33
31
|
ttlInSecs?: number
|
|
34
32
|
}
|
|
35
33
|
|