Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Namespace Refactoring - with updated events #33

Merged
merged 10 commits into from
Mar 5, 2024
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@
*.DotSettings.user
.vscode/*
UnicornProperties.sln.DotSettings.user
**/cdk.out/
2 changes: 1 addition & 1 deletion Unicorn.Contracts/Integration/event-schemas.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ Resources:
Properties:
Description: 'Event schemas for Unicorn Contracts'
RegistryName:
Fn::Sub: "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}-${Stage}"
Fn::Sub: "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}-${Stage}"

EventRegistryPolicy:
Type: AWS::EventSchemas::RegistryPolicy
Expand Down
2 changes: 1 addition & 1 deletion Unicorn.Contracts/Integration/subscriber-policies.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,6 @@ Resources:
"events:creatorAccount": "${aws:PrincipalAccount}"
StringEquals:
"events:source":
- Fn::Sub: "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
- "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"
"Null":
"events:source": "false"
41 changes: 23 additions & 18 deletions Unicorn.Contracts/template.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
AWSTemplateFormatVersion: 2010-09-09
AWSTemplateFormatVersion: "2010-09-09"
Transform:
- AWS::LanguageExtensions
- AWS::Serverless-2016-10-31
Expand All @@ -12,10 +12,10 @@ Metadata:
config:
ignore_checks:
- ES4000 # Rule disabled because the CatchAll Rule doesn't need a DLQ
- ES6000 # Rule disabled because SQS DLOs don't need a RedrivePolicy
- ES6000 # Rule disabled because SQS DLQs don't need a RedrivePolicy
- WS2001 # Rule disabled because check does not support !ToJsonString transform
- ES1001 # Rule disabled because our Lambda functions don't need DestinationConfig.OnFailure
- W3002
- W3002 # Rule disabled as nested templates are being packaged

Parameters:
Stage:
Expand Down Expand Up @@ -54,19 +54,19 @@ Globals:
Environment:
Variables:
DYNAMODB_TABLE: !Ref ContractsTable
SERVICE_NAMESPACE: !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
SERVICE_NAMESPACE: "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"
POWERTOOLS_LOGGER_CASE: PascalCase
POWERTOOLS_SERVICE_NAME: !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
POWERTOOLS_SERVICE_NAME: "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"
POWERTOOLS_TRACE_DISABLED: "false" # Explicitly disables tracing, default
POWERTOOLS_LOGGER_LOG_EVENT: !If [IsProd, "false", "true"] # Logs incoming event, default
POWERTOOLS_LOGGER_SAMPLE_RATE: !If [IsProd, "0.1", "0"] # Debug log sampling percentage, default
POWERTOOLS_METRICS_NAMESPACE: !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
POWERTOOLS_METRICS_NAMESPACE: "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"
POWERTOOLS_LOG_LEVEL: INFO # Log level for Logger (INFO, DEBUG, etc.), default
LOG_LEVEL: INFO # Log level for Logger
Tags:
stage: !Ref Stage
project: !FindInMap [Constants, ProjectName, Value]
namespace: !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
namespace: "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"

Resources:
#### SSM PARAMETERS
Expand Down Expand Up @@ -149,8 +149,9 @@ Resources:
Tags:
stage: !Ref Stage
project: !FindInMap [Constants, ProjectName, Value]
namespace: !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
namespace: "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"

# API GW Cloudwatch Log Group
UnicornContractsApiLogGroup:
Type: AWS::Logs::LogGroup
UpdateReplacePolicy: Delete
Expand Down Expand Up @@ -217,7 +218,7 @@ Resources:
- Key: project
Value: !FindInMap [Constants, ProjectName, Value]
- Key: namespace
Value: !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
Value: "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"

#### DEAD LETTER QUEUES
# DeadLetterQueue for UnicornContractsIngestQueue. Contains messages that failed to be processed
Expand All @@ -235,7 +236,7 @@ Resources:
- Key: project
Value: !FindInMap [Constants, ProjectName, Value]
- Key: namespace
Value: !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
Value: "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"

