Skip to content

Commit 8e31156

Browse files
leonmk-awsLeon Michalski
andauthored
chore(mixins-preview): do not extend event metadata (#36214)
### Issue # (if applicable) Closes #<issue number here>. ### Reason for this change Remove the detail interface that was extending the `cdk.AWSEventMetadataProps` as extending creates problems in python. ### Description of changes Before ``` export interface ObjectCreatedDetail { readonly bucket?: BucketEvents.ObjectCreated.Bucket; ...otherfields } export interface PatternProps extends BucketEvents.ObjectCreated.ObjectCreatedDetail { readonly eventMetadata?: cdk.AWSEventMetadataProps; } ``` After this change: ``` export interface ObjectCreatedProps { readonly eventMetadata?: cdk.AWSEventMetadataProps; readonly bucket?: BucketEvents.ObjectCreated.Bucket; ...otherfields } ``` The Pattern functions have been updated to: ``` public workSpacesAccessPattern(options?: WorkspaceEvents.WorkSpacesAccess.WorkSpacesAccessProps): events.EventPattern { return { source: ["aws.workspaces"], detailType: ["WorkSpaces Access"], detail: convertWorkSpacesAccessDetailToEventPattern(options, this.workspaceRef), version: options?.eventMetadata?.version, resources: options?.eventMetadata?.resources, region: options?.eventMetadata?.region }; } ``` And the `convertWorkSpacesAccessDetailToEventPattern` functions ignore the `eventMetadata` property. ### Describe any new or updated permissions being added <!-- What new or updated IAM permissions are needed to support the changes being introduced? --> ### Description of how you validated changes <!-- Have you added any unit tests and/or integration tests? Did you test by hand? --> Added unit test to ensure that the metadata was still being passed to the `EventPattern` ### Checklist - [X] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license* Co-authored-by: Leon Michalski <leonmk@amazon.de>
1 parent 18e18eb commit 8e31156

File tree

2 files changed

+54
-34
lines changed

2 files changed

+54
-34
lines changed

packages/@aws-cdk/mixins-preview/scripts/spec2eventbridge/builder.ts

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ class EventBridgeEventsClass extends ClassType {
179179
eventNsName,
180180
event,
181181
typeDef,
182+
addMetadata,
182183
}: {
183184
/** The interface or struct to add properties to */
184185
target: InterfaceType | StructType;
@@ -194,6 +195,7 @@ class EventBridgeEventsClass extends ClassType {
194195
event: Event;
195196
/** Type definition for resource field identification */
196197
typeDef: TypeDefinition;
198+
addMetadata: boolean;
197199
}): FreeFunction {
198200
const propertyMappings = new Map<string, { original: string; type: Type; resolver?: Expression }>();
199201
const module = Module.of(this);
@@ -228,6 +230,18 @@ class EventBridgeEventsClass extends ClassType {
228230
},
229231
});
230232
}
233+
if (addMetadata) {
234+
target.addProperty({
235+
name: 'eventMetadata',
236+
type: CDK_CORE.AWSEventMetadataProps,
237+
optional: true,
238+
immutable: true,
239+
docs: {
240+
summary: 'EventBridge event metadata',
241+
default: '-',
242+
},
243+
});
244+
}
231245

