diff --git a/cdk_java/.gitignore b/cdk_java/.gitignore new file mode 100644 index 000000000..1db21f162 --- /dev/null +++ b/cdk_java/.gitignore @@ -0,0 +1,13 @@ +.classpath.txt +target +.classpath +.project +.idea +.settings +.vscode +*.iml + +# CDK asset staging directory +.cdk.staging +cdk.out + diff --git a/cdk_java/README.md b/cdk_java/README.md new file mode 100644 index 000000000..516ef71a2 --- /dev/null +++ b/cdk_java/README.md @@ -0,0 +1,18 @@ +# Welcome to your CDK Java project! + +This is a blank project for CDK development with Java. + +The `cdk.json` file tells the CDK Toolkit how to execute your app. + +It is a [Maven](https://maven.apache.org/) based project, so you can open this project with any Maven compatible Java IDE to build and run tests. + +## Useful commands + + * `mvn package` compile and run tests + * `cdk ls` list all stacks in the app + * `cdk synth` emits the synthesized CloudFormation template + * `cdk deploy` deploy this stack to your default AWS account/region + * `cdk diff` compare deployed stack with current state + * `cdk docs` open CDK documentation + +Enjoy! diff --git a/cdk_java/cdk.json b/cdk_java/cdk.json new file mode 100644 index 000000000..723b2f18b --- /dev/null +++ b/cdk_java/cdk.json @@ -0,0 +1,68 @@ +{ + "app": "mvn -e -q compile exec:java", + "watch": { + "include": [ + "**" + ], + "exclude": [ + "README.md", + "cdk*.json", + "target", + "pom.xml", + "src/test" + ] + }, + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": [ + "aws", + "aws-cn" + ], + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, + "@aws-cdk/aws-iam:standardizedServicePrincipals": true, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, + "@aws-cdk/aws-route53-patters:useCertificate": true, + "@aws-cdk/customresources:installLatestAwsSdkDefault": false, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, + "@aws-cdk/aws-redshift:columnId": true, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, + "@aws-cdk/aws-kms:aliasNameRef": true, + "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, + "@aws-cdk/aws-efs:denyAnonymousAccess": true, + "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, + "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, + "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, + "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, + "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, + "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true, + "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true, + "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true, + "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true, + "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true, + "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true, + "@aws-cdk/aws-eks:nodegroupNameAttribute": true, + "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": true, + "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": true, + "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": false + } +} diff --git a/cdk_java/pom.xml b/cdk_java/pom.xml new file mode 100644 index 000000000..944fd80c5 --- /dev/null +++ b/cdk_java/pom.xml @@ -0,0 +1,88 @@ + + + 4.0.0 + + com.myorg + cdk_java + 0.1 + + + UTF-8 + 2.145.0 + [10.0.0,11.0.0) + 5.7.1 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + com.myorg.CdkJavaApp + + + + + + + + + software.amazon.awscdk + aws-cdk-lib + ${cdk.version} + + + + software.constructs + constructs + ${constructs.version} + + + + + com.amazonaws + aws-java-sdk-core + 1.12.738 + + + + + com.amazonaws + aws-java-sdk-s3 + 1.12.738 + + + + + com.amazonaws + aws-java-sdk-cloudfront + 1.12.738 + + + + + com.amazonaws + aws-java-sdk-iam + 1.12.738 + + + + org.junit.jupiter + junit-jupiter + ${junit.version} + test + + + diff --git a/cdk_java/src/main/java/com/myorg/CdkJavaApp.java b/cdk_java/src/main/java/com/myorg/CdkJavaApp.java new file mode 100644 index 000000000..009445f8a --- /dev/null +++ b/cdk_java/src/main/java/com/myorg/CdkJavaApp.java @@ -0,0 +1,42 @@ +package com.myorg; + +import software.amazon.awscdk.App; +import software.amazon.awscdk.Environment; +import software.amazon.awscdk.StackProps; + +import java.util.Arrays; + +public class CdkJavaApp { + public static void main(final String[] args) { + App app = new App(); + + new CdkJavaStack(app, "CdkJavaStack", StackProps.builder() + // If you don't specify 'env', this stack will be environment-agnostic. + // Account/Region-dependent features and context lookups will not work, + // but a single synthesized template can be deployed anywhere. + + // Uncomment the next block to specialize this stack for the AWS Account + // and Region that are implied by the current CLI configuration. + /* + .env(Environment.builder() + .account(System.getenv("CDK_DEFAULT_ACCOUNT")) + .region(System.getenv("CDK_DEFAULT_REGION")) + .build()) + */ + + // Uncomment the next block if you know exactly what Account and Region you + // want to deploy the stack to. + /* + .env(Environment.builder() + .account("123456789012") + .region("us-east-1") + .build()) + */ + + // For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html + .build()); + + app.synth(); + } +} + diff --git a/cdk_java/src/main/java/com/myorg/CdkJavaStack.java b/cdk_java/src/main/java/com/myorg/CdkJavaStack.java new file mode 100644 index 000000000..5d775a7fe --- /dev/null +++ b/cdk_java/src/main/java/com/myorg/CdkJavaStack.java @@ -0,0 +1,73 @@ +package com.myorg; + +import software.amazon.awscdk.services.cloudfront.*; +import software.amazon.awscdk.services.iam.Effect; +import software.amazon.awscdk.services.iam.PolicyStatement; +import software.amazon.awscdk.services.s3.Bucket; +import software.amazon.awscdk.services.s3.BucketAccessControl; +import software.amazon.awscdk.services.s3.deployment.BucketDeployment; +import software.amazon.awscdk.services.s3.deployment.Source; +import software.constructs.Construct; +import software.amazon.awscdk.Stack; +import software.amazon.awscdk.StackProps; + + +import java.util.Collections; +import java.util.List; +// import software.amazon.awscdk.Duration; +// import software.amazon.awscdk.services.sqs.Queue; + +public class CdkJavaStack extends Stack { + public CdkJavaStack(final Construct scope, final String id) { + this(scope, id, null); + } + + public CdkJavaStack(final Construct scope, final String id, final StackProps props) { + super(scope, id, props); + + // The code that defines your stack goes here + + // example resource + // final Queue queue = Queue.Builder.create(this, "CdkJavaQueue") + // .visibilityTimeout(Duration.seconds(300)) + // .build(); + + Bucket myBucket = Bucket.Builder.create(this, "MyBucket") + .versioned(false) + .bucketName("rs-spa") + .websiteIndexDocument("index.html") + .websiteErrorDocument("index.html") + .publicReadAccess(false) + .accessControl(BucketAccessControl.PRIVATE) + .build(); + + OriginAccessIdentity originAccessIdentity = OriginAccessIdentity.Builder.create(this, "OAI") + .comment("OAI for my SPA") + .build(); + + myBucket.addToResourcePolicy(PolicyStatement.Builder.create() + .effect(Effect.ALLOW) + .principals(Collections.singletonList(originAccessIdentity.getGrantPrincipal())) + .actions(Collections.singletonList("s3:GetObject")) + .resources(Collections.singletonList(myBucket.arnForObjects("*"))) + .build()); + + CloudFrontWebDistribution distribution = CloudFrontWebDistribution.Builder.create(this, "SiteDistribution") + .originConfigs(Collections.singletonList( + SourceConfiguration.builder() + .s3OriginSource(S3OriginConfig.builder() + .s3BucketSource(myBucket) + .originAccessIdentity(originAccessIdentity) + .build()) + .behaviors(Collections.singletonList(Behavior.builder().isDefaultBehavior(true).build())) + .build())) + .build(); + + BucketDeployment.Builder.create(this, "DeployWebsite") + .sources(Collections.singletonList(Source.asset("../dist"))) + .destinationBucket(myBucket) + .distribution(distribution) + .distributionPaths(Collections.singletonList("/*")) // Инвалидация всех путей + .build(); + } +} diff --git a/cdk_java/src/test/java/com/myorg/CdkJavaTest.java b/cdk_java/src/test/java/com/myorg/CdkJavaTest.java new file mode 100644 index 000000000..dd210307f --- /dev/null +++ b/cdk_java/src/test/java/com/myorg/CdkJavaTest.java @@ -0,0 +1,26 @@ +// package com.myorg; + +// import software.amazon.awscdk.App; +// import software.amazon.awscdk.assertions.Template; +// import java.io.IOException; + +// import java.util.HashMap; + +// import org.junit.jupiter.api.Test; + +// example test. To run these tests, uncomment this file, along with the +// example resource in java/src/main/java/com/myorg/CdkJavaStack.java +// public class CdkJavaTest { + +// @Test +// public void testStack() throws IOException { +// App app = new App(); +// CdkJavaStack stack = new CdkJavaStack(app, "test"); + +// Template template = Template.fromStack(stack); + +// template.hasResourceProperties("AWS::SQS::Queue", new HashMap() {{ +// put("VisibilityTimeout", 300); +// }}); +// } +// } diff --git a/package.json b/package.json index 632fd8370..b66e5f9e5 100755 --- a/package.json +++ b/package.json @@ -5,6 +5,8 @@ "scripts": { "start": "vite", "build": "tsc && vite build", + "deploy": "npm run build && cd cdk_java && cdk deploy", + "destroy": "cd cdk_java && cdk destroy -f", "preview": "npm run build && vite preview", "test": "vitest", "test:ui": "vitest --ui", diff --git a/src/constants/apiPaths.ts b/src/constants/apiPaths.ts index 6846a7534..06a787361 100755 --- a/src/constants/apiPaths.ts +++ b/src/constants/apiPaths.ts @@ -1,5 +1,5 @@ const API_PATHS = { - product: "https://.execute-api.eu-west-1.amazonaws.com/dev", + product: "https://wa015rf5vk.execute-api.eu-central-1.amazonaws.com/prod/", order: "https://.execute-api.eu-west-1.amazonaws.com/dev", import: "https://.execute-api.eu-west-1.amazonaws.com/dev", bff: "https://.execute-api.eu-west-1.amazonaws.com/dev", diff --git a/src/queries/products.ts b/src/queries/products.ts index 090a803f3..3567aa0c4 100644 --- a/src/queries/products.ts +++ b/src/queries/products.ts @@ -9,7 +9,7 @@ export function useAvailableProducts() { "available-products", async () => { const res = await axios.get( - `${API_PATHS.bff}/product/available` + `${API_PATHS.product}/products` ); return res.data; } @@ -29,7 +29,7 @@ export function useAvailableProduct(id?: string) { ["product", { id }], async () => { const res = await axios.get( - `${API_PATHS.bff}/product/${id}` + `${API_PATHS.product}/products/${id}` ); return res.data; }, @@ -48,7 +48,7 @@ export function useRemoveProductCache() { export function useUpsertAvailableProduct() { return useMutation((values: AvailableProduct) => - axios.put(`${API_PATHS.bff}/product`, values, { + axios.post(`${API_PATHS.product}/products`, values, { headers: { Authorization: `Basic ${localStorage.getItem("authorization_token")}`, },