diff --git a/bin/product-service.js b/bin/product-service.js index 1452050..9578666 100644 --- a/bin/product-service.js +++ b/bin/product-service.js @@ -26,6 +26,7 @@ var __importStar = (this && this.__importStar) || function (mod) { Object.defineProperty(exports, "__esModule", { value: true }); const cdk = __importStar(require("aws-cdk-lib")); const product_service_stack_1 = require("../lib/product-service-stack"); +const import_service_stack_1 = require("../lib/import-service-stack"); // Add this import const app = new cdk.App(); new product_service_stack_1.ProductServiceStack(app, 'ProductServiceStack', { /* If you don't specify 'env', this stack will be environment-agnostic. @@ -39,4 +40,7 @@ new product_service_stack_1.ProductServiceStack(app, 'ProductServiceStack', { // env: { account: '123456789012', region: 'us-east-1' }, /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHJvZHVjdC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsaURBQW1DO0FBQ25DLHdFQUFtRTtBQUVuRSxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixJQUFJLDJDQUFtQixDQUFDLEdBQUcsRUFBRSxxQkFBcUIsRUFBRTtBQUNsRDs7aUVBRWlFO0FBRWpFO21FQUNtRTtBQUNuRSw2RkFBNkY7QUFFN0Y7a0NBQ2tDO0FBQ2xDLHlEQUF5RDtBQUV6RCw4RkFBOEY7Q0FDL0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IFByb2R1Y3RTZXJ2aWNlU3RhY2sgfSBmcm9tICcuLi9saWIvcHJvZHVjdC1zZXJ2aWNlLXN0YWNrJztcblxuY29uc3QgYXBwID0gbmV3IGNkay5BcHAoKTtcbm5ldyBQcm9kdWN0U2VydmljZVN0YWNrKGFwcCwgJ1Byb2R1Y3RTZXJ2aWNlU3RhY2snLCB7XG4gIC8qIElmIHlvdSBkb24ndCBzcGVjaWZ5ICdlbnYnLCB0aGlzIHN0YWNrIHdpbGwgYmUgZW52aXJvbm1lbnQtYWdub3N0aWMuXG4gICAqIEFjY291bnQvUmVnaW9uLWRlcGVuZGVudCBmZWF0dXJlcyBhbmQgY29udGV4dCBsb29rdXBzIHdpbGwgbm90IHdvcmssXG4gICAqIGJ1dCBhIHNpbmdsZSBzeW50aGVzaXplZCB0ZW1wbGF0ZSBjYW4gYmUgZGVwbG95ZWQgYW55d2hlcmUuICovXG5cbiAgLyogVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gc3BlY2lhbGl6ZSB0aGlzIHN0YWNrIGZvciB0aGUgQVdTIEFjY291bnRcbiAgICogYW5kIFJlZ2lvbiB0aGF0IGFyZSBpbXBsaWVkIGJ5IHRoZSBjdXJyZW50IENMSSBjb25maWd1cmF0aW9uLiAqL1xuICAvLyBlbnY6IHsgYWNjb3VudDogcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfQUNDT1VOVCwgcmVnaW9uOiBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9SRUdJT04gfSxcblxuICAvKiBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSBpZiB5b3Uga25vdyBleGFjdGx5IHdoYXQgQWNjb3VudCBhbmQgUmVnaW9uIHlvdVxuICAgKiB3YW50IHRvIGRlcGxveSB0aGUgc3RhY2sgdG8uICovXG4gIC8vIGVudjogeyBhY2NvdW50OiAnMTIzNDU2Nzg5MDEyJywgcmVnaW9uOiAndXMtZWFzdC0xJyB9LFxuXG4gIC8qIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nkay9sYXRlc3QvZ3VpZGUvZW52aXJvbm1lbnRzLmh0bWwgKi9cbn0pOyJdfQ== \ No newline at end of file +new import_service_stack_1.ImportServiceStack(app, 'ImportServiceStack', { +// Optionally specify env or other props if needed +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHJvZHVjdC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsaURBQW1DO0FBQ25DLHdFQUFtRTtBQUNuRSxzRUFBaUUsQ0FBQyxrQkFBa0I7QUFFcEYsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDMUIsSUFBSSwyQ0FBbUIsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLEVBQUU7QUFDbEQ7O2lFQUVpRTtBQUVqRTttRUFDbUU7QUFDbkUsNkZBQTZGO0FBRTdGO2tDQUNrQztBQUNsQyx5REFBeUQ7QUFFekQsOEZBQThGO0NBQy9GLENBQUMsQ0FBQztBQUVILElBQUkseUNBQWtCLENBQUMsR0FBRyxFQUFFLG9CQUFvQixFQUFFO0FBQ2hELGtEQUFrRDtDQUNuRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgUHJvZHVjdFNlcnZpY2VTdGFjayB9IGZyb20gJy4uL2xpYi9wcm9kdWN0LXNlcnZpY2Utc3RhY2snO1xuaW1wb3J0IHsgSW1wb3J0U2VydmljZVN0YWNrIH0gZnJvbSAnLi4vbGliL2ltcG9ydC1zZXJ2aWNlLXN0YWNrJzsgLy8gQWRkIHRoaXMgaW1wb3J0XG5cbmNvbnN0IGFwcCA9IG5ldyBjZGsuQXBwKCk7XG5uZXcgUHJvZHVjdFNlcnZpY2VTdGFjayhhcHAsICdQcm9kdWN0U2VydmljZVN0YWNrJywge1xuICAvKiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSAnZW52JywgdGhpcyBzdGFjayB3aWxsIGJlIGVudmlyb25tZW50LWFnbm9zdGljLlxuICAgKiBBY2NvdW50L1JlZ2lvbi1kZXBlbmRlbnQgZmVhdHVyZXMgYW5kIGNvbnRleHQgbG9va3VwcyB3aWxsIG5vdCB3b3JrLFxuICAgKiBidXQgYSBzaW5nbGUgc3ludGhlc2l6ZWQgdGVtcGxhdGUgY2FuIGJlIGRlcGxveWVkIGFueXdoZXJlLiAqL1xuXG4gIC8qIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIHNwZWNpYWxpemUgdGhpcyBzdGFjayBmb3IgdGhlIEFXUyBBY2NvdW50XG4gICAqIGFuZCBSZWdpb24gdGhhdCBhcmUgaW1wbGllZCBieSB0aGUgY3VycmVudCBDTEkgY29uZmlndXJhdGlvbi4gKi9cbiAgLy8gZW52OiB7IGFjY291bnQ6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQsIHJlZ2lvbjogcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfUkVHSU9OIH0sXG5cbiAgLyogVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgaWYgeW91IGtub3cgZXhhY3RseSB3aGF0IEFjY291bnQgYW5kIFJlZ2lvbiB5b3VcbiAgICogd2FudCB0byBkZXBsb3kgdGhlIHN0YWNrIHRvLiAqL1xuICAvLyBlbnY6IHsgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsIHJlZ2lvbjogJ3VzLWVhc3QtMScgfSxcblxuICAvKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jZGsvbGF0ZXN0L2d1aWRlL2Vudmlyb25tZW50cy5odG1sICovXG59KTtcblxubmV3IEltcG9ydFNlcnZpY2VTdGFjayhhcHAsICdJbXBvcnRTZXJ2aWNlU3RhY2snLCB7XG4gIC8vIE9wdGlvbmFsbHkgc3BlY2lmeSBlbnYgb3Igb3RoZXIgcHJvcHMgaWYgbmVlZGVkXG59KTsiXX0= \ No newline at end of file diff --git a/cdk.out/ProductServiceStack.assets.json b/cdk.out/ProductServiceStack.assets.json index dd3e503..f872b8a 100644 --- a/cdk.out/ProductServiceStack.assets.json +++ b/cdk.out/ProductServiceStack.assets.json @@ -43,16 +43,30 @@ } } }, - "749ea6ccb1538f83a77ed144e20544351c7b54446ec404f8a9ae3d7120c37b1c": { + "97729aa914f77d96a12061785501568977ca76d97143530acedc9274a4e9f451": { + "displayName": "catalogBatchProcess/Code", + "source": { + "path": "asset.97729aa914f77d96a12061785501568977ca76d97143530acedc9274a4e9f451", + "packaging": "zip" + }, + "destinations": { + "current_account-current_region-9b1d5690": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "97729aa914f77d96a12061785501568977ca76d97143530acedc9274a4e9f451.zip", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + }, + "cd9b3da3dacd9bd6a6f60f2021947699042f2ad4ae6dd13ce389f9c3d45f6049": { "displayName": "ProductServiceStack Template", "source": { "path": "ProductServiceStack.template.json", "packaging": "file" }, "destinations": { - "current_account-current_region-ad5300ed": { + "current_account-current_region-4c892abf": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "749ea6ccb1538f83a77ed144e20544351c7b54446ec404f8a9ae3d7120c37b1c.json", + "objectKey": "cd9b3da3dacd9bd6a6f60f2021947699042f2ad4ae6dd13ce389f9c3d45f6049.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/cdk.out/ProductServiceStack.template.json b/cdk.out/ProductServiceStack.template.json index 7e6ffb9..e3de973 100644 --- a/cdk.out/ProductServiceStack.template.json +++ b/cdk.out/ProductServiceStack.template.json @@ -505,6 +505,262 @@ "aws:cdk:path": "ProductServiceStack/createProduct/LogGroup/Resource" } }, + "catalogItemsQueue79451959": { + "Type": "AWS::SQS::Queue", + "Properties": { + "VisibilityTimeout": 30 + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete", + "Metadata": { + "aws:cdk:path": "ProductServiceStack/catalogItemsQueue/Resource" + } + }, + "catalogItemsQueuePolicyE4B945F2": { + "Type": "AWS::SQS::QueuePolicy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "sqs:GetQueueAttributes", + "sqs:GetQueueUrl", + "sqs:SendMessage" + ], + "Effect": "Allow", + "Principal": { + "AWS": "arn:aws:iam::837282923698:role/importFileParserRole" + }, + "Resource": { + "Fn::GetAtt": [ + "catalogItemsQueue79451959", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "Queues": [ + { + "Ref": "catalogItemsQueue79451959" + } + ] + }, + "Metadata": { + "aws:cdk:path": "ProductServiceStack/catalogItemsQueue/Policy/Resource" + } + }, + "catalogBatchProcessServiceRole274D33CD": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ] + ] + } + ] + }, + "Metadata": { + "aws:cdk:path": "ProductServiceStack/catalogBatchProcess/ServiceRole/Resource" + } + }, + "catalogBatchProcessServiceRoleDefaultPolicy8FC58026": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "dynamodb:BatchWriteItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + "dynamodb:PutItem", + "dynamodb:UpdateItem" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":dynamodb:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":table/products" + ] + ] + }, + { + "Ref": "AWS::NoValue" + } + ] + }, + { + "Action": [ + "sqs:ChangeMessageVisibility", + "sqs:DeleteMessage", + "sqs:GetQueueAttributes", + "sqs:GetQueueUrl", + "sqs:ReceiveMessage" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "catalogItemsQueue79451959", + "Arn" + ] + } + }, + { + "Action": "sns:Publish", + "Effect": "Allow", + "Resource": { + "Ref": "createProductTopic05C0E62B" + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "catalogBatchProcessServiceRoleDefaultPolicy8FC58026", + "Roles": [ + { + "Ref": "catalogBatchProcessServiceRole274D33CD" + } + ] + }, + "Metadata": { + "aws:cdk:path": "ProductServiceStack/catalogBatchProcess/ServiceRole/DefaultPolicy/Resource" + } + }, + "catalogBatchProcessDC6613DA": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "97729aa914f77d96a12061785501568977ca76d97143530acedc9274a4e9f451.zip" + }, + "Environment": { + "Variables": { + "PRODUCTS_TABLE": "products", + "SQS_URL": { + "Ref": "catalogItemsQueue79451959" + }, + "SNS_TOPIC": { + "Ref": "createProductTopic05C0E62B" + } + } + }, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "catalogBatchProcessServiceRole274D33CD", + "Arn" + ] + }, + "Runtime": "nodejs18.x" + }, + "DependsOn": [ + "catalogBatchProcessServiceRoleDefaultPolicy8FC58026", + "catalogBatchProcessServiceRole274D33CD" + ], + "Metadata": { + "aws:cdk:path": "ProductServiceStack/catalogBatchProcess/Resource", + "aws:asset:path": "asset.97729aa914f77d96a12061785501568977ca76d97143530acedc9274a4e9f451", + "aws:asset:is-bundled": false, + "aws:asset:property": "Code" + } + }, + "catalogBatchProcessLogGroupA1CECDA2": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/lambda/", + { + "Ref": "catalogBatchProcessDC6613DA" + } + ] + ] + }, + "RetentionInDays": 731 + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain", + "Metadata": { + "aws:cdk:path": "ProductServiceStack/catalogBatchProcess/LogGroup/Resource" + } + }, + "catalogBatchProcessSqsEventSourceProductServiceStackcatalogItemsQueue1DF43E6A4EBBBC9C": { + "Type": "AWS::Lambda::EventSourceMapping", + "Properties": { + "BatchSize": 5, + "EventSourceArn": { + "Fn::GetAtt": [ + "catalogItemsQueue79451959", + "Arn" + ] + }, + "FunctionName": { + "Ref": "catalogBatchProcessDC6613DA" + } + }, + "Metadata": { + "aws:cdk:path": "ProductServiceStack/catalogBatchProcess/SqsEventSource:ProductServiceStackcatalogItemsQueue1DF43E6A/Resource" + } + }, + "createProductTopic05C0E62B": { + "Type": "AWS::SNS::Topic", + "Metadata": { + "aws:cdk:path": "ProductServiceStack/createProductTopic/Resource" + } + }, + "emailSubscriptionA0771E59": { + "Type": "AWS::SNS::Subscription", + "Properties": { + "Endpoint": "mahendra_yadav@epam.com", + "Protocol": "email", + "TopicArn": { + "Ref": "createProductTopic05C0E62B" + } + }, + "Metadata": { + "aws:cdk:path": "ProductServiceStack/emailSubscription/Resource" + } + }, "ProductServiceApiFE734E24": { "Type": "AWS::ApiGateway::RestApi", "Properties": { @@ -1125,7 +1381,7 @@ "CDKMetadata": { "Type": "AWS::CDK::Metadata", "Properties": { - "Analytics": "v2:deflate64:H4sIAAAAAAAA/+1XW0/bMBT+LcsjMtnGLg+8FXZDG6Nifasq5ManqcGxPdsBZVH++44vSduhMTqpG0g8xf7OxefqEx/kBy/f5C+e0Ru7X7CrfcHnefvN0eKKIHTRskbSSrF5PqFzAUfUwnRGBK3mjObth1oWjis5bTNTS8cryA6zvYxkSyqZAJN2hWI9YZEkvtLE25E2o4y9l9fcKFmBdNnhNLDuZbM/Eh/0qbCuYBd27II4I8cL2efVr8dgKm4t7jrCaZW350oAJpxaW1fAjprssM204bLgmopRUah68DfyeIFR0Jd8zioqaQlsrAQvOFg8v93AmpFJvL21EzXuj4gcXiZRHVbr8kQKLmGgDY7eSbxb75ODj93Bv6WGJvBOkwiH9uhNmShPuWXhbZgxvEcd+A6zG8fehh+7/q3gEN0Y2I7YVxdYY+BsPvIf3OdHdXEFrh81qrR5+0WVH42qNVaZSMuNO/SeYDi519URqnmJtt3QBm81sG6kuZ9kcTVIkYzBgtbCHStjxwYWgpdLd6Z9O1jfOlQIdXNmeMn9PraNh07BLRXbgD4BZWAi1KUyi8eRd6CFanyc0AYGtjBcDx2H4pqnlQFHuVyx2/VJMlHoHi+oOGG/VPpDx0MwVl4RLJsSQih6aC2HgUgwdKo2Rfwr8WVLYshjEgOpn9HO6UhLAJcOSkPXAqzWElojp+E//FBf35300j0U5CeN7mvOZ+kzNOfwveYGkHtBhYXf8eMtGkxCNzSenG5Ri+1S2+PVb4RJ5DE1WJJuKJ9Zl2J5uqFlWyXkKVj/Llj38GEbU5/S9/DSR+4FbZ3k3bD+j2jszPUwGSLnMBqQUVOzeoFp6pZYF26w7g5qP56DIjR60JkeS+HBRMJvi59HXJZe4Kx2unYdkWhZfmmfXx+8zt/iA/vScr6fXo75efz+BKa0nN19DwAA" + "Analytics": "v2:deflate64:H4sIAAAAAAAA/+1YS3PbNhD+LeExAzOpk/aQm+w6jSdxrdiaycHjyUAARG0MAjAedhmO/nsWIEFRdevGySi1Jz5IIr5d7BvYFXfL3V9+LZ8/odduh/GLHQnzsj31lF0QhD62vFG01nxezuhcij3qxNk5kbSec1q2r4NiHrQ6awsblIdaFK+KpwUpllRxKWy/YppnwqLf8SfteVekLSjnB+oKrFa1UL54dZZYnxbn/0m811rFWMA27NgS8Rvd25ZF52R/oXKlkYMrJJ/qYJk4osaAqrD4PLWVyEGeU8+Wp/A521nTv/YihKwfQHF9vcb3tWLBWqFY04NWGG194j/0on5NQQYr3OByPAQ8r9amTKzKKQbphXUbqwPFbGOi+Vm18BaYQ/ULqLrgJS9vOkey4/3JQ6apsDU4h9iKAK3L9kRLgUGgzoVa8D10pS2MBcXAUDlhTIehADueuGHCBntWMRaKVoJPtQQG0V2UN8aa7OAqJ2ump1lFxxH39FSP18fyUElQYqANeb6VeLvcRwcfuoPfQ/2Jg5POfXSLdHC6HLOymY6UGzbchDnHvo6XGt4xbkPtTfihy38I1nSXecrnirgXH7F4hXflJP7gutwL7EL4PHHpypXtO139YXUwWL6yf9wYJb4HTOZkBWjQJep7H0SIreUKHMxBgm9mOBjo4EdbEg9J331xtsVlXLkcrTXb4K1C4TNtgCWOSE8rchrmjlkw/VDpI9ifbWO110xLXIoa23Jqx9xoUGNrxgJWhBqoMOrXtMEuKZyfGIijavc0uE4KLhY0SL+vrZtasZBQLf1xkuHibUOl1NfHFipQubEn6Ej4peYb0BtBeW7/q/7cdurI78JI3cQKQBu4GMzM2w0MM4inoNbsbjxezTTmCBiVh/xvV8d9x1Mw1l4RPBCVSKHI0DiPkUgwdGkYSocgVUoX8i6JiZSnVO9NR+sBLAtRWToKsB4lNCCnxRHRbq4O8+4Mpf2zxuSDE7P0VjQn4jKAjYPggkon/o0/DXpoErphUHPfeBxeBAFnv2GQtj15Si2W5DA9Ysj6WB5tSLmrEPIYrB8XrK/w4S6mPqbv/qWPfBV05yRvh/X/iMbWXE+doeMcWgMyGmrXr1gM9Uusi/UriVuouT0nQWj0ILN/9/BPn3OSBrTYn+LfcxRwHLwJfkUUWlp+cs+udl+Wv5XPn3xyADv9u5TypPv9AnyNAOtuEwAA" }, "Metadata": { "aws:cdk:path": "ProductServiceStack/CDKMetadata/Default" diff --git a/cdk.out/manifest.json b/cdk.out/manifest.json index 92a86ae..763cbae 100644 --- a/cdk.out/manifest.json +++ b/cdk.out/manifest.json @@ -18,7 +18,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/749ea6ccb1538f83a77ed144e20544351c7b54446ec404f8a9ae3d7120c37b1c.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/cd9b3da3dacd9bd6a6f60f2021947699042f2ad4ae6dd13ce389f9c3d45f6049.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -553,6 +553,281 @@ "data": "createProductLogGroup1A0370B5" } ], + "/ProductServiceStack/catalogItemsQueue": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "visibilityTimeout": "*" + } + } + ], + "/ProductServiceStack/catalogItemsQueue/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "catalogItemsQueue79451959" + } + ], + "/ProductServiceStack/catalogItemsQueue/Policy": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "queues": [ + "*" + ] + } + } + ], + "/ProductServiceStack/catalogItemsQueue/Policy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "catalogItemsQueuePolicyE4B945F2" + } + ], + "/ProductServiceStack/catalogBatchProcess": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "runtime": "*", + "handler": "*", + "code": "*", + "environment": "*" + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addEnvironment": [ + "*", + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addEnvironment": [ + "*", + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addEnvironment": [ + "*", + "*" + ] + } + } + ], + "/ProductServiceStack/catalogBatchProcess/ServiceRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "assumedBy": { + "principalAccount": "*", + "assumeRoleAction": "*" + }, + "managedPolicies": [ + { + "managedPolicyArn": "*" + } + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachInlinePolicy": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachInlinePolicy": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + } + ], + "/ProductServiceStack/catalogBatchProcess/ServiceRole/ImportServiceRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], + "/ProductServiceStack/catalogBatchProcess/ServiceRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "catalogBatchProcessServiceRole274D33CD" + } + ], + "/ProductServiceStack/catalogBatchProcess/ServiceRole/DefaultPolicy": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachToRole": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachToRole": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + } + ], + "/ProductServiceStack/catalogBatchProcess/ServiceRole/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "catalogBatchProcessServiceRoleDefaultPolicy8FC58026" + } + ], + "/ProductServiceStack/catalogBatchProcess/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "catalogBatchProcessDC6613DA" + } + ], + "/ProductServiceStack/catalogBatchProcess/LogGroup": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "logGroupName": "*" + } + } + ], + "/ProductServiceStack/catalogBatchProcess/LogGroup/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "catalogBatchProcessLogGroupA1CECDA2" + } + ], + "/ProductServiceStack/catalogBatchProcess/SqsEventSource:ProductServiceStackcatalogItemsQueue1DF43E6A": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "target": "*", + "batchSize": "*", + "maxBatchingWindow": "*", + "maxConcurrency": "*", + "reportBatchItemFailures": "*", + "enabled": "*", + "eventSourceArn": "*", + "filters": "*", + "filterEncryption": "*", + "metricsConfig": "*" + } + } + ], + "/ProductServiceStack/catalogBatchProcess/SqsEventSource:ProductServiceStackcatalogItemsQueue1DF43E6A/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "catalogBatchProcessSqsEventSourceProductServiceStackcatalogItemsQueue1DF43E6A4EBBBC9C" + } + ], + "/ProductServiceStack/createProductTopic": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], + "/ProductServiceStack/createProductTopic/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "createProductTopic05C0E62B" + } + ], + "/ProductServiceStack/emailSubscription": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "topic": "*", + "protocol": "email", + "endpoint": "*" + } + } + ], + "/ProductServiceStack/emailSubscription/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "emailSubscriptionA0771E59" + } + ], + "/ProductServiceStack/MutableRoleImportFileParserRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], + "/ProductServiceStack/ImportFileParserRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": "*" + } + ], "/ProductServiceStack/ProductServiceApi": [ { "type": "aws:cdk:analytics:construct", @@ -1055,7 +1330,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/8205ef10dde8ab9f3aeabccf0a2cbc8a0b692226d0429fa9ebeee97a9611bf39.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/933f92c4dd90bc38e76ce7b0c64be034a679e6ea26d85c62d937ea24e5de3745.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ diff --git a/cdk.out/tree.json b/cdk.out/tree.json index f01ea50..507ba72 100644 --- a/cdk.out/tree.json +++ b/cdk.out/tree.json @@ -1 +1 @@ -{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"2.215.0"},"children":{"ProductServiceStack":{"id":"ProductServiceStack","path":"ProductServiceStack","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"2.215.0"},"children":{"ProductsTableImported":{"id":"ProductsTableImported","path":"ProductServiceStack/ProductsTableImported","constructInfo":{"fqn":"aws-cdk-lib.aws_dynamodb.TableBase","version":"2.215.0","metadata":[]}},"StockTableImported":{"id":"StockTableImported","path":"ProductServiceStack/StockTableImported","constructInfo":{"fqn":"aws-cdk-lib.aws_dynamodb.TableBase","version":"2.215.0","metadata":[]}},"getProductsList":{"id":"getProductsList","path":"ProductServiceStack/getProductsList","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"2.215.0","metadata":[{"runtime":"*","handler":"*","code":"*","functionName":"*"},{"addEnvironment":["*","*"]},{"addEnvironment":["*","*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"ProductServiceStack/getProductsList/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"2.215.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"ProductServiceStack/getProductsList/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsList/ServiceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ProductServiceStack/getProductsList/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"2.215.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsList/ServiceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["dynamodb:BatchGetItem","dynamodb:ConditionCheckItem","dynamodb:DescribeTable","dynamodb:GetItem","dynamodb:GetRecords","dynamodb:GetShardIterator","dynamodb:Query","dynamodb:Scan"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":dynamodb:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":table/products"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":dynamodb:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":table/stock"]]},{"Ref":"AWS::NoValue"}]}],"Version":"2012-10-17"},"policyName":"getProductsListServiceRoleDefaultPolicyFCF405B6","roles":[{"Ref":"getProductsListServiceRoleC64A5CD3"}]}}}}}}},"Code":{"id":"Code","path":"ProductServiceStack/getProductsList/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"2.215.0"},"children":{"Stage":{"id":"Stage","path":"ProductServiceStack/getProductsList/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"2.215.0"}},"AssetBucket":{"id":"AssetBucket","path":"ProductServiceStack/getProductsList/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"2.215.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsList/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Function","aws:cdk:cloudformation:props":{"code":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"70cbab7b33a392c0c1ddaad96d1cb3e2942d2a10e49670f06c24ed1d1dca0f3d.zip"},"environment":{"variables":{"PRODUCTS_TABLE_NAME":"products","STOCK_TABLE_NAME":"stock"}},"functionName":"getProductsList","handler":"index.handler","role":{"Fn::GetAtt":["getProductsListServiceRoleC64A5CD3","Arn"]},"runtime":"nodejs18.x"}}},"LogGroup":{"id":"LogGroup","path":"ProductServiceStack/getProductsList/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"2.215.0","metadata":[{"logGroupName":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsList/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{"logGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"getProductsList1F4CE4F4"}]]},"retentionInDays":731}}}}}}},"getProductsById":{"id":"getProductsById","path":"ProductServiceStack/getProductsById","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"2.215.0","metadata":[{"runtime":"*","handler":"*","code":"*","functionName":"*"},{"addEnvironment":["*","*"]},{"addEnvironment":["*","*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"ProductServiceStack/getProductsById/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"2.215.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"ProductServiceStack/getProductsById/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsById/ServiceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ProductServiceStack/getProductsById/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"2.215.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsById/ServiceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["dynamodb:BatchGetItem","dynamodb:ConditionCheckItem","dynamodb:DescribeTable","dynamodb:GetItem","dynamodb:GetRecords","dynamodb:GetShardIterator","dynamodb:Query","dynamodb:Scan"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":dynamodb:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":table/products"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":dynamodb:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":table/stock"]]},{"Ref":"AWS::NoValue"}]}],"Version":"2012-10-17"},"policyName":"getProductsByIdServiceRoleDefaultPolicyF36017B0","roles":[{"Ref":"getProductsByIdServiceRoleD8824A03"}]}}}}}}},"Code":{"id":"Code","path":"ProductServiceStack/getProductsById/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"2.215.0"},"children":{"Stage":{"id":"Stage","path":"ProductServiceStack/getProductsById/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"2.215.0"}},"AssetBucket":{"id":"AssetBucket","path":"ProductServiceStack/getProductsById/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"2.215.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsById/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Function","aws:cdk:cloudformation:props":{"code":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"406c62239f9ff5bf6f0ea5452f8dadb69cd3c1c23008b027e450ea23595976de.zip"},"environment":{"variables":{"PRODUCTS_TABLE_NAME":"products","STOCK_TABLE_NAME":"stock"}},"functionName":"getProductsById","handler":"index.handler","role":{"Fn::GetAtt":["getProductsByIdServiceRoleD8824A03","Arn"]},"runtime":"nodejs18.x"}}},"LogGroup":{"id":"LogGroup","path":"ProductServiceStack/getProductsById/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"2.215.0","metadata":[{"logGroupName":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsById/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{"logGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"getProductsById008BCA51"}]]},"retentionInDays":731}}}}}}},"createProduct":{"id":"createProduct","path":"ProductServiceStack/createProduct","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"2.215.0","metadata":[{"runtime":"*","handler":"*","code":"*","environment":"*","functionName":"*"},{"addEnvironment":["*","*"]},{"addEnvironment":["*","*"]},{"addEnvironment":["*","*"]},{"addEnvironment":["*","*"]},{"addEnvironment":["*","*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"ProductServiceStack/createProduct/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"2.215.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"ProductServiceStack/createProduct/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ProductServiceStack/createProduct/ServiceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ProductServiceStack/createProduct/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"2.215.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/createProduct/ServiceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["dynamodb:BatchWriteItem","dynamodb:DeleteItem","dynamodb:DescribeTable","dynamodb:PutItem","dynamodb:UpdateItem"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":dynamodb:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":table/products"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":dynamodb:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":table/stock"]]},{"Ref":"AWS::NoValue"}]}],"Version":"2012-10-17"},"policyName":"createProductServiceRoleDefaultPolicyA4987AF8","roles":[{"Ref":"createProductServiceRole49F078DF"}]}}}}}}},"Code":{"id":"Code","path":"ProductServiceStack/createProduct/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"2.215.0"},"children":{"Stage":{"id":"Stage","path":"ProductServiceStack/createProduct/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"2.215.0"}},"AssetBucket":{"id":"AssetBucket","path":"ProductServiceStack/createProduct/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"2.215.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"ProductServiceStack/createProduct/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Function","aws:cdk:cloudformation:props":{"code":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"9ed918abf00f4551a7208e6c2d9b92e1dbf597d77b8a895e17f59c32f621dc27.zip"},"environment":{"variables":{"PRODUCTS_TABLE_NAME":"products","STOCK_TABLE_NAME":"stock","AWS_NODEJS_CONNECTION_REUSE_ENABLED":"1"}},"functionName":"createProduct","handler":"index.handler","role":{"Fn::GetAtt":["createProductServiceRole49F078DF","Arn"]},"runtime":"nodejs18.x"}}},"LogGroup":{"id":"LogGroup","path":"ProductServiceStack/createProduct/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"2.215.0","metadata":[{"logGroupName":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/createProduct/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{"logGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"createProduct6AB81851"}]]},"retentionInDays":731}}}}}}},"ProductServiceApi":{"id":"ProductServiceApi","path":"ProductServiceStack/ProductServiceApi","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.RestApi","version":"2.215.0","metadata":[{"restApiName":"*","defaultCorsPreflightOptions":{"allowOrigins":"*","allowMethods":"*","allowHeaders":"*"}}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnRestApi","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::RestApi","aws:cdk:cloudformation:props":{"name":"Product Service"}}},"Deployment":{"id":"Deployment","path":"ProductServiceStack/ProductServiceApi/Deployment","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Deployment","version":"2.215.0","metadata":[{"description":"*","api":"*","retainDeployments":"*"},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Deployment/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnDeployment","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Deployment","aws:cdk:cloudformation:props":{"description":"Automatically created by the RestApi construct","restApiId":{"Ref":"ProductServiceApiFE734E24"}}}}}},"DeploymentStage.prod":{"id":"DeploymentStage.prod","path":"ProductServiceStack/ProductServiceApi/DeploymentStage.prod","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Stage","version":"2.215.0","metadata":[{"deployment":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/DeploymentStage.prod/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnStage","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Stage","aws:cdk:cloudformation:props":{"deploymentId":{"Ref":"ProductServiceApiDeployment696F4D079237897079983c97bee03b99b3ec4fcc"},"restApiId":{"Ref":"ProductServiceApiFE734E24"},"stageName":"prod"}}}}},"Endpoint":{"id":"Endpoint","path":"ProductServiceStack/ProductServiceApi/Endpoint","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"2.215.0"}},"Default":{"id":"Default","path":"ProductServiceStack/ProductServiceApi/Default","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.ResourceBase","version":"2.215.0","metadata":["*"]},"children":{"OPTIONS":{"id":"OPTIONS","path":"ProductServiceStack/ProductServiceApi/Default/OPTIONS","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"authorizer":{"authorizerId":"*","authorizationType":"*"},"apiKeyRequired":false,"authorizationType":"*","methodResponses":[{"statusCode":"*","responseParameters":"*"}]}},{"addMethodResponse":[{"statusCode":"*","responseParameters":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/OPTIONS/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"apiKeyRequired":false,"authorizationType":"NONE","httpMethod":"OPTIONS","integration":{"type":"MOCK","requestTemplates":{"application/json":"{ statusCode: 200 }"},"integrationResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":"'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'","method.response.header.Access-Control-Allow-Origin":"'*'","method.response.header.Access-Control-Allow-Methods":"'GET,POST,OPTIONS'"}}]},"methodResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":true,"method.response.header.Access-Control-Allow-Origin":true,"method.response.header.Access-Control-Allow-Methods":true}}],"resourceId":{"Fn::GetAtt":["ProductServiceApiFE734E24","RootResourceId"]},"restApiId":{"Ref":"ProductServiceApiFE734E24"}}}}}},"products":{"id":"products","path":"ProductServiceStack/ProductServiceApi/Default/products","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Resource","version":"2.215.0","metadata":[{"parent":"*","pathPart":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/products/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnResource","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Resource","aws:cdk:cloudformation:props":{"parentId":{"Fn::GetAtt":["ProductServiceApiFE734E24","RootResourceId"]},"pathPart":"products","restApiId":{"Ref":"ProductServiceApiFE734E24"}}}},"OPTIONS":{"id":"OPTIONS","path":"ProductServiceStack/ProductServiceApi/Default/products/OPTIONS","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"authorizer":{"authorizerId":"*","authorizationType":"*"},"apiKeyRequired":false,"authorizationType":"*","methodResponses":[{"statusCode":"*","responseParameters":"*"}]}},{"addMethodResponse":[{"statusCode":"*","responseParameters":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/products/OPTIONS/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"apiKeyRequired":false,"authorizationType":"NONE","httpMethod":"OPTIONS","integration":{"type":"MOCK","requestTemplates":{"application/json":"{ statusCode: 200 }"},"integrationResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":"'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'","method.response.header.Access-Control-Allow-Origin":"'*'","method.response.header.Access-Control-Allow-Methods":"'GET,POST,OPTIONS'"}}]},"methodResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":true,"method.response.header.Access-Control-Allow-Origin":true,"method.response.header.Access-Control-Allow-Methods":true}}],"resourceId":{"Ref":"ProductServiceApiproducts612C39F6"},"restApiId":{"Ref":"ProductServiceApiFE734E24"}}}}}},"GET":{"id":"GET","path":"ProductServiceStack/ProductServiceApi/Default/products/GET","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"methodResponses":[{"statusCode":"*"}]}},{"addMethodResponse":[{"statusCode":"*"}]}]},"children":{"ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.GET..products":{"id":"ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.GET..products","path":"ProductServiceStack/ProductServiceApi/Default/products/GET/ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.GET..products","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["getProductsList1F4CE4F4","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ProductServiceApiFE734E24"},"/",{"Ref":"ProductServiceApiDeploymentStageprod7C4CB6D5"},"/GET/products"]]}}}},"ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.GET..products":{"id":"ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.GET..products","path":"ProductServiceStack/ProductServiceApi/Default/products/GET/ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.GET..products","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["getProductsList1F4CE4F4","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ProductServiceApiFE734E24"},"/test-invoke-stage/GET/products"]]}}}},"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/products/GET/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"authorizationType":"NONE","httpMethod":"GET","integration":{"type":"AWS_PROXY","uri":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":apigateway:",{"Ref":"AWS::Region"},":lambda:path/2015-03-31/functions/",{"Fn::GetAtt":["getProductsList1F4CE4F4","Arn"]},"/invocations"]]},"integrationHttpMethod":"POST"},"methodResponses":[{"statusCode":"200"}],"resourceId":{"Ref":"ProductServiceApiproducts612C39F6"},"restApiId":{"Ref":"ProductServiceApiFE734E24"}}}}}},"{productId}":{"id":"{productId}","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Resource","version":"2.215.0","metadata":[{"parent":"*","pathPart":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnResource","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Resource","aws:cdk:cloudformation:props":{"parentId":{"Ref":"ProductServiceApiproducts612C39F6"},"pathPart":"{productId}","restApiId":{"Ref":"ProductServiceApiFE734E24"}}}},"OPTIONS":{"id":"OPTIONS","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}/OPTIONS","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"authorizer":{"authorizerId":"*","authorizationType":"*"},"apiKeyRequired":false,"authorizationType":"*","methodResponses":[{"statusCode":"*","responseParameters":"*"}]}},{"addMethodResponse":[{"statusCode":"*","responseParameters":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}/OPTIONS/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"apiKeyRequired":false,"authorizationType":"NONE","httpMethod":"OPTIONS","integration":{"type":"MOCK","requestTemplates":{"application/json":"{ statusCode: 200 }"},"integrationResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":"'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'","method.response.header.Access-Control-Allow-Origin":"'*'","method.response.header.Access-Control-Allow-Methods":"'GET,POST,OPTIONS'"}}]},"methodResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":true,"method.response.header.Access-Control-Allow-Origin":true,"method.response.header.Access-Control-Allow-Methods":true}}],"resourceId":{"Ref":"ProductServiceApiproductsproductId622E148C"},"restApiId":{"Ref":"ProductServiceApiFE734E24"}}}}}},"GET":{"id":"GET","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}/GET","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"methodResponses":[{"statusCode":"*"},{"statusCode":"*"},{"statusCode":"*"}]}},{"addMethodResponse":[{"statusCode":"*"}]},{"addMethodResponse":[{"statusCode":"*"}]},{"addMethodResponse":[{"statusCode":"*"}]}]},"children":{"ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.GET..products.{productId}":{"id":"ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.GET..products.{productId}","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}/GET/ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.GET..products.{productId}","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["getProductsById008BCA51","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ProductServiceApiFE734E24"},"/",{"Ref":"ProductServiceApiDeploymentStageprod7C4CB6D5"},"/GET/products/*"]]}}}},"ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.GET..products.{productId}":{"id":"ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.GET..products.{productId}","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}/GET/ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.GET..products.{productId}","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["getProductsById008BCA51","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ProductServiceApiFE734E24"},"/test-invoke-stage/GET/products/*"]]}}}},"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}/GET/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"authorizationType":"NONE","httpMethod":"GET","integration":{"type":"AWS_PROXY","uri":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":apigateway:",{"Ref":"AWS::Region"},":lambda:path/2015-03-31/functions/",{"Fn::GetAtt":["getProductsById008BCA51","Arn"]},"/invocations"]]},"integrationHttpMethod":"POST"},"methodResponses":[{"statusCode":"200"},{"statusCode":"404"},{"statusCode":"400"}],"resourceId":{"Ref":"ProductServiceApiproductsproductId622E148C"},"restApiId":{"Ref":"ProductServiceApiFE734E24"}}}}}}}},"POST":{"id":"POST","path":"ProductServiceStack/ProductServiceApi/Default/products/POST","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"methodResponses":[{"statusCode":"*"},{"statusCode":"*"}]}},{"addMethodResponse":[{"statusCode":"*"}]},{"addMethodResponse":[{"statusCode":"*"}]}]},"children":{"ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.POST..products":{"id":"ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.POST..products","path":"ProductServiceStack/ProductServiceApi/Default/products/POST/ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.POST..products","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["createProduct6AB81851","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ProductServiceApiFE734E24"},"/",{"Ref":"ProductServiceApiDeploymentStageprod7C4CB6D5"},"/POST/products"]]}}}},"ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.POST..products":{"id":"ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.POST..products","path":"ProductServiceStack/ProductServiceApi/Default/products/POST/ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.POST..products","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["createProduct6AB81851","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ProductServiceApiFE734E24"},"/test-invoke-stage/POST/products"]]}}}},"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/products/POST/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"authorizationType":"NONE","httpMethod":"POST","integration":{"type":"AWS_PROXY","uri":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":apigateway:",{"Ref":"AWS::Region"},":lambda:path/2015-03-31/functions/",{"Fn::GetAtt":["createProduct6AB81851","Arn"]},"/invocations"]]},"integrationHttpMethod":"POST"},"methodResponses":[{"statusCode":"201"},{"statusCode":"400"}],"resourceId":{"Ref":"ProductServiceApiproducts612C39F6"},"restApiId":{"Ref":"ProductServiceApiFE734E24"}}}}}}}}}}}},"ProductsApiUrl":{"id":"ProductsApiUrl","path":"ProductServiceStack/ProductsApiUrl","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"2.215.0"}},"CDKMetadata":{"id":"CDKMetadata","path":"ProductServiceStack/CDKMetadata","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Default":{"id":"Default","path":"ProductServiceStack/CDKMetadata/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"2.215.0"}},"Condition":{"id":"Condition","path":"ProductServiceStack/CDKMetadata/Condition","constructInfo":{"fqn":"aws-cdk-lib.CfnCondition","version":"2.215.0"}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"ProductServiceStack/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"2.215.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"ProductServiceStack/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"2.215.0"}}}},"ImportServiceStack":{"id":"ImportServiceStack","path":"ImportServiceStack","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"2.215.0"},"children":{"ImportBucket":{"id":"ImportBucket","path":"ImportServiceStack/ImportBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"2.215.0","metadata":[{"removalPolicy":"destroy","autoDeleteObjects":true,"cors":[{"allowedOrigins":"*","allowedMethods":["GET","PUT"],"allowedHeaders":"*","exposedHeaders":"*"}]},{"addCorsRule":[{"allowedOrigins":"*","allowedMethods":["GET","PUT"],"allowedHeaders":"*","exposedHeaders":"*"},"*","*"]}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportBucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"corsConfiguration":{"corsRules":[{"allowedHeaders":["*"],"allowedMethods":["GET","PUT"],"allowedOrigins":["*"],"exposedHeaders":["ETag"]}]},"tags":[{"key":"aws-cdk:auto-delete-objects","value":"true"}]}}},"Policy":{"id":"Policy","path":"ImportServiceStack/ImportBucket/Policy","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketPolicy","version":"2.215.0","metadata":[{"bucket":"*"}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportBucket/Policy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucketPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::BucketPolicy","aws:cdk:cloudformation:props":{"bucket":{"Ref":"ImportBucketBAF3A8E9"},"policyDocument":{"Statement":[{"Action":["s3:DeleteObject*","s3:GetBucket*","s3:List*","s3:PutBucketPolicy"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}}}}}},"AutoDeleteObjectsCustomResource":{"id":"AutoDeleteObjectsCustomResource","path":"ImportServiceStack/ImportBucket/AutoDeleteObjectsCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"2.215.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"ImportServiceStack/ImportBucket/AutoDeleteObjectsCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"2.215.0"}}}},"Notifications":{"id":"Notifications","path":"ImportServiceStack/ImportBucket/Notifications","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportBucket/Notifications/Resource","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"2.215.0"}}}},"AllowBucketNotificationsToImportServiceStackimportFileParserE5BD8A79":{"id":"AllowBucketNotificationsToImportServiceStackimportFileParserE5BD8A79","path":"ImportServiceStack/ImportBucket/AllowBucketNotificationsToImportServiceStackimportFileParserE5BD8A79","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["importFileParser85B01032","Arn"]},"principal":"s3.amazonaws.com","sourceAccount":{"Ref":"AWS::AccountId"},"sourceArn":{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]}}}}}},"Custom::S3AutoDeleteObjectsCustomResourceProvider":{"id":"Custom::S3AutoDeleteObjectsCustomResourceProvider","path":"ImportServiceStack/Custom::S3AutoDeleteObjectsCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"2.215.0"},"children":{"Staging":{"id":"Staging","path":"ImportServiceStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"2.215.0"}},"Role":{"id":"Role","path":"ImportServiceStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"2.215.0"}},"Handler":{"id":"Handler","path":"ImportServiceStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"2.215.0"}}}},"importProductsFile":{"id":"importProductsFile","path":"ImportServiceStack/importProductsFile","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"2.215.0","metadata":[{"runtime":"*","handler":"*","code":"*","environment":"*","functionName":"*"},{"addEnvironment":["*","*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"ImportServiceStack/importProductsFile/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"2.215.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"ImportServiceStack/importProductsFile/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ImportServiceStack/importProductsFile/ServiceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ImportServiceStack/importProductsFile/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"2.215.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/importProductsFile/ServiceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["s3:Abort*","s3:DeleteObject*","s3:GetBucket*","s3:GetObject*","s3:List*","s3:PutObject","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging","s3:PutObjectVersionTagging"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"policyName":"importProductsFileServiceRoleDefaultPolicy65E41B91","roles":[{"Ref":"importProductsFileServiceRole05E98DF6"}]}}}}}}},"Code":{"id":"Code","path":"ImportServiceStack/importProductsFile/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"2.215.0"},"children":{"Stage":{"id":"Stage","path":"ImportServiceStack/importProductsFile/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"2.215.0"}},"AssetBucket":{"id":"AssetBucket","path":"ImportServiceStack/importProductsFile/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"2.215.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"ImportServiceStack/importProductsFile/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Function","aws:cdk:cloudformation:props":{"code":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"1f67896871d0fdd38e5ad581b5f5635bda40de5d758d0bfa6fdde36d50ec4930.zip"},"environment":{"variables":{"BUCKET_NAME":{"Ref":"ImportBucketBAF3A8E9"}}},"functionName":"importProductsFile","handler":"index.handler","role":{"Fn::GetAtt":["importProductsFileServiceRole05E98DF6","Arn"]},"runtime":"nodejs18.x"}}},"LogGroup":{"id":"LogGroup","path":"ImportServiceStack/importProductsFile/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"2.215.0","metadata":[{"logGroupName":"*"}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/importProductsFile/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{"logGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"importProductsFile45EA58E8"}]]},"retentionInDays":731}}}}}}},"ImportServiceApi":{"id":"ImportServiceApi","path":"ImportServiceStack/ImportServiceApi","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.RestApi","version":"2.215.0","metadata":[{"restApiName":"*","defaultCorsPreflightOptions":{"allowOrigins":"*","allowMethods":"*","allowHeaders":"*"}}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportServiceApi/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnRestApi","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::RestApi","aws:cdk:cloudformation:props":{"name":"Import Service"}}},"Deployment":{"id":"Deployment","path":"ImportServiceStack/ImportServiceApi/Deployment","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Deployment","version":"2.215.0","metadata":[{"description":"*","api":"*","retainDeployments":"*"},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportServiceApi/Deployment/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnDeployment","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Deployment","aws:cdk:cloudformation:props":{"description":"Automatically created by the RestApi construct","restApiId":{"Ref":"ImportServiceApi8F88CB06"}}}}}},"DeploymentStage.prod":{"id":"DeploymentStage.prod","path":"ImportServiceStack/ImportServiceApi/DeploymentStage.prod","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Stage","version":"2.215.0","metadata":[{"deployment":"*"}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportServiceApi/DeploymentStage.prod/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnStage","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Stage","aws:cdk:cloudformation:props":{"deploymentId":{"Ref":"ImportServiceApiDeployment3C31EF8C46f51c2fd64492d5d2659ea6d8fd3e57"},"restApiId":{"Ref":"ImportServiceApi8F88CB06"},"stageName":"prod"}}}}},"Endpoint":{"id":"Endpoint","path":"ImportServiceStack/ImportServiceApi/Endpoint","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"2.215.0"}},"Default":{"id":"Default","path":"ImportServiceStack/ImportServiceApi/Default","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.ResourceBase","version":"2.215.0","metadata":["*"]},"children":{"OPTIONS":{"id":"OPTIONS","path":"ImportServiceStack/ImportServiceApi/Default/OPTIONS","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"authorizer":{"authorizerId":"*","authorizationType":"*"},"apiKeyRequired":false,"authorizationType":"*","methodResponses":[{"statusCode":"*","responseParameters":"*"}]}},{"addMethodResponse":[{"statusCode":"*","responseParameters":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportServiceApi/Default/OPTIONS/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"apiKeyRequired":false,"authorizationType":"NONE","httpMethod":"OPTIONS","integration":{"type":"MOCK","requestTemplates":{"application/json":"{ statusCode: 200 }"},"integrationResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":"'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'","method.response.header.Access-Control-Allow-Origin":"'*'","method.response.header.Access-Control-Allow-Methods":"'GET,OPTIONS'"}}]},"methodResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":true,"method.response.header.Access-Control-Allow-Origin":true,"method.response.header.Access-Control-Allow-Methods":true}}],"resourceId":{"Fn::GetAtt":["ImportServiceApi8F88CB06","RootResourceId"]},"restApiId":{"Ref":"ImportServiceApi8F88CB06"}}}}}},"import":{"id":"import","path":"ImportServiceStack/ImportServiceApi/Default/import","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Resource","version":"2.215.0","metadata":[{"parent":"*","pathPart":"*"}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportServiceApi/Default/import/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnResource","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Resource","aws:cdk:cloudformation:props":{"parentId":{"Fn::GetAtt":["ImportServiceApi8F88CB06","RootResourceId"]},"pathPart":"import","restApiId":{"Ref":"ImportServiceApi8F88CB06"}}}},"OPTIONS":{"id":"OPTIONS","path":"ImportServiceStack/ImportServiceApi/Default/import/OPTIONS","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"authorizer":{"authorizerId":"*","authorizationType":"*"},"apiKeyRequired":false,"authorizationType":"*","methodResponses":[{"statusCode":"*","responseParameters":"*"}]}},{"addMethodResponse":[{"statusCode":"*","responseParameters":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportServiceApi/Default/import/OPTIONS/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"apiKeyRequired":false,"authorizationType":"NONE","httpMethod":"OPTIONS","integration":{"type":"MOCK","requestTemplates":{"application/json":"{ statusCode: 200 }"},"integrationResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":"'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'","method.response.header.Access-Control-Allow-Origin":"'*'","method.response.header.Access-Control-Allow-Methods":"'GET,OPTIONS'"}}]},"methodResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":true,"method.response.header.Access-Control-Allow-Origin":true,"method.response.header.Access-Control-Allow-Methods":true}}],"resourceId":{"Ref":"ImportServiceApiimport7D50D4D2"},"restApiId":{"Ref":"ImportServiceApi8F88CB06"}}}}}},"GET":{"id":"GET","path":"ImportServiceStack/ImportServiceApi/Default/import/GET","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"methodResponses":[{"statusCode":"*"},{"statusCode":"*"}]}},{"addMethodResponse":[{"statusCode":"*"}]},{"addMethodResponse":[{"statusCode":"*"}]}]},"children":{"ApiPermission.ImportServiceStackImportServiceApiAA3B25C9.GET..import":{"id":"ApiPermission.ImportServiceStackImportServiceApiAA3B25C9.GET..import","path":"ImportServiceStack/ImportServiceApi/Default/import/GET/ApiPermission.ImportServiceStackImportServiceApiAA3B25C9.GET..import","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["importProductsFile45EA58E8","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ImportServiceApi8F88CB06"},"/",{"Ref":"ImportServiceApiDeploymentStageprod6E938E1D"},"/GET/import"]]}}}},"ApiPermission.Test.ImportServiceStackImportServiceApiAA3B25C9.GET..import":{"id":"ApiPermission.Test.ImportServiceStackImportServiceApiAA3B25C9.GET..import","path":"ImportServiceStack/ImportServiceApi/Default/import/GET/ApiPermission.Test.ImportServiceStackImportServiceApiAA3B25C9.GET..import","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["importProductsFile45EA58E8","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ImportServiceApi8F88CB06"},"/test-invoke-stage/GET/import"]]}}}},"Resource":{"id":"Resource","path":"ImportServiceStack/ImportServiceApi/Default/import/GET/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"authorizationType":"NONE","httpMethod":"GET","integration":{"type":"AWS_PROXY","uri":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":apigateway:",{"Ref":"AWS::Region"},":lambda:path/2015-03-31/functions/",{"Fn::GetAtt":["importProductsFile45EA58E8","Arn"]},"/invocations"]]},"integrationHttpMethod":"POST"},"methodResponses":[{"statusCode":"200"},{"statusCode":"400"}],"resourceId":{"Ref":"ImportServiceApiimport7D50D4D2"},"restApiId":{"Ref":"ImportServiceApi8F88CB06"}}}}}}}}}}}},"importFileParser":{"id":"importFileParser","path":"ImportServiceStack/importFileParser","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"2.215.0","metadata":[{"runtime":"*","handler":"*","code":"*","environment":"*","functionName":"*"},{"addEnvironment":["*","*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"ImportServiceStack/importFileParser/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"2.215.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"ImportServiceStack/importFileParser/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ImportServiceStack/importFileParser/ServiceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ImportServiceStack/importFileParser/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"2.215.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/importFileParser/ServiceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["s3:GetBucket*","s3:GetObject*","s3:List*"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"policyName":"importFileParserServiceRoleDefaultPolicy030C7279","roles":[{"Ref":"importFileParserServiceRole43BE4092"}]}}}}}}},"Code":{"id":"Code","path":"ImportServiceStack/importFileParser/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"2.215.0"},"children":{"Stage":{"id":"Stage","path":"ImportServiceStack/importFileParser/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"2.215.0"}},"AssetBucket":{"id":"AssetBucket","path":"ImportServiceStack/importFileParser/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"2.215.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"ImportServiceStack/importFileParser/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Function","aws:cdk:cloudformation:props":{"code":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"ef7da0537589851a5aacd314af4d9e9aa02465399e928c76a41fdc2dcaa48964.zip"},"environment":{"variables":{"BUCKET_NAME":{"Ref":"ImportBucketBAF3A8E9"}}},"functionName":"importFileParser","handler":"index.handler","role":{"Fn::GetAtt":["importFileParserServiceRole43BE4092","Arn"]},"runtime":"nodejs18.x"}}},"LogGroup":{"id":"LogGroup","path":"ImportServiceStack/importFileParser/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"2.215.0","metadata":[{"logGroupName":"*"}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/importFileParser/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{"logGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"importFileParser85B01032"}]]},"retentionInDays":731}}}}}}},"BucketNotificationsHandler050a0587b7544547bf325f094a3db834":{"id":"BucketNotificationsHandler050a0587b7544547bf325f094a3db834","path":"ImportServiceStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Role":{"id":"Role","path":"ImportServiceStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"2.215.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addManagedPolicy":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportRole":{"id":"ImportRole","path":"ImportServiceStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ImportServiceStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ImportServiceStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"2.215.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":"s3:PutBucketNotification","Effect":"Allow","Resource":{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]}}],"Version":"2012-10-17"},"policyName":"BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36","roles":[{"Ref":"BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC"}]}}}}}}},"Resource":{"id":"Resource","path":"ImportServiceStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Resource","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"2.215.0"}}}},"CDKMetadata":{"id":"CDKMetadata","path":"ImportServiceStack/CDKMetadata","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Default":{"id":"Default","path":"ImportServiceStack/CDKMetadata/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"2.215.0"}},"Condition":{"id":"Condition","path":"ImportServiceStack/CDKMetadata/Condition","constructInfo":{"fqn":"aws-cdk-lib.CfnCondition","version":"2.215.0"}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"ImportServiceStack/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"2.215.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"ImportServiceStack/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"2.215.0"}}}},"Tree":{"id":"Tree","path":"Tree","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}}} \ No newline at end of file +{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"2.215.0"},"children":{"ProductServiceStack":{"id":"ProductServiceStack","path":"ProductServiceStack","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"2.215.0"},"children":{"ProductsTableImported":{"id":"ProductsTableImported","path":"ProductServiceStack/ProductsTableImported","constructInfo":{"fqn":"aws-cdk-lib.aws_dynamodb.TableBase","version":"2.215.0","metadata":[]}},"StockTableImported":{"id":"StockTableImported","path":"ProductServiceStack/StockTableImported","constructInfo":{"fqn":"aws-cdk-lib.aws_dynamodb.TableBase","version":"2.215.0","metadata":[]}},"getProductsList":{"id":"getProductsList","path":"ProductServiceStack/getProductsList","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"2.215.0","metadata":[{"runtime":"*","handler":"*","code":"*","functionName":"*"},{"addEnvironment":["*","*"]},{"addEnvironment":["*","*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"ProductServiceStack/getProductsList/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"2.215.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"ProductServiceStack/getProductsList/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsList/ServiceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ProductServiceStack/getProductsList/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"2.215.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsList/ServiceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["dynamodb:BatchGetItem","dynamodb:ConditionCheckItem","dynamodb:DescribeTable","dynamodb:GetItem","dynamodb:GetRecords","dynamodb:GetShardIterator","dynamodb:Query","dynamodb:Scan"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":dynamodb:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":table/products"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":dynamodb:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":table/stock"]]},{"Ref":"AWS::NoValue"}]}],"Version":"2012-10-17"},"policyName":"getProductsListServiceRoleDefaultPolicyFCF405B6","roles":[{"Ref":"getProductsListServiceRoleC64A5CD3"}]}}}}}}},"Code":{"id":"Code","path":"ProductServiceStack/getProductsList/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"2.215.0"},"children":{"Stage":{"id":"Stage","path":"ProductServiceStack/getProductsList/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"2.215.0"}},"AssetBucket":{"id":"AssetBucket","path":"ProductServiceStack/getProductsList/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"2.215.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsList/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Function","aws:cdk:cloudformation:props":{"code":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"70cbab7b33a392c0c1ddaad96d1cb3e2942d2a10e49670f06c24ed1d1dca0f3d.zip"},"environment":{"variables":{"PRODUCTS_TABLE_NAME":"products","STOCK_TABLE_NAME":"stock"}},"functionName":"getProductsList","handler":"index.handler","role":{"Fn::GetAtt":["getProductsListServiceRoleC64A5CD3","Arn"]},"runtime":"nodejs18.x"}}},"LogGroup":{"id":"LogGroup","path":"ProductServiceStack/getProductsList/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"2.215.0","metadata":[{"logGroupName":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsList/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{"logGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"getProductsList1F4CE4F4"}]]},"retentionInDays":731}}}}}}},"getProductsById":{"id":"getProductsById","path":"ProductServiceStack/getProductsById","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"2.215.0","metadata":[{"runtime":"*","handler":"*","code":"*","functionName":"*"},{"addEnvironment":["*","*"]},{"addEnvironment":["*","*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"ProductServiceStack/getProductsById/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"2.215.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"ProductServiceStack/getProductsById/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsById/ServiceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ProductServiceStack/getProductsById/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"2.215.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsById/ServiceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["dynamodb:BatchGetItem","dynamodb:ConditionCheckItem","dynamodb:DescribeTable","dynamodb:GetItem","dynamodb:GetRecords","dynamodb:GetShardIterator","dynamodb:Query","dynamodb:Scan"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":dynamodb:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":table/products"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":dynamodb:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":table/stock"]]},{"Ref":"AWS::NoValue"}]}],"Version":"2012-10-17"},"policyName":"getProductsByIdServiceRoleDefaultPolicyF36017B0","roles":[{"Ref":"getProductsByIdServiceRoleD8824A03"}]}}}}}}},"Code":{"id":"Code","path":"ProductServiceStack/getProductsById/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"2.215.0"},"children":{"Stage":{"id":"Stage","path":"ProductServiceStack/getProductsById/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"2.215.0"}},"AssetBucket":{"id":"AssetBucket","path":"ProductServiceStack/getProductsById/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"2.215.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsById/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Function","aws:cdk:cloudformation:props":{"code":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"406c62239f9ff5bf6f0ea5452f8dadb69cd3c1c23008b027e450ea23595976de.zip"},"environment":{"variables":{"PRODUCTS_TABLE_NAME":"products","STOCK_TABLE_NAME":"stock"}},"functionName":"getProductsById","handler":"index.handler","role":{"Fn::GetAtt":["getProductsByIdServiceRoleD8824A03","Arn"]},"runtime":"nodejs18.x"}}},"LogGroup":{"id":"LogGroup","path":"ProductServiceStack/getProductsById/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"2.215.0","metadata":[{"logGroupName":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/getProductsById/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{"logGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"getProductsById008BCA51"}]]},"retentionInDays":731}}}}}}},"createProduct":{"id":"createProduct","path":"ProductServiceStack/createProduct","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"2.215.0","metadata":[{"runtime":"*","handler":"*","code":"*","environment":"*","functionName":"*"},{"addEnvironment":["*","*"]},{"addEnvironment":["*","*"]},{"addEnvironment":["*","*"]},{"addEnvironment":["*","*"]},{"addEnvironment":["*","*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"ProductServiceStack/createProduct/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"2.215.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"ProductServiceStack/createProduct/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ProductServiceStack/createProduct/ServiceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ProductServiceStack/createProduct/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"2.215.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/createProduct/ServiceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["dynamodb:BatchWriteItem","dynamodb:DeleteItem","dynamodb:DescribeTable","dynamodb:PutItem","dynamodb:UpdateItem"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":dynamodb:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":table/products"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":dynamodb:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":table/stock"]]},{"Ref":"AWS::NoValue"}]}],"Version":"2012-10-17"},"policyName":"createProductServiceRoleDefaultPolicyA4987AF8","roles":[{"Ref":"createProductServiceRole49F078DF"}]}}}}}}},"Code":{"id":"Code","path":"ProductServiceStack/createProduct/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"2.215.0"},"children":{"Stage":{"id":"Stage","path":"ProductServiceStack/createProduct/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"2.215.0"}},"AssetBucket":{"id":"AssetBucket","path":"ProductServiceStack/createProduct/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"2.215.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"ProductServiceStack/createProduct/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Function","aws:cdk:cloudformation:props":{"code":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"9ed918abf00f4551a7208e6c2d9b92e1dbf597d77b8a895e17f59c32f621dc27.zip"},"environment":{"variables":{"PRODUCTS_TABLE_NAME":"products","STOCK_TABLE_NAME":"stock","AWS_NODEJS_CONNECTION_REUSE_ENABLED":"1"}},"functionName":"createProduct","handler":"index.handler","role":{"Fn::GetAtt":["createProductServiceRole49F078DF","Arn"]},"runtime":"nodejs18.x"}}},"LogGroup":{"id":"LogGroup","path":"ProductServiceStack/createProduct/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"2.215.0","metadata":[{"logGroupName":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/createProduct/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{"logGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"createProduct6AB81851"}]]},"retentionInDays":731}}}}}}},"catalogItemsQueue":{"id":"catalogItemsQueue","path":"ProductServiceStack/catalogItemsQueue","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"2.215.0","metadata":[{"visibilityTimeout":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/catalogItemsQueue/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueue","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::Queue","aws:cdk:cloudformation:props":{"visibilityTimeout":30}}},"Policy":{"id":"Policy","path":"ProductServiceStack/catalogItemsQueue/Policy","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.QueuePolicy","version":"2.215.0","metadata":[{"queues":["*"]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/catalogItemsQueue/Policy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueuePolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::QueuePolicy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["sqs:GetQueueAttributes","sqs:GetQueueUrl","sqs:SendMessage"],"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::837282923698:role/importFileParserRole"},"Resource":{"Fn::GetAtt":["catalogItemsQueue79451959","Arn"]}}],"Version":"2012-10-17"},"queues":[{"Ref":"catalogItemsQueue79451959"}]}}}}}}},"catalogBatchProcess":{"id":"catalogBatchProcess","path":"ProductServiceStack/catalogBatchProcess","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"2.215.0","metadata":[{"runtime":"*","handler":"*","code":"*","environment":"*"},{"addEnvironment":["*","*"]},{"addEnvironment":["*","*"]},{"addEnvironment":["*","*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"ProductServiceStack/catalogBatchProcess/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"2.215.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"ProductServiceStack/catalogBatchProcess/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ProductServiceStack/catalogBatchProcess/ServiceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ProductServiceStack/catalogBatchProcess/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"2.215.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/catalogBatchProcess/ServiceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["dynamodb:BatchWriteItem","dynamodb:DeleteItem","dynamodb:DescribeTable","dynamodb:PutItem","dynamodb:UpdateItem"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":dynamodb:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":table/products"]]},{"Ref":"AWS::NoValue"}]},{"Action":["sqs:ChangeMessageVisibility","sqs:DeleteMessage","sqs:GetQueueAttributes","sqs:GetQueueUrl","sqs:ReceiveMessage"],"Effect":"Allow","Resource":{"Fn::GetAtt":["catalogItemsQueue79451959","Arn"]}},{"Action":"sns:Publish","Effect":"Allow","Resource":{"Ref":"createProductTopic05C0E62B"}}],"Version":"2012-10-17"},"policyName":"catalogBatchProcessServiceRoleDefaultPolicy8FC58026","roles":[{"Ref":"catalogBatchProcessServiceRole274D33CD"}]}}}}}}},"Code":{"id":"Code","path":"ProductServiceStack/catalogBatchProcess/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"2.215.0"},"children":{"Stage":{"id":"Stage","path":"ProductServiceStack/catalogBatchProcess/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"2.215.0"}},"AssetBucket":{"id":"AssetBucket","path":"ProductServiceStack/catalogBatchProcess/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"2.215.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"ProductServiceStack/catalogBatchProcess/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Function","aws:cdk:cloudformation:props":{"code":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"97729aa914f77d96a12061785501568977ca76d97143530acedc9274a4e9f451.zip"},"environment":{"variables":{"PRODUCTS_TABLE":"products","SQS_URL":{"Ref":"catalogItemsQueue79451959"},"SNS_TOPIC":{"Ref":"createProductTopic05C0E62B"}}},"handler":"index.handler","role":{"Fn::GetAtt":["catalogBatchProcessServiceRole274D33CD","Arn"]},"runtime":"nodejs18.x"}}},"LogGroup":{"id":"LogGroup","path":"ProductServiceStack/catalogBatchProcess/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"2.215.0","metadata":[{"logGroupName":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/catalogBatchProcess/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{"logGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"catalogBatchProcessDC6613DA"}]]},"retentionInDays":731}}}}},"SqsEventSource:ProductServiceStackcatalogItemsQueue1DF43E6A":{"id":"SqsEventSource:ProductServiceStackcatalogItemsQueue1DF43E6A","path":"ProductServiceStack/catalogBatchProcess/SqsEventSource:ProductServiceStackcatalogItemsQueue1DF43E6A","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.EventSourceMapping","version":"2.215.0","metadata":[{"target":"*","batchSize":"*","maxBatchingWindow":"*","maxConcurrency":"*","reportBatchItemFailures":"*","enabled":"*","eventSourceArn":"*","filters":"*","filterEncryption":"*","metricsConfig":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/catalogBatchProcess/SqsEventSource:ProductServiceStackcatalogItemsQueue1DF43E6A/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnEventSourceMapping","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::EventSourceMapping","aws:cdk:cloudformation:props":{"batchSize":5,"eventSourceArn":{"Fn::GetAtt":["catalogItemsQueue79451959","Arn"]},"functionName":{"Ref":"catalogBatchProcessDC6613DA"}}}}}}}},"createProductTopic":{"id":"createProductTopic","path":"ProductServiceStack/createProductTopic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"2.215.0","metadata":["*"]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/createProductTopic/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.CfnTopic","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Topic","aws:cdk:cloudformation:props":{}}}}},"emailSubscription":{"id":"emailSubscription","path":"ProductServiceStack/emailSubscription","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Subscription","version":"2.215.0","metadata":[{"topic":"*","protocol":"email","endpoint":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/emailSubscription/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.CfnSubscription","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Subscription","aws:cdk:cloudformation:props":{"endpoint":"mahendra_yadav@epam.com","protocol":"email","topicArn":{"Ref":"createProductTopic05C0E62B"}}}}}},"MutableRoleImportFileParserRole":{"id":"MutableRoleImportFileParserRole","path":"ProductServiceStack/MutableRoleImportFileParserRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*"]}},"ImportFileParserRole":{"id":"ImportFileParserRole","path":"ProductServiceStack/ImportFileParserRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*","*"]}},"ImportFileParserFunction":{"id":"ImportFileParserFunction","path":"ProductServiceStack/ImportFileParserFunction","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.FunctionBase","version":"2.215.0","metadata":[]}},"ProductServiceApi":{"id":"ProductServiceApi","path":"ProductServiceStack/ProductServiceApi","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.RestApi","version":"2.215.0","metadata":[{"restApiName":"*","defaultCorsPreflightOptions":{"allowOrigins":"*","allowMethods":"*","allowHeaders":"*"}}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnRestApi","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::RestApi","aws:cdk:cloudformation:props":{"name":"Product Service"}}},"Deployment":{"id":"Deployment","path":"ProductServiceStack/ProductServiceApi/Deployment","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Deployment","version":"2.215.0","metadata":[{"description":"*","api":"*","retainDeployments":"*"},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Deployment/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnDeployment","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Deployment","aws:cdk:cloudformation:props":{"description":"Automatically created by the RestApi construct","restApiId":{"Ref":"ProductServiceApiFE734E24"}}}}}},"DeploymentStage.prod":{"id":"DeploymentStage.prod","path":"ProductServiceStack/ProductServiceApi/DeploymentStage.prod","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Stage","version":"2.215.0","metadata":[{"deployment":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/DeploymentStage.prod/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnStage","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Stage","aws:cdk:cloudformation:props":{"deploymentId":{"Ref":"ProductServiceApiDeployment696F4D079237897079983c97bee03b99b3ec4fcc"},"restApiId":{"Ref":"ProductServiceApiFE734E24"},"stageName":"prod"}}}}},"Endpoint":{"id":"Endpoint","path":"ProductServiceStack/ProductServiceApi/Endpoint","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"2.215.0"}},"Default":{"id":"Default","path":"ProductServiceStack/ProductServiceApi/Default","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.ResourceBase","version":"2.215.0","metadata":["*"]},"children":{"OPTIONS":{"id":"OPTIONS","path":"ProductServiceStack/ProductServiceApi/Default/OPTIONS","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"authorizer":{"authorizerId":"*","authorizationType":"*"},"apiKeyRequired":false,"authorizationType":"*","methodResponses":[{"statusCode":"*","responseParameters":"*"}]}},{"addMethodResponse":[{"statusCode":"*","responseParameters":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/OPTIONS/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"apiKeyRequired":false,"authorizationType":"NONE","httpMethod":"OPTIONS","integration":{"type":"MOCK","requestTemplates":{"application/json":"{ statusCode: 200 }"},"integrationResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":"'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'","method.response.header.Access-Control-Allow-Origin":"'*'","method.response.header.Access-Control-Allow-Methods":"'GET,POST,OPTIONS'"}}]},"methodResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":true,"method.response.header.Access-Control-Allow-Origin":true,"method.response.header.Access-Control-Allow-Methods":true}}],"resourceId":{"Fn::GetAtt":["ProductServiceApiFE734E24","RootResourceId"]},"restApiId":{"Ref":"ProductServiceApiFE734E24"}}}}}},"products":{"id":"products","path":"ProductServiceStack/ProductServiceApi/Default/products","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Resource","version":"2.215.0","metadata":[{"parent":"*","pathPart":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/products/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnResource","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Resource","aws:cdk:cloudformation:props":{"parentId":{"Fn::GetAtt":["ProductServiceApiFE734E24","RootResourceId"]},"pathPart":"products","restApiId":{"Ref":"ProductServiceApiFE734E24"}}}},"OPTIONS":{"id":"OPTIONS","path":"ProductServiceStack/ProductServiceApi/Default/products/OPTIONS","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"authorizer":{"authorizerId":"*","authorizationType":"*"},"apiKeyRequired":false,"authorizationType":"*","methodResponses":[{"statusCode":"*","responseParameters":"*"}]}},{"addMethodResponse":[{"statusCode":"*","responseParameters":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/products/OPTIONS/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"apiKeyRequired":false,"authorizationType":"NONE","httpMethod":"OPTIONS","integration":{"type":"MOCK","requestTemplates":{"application/json":"{ statusCode: 200 }"},"integrationResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":"'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'","method.response.header.Access-Control-Allow-Origin":"'*'","method.response.header.Access-Control-Allow-Methods":"'GET,POST,OPTIONS'"}}]},"methodResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":true,"method.response.header.Access-Control-Allow-Origin":true,"method.response.header.Access-Control-Allow-Methods":true}}],"resourceId":{"Ref":"ProductServiceApiproducts612C39F6"},"restApiId":{"Ref":"ProductServiceApiFE734E24"}}}}}},"GET":{"id":"GET","path":"ProductServiceStack/ProductServiceApi/Default/products/GET","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"methodResponses":[{"statusCode":"*"}]}},{"addMethodResponse":[{"statusCode":"*"}]}]},"children":{"ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.GET..products":{"id":"ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.GET..products","path":"ProductServiceStack/ProductServiceApi/Default/products/GET/ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.GET..products","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["getProductsList1F4CE4F4","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ProductServiceApiFE734E24"},"/",{"Ref":"ProductServiceApiDeploymentStageprod7C4CB6D5"},"/GET/products"]]}}}},"ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.GET..products":{"id":"ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.GET..products","path":"ProductServiceStack/ProductServiceApi/Default/products/GET/ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.GET..products","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["getProductsList1F4CE4F4","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ProductServiceApiFE734E24"},"/test-invoke-stage/GET/products"]]}}}},"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/products/GET/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"authorizationType":"NONE","httpMethod":"GET","integration":{"type":"AWS_PROXY","uri":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":apigateway:",{"Ref":"AWS::Region"},":lambda:path/2015-03-31/functions/",{"Fn::GetAtt":["getProductsList1F4CE4F4","Arn"]},"/invocations"]]},"integrationHttpMethod":"POST"},"methodResponses":[{"statusCode":"200"}],"resourceId":{"Ref":"ProductServiceApiproducts612C39F6"},"restApiId":{"Ref":"ProductServiceApiFE734E24"}}}}}},"{productId}":{"id":"{productId}","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Resource","version":"2.215.0","metadata":[{"parent":"*","pathPart":"*"}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnResource","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Resource","aws:cdk:cloudformation:props":{"parentId":{"Ref":"ProductServiceApiproducts612C39F6"},"pathPart":"{productId}","restApiId":{"Ref":"ProductServiceApiFE734E24"}}}},"OPTIONS":{"id":"OPTIONS","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}/OPTIONS","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"authorizer":{"authorizerId":"*","authorizationType":"*"},"apiKeyRequired":false,"authorizationType":"*","methodResponses":[{"statusCode":"*","responseParameters":"*"}]}},{"addMethodResponse":[{"statusCode":"*","responseParameters":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}/OPTIONS/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"apiKeyRequired":false,"authorizationType":"NONE","httpMethod":"OPTIONS","integration":{"type":"MOCK","requestTemplates":{"application/json":"{ statusCode: 200 }"},"integrationResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":"'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'","method.response.header.Access-Control-Allow-Origin":"'*'","method.response.header.Access-Control-Allow-Methods":"'GET,POST,OPTIONS'"}}]},"methodResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":true,"method.response.header.Access-Control-Allow-Origin":true,"method.response.header.Access-Control-Allow-Methods":true}}],"resourceId":{"Ref":"ProductServiceApiproductsproductId622E148C"},"restApiId":{"Ref":"ProductServiceApiFE734E24"}}}}}},"GET":{"id":"GET","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}/GET","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"methodResponses":[{"statusCode":"*"},{"statusCode":"*"},{"statusCode":"*"}]}},{"addMethodResponse":[{"statusCode":"*"}]},{"addMethodResponse":[{"statusCode":"*"}]},{"addMethodResponse":[{"statusCode":"*"}]}]},"children":{"ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.GET..products.{productId}":{"id":"ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.GET..products.{productId}","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}/GET/ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.GET..products.{productId}","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["getProductsById008BCA51","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ProductServiceApiFE734E24"},"/",{"Ref":"ProductServiceApiDeploymentStageprod7C4CB6D5"},"/GET/products/*"]]}}}},"ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.GET..products.{productId}":{"id":"ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.GET..products.{productId}","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}/GET/ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.GET..products.{productId}","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["getProductsById008BCA51","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ProductServiceApiFE734E24"},"/test-invoke-stage/GET/products/*"]]}}}},"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/products/{productId}/GET/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"authorizationType":"NONE","httpMethod":"GET","integration":{"type":"AWS_PROXY","uri":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":apigateway:",{"Ref":"AWS::Region"},":lambda:path/2015-03-31/functions/",{"Fn::GetAtt":["getProductsById008BCA51","Arn"]},"/invocations"]]},"integrationHttpMethod":"POST"},"methodResponses":[{"statusCode":"200"},{"statusCode":"404"},{"statusCode":"400"}],"resourceId":{"Ref":"ProductServiceApiproductsproductId622E148C"},"restApiId":{"Ref":"ProductServiceApiFE734E24"}}}}}}}},"POST":{"id":"POST","path":"ProductServiceStack/ProductServiceApi/Default/products/POST","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"methodResponses":[{"statusCode":"*"},{"statusCode":"*"}]}},{"addMethodResponse":[{"statusCode":"*"}]},{"addMethodResponse":[{"statusCode":"*"}]}]},"children":{"ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.POST..products":{"id":"ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.POST..products","path":"ProductServiceStack/ProductServiceApi/Default/products/POST/ApiPermission.ProductServiceStackProductServiceApiF6E5F4DA.POST..products","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["createProduct6AB81851","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ProductServiceApiFE734E24"},"/",{"Ref":"ProductServiceApiDeploymentStageprod7C4CB6D5"},"/POST/products"]]}}}},"ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.POST..products":{"id":"ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.POST..products","path":"ProductServiceStack/ProductServiceApi/Default/products/POST/ApiPermission.Test.ProductServiceStackProductServiceApiF6E5F4DA.POST..products","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["createProduct6AB81851","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ProductServiceApiFE734E24"},"/test-invoke-stage/POST/products"]]}}}},"Resource":{"id":"Resource","path":"ProductServiceStack/ProductServiceApi/Default/products/POST/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"authorizationType":"NONE","httpMethod":"POST","integration":{"type":"AWS_PROXY","uri":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":apigateway:",{"Ref":"AWS::Region"},":lambda:path/2015-03-31/functions/",{"Fn::GetAtt":["createProduct6AB81851","Arn"]},"/invocations"]]},"integrationHttpMethod":"POST"},"methodResponses":[{"statusCode":"201"},{"statusCode":"400"}],"resourceId":{"Ref":"ProductServiceApiproducts612C39F6"},"restApiId":{"Ref":"ProductServiceApiFE734E24"}}}}}}}}}}}},"ProductsApiUrl":{"id":"ProductsApiUrl","path":"ProductServiceStack/ProductsApiUrl","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"2.215.0"}},"CDKMetadata":{"id":"CDKMetadata","path":"ProductServiceStack/CDKMetadata","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Default":{"id":"Default","path":"ProductServiceStack/CDKMetadata/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"2.215.0"}},"Condition":{"id":"Condition","path":"ProductServiceStack/CDKMetadata/Condition","constructInfo":{"fqn":"aws-cdk-lib.CfnCondition","version":"2.215.0"}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"ProductServiceStack/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"2.215.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"ProductServiceStack/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"2.215.0"}}}},"ImportServiceStack":{"id":"ImportServiceStack","path":"ImportServiceStack","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"2.215.0"},"children":{"ImportBucket":{"id":"ImportBucket","path":"ImportServiceStack/ImportBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"2.215.0","metadata":[{"removalPolicy":"destroy","autoDeleteObjects":true,"cors":[{"allowedOrigins":"*","allowedMethods":["GET","PUT"],"allowedHeaders":"*","exposedHeaders":"*"}]},{"addCorsRule":[{"allowedOrigins":"*","allowedMethods":["GET","PUT"],"allowedHeaders":"*","exposedHeaders":"*"},"*","*"]}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportBucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"corsConfiguration":{"corsRules":[{"allowedHeaders":["*"],"allowedMethods":["GET","PUT"],"allowedOrigins":["*"],"exposedHeaders":["ETag"]}]},"tags":[{"key":"aws-cdk:auto-delete-objects","value":"true"}]}}},"Policy":{"id":"Policy","path":"ImportServiceStack/ImportBucket/Policy","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketPolicy","version":"2.215.0","metadata":[{"bucket":"*"}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportBucket/Policy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucketPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::BucketPolicy","aws:cdk:cloudformation:props":{"bucket":{"Ref":"ImportBucketBAF3A8E9"},"policyDocument":{"Statement":[{"Action":["s3:DeleteObject*","s3:GetBucket*","s3:List*","s3:PutBucketPolicy"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}}}}}},"AutoDeleteObjectsCustomResource":{"id":"AutoDeleteObjectsCustomResource","path":"ImportServiceStack/ImportBucket/AutoDeleteObjectsCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"2.215.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"ImportServiceStack/ImportBucket/AutoDeleteObjectsCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"2.215.0"}}}},"Notifications":{"id":"Notifications","path":"ImportServiceStack/ImportBucket/Notifications","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportBucket/Notifications/Resource","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"2.215.0"}}}},"AllowBucketNotificationsToImportServiceStackimportFileParserE5BD8A79":{"id":"AllowBucketNotificationsToImportServiceStackimportFileParserE5BD8A79","path":"ImportServiceStack/ImportBucket/AllowBucketNotificationsToImportServiceStackimportFileParserE5BD8A79","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["importFileParser85B01032","Arn"]},"principal":"s3.amazonaws.com","sourceAccount":{"Ref":"AWS::AccountId"},"sourceArn":{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]}}}}}},"Custom::S3AutoDeleteObjectsCustomResourceProvider":{"id":"Custom::S3AutoDeleteObjectsCustomResourceProvider","path":"ImportServiceStack/Custom::S3AutoDeleteObjectsCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"2.215.0"},"children":{"Staging":{"id":"Staging","path":"ImportServiceStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"2.215.0"}},"Role":{"id":"Role","path":"ImportServiceStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"2.215.0"}},"Handler":{"id":"Handler","path":"ImportServiceStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"2.215.0"}}}},"importProductsFile":{"id":"importProductsFile","path":"ImportServiceStack/importProductsFile","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"2.215.0","metadata":[{"runtime":"*","handler":"*","code":"*","environment":"*","functionName":"*"},{"addEnvironment":["*","*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"ImportServiceStack/importProductsFile/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"2.215.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"ImportServiceStack/importProductsFile/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ImportServiceStack/importProductsFile/ServiceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ImportServiceStack/importProductsFile/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"2.215.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/importProductsFile/ServiceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["s3:Abort*","s3:DeleteObject*","s3:GetBucket*","s3:GetObject*","s3:List*","s3:PutObject","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging","s3:PutObjectVersionTagging"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"policyName":"importProductsFileServiceRoleDefaultPolicy65E41B91","roles":[{"Ref":"importProductsFileServiceRole05E98DF6"}]}}}}}}},"Code":{"id":"Code","path":"ImportServiceStack/importProductsFile/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"2.215.0"},"children":{"Stage":{"id":"Stage","path":"ImportServiceStack/importProductsFile/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"2.215.0"}},"AssetBucket":{"id":"AssetBucket","path":"ImportServiceStack/importProductsFile/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"2.215.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"ImportServiceStack/importProductsFile/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Function","aws:cdk:cloudformation:props":{"code":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"3a13886dd8f7dbd2f59eeb687fd7a7bc4185adcebcf2b596bf36c3cbd26d7382.zip"},"environment":{"variables":{"BUCKET_NAME":{"Ref":"ImportBucketBAF3A8E9"}}},"functionName":"importProductsFile","handler":"index.handler","role":{"Fn::GetAtt":["importProductsFileServiceRole05E98DF6","Arn"]},"runtime":"nodejs18.x"}}},"LogGroup":{"id":"LogGroup","path":"ImportServiceStack/importProductsFile/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"2.215.0","metadata":[{"logGroupName":"*"}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/importProductsFile/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{"logGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"importProductsFile45EA58E8"}]]},"retentionInDays":731}}}}}}},"ImportServiceApi":{"id":"ImportServiceApi","path":"ImportServiceStack/ImportServiceApi","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.RestApi","version":"2.215.0","metadata":[{"restApiName":"*","defaultCorsPreflightOptions":{"allowOrigins":"*","allowMethods":"*","allowHeaders":"*"}}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportServiceApi/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnRestApi","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::RestApi","aws:cdk:cloudformation:props":{"name":"Import Service"}}},"Deployment":{"id":"Deployment","path":"ImportServiceStack/ImportServiceApi/Deployment","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Deployment","version":"2.215.0","metadata":[{"description":"*","api":"*","retainDeployments":"*"},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]},{"addToLogicalId":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportServiceApi/Deployment/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnDeployment","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Deployment","aws:cdk:cloudformation:props":{"description":"Automatically created by the RestApi construct","restApiId":{"Ref":"ImportServiceApi8F88CB06"}}}}}},"DeploymentStage.prod":{"id":"DeploymentStage.prod","path":"ImportServiceStack/ImportServiceApi/DeploymentStage.prod","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Stage","version":"2.215.0","metadata":[{"deployment":"*"}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportServiceApi/DeploymentStage.prod/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnStage","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Stage","aws:cdk:cloudformation:props":{"deploymentId":{"Ref":"ImportServiceApiDeployment3C31EF8C46f51c2fd64492d5d2659ea6d8fd3e57"},"restApiId":{"Ref":"ImportServiceApi8F88CB06"},"stageName":"prod"}}}}},"Endpoint":{"id":"Endpoint","path":"ImportServiceStack/ImportServiceApi/Endpoint","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"2.215.0"}},"Default":{"id":"Default","path":"ImportServiceStack/ImportServiceApi/Default","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.ResourceBase","version":"2.215.0","metadata":["*"]},"children":{"OPTIONS":{"id":"OPTIONS","path":"ImportServiceStack/ImportServiceApi/Default/OPTIONS","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"authorizer":{"authorizerId":"*","authorizationType":"*"},"apiKeyRequired":false,"authorizationType":"*","methodResponses":[{"statusCode":"*","responseParameters":"*"}]}},{"addMethodResponse":[{"statusCode":"*","responseParameters":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportServiceApi/Default/OPTIONS/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"apiKeyRequired":false,"authorizationType":"NONE","httpMethod":"OPTIONS","integration":{"type":"MOCK","requestTemplates":{"application/json":"{ statusCode: 200 }"},"integrationResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":"'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'","method.response.header.Access-Control-Allow-Origin":"'*'","method.response.header.Access-Control-Allow-Methods":"'GET,OPTIONS'"}}]},"methodResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":true,"method.response.header.Access-Control-Allow-Origin":true,"method.response.header.Access-Control-Allow-Methods":true}}],"resourceId":{"Fn::GetAtt":["ImportServiceApi8F88CB06","RootResourceId"]},"restApiId":{"Ref":"ImportServiceApi8F88CB06"}}}}}},"import":{"id":"import","path":"ImportServiceStack/ImportServiceApi/Default/import","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Resource","version":"2.215.0","metadata":[{"parent":"*","pathPart":"*"}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportServiceApi/Default/import/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnResource","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Resource","aws:cdk:cloudformation:props":{"parentId":{"Fn::GetAtt":["ImportServiceApi8F88CB06","RootResourceId"]},"pathPart":"import","restApiId":{"Ref":"ImportServiceApi8F88CB06"}}}},"OPTIONS":{"id":"OPTIONS","path":"ImportServiceStack/ImportServiceApi/Default/import/OPTIONS","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"authorizer":{"authorizerId":"*","authorizationType":"*"},"apiKeyRequired":false,"authorizationType":"*","methodResponses":[{"statusCode":"*","responseParameters":"*"}]}},{"addMethodResponse":[{"statusCode":"*","responseParameters":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/ImportServiceApi/Default/import/OPTIONS/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"apiKeyRequired":false,"authorizationType":"NONE","httpMethod":"OPTIONS","integration":{"type":"MOCK","requestTemplates":{"application/json":"{ statusCode: 200 }"},"integrationResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":"'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'","method.response.header.Access-Control-Allow-Origin":"'*'","method.response.header.Access-Control-Allow-Methods":"'GET,OPTIONS'"}}]},"methodResponses":[{"statusCode":"204","responseParameters":{"method.response.header.Access-Control-Allow-Headers":true,"method.response.header.Access-Control-Allow-Origin":true,"method.response.header.Access-Control-Allow-Methods":true}}],"resourceId":{"Ref":"ImportServiceApiimport7D50D4D2"},"restApiId":{"Ref":"ImportServiceApi8F88CB06"}}}}}},"GET":{"id":"GET","path":"ImportServiceStack/ImportServiceApi/Default/import/GET","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.Method","version":"2.215.0","metadata":[{"resource":"*","httpMethod":"*","integration":"*","options":{"methodResponses":[{"statusCode":"*"},{"statusCode":"*"}]}},{"addMethodResponse":[{"statusCode":"*"}]},{"addMethodResponse":[{"statusCode":"*"}]}]},"children":{"ApiPermission.ImportServiceStackImportServiceApiAA3B25C9.GET..import":{"id":"ApiPermission.ImportServiceStackImportServiceApiAA3B25C9.GET..import","path":"ImportServiceStack/ImportServiceApi/Default/import/GET/ApiPermission.ImportServiceStackImportServiceApiAA3B25C9.GET..import","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["importProductsFile45EA58E8","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ImportServiceApi8F88CB06"},"/",{"Ref":"ImportServiceApiDeploymentStageprod6E938E1D"},"/GET/import"]]}}}},"ApiPermission.Test.ImportServiceStackImportServiceApiAA3B25C9.GET..import":{"id":"ApiPermission.Test.ImportServiceStackImportServiceApiAA3B25C9.GET..import","path":"ImportServiceStack/ImportServiceApi/Default/import/GET/ApiPermission.Test.ImportServiceStackImportServiceApiAA3B25C9.GET..import","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["importProductsFile45EA58E8","Arn"]},"principal":"apigateway.amazonaws.com","sourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ImportServiceApi8F88CB06"},"/test-invoke-stage/GET/import"]]}}}},"Resource":{"id":"Resource","path":"ImportServiceStack/ImportServiceApi/Default/import/GET/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_apigateway.CfnMethod","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApiGateway::Method","aws:cdk:cloudformation:props":{"authorizationType":"NONE","httpMethod":"GET","integration":{"type":"AWS_PROXY","uri":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":apigateway:",{"Ref":"AWS::Region"},":lambda:path/2015-03-31/functions/",{"Fn::GetAtt":["importProductsFile45EA58E8","Arn"]},"/invocations"]]},"integrationHttpMethod":"POST"},"methodResponses":[{"statusCode":"200"},{"statusCode":"400"}],"resourceId":{"Ref":"ImportServiceApiimport7D50D4D2"},"restApiId":{"Ref":"ImportServiceApi8F88CB06"}}}}}}}}}}}},"importFileParser":{"id":"importFileParser","path":"ImportServiceStack/importFileParser","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"2.215.0","metadata":[{"runtime":"*","handler":"*","code":"*","environment":"*","functionName":"*"},{"addEnvironment":["*","*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"ImportServiceStack/importFileParser/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"2.215.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"ImportServiceStack/importFileParser/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ImportServiceStack/importFileParser/ServiceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ImportServiceStack/importFileParser/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"2.215.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/importFileParser/ServiceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["s3:GetBucket*","s3:GetObject*","s3:List*"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"policyName":"importFileParserServiceRoleDefaultPolicy030C7279","roles":[{"Ref":"importFileParserServiceRole43BE4092"}]}}}}}}},"Code":{"id":"Code","path":"ImportServiceStack/importFileParser/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"2.215.0"},"children":{"Stage":{"id":"Stage","path":"ImportServiceStack/importFileParser/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"2.215.0"}},"AssetBucket":{"id":"AssetBucket","path":"ImportServiceStack/importFileParser/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"2.215.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"ImportServiceStack/importFileParser/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Function","aws:cdk:cloudformation:props":{"code":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"f06255e9b9b8c6a003313fae2815ef08db188b0e701359dce13ded55d5bd730d.zip"},"environment":{"variables":{"BUCKET_NAME":{"Ref":"ImportBucketBAF3A8E9"}}},"functionName":"importFileParser","handler":"index.handler","role":{"Fn::GetAtt":["importFileParserServiceRole43BE4092","Arn"]},"runtime":"nodejs18.x"}}},"LogGroup":{"id":"LogGroup","path":"ImportServiceStack/importFileParser/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"2.215.0","metadata":[{"logGroupName":"*"}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/importFileParser/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{"logGroupName":{"Fn::Join":["",["/aws/lambda/",{"Ref":"importFileParser85B01032"}]]},"retentionInDays":731}}}}}}},"BucketNotificationsHandler050a0587b7544547bf325f094a3db834":{"id":"BucketNotificationsHandler050a0587b7544547bf325f094a3db834","path":"ImportServiceStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Role":{"id":"Role","path":"ImportServiceStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"2.215.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addManagedPolicy":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportRole":{"id":"ImportRole","path":"ImportServiceStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"2.215.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ImportServiceStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ImportServiceStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"2.215.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ImportServiceStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"2.215.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":"s3:PutBucketNotification","Effect":"Allow","Resource":{"Fn::GetAtt":["ImportBucketBAF3A8E9","Arn"]}}],"Version":"2012-10-17"},"policyName":"BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36","roles":[{"Ref":"BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC"}]}}}}}}},"Resource":{"id":"Resource","path":"ImportServiceStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Resource","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"2.215.0"}}}},"CDKMetadata":{"id":"CDKMetadata","path":"ImportServiceStack/CDKMetadata","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Default":{"id":"Default","path":"ImportServiceStack/CDKMetadata/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"2.215.0"}},"Condition":{"id":"Condition","path":"ImportServiceStack/CDKMetadata/Condition","constructInfo":{"fqn":"aws-cdk-lib.CfnCondition","version":"2.215.0"}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"ImportServiceStack/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"2.215.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"ImportServiceStack/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"2.215.0"}}}},"Tree":{"id":"Tree","path":"Tree","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}}} \ No newline at end of file diff --git a/lambda/catalogBatchProcess/index.d.ts b/lambda/catalogBatchProcess/index.d.ts new file mode 100644 index 0000000..13257db --- /dev/null +++ b/lambda/catalogBatchProcess/index.d.ts @@ -0,0 +1,5 @@ +import { SQSEvent } from "aws-lambda"; +export declare const handler: (event: SQSEvent) => Promise<{ + statusCode: number; + body: string; +}>; diff --git a/lambda/catalogBatchProcess/index.js b/lambda/catalogBatchProcess/index.js new file mode 100644 index 0000000..dade31e --- /dev/null +++ b/lambda/catalogBatchProcess/index.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.handler = void 0; +const aws_sdk_1 = require("aws-sdk"); +const dynamoDb = new aws_sdk_1.DynamoDB.DocumentClient(); +const sns = new aws_sdk_1.SNS(); +const PRODUCTS_TABLE = process.env.PRODUCTS_TABLE; +const SNS_TOPIC = process.env.SNS_TOPIC; +const handler = async (event) => { + const createdProducts = []; + for (const record of event.Records) { + const product = JSON.parse(record.body); + // Example: add a unique id if not present + if (!product.id) { + product.id = `${Date.now()}-${Math.random()}`; + } + await dynamoDb + .put({ + TableName: PRODUCTS_TABLE, + Item: product, + }) + .promise(); + createdProducts.push(product); + } + // Notify via SNS after all products are created + if (createdProducts.length > 0) { + await sns + .publish({ + TopicArn: SNS_TOPIC, + Subject: "Products created", + Message: `Products created: ${createdProducts.map((p) => p.title || p.id).join(", ")}`, + }) + .promise(); + } + return { + statusCode: 200, + body: JSON.stringify({ message: "Batch processed", count: createdProducts.length }), + }; +}; +exports.handler = handler; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxQ0FBd0M7QUFFeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxrQkFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQy9DLE1BQU0sR0FBRyxHQUFHLElBQUksYUFBRyxFQUFFLENBQUM7QUFFdEIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFlLENBQUM7QUFDbkQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFVLENBQUM7QUFFbEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLEtBQWUsRUFBRSxFQUFFO0lBQy9DLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUUzQixLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV4QywwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNoQixPQUFPLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ2hELENBQUM7UUFFRCxNQUFNLFFBQVE7YUFDWCxHQUFHLENBQUM7WUFDSCxTQUFTLEVBQUUsY0FBYztZQUN6QixJQUFJLEVBQUUsT0FBTztTQUNkLENBQUM7YUFDRCxPQUFPLEVBQUUsQ0FBQztRQUViLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCxJQUFJLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDL0IsTUFBTSxHQUFHO2FBQ04sT0FBTyxDQUFDO1lBQ1AsUUFBUSxFQUFFLFNBQVM7WUFDbkIsT0FBTyxFQUFFLGtCQUFrQjtZQUMzQixPQUFPLEVBQUUscUJBQXFCLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtTQUN2RixDQUFDO2FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsT0FBTztRQUNMLFVBQVUsRUFBRSxHQUFHO1FBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztLQUNwRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBcENXLFFBQUEsT0FBTyxXQW9DbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTUVNFdmVudCB9IGZyb20gXCJhd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBEeW5hbW9EQiwgU05TIH0gZnJvbSBcImF3cy1zZGtcIjtcblxuY29uc3QgZHluYW1vRGIgPSBuZXcgRHluYW1vREIuRG9jdW1lbnRDbGllbnQoKTtcbmNvbnN0IHNucyA9IG5ldyBTTlMoKTtcblxuY29uc3QgUFJPRFVDVFNfVEFCTEUgPSBwcm9jZXNzLmVudi5QUk9EVUNUU19UQUJMRSE7XG5jb25zdCBTTlNfVE9QSUMgPSBwcm9jZXNzLmVudi5TTlNfVE9QSUMhO1xuXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChldmVudDogU1FTRXZlbnQpID0+IHtcbiAgY29uc3QgY3JlYXRlZFByb2R1Y3RzID0gW107XG5cbiAgZm9yIChjb25zdCByZWNvcmQgb2YgZXZlbnQuUmVjb3Jkcykge1xuICAgIGNvbnN0IHByb2R1Y3QgPSBKU09OLnBhcnNlKHJlY29yZC5ib2R5KTtcblxuICAgIC8vIEV4YW1wbGU6IGFkZCBhIHVuaXF1ZSBpZCBpZiBub3QgcHJlc2VudFxuICAgIGlmICghcHJvZHVjdC5pZCkge1xuICAgICAgcHJvZHVjdC5pZCA9IGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gO1xuICAgIH1cblxuICAgIGF3YWl0IGR5bmFtb0RiXG4gICAgICAucHV0KHtcbiAgICAgICAgVGFibGVOYW1lOiBQUk9EVUNUU19UQUJMRSxcbiAgICAgICAgSXRlbTogcHJvZHVjdCxcbiAgICAgIH0pXG4gICAgICAucHJvbWlzZSgpO1xuXG4gICAgY3JlYXRlZFByb2R1Y3RzLnB1c2gocHJvZHVjdCk7XG4gIH1cblxuICAvLyBOb3RpZnkgdmlhIFNOUyBhZnRlciBhbGwgcHJvZHVjdHMgYXJlIGNyZWF0ZWRcbiAgaWYgKGNyZWF0ZWRQcm9kdWN0cy5sZW5ndGggPiAwKSB7XG4gICAgYXdhaXQgc25zXG4gICAgICAucHVibGlzaCh7XG4gICAgICAgIFRvcGljQXJuOiBTTlNfVE9QSUMsXG4gICAgICAgIFN1YmplY3Q6IFwiUHJvZHVjdHMgY3JlYXRlZFwiLFxuICAgICAgICBNZXNzYWdlOiBgUHJvZHVjdHMgY3JlYXRlZDogJHtjcmVhdGVkUHJvZHVjdHMubWFwKChwKSA9PiBwLnRpdGxlIHx8IHAuaWQpLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgfSlcbiAgICAgIC5wcm9taXNlKCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG1lc3NhZ2U6IFwiQmF0Y2ggcHJvY2Vzc2VkXCIsIGNvdW50OiBjcmVhdGVkUHJvZHVjdHMubGVuZ3RoIH0pLFxuICB9O1xufTtcbiJdfQ== \ No newline at end of file diff --git a/lambda/catalogBatchProcess/index.ts b/lambda/catalogBatchProcess/index.ts new file mode 100644 index 0000000..0338ca4 --- /dev/null +++ b/lambda/catalogBatchProcess/index.ts @@ -0,0 +1,46 @@ +import { SQSEvent } from "aws-lambda"; +import { DynamoDB, SNS } from "aws-sdk"; + +const dynamoDb = new DynamoDB.DocumentClient(); +const sns = new SNS(); + +const PRODUCTS_TABLE = process.env.PRODUCTS_TABLE!; +const SNS_TOPIC = process.env.SNS_TOPIC!; + +export const handler = async (event: SQSEvent) => { + const createdProducts = []; + + for (const record of event.Records) { + const product = JSON.parse(record.body); + + // Example: add a unique id if not present + if (!product.id) { + product.id = `${Date.now()}-${Math.random()}`; + } + + await dynamoDb + .put({ + TableName: PRODUCTS_TABLE, + Item: product, + }) + .promise(); + + createdProducts.push(product); + } + + // Notify via SNS after all products are created + if (createdProducts.length > 0) { + await sns + .publish({ + TopicArn: SNS_TOPIC, + Subject: "Products created", + Message: `Products created: ${createdProducts.map((p) => p.title || p.id).join(", ")}`, + }) + .promise(); + } + + return { + statusCode: 200, + body: JSON.stringify({ message: "Batch processed", count: createdProducts.length }), + }; +}; diff --git a/lambda/importFileParser/index.d.ts b/lambda/importFileParser/index.d.ts new file mode 100644 index 0000000..88013f4 --- /dev/null +++ b/lambda/importFileParser/index.d.ts @@ -0,0 +1,2 @@ +import { S3Event } from "aws-lambda"; +export declare const handler: (event: S3Event) => Promise; diff --git a/lambda/importFileParser/index.js b/lambda/importFileParser/index.js new file mode 100644 index 0000000..a39cf3d --- /dev/null +++ b/lambda/importFileParser/index.js @@ -0,0 +1,40 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.handler = void 0; +const aws_sdk_1 = require("aws-sdk"); +const csv_parser_1 = __importDefault(require("csv-parser")); +const s3_1 = __importDefault(require("aws-sdk/clients/s3")); +const sqs = new aws_sdk_1.SQS(); +const s3 = new s3_1.default(); +const handler = async (event) => { + for (const record of event.Records) { + const bucket = record.s3.bucket.name; + const key = record.s3.object.key; + const queueUrl = process.env.SQS_URL; + const s3Stream = s3.getObject({ Bucket: bucket, Key: key }).createReadStream(); + await new Promise((resolve, reject) => { + const sendPromises = []; + s3Stream + .pipe((0, csv_parser_1.default)()) + .on("data", (row) => { + // No logging here + sendPromises.push(sqs + .sendMessage({ + QueueUrl: queueUrl, + MessageBody: JSON.stringify(row), + }) + .promise()); + }) + .on("end", async () => { + await Promise.all(sendPromises); + resolve(undefined); + }) + .on("error", reject); + }); + } +}; +exports.handler = handler; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxxQ0FBOEI7QUFDOUIsNERBQTZCO0FBQzdCLDREQUFvQztBQUVwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLGFBQUcsRUFBRSxDQUFDO0FBQ3RCLE1BQU0sRUFBRSxHQUFHLElBQUksWUFBRSxFQUFFLENBQUM7QUFFYixNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBYyxFQUFFLEVBQUU7SUFDOUMsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQVEsQ0FBQztRQUV0QyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRS9FLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDcEMsTUFBTSxZQUFZLEdBQW1CLEVBQUUsQ0FBQztZQUN4QyxRQUFRO2lCQUNMLElBQUksQ0FBQyxJQUFBLG9CQUFHLEdBQUUsQ0FBQztpQkFDWCxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2xCLGtCQUFrQjtnQkFDbEIsWUFBWSxDQUFDLElBQUksQ0FDZixHQUFHO3FCQUNBLFdBQVcsQ0FBQztvQkFDWCxRQUFRLEVBQUUsUUFBUTtvQkFDbEIsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO2lCQUNqQyxDQUFDO3FCQUNELE9BQU8sRUFBRSxDQUNiLENBQUM7WUFDSixDQUFDLENBQUM7aUJBQ0QsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDcEIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNoQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckIsQ0FBQyxDQUFDO2lCQUNELEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBOUJXLFFBQUEsT0FBTyxXQThCbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTM0V2ZW50IH0gZnJvbSBcImF3cy1sYW1iZGFcIjtcbmltcG9ydCB7IFNRUyB9IGZyb20gXCJhd3Mtc2RrXCI7XG5pbXBvcnQgY3N2IGZyb20gXCJjc3YtcGFyc2VyXCI7XG5pbXBvcnQgUzMgZnJvbSBcImF3cy1zZGsvY2xpZW50cy9zM1wiO1xuXG5jb25zdCBzcXMgPSBuZXcgU1FTKCk7XG5jb25zdCBzMyA9IG5ldyBTMygpO1xuXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChldmVudDogUzNFdmVudCkgPT4ge1xuICBmb3IgKGNvbnN0IHJlY29yZCBvZiBldmVudC5SZWNvcmRzKSB7XG4gICAgY29uc3QgYnVja2V0ID0gcmVjb3JkLnMzLmJ1Y2tldC5uYW1lO1xuICAgIGNvbnN0IGtleSA9IHJlY29yZC5zMy5vYmplY3Qua2V5O1xuICAgIGNvbnN0IHF1ZXVlVXJsID0gcHJvY2Vzcy5lbnYuU1FTX1VSTCE7XG5cbiAgICBjb25zdCBzM1N0cmVhbSA9IHMzLmdldE9iamVjdCh7IEJ1Y2tldDogYnVja2V0LCBLZXk6IGtleSB9KS5jcmVhdGVSZWFkU3RyZWFtKCk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzZW5kUHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XG4gICAgICBzM1N0cmVhbVxuICAgICAgICAucGlwZShjc3YoKSlcbiAgICAgICAgLm9uKFwiZGF0YVwiLCAocm93KSA9PiB7XG4gICAgICAgICAgLy8gTm8gbG9nZ2luZyBoZXJlXG4gICAgICAgICAgc2VuZFByb21pc2VzLnB1c2goXG4gICAgICAgICAgICBzcXNcbiAgICAgICAgICAgICAgLnNlbmRNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBRdWV1ZVVybDogcXVldWVVcmwsXG4gICAgICAgICAgICAgICAgTWVzc2FnZUJvZHk6IEpTT04uc3RyaW5naWZ5KHJvdyksXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5wcm9taXNlKClcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAub24oXCJlbmRcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHNlbmRQcm9taXNlcyk7XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICB9KVxuICAgICAgICAub24oXCJlcnJvclwiLCByZWplY3QpO1xuICAgIH0pO1xuICB9XG59O1xuIl19 \ No newline at end of file diff --git a/lambda/importFileParser/index.ts b/lambda/importFileParser/index.ts index 0cbd49c..df2c16d 100644 --- a/lambda/importFileParser/index.ts +++ b/lambda/importFileParser/index.ts @@ -1,28 +1,39 @@ -import { S3Event } from 'aws-lambda'; -import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3'; -import * as csv from 'csv-parser'; +import { S3Event } from "aws-lambda"; +import { SQS } from "aws-sdk"; +import csv from "csv-parser"; +import S3 from "aws-sdk/clients/s3"; -const s3 = new S3Client({}); +const sqs = new SQS(); +const s3 = new S3(); export const handler = async (event: S3Event) => { for (const record of event.Records) { const bucket = record.s3.bucket.name; const key = record.s3.object.key; + const queueUrl = process.env.SQS_URL!; - const getObjectCommand = new GetObjectCommand({ Bucket: bucket, Key: key }); - const s3Object = await s3.send(getObjectCommand); - - if (!s3Object.Body) continue; + const s3Stream = s3.getObject({ Bucket: bucket, Key: key }).createReadStream(); await new Promise((resolve, reject) => { - const results: any[] = []; - s3Object.Body.pipe(csv()) - .on('data', (data) => { - console.log('Parsed record:', data); - results.push(data); + const sendPromises: Promise[] = []; + s3Stream + .pipe(csv()) + .on("data", (row) => { + // No logging here + sendPromises.push( + sqs + .sendMessage({ + QueueUrl: queueUrl, + MessageBody: JSON.stringify(row), + }) + .promise() + ); + }) + .on("end", async () => { + await Promise.all(sendPromises); + resolve(undefined); }) - .on('end', resolve) - .on('error', reject); + .on("error", reject); }); } }; diff --git a/lambda/importProductsFile/index.d.ts b/lambda/importProductsFile/index.d.ts new file mode 100644 index 0000000..dd993ca --- /dev/null +++ b/lambda/importProductsFile/index.d.ts @@ -0,0 +1,10 @@ +import { APIGatewayProxyEvent } from 'aws-lambda'; +export declare const handler: (event: APIGatewayProxyEvent) => Promise<{ + statusCode: number; + headers: { + 'Access-Control-Allow-Origin': string; + 'Access-Control-Allow-Headers': string; + 'Access-Control-Allow-Methods': string; + }; + body: string; +}>; diff --git a/lambda/importProductsFile/index.js b/lambda/importProductsFile/index.js new file mode 100644 index 0000000..3f86332 --- /dev/null +++ b/lambda/importProductsFile/index.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.handler = void 0; +const client_s3_1 = require("@aws-sdk/client-s3"); +const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner"); +const s3 = new client_s3_1.S3Client({}); +const BUCKET = process.env.BUCKET_NAME; +const handler = async (event) => { + const headers = { + 'Access-Control-Allow-Origin': 'http://localhost:3000', + 'Access-Control-Allow-Headers': '*', + 'Access-Control-Allow-Methods': 'GET,OPTIONS' + }; + if (event.httpMethod === 'OPTIONS') { + return { statusCode: 200, headers, body: '' }; + } + const fileName = event.queryStringParameters?.name; + if (!fileName) { + return { + statusCode: 400, + headers, + body: JSON.stringify({ message: 'Missing file name in query string' }) + }; + } + const key = `uploaded/${fileName}`; + const command = new client_s3_1.PutObjectCommand({ Bucket: BUCKET, Key: key }); + const url = await (0, s3_request_presigner_1.getSignedUrl)(s3, command, { expiresIn: 60 }); + return { + statusCode: 200, + headers, + body: JSON.stringify({ url }) + }; +}; +exports.handler = handler; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrREFBZ0U7QUFDaEUsd0VBQTZEO0FBRzdELE1BQU0sRUFBRSxHQUFHLElBQUksb0JBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztBQUVoQyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBMkIsRUFBRSxFQUFFO0lBQzNELE1BQU0sT0FBTyxHQUFHO1FBQ2QsNkJBQTZCLEVBQUUsdUJBQXVCO1FBQ3RELDhCQUE4QixFQUFFLEdBQUc7UUFDbkMsOEJBQThCLEVBQUUsYUFBYTtLQUM5QyxDQUFDO0lBRUYsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ25DLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUM7SUFDbkQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsT0FBTztZQUNMLFVBQVUsRUFBRSxHQUFHO1lBQ2YsT0FBTztZQUNQLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLENBQUM7U0FDdkUsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxZQUFZLFFBQVEsRUFBRSxDQUFDO0lBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksNEJBQWdCLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSxtQ0FBWSxFQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUUvRCxPQUFPO1FBQ0wsVUFBVSxFQUFFLEdBQUc7UUFDZixPQUFPO1FBQ1AsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztLQUM5QixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBN0JXLFFBQUEsT0FBTyxXQTZCbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTM0NsaWVudCwgUHV0T2JqZWN0Q29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zMyc7XG5pbXBvcnQgeyBnZXRTaWduZWRVcmwgfSBmcm9tICdAYXdzLXNkay9zMy1yZXF1ZXN0LXByZXNpZ25lcic7XG5pbXBvcnQgeyBBUElHYXRld2F5UHJveHlFdmVudCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuXG5jb25zdCBzMyA9IG5ldyBTM0NsaWVudCh7fSk7XG5jb25zdCBCVUNLRVQgPSBwcm9jZXNzLmVudi5CVUNLRVRfTkFNRTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoZXZlbnQ6IEFQSUdhdGV3YXlQcm94eUV2ZW50KSA9PiB7XG4gIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbic6ICdodHRwOi8vbG9jYWxob3N0OjMwMDAnLFxuICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogJyonLFxuICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogJ0dFVCxPUFRJT05TJ1xuICB9O1xuXG4gIGlmIChldmVudC5odHRwTWV0aG9kID09PSAnT1BUSU9OUycpIHtcbiAgICByZXR1cm4geyBzdGF0dXNDb2RlOiAyMDAsIGhlYWRlcnMsIGJvZHk6ICcnIH07XG4gIH1cblxuICBjb25zdCBmaWxlTmFtZSA9IGV2ZW50LnF1ZXJ5U3RyaW5nUGFyYW1ldGVycz8ubmFtZTtcbiAgaWYgKCFmaWxlTmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXNDb2RlOiA0MDAsXG4gICAgICBoZWFkZXJzLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBtZXNzYWdlOiAnTWlzc2luZyBmaWxlIG5hbWUgaW4gcXVlcnkgc3RyaW5nJyB9KVxuICAgIH07XG4gIH1cblxuICBjb25zdCBrZXkgPSBgdXBsb2FkZWQvJHtmaWxlTmFtZX1gO1xuICBjb25zdCBjb21tYW5kID0gbmV3IFB1dE9iamVjdENvbW1hbmQoeyBCdWNrZXQ6IEJVQ0tFVCwgS2V5OiBrZXkgfSk7XG4gIGNvbnN0IHVybCA9IGF3YWl0IGdldFNpZ25lZFVybChzMywgY29tbWFuZCwgeyBleHBpcmVzSW46IDYwIH0pO1xuXG4gIHJldHVybiB7XG4gICAgc3RhdHVzQ29kZTogMjAwLFxuICAgIGhlYWRlcnMsXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB1cmwgfSlcbiAgfTtcbn07XG4iXX0= \ No newline at end of file diff --git a/lib/import-service-stack.d.ts b/lib/import-service-stack.d.ts new file mode 100644 index 0000000..0e11129 --- /dev/null +++ b/lib/import-service-stack.d.ts @@ -0,0 +1,5 @@ +import * as cdk from 'aws-cdk-lib'; +import { Construct } from 'constructs'; +export declare class ImportServiceStack extends cdk.Stack { + constructor(scope: Construct, id: string, props?: cdk.StackProps); +} diff --git a/lib/import-service-stack.js b/lib/import-service-stack.js new file mode 100644 index 0000000..b0092a4 --- /dev/null +++ b/lib/import-service-stack.js @@ -0,0 +1,89 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ImportServiceStack = void 0; +const cdk = __importStar(require("aws-cdk-lib")); +const s3 = __importStar(require("aws-cdk-lib/aws-s3")); +const lambda = __importStar(require("aws-cdk-lib/aws-lambda")); +const apigateway = __importStar(require("aws-cdk-lib/aws-apigateway")); +const s3n = __importStar(require("aws-cdk-lib/aws-s3-notifications")); +const path = __importStar(require("path")); +class ImportServiceStack extends cdk.Stack { + constructor(scope, id, props) { + super(scope, id, props); + // S3 bucket with 'uploaded/' folder + const importBucket = new s3.Bucket(this, 'ImportBucket', { + removalPolicy: cdk.RemovalPolicy.DESTROY, + autoDeleteObjects: true, + cors: [{ + allowedOrigins: ['*'], + allowedMethods: [s3.HttpMethods.GET, s3.HttpMethods.PUT], + allowedHeaders: ['*'], + exposedHeaders: ['ETag'], + }] + }); + // Lambda: importProductsFile + const importProductsFileLambda = new lambda.Function(this, 'importProductsFile', { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(path.join(__dirname, '..', 'lambda', 'importProductsFile')), + environment: { + BUCKET_NAME: importBucket.bucketName, + }, + functionName: 'importProductsFile' + }); + // Grant permissions to generate signed URLs + importBucket.grantReadWrite(importProductsFileLambda); + // API Gateway for /import + const api = new apigateway.RestApi(this, 'ImportServiceApi', { + restApiName: 'Import Service', + defaultCorsPreflightOptions: { + allowOrigins: apigateway.Cors.ALL_ORIGINS, + allowMethods: ['GET', 'OPTIONS'], + allowHeaders: apigateway.Cors.DEFAULT_HEADERS, + }, + }); + const importResource = api.root.addResource('import'); + importResource.addMethod('GET', new apigateway.LambdaIntegration(importProductsFileLambda, { proxy: true }), { + methodResponses: [{ statusCode: '200' }, { statusCode: '400' }] + }); + // Lambda: importFileParser + const importFileParserLambda = new lambda.Function(this, 'importFileParser', { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(path.join(__dirname, '..', 'lambda', 'importFileParser')), + environment: { + BUCKET_NAME: importBucket.bucketName, + }, + functionName: 'importFileParser' + }); + // Grant S3 read permissions to parser Lambda + importBucket.grantRead(importFileParserLambda); + // S3 event notification for 'uploaded/' folder + importBucket.addEventNotification(s3.EventType.OBJECT_CREATED, new s3n.LambdaDestination(importFileParserLambda), { prefix: 'uploaded/' }); + } +} +exports.ImportServiceStack = ImportServiceStack; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LXNlcnZpY2Utc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbXBvcnQtc2VydmljZS1zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUFtQztBQUVuQyx1REFBeUM7QUFDekMsK0RBQWlEO0FBQ2pELHVFQUF5RDtBQUN6RCxzRUFBd0Q7QUFFeEQsMkNBQTZCO0FBRTdCLE1BQWEsa0JBQW1CLFNBQVEsR0FBRyxDQUFDLEtBQUs7SUFDL0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixvQ0FBb0M7UUFDcEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDdkQsYUFBYSxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTztZQUN4QyxpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLElBQUksRUFBRSxDQUFDO29CQUNMLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDckIsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUM7b0JBQ3hELGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDckIsY0FBYyxFQUFFLENBQUMsTUFBTSxDQUFDO2lCQUN6QixDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsNkJBQTZCO1FBQzdCLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUMvRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ25DLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUM7WUFDdkYsV0FBVyxFQUFFO2dCQUNYLFdBQVcsRUFBRSxZQUFZLENBQUMsVUFBVTthQUNyQztZQUNELFlBQVksRUFBRSxvQkFBb0I7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsNENBQTRDO1FBQzVDLFlBQVksQ0FBQyxjQUFjLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUV0RCwwQkFBMEI7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUMzRCxXQUFXLEVBQUUsZ0JBQWdCO1lBQzdCLDJCQUEyQixFQUFFO2dCQUMzQixZQUFZLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXO2dCQUN6QyxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDO2dCQUNoQyxZQUFZLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlO2FBQzlDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEQsY0FBYyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRTtZQUMzRyxlQUFlLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUNoRSxDQUFDLENBQUM7UUFFSCwyQkFBMkI7UUFDM0IsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQzNFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDbkMsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUNyRixXQUFXLEVBQUU7Z0JBQ1gsV0FBVyxFQUFFLFlBQVksQ0FBQyxVQUFVO2FBQ3JDO1lBQ0QsWUFBWSxFQUFFLGtCQUFrQjtTQUNqQyxDQUFDLENBQUM7UUFFSCw2Q0FBNkM7UUFDN0MsWUFBWSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRS9DLCtDQUErQztRQUMvQyxZQUFZLENBQUMsb0JBQW9CLENBQy9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUMzQixJQUFJLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxFQUNqRCxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FDeEIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWxFRCxnREFrRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgYXBpZ2F0ZXdheSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XG5pbXBvcnQgKiBhcyBzM24gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLW5vdGlmaWNhdGlvbnMnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGNsYXNzIEltcG9ydFNlcnZpY2VTdGFjayBleHRlbmRzIGNkay5TdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogY2RrLlN0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIC8vIFMzIGJ1Y2tldCB3aXRoICd1cGxvYWRlZC8nIGZvbGRlclxuICAgIGNvbnN0IGltcG9ydEJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgJ0ltcG9ydEJ1Y2tldCcsIHtcbiAgICAgIHJlbW92YWxQb2xpY3k6IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgIGNvcnM6IFt7XG4gICAgICAgIGFsbG93ZWRPcmlnaW5zOiBbJyonXSxcbiAgICAgICAgYWxsb3dlZE1ldGhvZHM6IFtzMy5IdHRwTWV0aG9kcy5HRVQsIHMzLkh0dHBNZXRob2RzLlBVVF0sXG4gICAgICAgIGFsbG93ZWRIZWFkZXJzOiBbJyonXSxcbiAgICAgICAgZXhwb3NlZEhlYWRlcnM6IFsnRVRhZyddLFxuICAgICAgfV1cbiAgICB9KTtcblxuICAgIC8vIExhbWJkYTogaW1wb3J0UHJvZHVjdHNGaWxlXG4gICAgY29uc3QgaW1wb3J0UHJvZHVjdHNGaWxlTGFtYmRhID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnaW1wb3J0UHJvZHVjdHNGaWxlJywge1xuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ2xhbWJkYScsICdpbXBvcnRQcm9kdWN0c0ZpbGUnKSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBCVUNLRVRfTkFNRTogaW1wb3J0QnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICB9LFxuICAgICAgZnVuY3Rpb25OYW1lOiAnaW1wb3J0UHJvZHVjdHNGaWxlJ1xuICAgIH0pO1xuXG4gICAgLy8gR3JhbnQgcGVybWlzc2lvbnMgdG8gZ2VuZXJhdGUgc2lnbmVkIFVSTHNcbiAgICBpbXBvcnRCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoaW1wb3J0UHJvZHVjdHNGaWxlTGFtYmRhKTtcblxuICAgIC8vIEFQSSBHYXRld2F5IGZvciAvaW1wb3J0XG4gICAgY29uc3QgYXBpID0gbmV3IGFwaWdhdGV3YXkuUmVzdEFwaSh0aGlzLCAnSW1wb3J0U2VydmljZUFwaScsIHtcbiAgICAgIHJlc3RBcGlOYW1lOiAnSW1wb3J0IFNlcnZpY2UnLFxuICAgICAgZGVmYXVsdENvcnNQcmVmbGlnaHRPcHRpb25zOiB7XG4gICAgICAgIGFsbG93T3JpZ2luczogYXBpZ2F0ZXdheS5Db3JzLkFMTF9PUklHSU5TLFxuICAgICAgICBhbGxvd01ldGhvZHM6IFsnR0VUJywgJ09QVElPTlMnXSxcbiAgICAgICAgYWxsb3dIZWFkZXJzOiBhcGlnYXRld2F5LkNvcnMuREVGQVVMVF9IRUFERVJTLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGltcG9ydFJlc291cmNlID0gYXBpLnJvb3QuYWRkUmVzb3VyY2UoJ2ltcG9ydCcpO1xuICAgIGltcG9ydFJlc291cmNlLmFkZE1ldGhvZCgnR0VUJywgbmV3IGFwaWdhdGV3YXkuTGFtYmRhSW50ZWdyYXRpb24oaW1wb3J0UHJvZHVjdHNGaWxlTGFtYmRhLCB7IHByb3h5OiB0cnVlIH0pLCB7XG4gICAgICBtZXRob2RSZXNwb25zZXM6IFt7IHN0YXR1c0NvZGU6ICcyMDAnIH0sIHsgc3RhdHVzQ29kZTogJzQwMCcgfV1cbiAgICB9KTtcblxuICAgIC8vIExhbWJkYTogaW1wb3J0RmlsZVBhcnNlclxuICAgIGNvbnN0IGltcG9ydEZpbGVQYXJzZXJMYW1iZGEgPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdpbXBvcnRGaWxlUGFyc2VyJywge1xuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ2xhbWJkYScsICdpbXBvcnRGaWxlUGFyc2VyJykpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgQlVDS0VUX05BTUU6IGltcG9ydEJ1Y2tldC5idWNrZXROYW1lLFxuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uTmFtZTogJ2ltcG9ydEZpbGVQYXJzZXInXG4gICAgfSk7XG5cbiAgICAvLyBHcmFudCBTMyByZWFkIHBlcm1pc3Npb25zIHRvIHBhcnNlciBMYW1iZGFcbiAgICBpbXBvcnRCdWNrZXQuZ3JhbnRSZWFkKGltcG9ydEZpbGVQYXJzZXJMYW1iZGEpO1xuXG4gICAgLy8gUzMgZXZlbnQgbm90aWZpY2F0aW9uIGZvciAndXBsb2FkZWQvJyBmb2xkZXJcbiAgICBpbXBvcnRCdWNrZXQuYWRkRXZlbnROb3RpZmljYXRpb24oXG4gICAgICBzMy5FdmVudFR5cGUuT0JKRUNUX0NSRUFURUQsXG4gICAgICBuZXcgczNuLkxhbWJkYURlc3RpbmF0aW9uKGltcG9ydEZpbGVQYXJzZXJMYW1iZGEpLFxuICAgICAgeyBwcmVmaXg6ICd1cGxvYWRlZC8nIH1cbiAgICApO1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/lib/product-service-stack.js b/lib/product-service-stack.js index d38e8c8..f55ec84 100644 --- a/lib/product-service-stack.js +++ b/lib/product-service-stack.js @@ -25,10 +25,14 @@ var __importStar = (this && this.__importStar) || function (mod) { Object.defineProperty(exports, "__esModule", { value: true }); exports.ProductServiceStack = void 0; const cdk = __importStar(require("aws-cdk-lib")); +const iam = __importStar(require("aws-cdk-lib/aws-iam")); const lambda = __importStar(require("aws-cdk-lib/aws-lambda")); const apigateway = __importStar(require("aws-cdk-lib/aws-apigateway")); const path = __importStar(require("path")); const dynamodb = __importStar(require("aws-cdk-lib/aws-dynamodb")); +const sqs = __importStar(require("aws-cdk-lib/aws-sqs")); +const eventSources = __importStar(require("aws-cdk-lib/aws-lambda-event-sources")); +const sns = __importStar(require("aws-cdk-lib/aws-sns")); class ProductServiceStack extends cdk.Stack { productsApiUrl; constructor(scope, id, props) { @@ -79,12 +83,55 @@ class ProductServiceStack extends cdk.Stack { createProductLambda.addEnvironment('STOCK_TABLE_NAME', stockTable.tableName); productsTable.grantWriteData(createProductLambda); stockTable.grantWriteData(createProductLambda); + // 1. Create SQS queue catalogItemsQueue + const catalogItemsQueue = new sqs.Queue(this, "catalogItemsQueue", { + visibilityTimeout: cdk.Duration.seconds(30), + }); + // 2. Create the Lambda catalogBatchProcess + const catalogBatchProcess = new lambda.Function(this, "catalogBatchProcess", { + runtime: lambda.Runtime.NODEJS_18_X, + handler: "index.handler", + code: lambda.Code.fromAsset("lambda/catalogBatchProcess"), + environment: { + PRODUCTS_TABLE: productsTable.tableName, + SQS_URL: catalogItemsQueue.queueUrl, + }, + }); + // 3. Grant Lambda permissions + productsTable.grantWriteData(catalogBatchProcess); + // 4. SQS → Lambda event source (batch size = 5) + catalogBatchProcess.addEventSource(new eventSources.SqsEventSource(catalogItemsQueue, { + batchSize: 5, + })); + // --- SNS topic and email subscription --- + const createProductTopic = new sns.Topic(this, "createProductTopic"); + new sns.Subscription(this, "emailSubscription", { + topic: createProductTopic, + protocol: sns.SubscriptionProtocol.EMAIL, + endpoint: "mahendra_yadav@epam.com", + }); + createProductTopic.grantPublish(catalogBatchProcess); + catalogBatchProcess.addEnvironment("SNS_TOPIC", createProductTopic.topicArn); + // --- end SNS additions --- + // Reference the existing Lambda function by ARN + // const importFileParser = lambda.Function.fromFunctionArn( + // this, + // "ImportFileParserFunction", + // "arn:aws:lambda:us-east-1:837282923698:function:importFileParser" + // ); + const importFileParser = lambda.Function.fromFunctionAttributes(this, "ImportFileParserFunction", { + functionArn: "arn:aws:lambda:us-east-1:837282923698:function:importFileParser", + role: iam.Role.fromRoleArn(this, "ImportFileParserRole", "arn:aws:iam::837282923698:role/importFileParserRole", { mutable: false }) + }); + // 4. Permissions — allow importFileParser to send SQS messages + catalogItemsQueue.grantSendMessages(importFileParser); // API Gateway REST API const api = new apigateway.RestApi(this, 'ProductServiceApi', { restApiName: 'Product Service', defaultCorsPreflightOptions: { allowOrigins: apigateway.Cors.ALL_ORIGINS, - allowMethods: ['GET', 'POST'], + allowMethods: ['GET', 'POST', 'OPTIONS'], + allowHeaders: ['Content-Type', 'Authorization', 'X-Amz-Date', 'X-Api-Key', 'X-Amz-Security-Token', 'X-Amz-User-Agent'] }, }); // /products resource @@ -115,4 +162,4 @@ class ProductServiceStack extends cdk.Stack { } } exports.ProductServiceStack = ProductServiceStack; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1zZXJ2aWNlLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHJvZHVjdC1zZXJ2aWNlLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQW1DO0FBRW5DLCtEQUFpRDtBQUNqRCx1RUFBeUQ7QUFDekQsMkNBQTZCO0FBQzdCLG1FQUFxRDtBQUVyRCxNQUFhLG1CQUFvQixTQUFRLEdBQUcsQ0FBQyxLQUFLO0lBQ2hDLGNBQWMsQ0FBUztJQUV2QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQzlELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLHNFQUFzRTtRQUN0RSxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUYsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXJGLHdCQUF3QjtRQUN4QixNQUFNLGlCQUFpQixHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7WUFDckUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNuQyxPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3BGLFlBQVksRUFBRSxpQkFBaUI7U0FDaEMsQ0FBQyxDQUFDO1FBRUgsb0NBQW9DO1FBQ3BDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRTtZQUN6RSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ25DLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDcEYsWUFBWSxFQUFFLGlCQUFpQjtTQUNoQyxDQUFDLENBQUM7UUFFSCwrQkFBK0I7UUFDL0IsTUFBTSxTQUFTLEdBQUc7WUFDaEIsbUJBQW1CLEVBQUUsYUFBYSxDQUFDLFNBQVM7WUFDNUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLFNBQVM7WUFDdEMsbUNBQW1DLEVBQUUsR0FBRztTQUN6QyxDQUFDO1FBRUYsZ0JBQWdCO1FBQ2QsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRTtZQUNyRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ25DLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ2xGLFdBQVcsRUFBRSxTQUFTO1lBQ3RCLFlBQVksRUFBRSxlQUFlO1NBQzlCLENBQUMsQ0FBQztRQUNILGFBQWEsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNsRCxVQUFVLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFHakQsaUJBQWlCLENBQUMsY0FBYyxDQUFDLHFCQUFxQixFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRixpQkFBaUIsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTNFLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckYscUJBQXFCLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUvRSxvQ0FBb0M7UUFDcEMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQy9DLFVBQVUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUU1QyxhQUFhLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDbkQsVUFBVSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRWhELG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkYsbUJBQW1CLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU3RSxhQUFhLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbEQsVUFBVSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRy9DLHVCQUF1QjtRQUN2QixNQUFNLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQzVELFdBQVcsRUFBRSxpQkFBaUI7WUFDOUIsMkJBQTJCLEVBQUU7Z0JBQzNCLFlBQVksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVc7Z0JBQ3pDLFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7YUFDOUI7U0FDRixDQUFDLENBQUM7UUFFSCxxQkFBcUI7UUFDckIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEQsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRTtZQUNqRixLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLHNCQUFzQixFQUFFO1lBQ2hELGVBQWUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQ3pDLENBQUMsQ0FBQztRQUVILGlDQUFpQztRQUNqQyxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUQsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsRUFBRTtZQUN4RixLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUMsQ0FBQztRQUNILGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUseUJBQXlCLEVBQUU7WUFDNUQsZUFBZSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDdkYsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRTtZQUNqRyxlQUFlLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUNoRSxDQUFDLENBQUM7UUFFSCxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQzlCLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDeEMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsVUFBVTtZQUN2QyxXQUFXLEVBQUUsMkJBQTJCO1NBQ3pDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXZHRCxrREF1R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBhcGlnYXRld2F5IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5JztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBkeW5hbW9kYiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuXG5leHBvcnQgY2xhc3MgUHJvZHVjdFNlcnZpY2VTdGFjayBleHRlbmRzIGNkay5TdGFjayB7XG4gIHB1YmxpYyByZWFkb25seSBwcm9kdWN0c0FwaVVybDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogY2RrLlN0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIC8vIOKchSBJbXBvcnQgZXhpc3RpbmcgdGFibGVzIChpZiB0aGV5IGFscmVhZHkgZXhpc3QpIG9yIGNyZWF0ZSBuZXcgb25lc1xuICAgIGNvbnN0IHByb2R1Y3RzVGFibGUgPSBkeW5hbW9kYi5UYWJsZS5mcm9tVGFibGVOYW1lKHRoaXMsICdQcm9kdWN0c1RhYmxlSW1wb3J0ZWQnLCAncHJvZHVjdHMnKTtcbiAgICBjb25zdCBzdG9ja1RhYmxlID0gZHluYW1vZGIuVGFibGUuZnJvbVRhYmxlTmFtZSh0aGlzLCAnU3RvY2tUYWJsZUltcG9ydGVkJywgJ3N0b2NrJyk7XG5cbiAgICAvLyBMYW1iZGE6IEdFVCAvcHJvZHVjdHNcbiAgICBjb25zdCBnZXRQcm9kdWN0c0xhbWJkYSA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ2dldFByb2R1Y3RzTGlzdCcsIHtcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xOF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdsYW1iZGEnLCAnZ2V0UHJvZHVjdHNMaXN0JykpLFxuICAgICAgZnVuY3Rpb25OYW1lOiAnZ2V0UHJvZHVjdHNMaXN0JyxcbiAgICB9KTtcblxuICAgIC8vIExhbWJkYTogR0VUIC9wcm9kdWN0cy97cHJvZHVjdElkfVxuICAgIGNvbnN0IGdldFByb2R1Y3RzQnlJZExhbWJkYSA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ2dldFByb2R1Y3RzQnlJZCcsIHtcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xOF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdsYW1iZGEnLCAnZ2V0UHJvZHVjdHNCeUlkJykpLFxuICAgICAgZnVuY3Rpb25OYW1lOiAnZ2V0UHJvZHVjdHNCeUlkJyxcbiAgICB9KTtcblxuICAgIC8vIExhbWJkYSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICBjb25zdCBjb21tb25FbnYgPSB7XG4gICAgICBQUk9EVUNUU19UQUJMRV9OQU1FOiBwcm9kdWN0c1RhYmxlLnRhYmxlTmFtZSxcbiAgICAgIFNUT0NLX1RBQkxFX05BTUU6IHN0b2NrVGFibGUudGFibGVOYW1lLFxuICAgICAgQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQ6ICcxJyxcbiAgICB9O1xuXG4gICAgLy8gY3JlYXRlIGxhbWJkYVxuICAgICAgY29uc3QgY3JlYXRlUHJvZHVjdExhbWJkYSA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ2NyZWF0ZVByb2R1Y3QnLCB7XG4gICAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xOF9YLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnbGFtYmRhJywgJ2NyZWF0ZVByb2R1Y3QnKSksXG4gICAgICAgIGVudmlyb25tZW50OiBjb21tb25FbnYsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogJ2NyZWF0ZVByb2R1Y3QnXG4gICAgICB9KTtcbiAgICAgIHByb2R1Y3RzVGFibGUuZ3JhbnRXcml0ZURhdGEoY3JlYXRlUHJvZHVjdExhbWJkYSk7XG4gICAgICBzdG9ja1RhYmxlLmdyYW50V3JpdGVEYXRhKGNyZWF0ZVByb2R1Y3RMYW1iZGEpOyAgICAgIFxuICAgIFxuXG4gICAgZ2V0UHJvZHVjdHNMYW1iZGEuYWRkRW52aXJvbm1lbnQoJ1BST0RVQ1RTX1RBQkxFX05BTUUnLCBwcm9kdWN0c1RhYmxlLnRhYmxlTmFtZSk7XG4gICAgZ2V0UHJvZHVjdHNMYW1iZGEuYWRkRW52aXJvbm1lbnQoJ1NUT0NLX1RBQkxFX05BTUUnLCBzdG9ja1RhYmxlLnRhYmxlTmFtZSk7XG5cbiAgICBnZXRQcm9kdWN0c0J5SWRMYW1iZGEuYWRkRW52aXJvbm1lbnQoJ1BST0RVQ1RTX1RBQkxFX05BTUUnLCBwcm9kdWN0c1RhYmxlLnRhYmxlTmFtZSk7XG4gICAgZ2V0UHJvZHVjdHNCeUlkTGFtYmRhLmFkZEVudmlyb25tZW50KCdTVE9DS19UQUJMRV9OQU1FJywgc3RvY2tUYWJsZS50YWJsZU5hbWUpO1xuXG4gICAgLy8gR3JhbnQgcmVhZCBwZXJtaXNzaW9ucyB0byBMYW1iZGFzXG4gICAgcHJvZHVjdHNUYWJsZS5ncmFudFJlYWREYXRhKGdldFByb2R1Y3RzTGFtYmRhKTtcbiAgICBzdG9ja1RhYmxlLmdyYW50UmVhZERhdGEoZ2V0UHJvZHVjdHNMYW1iZGEpO1xuXG4gICAgcHJvZHVjdHNUYWJsZS5ncmFudFJlYWREYXRhKGdldFByb2R1Y3RzQnlJZExhbWJkYSk7XG4gICAgc3RvY2tUYWJsZS5ncmFudFJlYWREYXRhKGdldFByb2R1Y3RzQnlJZExhbWJkYSk7XG5cbiAgICBjcmVhdGVQcm9kdWN0TGFtYmRhLmFkZEVudmlyb25tZW50KCdQUk9EVUNUU19UQUJMRV9OQU1FJywgcHJvZHVjdHNUYWJsZS50YWJsZU5hbWUpO1xuICAgIGNyZWF0ZVByb2R1Y3RMYW1iZGEuYWRkRW52aXJvbm1lbnQoJ1NUT0NLX1RBQkxFX05BTUUnLCBzdG9ja1RhYmxlLnRhYmxlTmFtZSk7XG5cbiAgICBwcm9kdWN0c1RhYmxlLmdyYW50V3JpdGVEYXRhKGNyZWF0ZVByb2R1Y3RMYW1iZGEpO1xuICAgIHN0b2NrVGFibGUuZ3JhbnRXcml0ZURhdGEoY3JlYXRlUHJvZHVjdExhbWJkYSk7XG4gICAgXG5cbiAgICAvLyBBUEkgR2F0ZXdheSBSRVNUIEFQSVxuICAgIGNvbnN0IGFwaSA9IG5ldyBhcGlnYXRld2F5LlJlc3RBcGkodGhpcywgJ1Byb2R1Y3RTZXJ2aWNlQXBpJywge1xuICAgICAgcmVzdEFwaU5hbWU6ICdQcm9kdWN0IFNlcnZpY2UnLFxuICAgICAgZGVmYXVsdENvcnNQcmVmbGlnaHRPcHRpb25zOiB7XG4gICAgICAgIGFsbG93T3JpZ2luczogYXBpZ2F0ZXdheS5Db3JzLkFMTF9PUklHSU5TLFxuICAgICAgICBhbGxvd01ldGhvZHM6IFsnR0VUJywgJ1BPU1QnXSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAvcHJvZHVjdHMgcmVzb3VyY2VcbiAgICBjb25zdCBwcm9kdWN0cyA9IGFwaS5yb290LmFkZFJlc291cmNlKCdwcm9kdWN0cycpO1xuICAgIGNvbnN0IGdldFByb2R1Y3RzSW50ZWdyYXRpb24gPSBuZXcgYXBpZ2F0ZXdheS5MYW1iZGFJbnRlZ3JhdGlvbihnZXRQcm9kdWN0c0xhbWJkYSwge1xuICAgICAgcHJveHk6IHRydWUsXG4gICAgfSk7XG4gICAgcHJvZHVjdHMuYWRkTWV0aG9kKCdHRVQnLCBnZXRQcm9kdWN0c0ludGVncmF0aW9uLCB7XG4gICAgICBtZXRob2RSZXNwb25zZXM6IFt7IHN0YXR1c0NvZGU6ICcyMDAnIH1dLFxuICAgIH0pO1xuXG4gICAgLy8gL3Byb2R1Y3RzL3twcm9kdWN0SWR9IHJlc291cmNlXG4gICAgY29uc3QgcHJvZHVjdElkUmVzb3VyY2UgPSBwcm9kdWN0cy5hZGRSZXNvdXJjZSgne3Byb2R1Y3RJZH0nKTtcbiAgICBjb25zdCBnZXRQcm9kdWN0QnlJZEludGVncmF0aW9uID0gbmV3IGFwaWdhdGV3YXkuTGFtYmRhSW50ZWdyYXRpb24oZ2V0UHJvZHVjdHNCeUlkTGFtYmRhLCB7XG4gICAgICBwcm94eTogdHJ1ZSxcbiAgICB9KTtcbiAgICBwcm9kdWN0SWRSZXNvdXJjZS5hZGRNZXRob2QoJ0dFVCcsIGdldFByb2R1Y3RCeUlkSW50ZWdyYXRpb24sIHtcbiAgICAgIG1ldGhvZFJlc3BvbnNlczogW3sgc3RhdHVzQ29kZTogJzIwMCcgfSwgeyBzdGF0dXNDb2RlOiAnNDA0JyB9LCB7IHN0YXR1c0NvZGU6ICc0MDAnIH1dLFxuICAgIH0pO1xuICAgIFxuICAgIHByb2R1Y3RzLmFkZE1ldGhvZCgnUE9TVCcsIG5ldyBhcGlnYXRld2F5LkxhbWJkYUludGVncmF0aW9uKGNyZWF0ZVByb2R1Y3RMYW1iZGEsIHsgcHJveHk6IHRydWUgfSksIHtcbiAgICAgIG1ldGhvZFJlc3BvbnNlczogW3sgc3RhdHVzQ29kZTogJzIwMScgfSwgeyBzdGF0dXNDb2RlOiAnNDAwJyB9XVxuICAgIH0pO1xuXG4gICAgLy8gRXhwb3J0IEFQSSBVUkwgZm9yIGVhc3kgYWNjZXNzXG4gICAgdGhpcy5wcm9kdWN0c0FwaVVybCA9IGFwaS51cmw7XG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ1Byb2R1Y3RzQXBpVXJsJywge1xuICAgICAgdmFsdWU6IGAke3RoaXMucHJvZHVjdHNBcGlVcmx9cHJvZHVjdHNgLFxuICAgICAgZGVzY3JpcHRpb246ICdHRVQgZW5kcG9pbnQgZm9yIHByb2R1Y3RzJyxcbiAgICB9KTtcbiAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1zZXJ2aWNlLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHJvZHVjdC1zZXJ2aWNlLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQW1DO0FBQ25DLHlEQUEyQztBQUczQywrREFBaUQ7QUFDakQsdUVBQXlEO0FBQ3pELDJDQUE2QjtBQUM3QixtRUFBcUQ7QUFDckQseURBQTJDO0FBQzNDLG1GQUFxRTtBQUNyRSx5REFBMkM7QUFHM0MsTUFBYSxtQkFBb0IsU0FBUSxHQUFHLENBQUMsS0FBSztJQUNoQyxjQUFjLENBQVM7SUFFdkMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixzRUFBc0U7UUFDdEUsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVyRix3QkFBd0I7UUFDeEIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFO1lBQ3JFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDbkMsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNwRixZQUFZLEVBQUUsaUJBQWlCO1NBQ2hDLENBQUMsQ0FBQztRQUVILG9DQUFvQztRQUNwQyxNQUFNLHFCQUFxQixHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7WUFDekUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNuQyxPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3BGLFlBQVksRUFBRSxpQkFBaUI7U0FDaEMsQ0FBQyxDQUFDO1FBRUgsK0JBQStCO1FBQy9CLE1BQU0sU0FBUyxHQUFHO1lBQ2hCLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxTQUFTO1lBQzVDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxTQUFTO1lBQ3RDLG1DQUFtQyxFQUFFLEdBQUc7U0FDekMsQ0FBQztRQUVGLGdCQUFnQjtRQUNkLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUU7WUFDckUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNuQyxPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNsRixXQUFXLEVBQUUsU0FBUztZQUN0QixZQUFZLEVBQUUsZUFBZTtTQUM5QixDQUFDLENBQUM7UUFDSCxhQUFhLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbEQsVUFBVSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBR2pELGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakYsaUJBQWlCLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUzRSxxQkFBcUIsQ0FBQyxjQUFjLENBQUMscUJBQXFCLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JGLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFL0Usb0NBQW9DO1FBQ3BDLGFBQWEsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvQyxVQUFVLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFNUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ25ELFVBQVUsQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUVoRCxtQkFBbUIsQ0FBQyxjQUFjLENBQUMscUJBQXFCLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25GLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0UsYUFBYSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2xELFVBQVUsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUUvQyx3Q0FBd0M7UUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQ2pFLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztTQUM1QyxDQUFDLENBQUM7UUFFSCwyQ0FBMkM7UUFDM0MsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO1lBQzNFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDbkMsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLDRCQUE0QixDQUFDO1lBQ3pELFdBQVcsRUFBRTtnQkFDWCxjQUFjLEVBQUUsYUFBYSxDQUFDLFNBQVM7Z0JBQ3ZDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxRQUFRO2FBQ3BDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsOEJBQThCO1FBQzlCLGFBQWEsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUVsRCxnREFBZ0Q7UUFDaEQsbUJBQW1CLENBQUMsY0FBYyxDQUNoQyxJQUFJLFlBQVksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEVBQUU7WUFDakQsU0FBUyxFQUFFLENBQUM7U0FDYixDQUFDLENBQ0gsQ0FBQztRQUVGLDJDQUEyQztRQUMzQyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUVyRSxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQzlDLEtBQUssRUFBRSxrQkFBa0I7WUFDekIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLO1lBQ3hDLFFBQVEsRUFBRSx5QkFBeUI7U0FDcEMsQ0FBQyxDQUFDO1FBRUgsa0JBQWtCLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFckQsbUJBQW1CLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RSw0QkFBNEI7UUFFNUIsZ0RBQWdEO1FBQ2hELDREQUE0RDtRQUM1RCxVQUFVO1FBQ1YsZ0NBQWdDO1FBQ2hDLHNFQUFzRTtRQUN0RSxLQUFLO1FBQ0wsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSwwQkFBMEIsRUFBRTtZQUNoRyxXQUFXLEVBQUUsaUVBQWlFO1lBQzlFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FDeEIsSUFBSSxFQUNKLHNCQUFzQixFQUN0QixxREFBcUQsRUFDckQsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQ25CO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsK0RBQStEO1FBQy9ELGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFdEQsdUJBQXVCO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDNUQsV0FBVyxFQUFFLGlCQUFpQjtZQUM5QiwyQkFBMkIsRUFBRTtnQkFDM0IsWUFBWSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVztnQkFDekMsWUFBWSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUM7Z0JBQ3hDLFlBQVksRUFBRSxDQUFDLGNBQWMsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsQ0FBQzthQUN2SDtTQUNGLENBQUMsQ0FBQztRQUVILHFCQUFxQjtRQUNyQixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRCxNQUFNLHNCQUFzQixHQUFHLElBQUksVUFBVSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFO1lBQ2pGLEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLEVBQUU7WUFDaEQsZUFBZSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDekMsQ0FBQyxDQUFDO1FBRUgsaUNBQWlDO1FBQ2pDLE1BQU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5RCxNQUFNLHlCQUF5QixHQUFHLElBQUksVUFBVSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFO1lBQ3hGLEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSx5QkFBeUIsRUFBRTtZQUM1RCxlQUFlLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUN2RixDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQ2pHLGVBQWUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQ2hFLENBQUMsQ0FBQztRQUVILGlDQUFpQztRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDOUIsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUN4QyxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxVQUFVO1lBQ3ZDLFdBQVcsRUFBRSwyQkFBMkI7U0FDekMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBbEtELGtEQWtLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBhcGlnYXRld2F5IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5JztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBkeW5hbW9kYiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0ICogYXMgc3FzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zcXMnO1xuaW1wb3J0ICogYXMgZXZlbnRTb3VyY2VzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEtZXZlbnQtc291cmNlcyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgKiBhcyBzdWJzY3JpcHRpb25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMtc3Vic2NyaXB0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBQcm9kdWN0U2VydmljZVN0YWNrIGV4dGVuZHMgY2RrLlN0YWNrIHtcbiAgcHVibGljIHJlYWRvbmx5IHByb2R1Y3RzQXBpVXJsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBjZGsuU3RhY2tQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgLy8g4pyFIEltcG9ydCBleGlzdGluZyB0YWJsZXMgKGlmIHRoZXkgYWxyZWFkeSBleGlzdCkgb3IgY3JlYXRlIG5ldyBvbmVzXG4gICAgY29uc3QgcHJvZHVjdHNUYWJsZSA9IGR5bmFtb2RiLlRhYmxlLmZyb21UYWJsZU5hbWUodGhpcywgJ1Byb2R1Y3RzVGFibGVJbXBvcnRlZCcsICdwcm9kdWN0cycpO1xuICAgIGNvbnN0IHN0b2NrVGFibGUgPSBkeW5hbW9kYi5UYWJsZS5mcm9tVGFibGVOYW1lKHRoaXMsICdTdG9ja1RhYmxlSW1wb3J0ZWQnLCAnc3RvY2snKTtcblxuICAgIC8vIExhbWJkYTogR0VUIC9wcm9kdWN0c1xuICAgIGNvbnN0IGdldFByb2R1Y3RzTGFtYmRhID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnZ2V0UHJvZHVjdHNMaXN0Jywge1xuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ2xhbWJkYScsICdnZXRQcm9kdWN0c0xpc3QnKSksXG4gICAgICBmdW5jdGlvbk5hbWU6ICdnZXRQcm9kdWN0c0xpc3QnLFxuICAgIH0pO1xuXG4gICAgLy8gTGFtYmRhOiBHRVQgL3Byb2R1Y3RzL3twcm9kdWN0SWR9XG4gICAgY29uc3QgZ2V0UHJvZHVjdHNCeUlkTGFtYmRhID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnZ2V0UHJvZHVjdHNCeUlkJywge1xuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ2xhbWJkYScsICdnZXRQcm9kdWN0c0J5SWQnKSksXG4gICAgICBmdW5jdGlvbk5hbWU6ICdnZXRQcm9kdWN0c0J5SWQnLFxuICAgIH0pO1xuXG4gICAgLy8gTGFtYmRhIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgIGNvbnN0IGNvbW1vbkVudiA9IHtcbiAgICAgIFBST0RVQ1RTX1RBQkxFX05BTUU6IHByb2R1Y3RzVGFibGUudGFibGVOYW1lLFxuICAgICAgU1RPQ0tfVEFCTEVfTkFNRTogc3RvY2tUYWJsZS50YWJsZU5hbWUsXG4gICAgICBBV1NfTk9ERUpTX0NPTk5FQ1RJT05fUkVVU0VfRU5BQkxFRDogJzEnLFxuICAgIH07XG5cbiAgICAvLyBjcmVhdGUgbGFtYmRhXG4gICAgICBjb25zdCBjcmVhdGVQcm9kdWN0TGFtYmRhID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnY3JlYXRlUHJvZHVjdCcsIHtcbiAgICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdsYW1iZGEnLCAnY3JlYXRlUHJvZHVjdCcpKSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IGNvbW1vbkVudixcbiAgICAgICAgZnVuY3Rpb25OYW1lOiAnY3JlYXRlUHJvZHVjdCdcbiAgICAgIH0pO1xuICAgICAgcHJvZHVjdHNUYWJsZS5ncmFudFdyaXRlRGF0YShjcmVhdGVQcm9kdWN0TGFtYmRhKTtcbiAgICAgIHN0b2NrVGFibGUuZ3JhbnRXcml0ZURhdGEoY3JlYXRlUHJvZHVjdExhbWJkYSk7ICAgICAgXG4gICAgXG5cbiAgICBnZXRQcm9kdWN0c0xhbWJkYS5hZGRFbnZpcm9ubWVudCgnUFJPRFVDVFNfVEFCTEVfTkFNRScsIHByb2R1Y3RzVGFibGUudGFibGVOYW1lKTtcbiAgICBnZXRQcm9kdWN0c0xhbWJkYS5hZGRFbnZpcm9ubWVudCgnU1RPQ0tfVEFCTEVfTkFNRScsIHN0b2NrVGFibGUudGFibGVOYW1lKTtcblxuICAgIGdldFByb2R1Y3RzQnlJZExhbWJkYS5hZGRFbnZpcm9ubWVudCgnUFJPRFVDVFNfVEFCTEVfTkFNRScsIHByb2R1Y3RzVGFibGUudGFibGVOYW1lKTtcbiAgICBnZXRQcm9kdWN0c0J5SWRMYW1iZGEuYWRkRW52aXJvbm1lbnQoJ1NUT0NLX1RBQkxFX05BTUUnLCBzdG9ja1RhYmxlLnRhYmxlTmFtZSk7XG5cbiAgICAvLyBHcmFudCByZWFkIHBlcm1pc3Npb25zIHRvIExhbWJkYXNcbiAgICBwcm9kdWN0c1RhYmxlLmdyYW50UmVhZERhdGEoZ2V0UHJvZHVjdHNMYW1iZGEpO1xuICAgIHN0b2NrVGFibGUuZ3JhbnRSZWFkRGF0YShnZXRQcm9kdWN0c0xhbWJkYSk7XG5cbiAgICBwcm9kdWN0c1RhYmxlLmdyYW50UmVhZERhdGEoZ2V0UHJvZHVjdHNCeUlkTGFtYmRhKTtcbiAgICBzdG9ja1RhYmxlLmdyYW50UmVhZERhdGEoZ2V0UHJvZHVjdHNCeUlkTGFtYmRhKTtcblxuICAgIGNyZWF0ZVByb2R1Y3RMYW1iZGEuYWRkRW52aXJvbm1lbnQoJ1BST0RVQ1RTX1RBQkxFX05BTUUnLCBwcm9kdWN0c1RhYmxlLnRhYmxlTmFtZSk7XG4gICAgY3JlYXRlUHJvZHVjdExhbWJkYS5hZGRFbnZpcm9ubWVudCgnU1RPQ0tfVEFCTEVfTkFNRScsIHN0b2NrVGFibGUudGFibGVOYW1lKTtcblxuICAgIHByb2R1Y3RzVGFibGUuZ3JhbnRXcml0ZURhdGEoY3JlYXRlUHJvZHVjdExhbWJkYSk7XG4gICAgc3RvY2tUYWJsZS5ncmFudFdyaXRlRGF0YShjcmVhdGVQcm9kdWN0TGFtYmRhKTtcbiAgICBcbiAgICAvLyAxLiBDcmVhdGUgU1FTIHF1ZXVlIGNhdGFsb2dJdGVtc1F1ZXVlXG4gICAgY29uc3QgY2F0YWxvZ0l0ZW1zUXVldWUgPSBuZXcgc3FzLlF1ZXVlKHRoaXMsIFwiY2F0YWxvZ0l0ZW1zUXVldWVcIiwge1xuICAgICAgdmlzaWJpbGl0eVRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICB9KTtcblxuICAgIC8vIDIuIENyZWF0ZSB0aGUgTGFtYmRhIGNhdGFsb2dCYXRjaFByb2Nlc3NcbiAgICBjb25zdCBjYXRhbG9nQmF0Y2hQcm9jZXNzID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCBcImNhdGFsb2dCYXRjaFByb2Nlc3NcIiwge1xuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChcImxhbWJkYS9jYXRhbG9nQmF0Y2hQcm9jZXNzXCIpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgUFJPRFVDVFNfVEFCTEU6IHByb2R1Y3RzVGFibGUudGFibGVOYW1lLFxuICAgICAgICBTUVNfVVJMOiBjYXRhbG9nSXRlbXNRdWV1ZS5xdWV1ZVVybCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAzLiBHcmFudCBMYW1iZGEgcGVybWlzc2lvbnNcbiAgICBwcm9kdWN0c1RhYmxlLmdyYW50V3JpdGVEYXRhKGNhdGFsb2dCYXRjaFByb2Nlc3MpO1xuXG4gICAgLy8gNC4gU1FTIOKGkiBMYW1iZGEgZXZlbnQgc291cmNlIChiYXRjaCBzaXplID0gNSlcbiAgICBjYXRhbG9nQmF0Y2hQcm9jZXNzLmFkZEV2ZW50U291cmNlKFxuICAgICAgbmV3IGV2ZW50U291cmNlcy5TcXNFdmVudFNvdXJjZShjYXRhbG9nSXRlbXNRdWV1ZSwge1xuICAgICAgICBiYXRjaFNpemU6IDUsXG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyAtLS0gU05TIHRvcGljIGFuZCBlbWFpbCBzdWJzY3JpcHRpb24gLS0tXG4gICAgY29uc3QgY3JlYXRlUHJvZHVjdFRvcGljID0gbmV3IHNucy5Ub3BpYyh0aGlzLCBcImNyZWF0ZVByb2R1Y3RUb3BpY1wiKTtcblxuICAgIG5ldyBzbnMuU3Vic2NyaXB0aW9uKHRoaXMsIFwiZW1haWxTdWJzY3JpcHRpb25cIiwge1xuICAgICAgdG9waWM6IGNyZWF0ZVByb2R1Y3RUb3BpYyxcbiAgICAgIHByb3RvY29sOiBzbnMuU3Vic2NyaXB0aW9uUHJvdG9jb2wuRU1BSUwsXG4gICAgICBlbmRwb2ludDogXCJtYWhlbmRyYV95YWRhdkBlcGFtLmNvbVwiLCBcbiAgICB9KTtcblxuICAgIGNyZWF0ZVByb2R1Y3RUb3BpYy5ncmFudFB1Ymxpc2goY2F0YWxvZ0JhdGNoUHJvY2Vzcyk7XG5cbiAgICBjYXRhbG9nQmF0Y2hQcm9jZXNzLmFkZEVudmlyb25tZW50KFwiU05TX1RPUElDXCIsIGNyZWF0ZVByb2R1Y3RUb3BpYy50b3BpY0Fybik7XG4gICAgLy8gLS0tIGVuZCBTTlMgYWRkaXRpb25zIC0tLVxuXG4gICAgLy8gUmVmZXJlbmNlIHRoZSBleGlzdGluZyBMYW1iZGEgZnVuY3Rpb24gYnkgQVJOXG4gICAgLy8gY29uc3QgaW1wb3J0RmlsZVBhcnNlciA9IGxhbWJkYS5GdW5jdGlvbi5mcm9tRnVuY3Rpb25Bcm4oXG4gICAgLy8gICB0aGlzLFxuICAgIC8vICAgXCJJbXBvcnRGaWxlUGFyc2VyRnVuY3Rpb25cIixcbiAgICAvLyAgIFwiYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjgzNzI4MjkyMzY5ODpmdW5jdGlvbjppbXBvcnRGaWxlUGFyc2VyXCJcbiAgICAvLyApO1xuICAgIGNvbnN0IGltcG9ydEZpbGVQYXJzZXIgPSBsYW1iZGEuRnVuY3Rpb24uZnJvbUZ1bmN0aW9uQXR0cmlidXRlcyh0aGlzLCBcIkltcG9ydEZpbGVQYXJzZXJGdW5jdGlvblwiLCB7XG4gICAgICBmdW5jdGlvbkFybjogXCJhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6ODM3MjgyOTIzNjk4OmZ1bmN0aW9uOmltcG9ydEZpbGVQYXJzZXJcIixcbiAgICAgIHJvbGU6IGlhbS5Sb2xlLmZyb21Sb2xlQXJuKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIkltcG9ydEZpbGVQYXJzZXJSb2xlXCIsXG4gICAgICAgIFwiYXJuOmF3czppYW06OjgzNzI4MjkyMzY5ODpyb2xlL2ltcG9ydEZpbGVQYXJzZXJSb2xlXCIsXG4gICAgICAgIHsgbXV0YWJsZTogZmFsc2UgfVxuICAgICAgKVxuICAgIH0pO1xuXG4gICAgLy8gNC4gUGVybWlzc2lvbnMg4oCUIGFsbG93IGltcG9ydEZpbGVQYXJzZXIgdG8gc2VuZCBTUVMgbWVzc2FnZXNcbiAgICBjYXRhbG9nSXRlbXNRdWV1ZS5ncmFudFNlbmRNZXNzYWdlcyhpbXBvcnRGaWxlUGFyc2VyKTtcblxuICAgIC8vIEFQSSBHYXRld2F5IFJFU1QgQVBJXG4gICAgY29uc3QgYXBpID0gbmV3IGFwaWdhdGV3YXkuUmVzdEFwaSh0aGlzLCAnUHJvZHVjdFNlcnZpY2VBcGknLCB7XG4gICAgICByZXN0QXBpTmFtZTogJ1Byb2R1Y3QgU2VydmljZScsXG4gICAgICBkZWZhdWx0Q29yc1ByZWZsaWdodE9wdGlvbnM6IHtcbiAgICAgICAgYWxsb3dPcmlnaW5zOiBhcGlnYXRld2F5LkNvcnMuQUxMX09SSUdJTlMsIFxuICAgICAgICBhbGxvd01ldGhvZHM6IFsnR0VUJywgJ1BPU1QnLCAnT1BUSU9OUyddLFxuICAgICAgICBhbGxvd0hlYWRlcnM6IFsnQ29udGVudC1UeXBlJywgJ0F1dGhvcml6YXRpb24nLCAnWC1BbXotRGF0ZScsICdYLUFwaS1LZXknLCAnWC1BbXotU2VjdXJpdHktVG9rZW4nLCAnWC1BbXotVXNlci1BZ2VudCddXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gL3Byb2R1Y3RzIHJlc291cmNlXG4gICAgY29uc3QgcHJvZHVjdHMgPSBhcGkucm9vdC5hZGRSZXNvdXJjZSgncHJvZHVjdHMnKTtcbiAgICBjb25zdCBnZXRQcm9kdWN0c0ludGVncmF0aW9uID0gbmV3IGFwaWdhdGV3YXkuTGFtYmRhSW50ZWdyYXRpb24oZ2V0UHJvZHVjdHNMYW1iZGEsIHtcbiAgICAgIHByb3h5OiB0cnVlLFxuICAgIH0pO1xuICAgIHByb2R1Y3RzLmFkZE1ldGhvZCgnR0VUJywgZ2V0UHJvZHVjdHNJbnRlZ3JhdGlvbiwge1xuICAgICAgbWV0aG9kUmVzcG9uc2VzOiBbeyBzdGF0dXNDb2RlOiAnMjAwJyB9XSxcbiAgICB9KTtcblxuICAgIC8vIC9wcm9kdWN0cy97cHJvZHVjdElkfSByZXNvdXJjZVxuICAgIGNvbnN0IHByb2R1Y3RJZFJlc291cmNlID0gcHJvZHVjdHMuYWRkUmVzb3VyY2UoJ3twcm9kdWN0SWR9Jyk7XG4gICAgY29uc3QgZ2V0UHJvZHVjdEJ5SWRJbnRlZ3JhdGlvbiA9IG5ldyBhcGlnYXRld2F5LkxhbWJkYUludGVncmF0aW9uKGdldFByb2R1Y3RzQnlJZExhbWJkYSwge1xuICAgICAgcHJveHk6IHRydWUsXG4gICAgfSk7XG4gICAgcHJvZHVjdElkUmVzb3VyY2UuYWRkTWV0aG9kKCdHRVQnLCBnZXRQcm9kdWN0QnlJZEludGVncmF0aW9uLCB7XG4gICAgICBtZXRob2RSZXNwb25zZXM6IFt7IHN0YXR1c0NvZGU6ICcyMDAnIH0sIHsgc3RhdHVzQ29kZTogJzQwNCcgfSwgeyBzdGF0dXNDb2RlOiAnNDAwJyB9XSxcbiAgICB9KTtcbiAgICBcbiAgICBwcm9kdWN0cy5hZGRNZXRob2QoJ1BPU1QnLCBuZXcgYXBpZ2F0ZXdheS5MYW1iZGFJbnRlZ3JhdGlvbihjcmVhdGVQcm9kdWN0TGFtYmRhLCB7IHByb3h5OiB0cnVlIH0pLCB7XG4gICAgICBtZXRob2RSZXNwb25zZXM6IFt7IHN0YXR1c0NvZGU6ICcyMDEnIH0sIHsgc3RhdHVzQ29kZTogJzQwMCcgfV1cbiAgICB9KTtcblxuICAgIC8vIEV4cG9ydCBBUEkgVVJMIGZvciBlYXN5IGFjY2Vzc1xuICAgIHRoaXMucHJvZHVjdHNBcGlVcmwgPSBhcGkudXJsO1xuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdQcm9kdWN0c0FwaVVybCcsIHtcbiAgICAgIHZhbHVlOiBgJHt0aGlzLnByb2R1Y3RzQXBpVXJsfXByb2R1Y3RzYCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnR0VUIGVuZHBvaW50IGZvciBwcm9kdWN0cycsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/lib/product-service-stack.ts b/lib/product-service-stack.ts index cd7a904..536db15 100644 --- a/lib/product-service-stack.ts +++ b/lib/product-service-stack.ts @@ -1,9 +1,15 @@ import * as cdk from 'aws-cdk-lib'; +import * as iam from "aws-cdk-lib/aws-iam"; + import { Construct } from 'constructs'; import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as apigateway from 'aws-cdk-lib/aws-apigateway'; import * as path from 'path'; import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; +import * as sqs from 'aws-cdk-lib/aws-sqs'; +import * as eventSources from 'aws-cdk-lib/aws-lambda-event-sources'; +import * as sns from 'aws-cdk-lib/aws-sns'; +import * as subscriptions from 'aws-cdk-lib/aws-sns-subscriptions'; export class ProductServiceStack extends cdk.Stack { public readonly productsApiUrl: string; @@ -69,6 +75,58 @@ export class ProductServiceStack extends cdk.Stack { productsTable.grantWriteData(createProductLambda); stockTable.grantWriteData(createProductLambda); + // 1. Create SQS queue catalogItemsQueue + const catalogItemsQueue = new sqs.Queue(this, "catalogItemsQueue", { + visibilityTimeout: cdk.Duration.seconds(30), + }); + + // 2. Create the Lambda catalogBatchProcess + const catalogBatchProcess = new lambda.Function(this, "catalogBatchProcess", { + runtime: lambda.Runtime.NODEJS_18_X, + handler: "index.handler", + code: lambda.Code.fromAsset("lambda/catalogBatchProcess"), + environment: { + PRODUCTS_TABLE: productsTable.tableName, + SQS_URL: catalogItemsQueue.queueUrl, + }, + }); + + // 3. Grant Lambda permissions + productsTable.grantWriteData(catalogBatchProcess); + + // 4. SQS → Lambda event source (batch size = 5) + catalogBatchProcess.addEventSource( + new eventSources.SqsEventSource(catalogItemsQueue, { + batchSize: 5, + }) + ); + + // --- SNS topic and email subscription --- + const createProductTopic = new sns.Topic(this, "createProductTopic"); + + new sns.Subscription(this, "emailSubscription", { + topic: createProductTopic, + protocol: sns.SubscriptionProtocol.EMAIL, + endpoint: "mahendra_yadav@epam.com", + }); + + createProductTopic.grantPublish(catalogBatchProcess); + + catalogBatchProcess.addEnvironment("SNS_TOPIC", createProductTopic.topicArn); + // --- end SNS additions --- + + const importFileParser = lambda.Function.fromFunctionAttributes(this, "ImportFileParserFunction", { + functionArn: "arn:aws:lambda:us-east-1:837282923698:function:importFileParser", + role: iam.Role.fromRoleArn( + this, + "ImportFileParserRole", + "arn:aws:iam::837282923698:role/importFileParserRole", + { mutable: false } + ) + }); + + // 4. Permissions — allow importFileParser to send SQS messages + catalogItemsQueue.grantSendMessages(importFileParser); // API Gateway REST API const api = new apigateway.RestApi(this, 'ProductServiceApi', {