232246
// Generate converter function
233247
const converterFunction = new FreeFunction(module, {
@@ -329,6 +343,7 @@ class EventBridgeEventsClass extends ClassType {
329343
eventNsName,
330344
event,
331345
typeDef,
346+
addMetadata: false,
332347
});
333348
}
334349
};
@@ -364,10 +379,10 @@ class EventBridgeEventsClass extends ClassType {
364379

365380
// Create detail interface with event properties
366381
const detailInterface = new InterfaceType(eventNamespace, {
367-
name: `${namespaceName}Detail`,
382+
name: `${namespaceName}Props`,
368383
export: true,
369384
docs: {
370-
summary: `Detail type for ${this.resource.name} ${event.name} event`,
385+
summary: `Props type for ${this.resource.name} ${event.name} event`,
371386
},
372387
});
373388

@@ -380,26 +395,7 @@ class EventBridgeEventsClass extends ClassType {
380395
eventNsName: namespaceName,
381396
event,
382397
typeDef: rootProperty,
383-
});
384-
385-
// Create pattern props interface extending detail with metadata
386-
const propInterface = new InterfaceType(eventNamespace, {
387-
name: 'PatternProps',
388-
export: true,
389-
extends: [detailInterface.type],
390-
docs: {
391-
summary: `Properties for ${this.resource.name} ${event.name} event pattern`,
392-
},
393-
});
394-
propInterface.addProperty({
395-
name: 'eventMetadata',
396-
type: CDK_CORE.AWSEventMetadataProps,
397-
optional: true,
398-
immutable: true,
399-
docs: {
400-
summary: 'EventBridge event metadata',
401-
default: '-',
402-
},
398+
addMetadata: true,
403399
});
404400

405401
// Create event pattern method that returns events.EventPattern
@@ -411,27 +407,21 @@ class EventBridgeEventsClass extends ClassType {
411407
summary: `EventBridge event pattern for ${this.resource.name} ${event.detailType}`,
412408
},
413409
});
414-
const eventPatternMethodParam = eventPatternMethod.addParameter({
410+
eventPatternMethod.addParameter({
415411
name: 'options',
416-
type: propInterface.type,
412+
type: detailInterface.type,
417413
optional: true,
418414
});
419415

420-
const eventMetadata = expr.ident('eventMetadata');
421-
422416
eventPatternMethod.addBody(
423-
stmt.constVar(
424-
expr.destructuringObject(eventMetadata, expr.directCode('...obj')),
425-
expr.binOp(expr.ident(eventPatternMethodParam.spec.name), '||', expr.lit({})),
426-
),
427417
stmt.ret(
428418
expr.object({
429419
source: expr.list([expr.lit(event.source)]),
430420
detailType: expr.list([expr.lit(event.detailType)]),
431-
detail: expr.ident(converterFunction.name).call(expr.ident('obj'), expr.this_().prop(this.referenceName)),
432-
version: expr.directCode('eventMetadata?.version'),
433-
resources: expr.directCode('eventMetadata?.resources'),
434-
region: expr.directCode('eventMetadata?.region'),
421+
detail: expr.ident(converterFunction.name).call(expr.ident('options'), expr.this_().prop(this.referenceName)),
422+
version: expr.directCode('options?.eventMetadata?.version'),
423+
resources: expr.directCode('options?.eventMetadata?.resources'),
424+
region: expr.directCode('options?.eventMetadata?.region'),
435425
}),
436426
),
437427
);

packages/@aws-cdk/mixins-preview/test/events/l1-l2.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,36 @@ describe.each([
153153
},
154154
});
155155
});
156+
157+
test('should always have a bucketRef when empty props is passed', () => {
158+
// GIVEN
159+
const bucketEvents = BucketEvents.fromBucket(new class extends Construct {
160+
public readonly bucketRef = {
161+
bucketArn: 'arn',
162+
bucketName: 'the-bucket',
163+
};
164+
public readonly env = { account: '11111111111', region: 'us-east-1' };
165+
}(stack, 'Bucket'));
166+
167+
// WHEN
168+
newRule(stack, bucketEvents.objectCreatedPattern({
169+
eventMetadata: {
170+
region: ['my-region'],
171+
},
172+
}));
173+
174+
// THEN
175+
Template.fromStack(stack).hasResourceProperties('AWS::Events::Rule', {
176+
EventPattern: {
177+
'detail-type': ['Object Created'],
178+
'source': ['aws.s3'],
179+
'detail': {
180+
bucket: { name: ['the-bucket'] },
181+
},
182+
'region': ['my-region'],
183+
},
184+
});
185+
});
156186
});
157187

158188
test('creates multiple rules for different event types', () => {

0 commit comments

Comments
 (0)