#### DYNAMODB TABLE
# Persist Contracts information in DynamoDB
Expand All @@ -259,7 +260,7 @@ Resources:
- Key: project
Value: !FindInMap [Constants, ProjectName, Value]
- Key: namespace
Value: !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
Value: "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"

#### EVENT BUS
# Event bus for Unicorn Contract Service used to publish and consume events
Expand All @@ -284,7 +285,7 @@ Resources:
Condition:
StringEquals:
events:source:
- !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
- "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"

# Catchall rule used for development purposes.
UnicornContractsCatchAllRule:
Expand All @@ -297,9 +298,9 @@ Resources:
account:
- !Ref AWS::AccountId
source:
- !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
- !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornPropertiesNamespace}}"
- !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornWebNamespace}}"
- "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"
- "{{resolve:ssm:/uni-prop/UnicornPropertiesNamespace}}"
- "{{resolve:ssm:/uni-prop/UnicornWebNamespace}}"
State: ENABLED #You may want to disable this rule in production
Targets:
- Arn: !GetAtt UnicornContractsCatchAllLogGroup.Arn
Expand All @@ -314,7 +315,7 @@ Resources:
LogGroupName: !Sub
- "/aws/events/${Stage}/${NS}-catchall"
- Stage: !Ref Stage
NS: !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
NS: "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"
RetentionInDays: !FindInMap
- LogsRetentionPeriodMap
- !Ref Stage
Expand Down Expand Up @@ -375,7 +376,7 @@ Resources:
Target: !GetAtt UnicornContractsEventBus.Arn
TargetParameters:
EventBridgeEventBusParameters:
Source: !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
Source: "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"
DetailType: ContractStatusChanged
InputTemplate: !ToJsonString
PropertyId: "<$.dynamodb.NewImage.PropertyId.S>"
Expand Down Expand Up @@ -431,12 +432,14 @@ Resources:
- Key: project
Value: !FindInMap [Constants, ProjectName, Value]
- Key: namespace
Value: !Sub "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
Value: "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"

#### CLOUDFORMATION NESTED STACKS
# CloudFormation Stack with the Contracts Service Event Registry and Schemas
EventSchemasStack:
Type: AWS::Serverless::Application
UpdateReplacePolicy: Delete
DeletionPolicy: Delete
Properties:
Location: "Integration/event-schemas.yaml"
Parameters:
Expand All @@ -445,6 +448,8 @@ Resources:
# CloudFormation Stack with the Cross-service EventBus policy for Contracts Service
SubscriberPoliciesStack:
Type: AWS::Serverless::Application
UpdateReplacePolicy: Delete
DeletionPolicy: Delete
DependsOn:
- UnicornContractsEventBusNameParam
Properties:
Expand Down
4 changes: 2 additions & 2 deletions Unicorn.Properties/Integration/event-schemas.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
AWSTemplateFormatVersion: '2010-09-09'
AWSTemplateFormatVersion: "2010-09-09"
Description: Event Schemas for use by the Properties Service

Parameters:
Expand All @@ -18,7 +18,7 @@ Resources:
Properties:
Description: 'Event schemas for Unicorn Properties'
RegistryName:
Fn::Sub: "{{resolve:ssm:/uni-prop/${Stage}/UnicornPropertiesNamespace}}-${Stage}"
Fn::Sub: "{{resolve:ssm:/uni-prop/UnicornPropertiesNamespace}}-${Stage}"

EventRegistryPolicy:
Type: AWS::EventSchemas::RegistryPolicy
Expand Down
4 changes: 2 additions & 2 deletions Unicorn.Properties/Integration/subscriber-policies.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
AWSTemplateFormatVersion: '2010-09-09'
AWSTemplateFormatVersion: "2010-09-09"
Description: >
Defines the event bus policies that determine who can create rules on the event bus to
subscribe to events published by Unicorn Properties Service.
Expand Down Expand Up @@ -46,6 +46,6 @@ Resources:
"events:creatorAccount": "${aws:PrincipalAccount}"
StringEquals:
"events:source":
- Fn::Sub: "{{resolve:ssm:/uni-prop/${Stage}/UnicornPropertiesNamespace}}"
- "{{resolve:ssm:/uni-prop/UnicornPropertiesNamespace}}"
"Null":
"events:source": "false"
15 changes: 8 additions & 7 deletions Unicorn.Properties/Integration/subscriptions.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
AWSTemplateFormatVersion: '2010-09-09'
AWSTemplateFormatVersion: "2010-09-09"
Description: Defines the rule for the events (subscriptions) that Unicorn Properties wants to consume.

