diff --git a/app/src/main/java/com/renaghan/todo/IndexController.java b/app/src/main/java/com/renaghan/todo/IndexController.java index e3b1149..15c1461 100644 --- a/app/src/main/java/com/renaghan/todo/IndexController.java +++ b/app/src/main/java/com/renaghan/todo/IndexController.java @@ -1,18 +1,30 @@ package com.renaghan.todo; +import com.renaghan.todo.tracing.TracingEvent; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import java.security.Principal; + @Controller @RequestMapping("/") public class IndexController { - public IndexController() {} + private final ApplicationEventPublisher eventPublisher; + + public IndexController(ApplicationEventPublisher eventPublisher) { + this.eventPublisher = eventPublisher; + } @GetMapping - public String getIndex() { + @RequestMapping("/") + public String getIndex(Principal principal) { + this.eventPublisher.publishEvent( + new TracingEvent(this, "index", principal != null ? principal.getName() : "anonymous")); + return "index"; } } diff --git a/app/src/main/java/com/renaghan/todo/tracing/TraceDao.java b/app/src/main/java/com/renaghan/todo/tracing/TraceDao.java index d4f7d18..3a8ce14 100644 --- a/app/src/main/java/com/renaghan/todo/tracing/TraceDao.java +++ b/app/src/main/java/com/renaghan/todo/tracing/TraceDao.java @@ -1,7 +1,9 @@ package com.renaghan.todo.tracing; import io.awspring.cloud.dynamodb.DynamoDbTemplate; +import java.time.Instant; import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.UUID; import org.slf4j.Logger; @@ -33,7 +35,7 @@ public void storeTracingEvent(TracingEvent tracingEvent) { breadcrumb.setId(UUID.randomUUID().toString()); breadcrumb.setUri(tracingEvent.getUri()); breadcrumb.setUsername(tracingEvent.getUsername()); - breadcrumb.setTimestamp(ZonedDateTime.now().toString()); + breadcrumb.setTimestamp(Instant.now().truncatedTo(ChronoUnit.SECONDS).toString()); dynamoDbTemplate.save(breadcrumb); @@ -58,7 +60,8 @@ public List findAllEventsForUser(String username) { } public List findUserTraceForLastTwoWeeks(String username) { - ZonedDateTime twoWeeksAgo = ZonedDateTime.now().minusWeeks(2); + Instant twoWeeksAgo = + ZonedDateTime.now().minusWeeks(2).toInstant().truncatedTo(ChronoUnit.SECONDS); Breadcrumb breadcrumb = new Breadcrumb(); breadcrumb.setUsername(username); diff --git a/app/src/main/resources/application-dev.yml b/app/src/main/resources/application-dev.yml index f803990..63ae7b2 100644 --- a/app/src/main/resources/application-dev.yml +++ b/app/src/main/resources/application-dev.yml @@ -51,9 +51,9 @@ management: # noinspection SpringBootApplicationYaml custom: - environment: local use-cognito-as-identity-provider: false auto-confirm-collaborations: true web-socket-relay-use-ssl: false provide-test-todo-controller: true + environment: dev diff --git a/app/src/test/resources/localstack/local-aws-infrastructure.sh b/app/src/test/resources/localstack/local-aws-infrastructure.sh index eb7bc38..67b148f 100755 --- a/app/src/test/resources/localstack/local-aws-infrastructure.sh +++ b/app/src/test/resources/localstack/local-aws-infrastructure.sh @@ -9,7 +9,7 @@ awslocal ses verify-email-identity --email-address bjoern@stratospheric.dev awslocal ses verify-email-identity --email-address philip@stratospheric.dev awslocal dynamodb create-table \ - --table-name local-todo-app-breadcrumb \ + --table-name dev-todo-app-breadcrumb \ --attribute-definitions AttributeName=id,AttributeType=S \ --key-schema AttributeName=id,KeyType=HASH \ --provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=10 \ diff --git a/cdk/src/main/java/com/renaghan/todo/cdk/Infrastructure.java b/cdk/src/main/java/com/renaghan/todo/cdk/Infrastructure.java index 0526e56..06852f1 100644 --- a/cdk/src/main/java/com/renaghan/todo/cdk/Infrastructure.java +++ b/cdk/src/main/java/com/renaghan/todo/cdk/Infrastructure.java @@ -3,9 +3,16 @@ import dev.stratospheric.cdk.DockerRepository; import dev.stratospheric.cdk.Network; import software.amazon.awscdk.Duration; +import software.amazon.awscdk.RemovalPolicy; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.services.certificatemanager.DnsValidatedCertificate; +import software.amazon.awscdk.services.dynamodb.Attribute; +import software.amazon.awscdk.services.dynamodb.AttributeType; +import software.amazon.awscdk.services.dynamodb.BillingMode; +import software.amazon.awscdk.services.dynamodb.Table; +import software.amazon.awscdk.services.dynamodb.TableEncryption; +import software.amazon.awscdk.services.dynamodb.TableProps; import software.amazon.awscdk.services.route53.ARecord; import software.amazon.awscdk.services.route53.HostedZone; import software.amazon.awscdk.services.route53.HostedZoneProviderProps; @@ -23,7 +30,6 @@ public class Infrastructure { private IHostedZone hostedZone; private String certARN; private Network network; - private Database database; Infrastructure() { this.app = new CDKApp(); @@ -88,14 +94,13 @@ private void cognito() { } private void database() { - this.database = - new Database( - app, - stack, - network, - new Database.DatabaseInputParameters() - .withPostgresVersion("16.4") - .withInstanceClass("db.t4g.micro")); + new Database( + app, + stack, + network, + new Database.DatabaseInputParameters() + .withPostgresVersion("16.4") + .withInstanceClass("db.t4g.micro")); } private void messaging() { @@ -105,20 +110,33 @@ private void messaging() { .retentionPeriod(Duration.days(14)) .build(); - Queue todoSharingQueue = - Queue.Builder.create(stack, "todoSharingQueue") - .queueName(app.appEnv().prefix("todo-sharing-queue")) - .visibilityTimeout(Duration.seconds(30)) - .retentionPeriod(Duration.days(14)) - .deadLetterQueue( - DeadLetterQueue.builder().queue(todoSharingDlq).maxReceiveCount(3).build()) - .build(); + Queue.Builder.create(stack, "todoSharingQueue") + .queueName(app.appEnv().prefix("todo-sharing-queue")) + .visibilityTimeout(Duration.seconds(30)) + .retentionPeriod(Duration.days(14)) + .deadLetterQueue(DeadLetterQueue.builder().queue(todoSharingDlq).maxReceiveCount(3).build()) + .build(); } private void activeMQ() { new ActiveMQ(app, stack, network); } + private void dynamoDB() { + new Table( + stack, + "BreadcrumbsDynamoDbTable", + TableProps.builder() + .partitionKey(Attribute.builder().type(AttributeType.STRING).name("id").build()) + .tableName(app.appEnv().prefix("breadcrumb")) + .encryption(TableEncryption.AWS_MANAGED) + .billingMode(BillingMode.PROVISIONED) + .readCapacity(10) + .writeCapacity(10) + .removalPolicy(RemovalPolicy.DESTROY) + .build()); + } + private void generate() { dockerRepo(); cert(); @@ -128,6 +146,7 @@ private void generate() { messaging(); database(); activeMQ(); + dynamoDB(); app.appEnv().tag(stack); app.synth(); }