Parameters:
Expand All @@ -23,7 +23,7 @@ Resources:
Fn::Sub: "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsEventBusArn}}"
EventPattern:
source:
- Fn::Sub: "{{resolve:ssm:/uni-prop/${Stage}/UnicornContractsNamespace}}"
- "{{resolve:ssm:/uni-prop/UnicornContractsNamespace}}"
detail-type:
- ContractStatusChanged
State: ENABLED
Expand All @@ -32,7 +32,7 @@ Resources:
Arn:
Fn::Sub: "{{resolve:ssm:/uni-prop/${Stage}/UnicornPropertiesEventBusArn}}"
RoleArn:
Fn::GetAtt: UnicornPropertiesSubscriptionRole.Arn
Fn::GetAtt: [ UnicornPropertiesSubscriptionRole, Arn ]

#### UNICORN WEB EVENT SUBSCRIPTIONS
PublicationApprovalRequestedSubscriptionRule:
Expand All @@ -44,7 +44,7 @@ Resources:
Fn::Sub: "{{resolve:ssm:/uni-prop/${Stage}/UnicornWebEventBusArn}}"
EventPattern:
source:
- Fn::Sub: "{{resolve:ssm:/uni-prop/${Stage}/UnicornWebNamespace}}"
- "{{resolve:ssm:/uni-prop/UnicornWebNamespace}}"
detail-type:
- PublicationApprovalRequested
State: ENABLED
Expand All @@ -53,7 +53,7 @@ Resources:
Arn:
Fn::Sub: "{{resolve:ssm:/uni-prop/${Stage}/UnicornPropertiesEventBusArn}}"
RoleArn:
Fn::GetAtt: UnicornPropertiesSubscriptionRole.Arn
Fn::GetAtt: [ UnicornPropertiesSubscriptionRole, Arn ]


# This IAM role allows EventBridge to assume the permissions necessary to send events
Expand Down Expand Up @@ -81,9 +81,10 @@ Outputs:
ContractStatusChangedSubscription:
Description: Rule ARN for Contract service event subscription
Value:
Fn::GetAtt: ContractStatusChangedSubscriptionRule.Arn
Fn::GetAtt: [ ContractStatusChangedSubscriptionRule, Arn ]

PublicationApprovalRequestedSubscription:
Description: Rule ARN for Web service event subscription
Value:
Fn::GetAtt: PublicationApprovalRequestedSubscriptionRule.Arn
Fn::GetAtt: [ PublicationApprovalRequestedSubscriptionRule, Arn ]

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{
"DetailType": "ContractStatusChanged",
"Source": "unicorn.contracts",
"EventBusName": "UnicornPropertiesEventBus-Local",
"EventBusName": "UnicornPropertiesBus-local",
"Detail": "{ \"ContractUpdatedOn\": \"10/08/2022 19:56:30\", \"ContractId\": \"f2bedc80-3dc8-4544-9140-9b606d71a6ee\", \"PropertyId\": \"usa/anytown/main-street/111\", \"ContractStatus\": \"APPROVED\" }"
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{
"DetailType": "ContractStatusChanged",
"Source": "unicorn.contracts",
"EventBusName": "UnicornPropertiesEventBus-Local",
"EventBusName": "UnicornPropertiesBus-local",
"Detail": "{ \"ContractUpdatedOn\": \"10/08/2022 19:56:30\", \"ContractId\": \"f2bedc80-3dc8-4544-9140-9b606d71a6ee\", \"PropertyId\": \"usa/anytown/main-street/111\", \"ContractStatus\": \"DRAFT\" }"
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{
"DetailType": "ContractStatusChanged",
"Source": "unicorn.contracts",
"EventBusName": "UnicornPropertiesEventBus-Local",
"EventBusName": "UnicornPropertiesBus-local",
"Detail": "{ \"ContractUpdatedOn\": \"10/08/2022 19:56:30\", \"ContractId\": \"9183453b-d284-4466-a2d9-f00b1d569ad7\", \"PropertyId\": \"usa/anytown/main-street/222\", \"ContractStatus\": \"APPROVED\" }"
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{
"DetailType": "ContractStatusChanged",
"Source": "unicorn.contracts",
"EventBusName": "UnicornPropertiesEventBus-Local",
"EventBusName": "UnicornPropertiesBus-local",
"Detail": "{ \"ContractUpdatedOn\": \"10/08/2022 19:56:30\", \"ContractId\": \"9183453b-d284-4466-a2d9-f00b1d569ad7\", \"PropertyId\": \"usa/anytown/main-street/222\", \"ContractStatus\": \"DRAFT\" }"
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[
{
"DetailType": "PublicationApprovalRequested",
"Source": "unicorn.web",
"EventBusName": "UnicornPropertiesBus-local",
"Detail": "{\"PropertyId\":\"usa/anytown/main-street/222\",\"Address\":{\"Country\":\"USA\",\"City\":\"Anytown\",\"Street\":\"Main Street\",\"Number\":222},\"Description\":\"This classic Anytown estate comes with a covetable lake view. The romantic and comfortable backyard is the perfect setting for unicorn get-togethers. The open concept Main Stable is fully equipped with all the desired amenities. Second floor features 6 straw bales including large Rainbow Suite with private training pool terrace and Jr Sparkles Suite.\",\"Contract\":\"sale\",\"ListPrice\":200,\"Currency\":\"SPL\",\"images\":[\"prop1_exterior1.jpg\",\"prop1_interior1.jpg\",\"prop1_interior2.jpg\",\"prop1_interior3.jpg\"]}"
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[
{
"DetailType": "PublicationApprovalRequested",
"Source": "unicorn.web",
"EventBusName": "UnicornPropertiesBus-local",
"Detail": "{\"PropertyId\":\"usa/anytown/main-street/111\",\"Address\":{\"Country\":\"USA\",\"City\":\"Anytown\",\"Street\":\"Main Street\",\"Number\":111},\"Description\":\"This is a property for goblins. The property has the worst quality and is atrocious when it comes to design. The property is not clean whatsoever, and will make any property owner have buyers' remorse as soon the property is bought. Keep away from this property as much as possible!\",\"Contract\":\"sale\",\"ListPrice\":200,\"Currency\":\"SPL\",\"images\":[\"prop1_exterior1.jpg\",\"prop1_interior1.jpg\",\"prop1_interior2.jpg\",\"prop1_interior3.jpg\"]}"
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[
{
"DetailType": "PublicationApprovalRequested",
"Source": "unicorn.web",
"EventBusName": "UnicornPropertiesBus-local",
"Detail": "{\"PropertyId\":\"usa/anytown/main-street/111\",\"Address\":{\"Country\":\"USA\",\"City\":\"Anytown\",\"Street\":\"Main Street\",\"Number\":111},\"Description\":\"This classic Anytown estate comes with a covetable lake view. The romantic and comfortable backyard is the perfect setting for unicorn get-togethers. The open concept Main Stable is fully equipped with all the desired amenities. Second floor features 6 straw bales including large Rainbow Suite with private training pool terrace and Jr Sparkles Suite.\",\"Contract\":\"sale\",\"ListPrice\":200,\"Currency\":\"SPL\",\"images\":[\"prop1_exterior1.jpg\",\"prop1_interior1.jpg\",\"prop1_interior2.jpg\",\"prop1_interior3.jpg\",\"prop1_interior4-bad.jpg\"]}"
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[
{
"DetailType": "PublicationApprovalRequested",
"Source": "unicorn.web",
"EventBusName": "UnicornPropertiesBus-local",
"Detail": "{\"PropertyId\":\"usa/anytown/main-street/333\",\"Address\":{\"Country\":\"USA\",\"City\":\"Anytown\",\"Street\":\"Main Street\",\"Number\":333},\"Description\":\"This classic Anytown estate comes with a covetable lake view. The romantic and comfortable backyard is the perfect setting for unicorn get-togethers. The open concept Main Stable is fully equipped with all the desired amenities. Second floor features 6 straw bales including large Rainbow Suite with private training pool terrace and Jr Sparkles Suite.\",\"Contract\":\"sale\",\"ListPrice\":200,\"Currency\":\"SPL\",\"images\":[\"prop1_exterior1.jpg\",\"prop1_interior1.jpg\",\"prop1_interior2.jpg\",\"prop1_interior3.jpg\"]}"
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[
{
"DetailType": "PublicationApprovalRequested",
"Source": "unicorn.web",
"EventBusName": "UnicornPropertiesBus-local",
"Detail": "{\"PropertyId\":\"usa/anytown/main-street/111\",\"Address\":{\"Country\":\"USA\",\"City\":\"Anytown\",\"Street\":\"Main Street\",\"Number\":111},\"Description\":\"This classic Anytown estate comes with a covetable lake view. The romantic and comfortable backyard is the perfect setting for unicorn get-togethers. The open concept Main Stable is fully equipped with all the desired amenities. Second floor features 6 straw bales including large Rainbow Suite with private training pool terrace and Jr Sparkles Suite.\",\"Contract\":\"sale\",\"ListPrice\":200,\"Currency\":\"SPL\",\"images\":[\"prop1_exterior1.jpg\",\"prop1_interior1.jpg\",\"prop1_interior2.jpg\",\"prop1_interior3.jpg\"]}"
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"version": "0",
"id": "f849f683-76e1-1c84-669d-544a9828dfef",
"detail-type": "PublicationApprovalRequested",
"source": "unicorn.properties.web",
"account": "111111111111",
"source": "unicorn.web",
"account": "123456789012",
"time": "2022-08-16T06:33:05Z",
"region": "ap-southeast-2",
"resources": [],
Expand All @@ -27,4 +27,4 @@
"prop1_interior4-bad.jpg"
]
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@
"evaluation_result": "APPROVED|DECLINED",
"result_reason": "UNSAFE_IMAGE_DETECTED|BAD_SENTIMENT_DETECTED|..."
}
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
[
{
"Source": "unicorn.properties.web",
"Detail": "{ \"property_id\": \"usa/anytown/main-street/123\", \"country\": \"USA\", \"city\": \"Anytown\", \"street\": \"Main Street\", \"number\": 123, \"description\": \"This classic Anytown estate comes with a covetable lake view. The romantic and comfortable backyard is the perfect setting for unicorn get-togethers. The open concept Main Stable is fully equipped with all the desired amenities. Second floor features 6 straw bales including large Rainbow Suite with private training pool terrace and Jr Sparkles Suite.\", \"contract\": \"sale\", \"listprice\": 200, \"currency\": \"SPL\", \"images\": [ \"prop1_exterior1.jpg\", \"prop1_interior1.jpg\", \"prop1_interior2.jpg\", \"prop1_interior3.jpg\", \"prop1_interior4-bad.jpg\" ] }",
"DetailType": "PublicationApprovalRequested",
"EventBusName": "UnicornPropertiesEventBus-Local"
}
]
{
"Source": "unicorn.web",
"Detail": "{ \"PropertyId\": \"usa/anytown/main-street/123\", \"Country\": \"USA\", \"City\": \"Anytown\", \"Street\": \"Main Street\", \"Number\": 123, \"Description\": \"This classic Anytown estate comes with a covetable lake view. The romantic and comfortable backyard is the perfect setting for unicorn get-togethers. The open concept Main Stable is fully equipped with all the desired amenities. Second floor features 6 straw bales including large Rainbow Suite with private training pool terrace and Jr Sparkles Suite.\", \"Contract\": \"sale\", \"ListPrice\": 200, \"Currency\": \"SPL\", \"images\": [ \"prop1_exterior1.jpg\", \"prop1_interior1.jpg\", \"prop1_interior2.jpg\", \"prop1_interior3.jpg\", \"prop1_interior4-bad.jpg\" ] }",
"DetailType": "PublicationApprovalRequested",
"EventBusName": "UnicornPropertiesBus-local"
}
]
Loading
Loading