Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Gradle Modules #18

Draft
wants to merge 4 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 9 additions & 15 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
plugins {
id 'org.springframework.boot' version '3.0.1'
id 'io.spring.dependency-management' version '1.1.0'
id 'spring-conventions'
id 'java'
id "java-conventions"
id "mapstruct-conventions"
id "jib-conventions"
id "release-conventions"
id 'testcontainers-conventions'
}

group = 'de.innovationhub.prox'
Expand All @@ -17,18 +17,17 @@ repositories {
}

ext {
set('testcontainersVersion', "1.17.4")
set('restassuredVersion', "5.3.0")
set('springCloudVersion', "2022.0.0")
set('springdocVersion', "2.0.2")
}

springBoot {
buildInfo()
}

dependencies {
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
implementation project(":modules:commons")
implementation project(":infrastructure:keycloak")
implementation project(":infrastructure:cache")
implementation project(":infrastructure:rabbitmq")
implementation project(":infrastructure:aws")

implementation "com.google.code.findbugs:annotations:3.0.1u2"

Expand Down Expand Up @@ -62,13 +61,11 @@ dependencies {
runtimeOnly 'org.postgresql:postgresql'

testImplementation 'org.awaitility:awaitility:4.2.0'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.amqp:spring-rabbit-test'
testImplementation 'org.springframework.security:spring-security-test'
testImplementation("io.rest-assured:rest-assured:${restassuredVersion}")
testImplementation("io.rest-assured:json-path:${restassuredVersion}")
testImplementation("io.rest-assured:spring-mock-mvc:${restassuredVersion}")
testImplementation 'org.testcontainers:junit-jupiter'
testImplementation 'org.testcontainers:postgresql'
testImplementation 'org.testcontainers:rabbitmq'
testImplementation 'org.testcontainers:localstack'
Expand All @@ -84,11 +81,8 @@ dependencies {
}
}

dependencyManagement {
imports {
mavenBom "org.testcontainers:testcontainers-bom:${testcontainersVersion}"
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
bootJar {
enabled = true
}

tasks.named('test') {
Expand Down
2 changes: 2 additions & 0 deletions buildSrc/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,6 @@ dependencies {
implementation "io.ebean:ebean-gradle-plugin:13.11.1"
implementation "com.google.cloud.tools:jib-gradle-plugin:3.3.1"
implementation "net.researchgate:gradle-release:3.0.2"
implementation "org.springframework.boot:spring-boot-gradle-plugin:3.0.1"
implementation "io.spring.gradle:dependency-management-plugin:1.1.0"
}
38 changes: 38 additions & 0 deletions buildSrc/src/main/groovy/spring-conventions.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
plugins {
id 'java'
id 'org.springframework.boot'
id 'io.spring.dependency-management'
}

ext {
set('springCloudVersion', "2022.0.0")
}

springBoot {
buildInfo()
}

bootJar {
enabled = false
}

jar {
enabled = true
}

dependencies {
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"

implementation 'org.springframework.boot:spring-boot-starter'
// TODO: We might place them elswhere
implementation 'io.swagger.core.v3:swagger-annotations:2.2.8'


testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
13 changes: 13 additions & 0 deletions buildSrc/src/main/groovy/testcontainers-conventions.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
plugins {
id 'java'
}

dependencies {
testImplementation 'org.testcontainers:junit-jupiter'
}

dependencyManagement {
imports {
mavenBom "org.testcontainers:testcontainers-bom:1.17.4"
}
}
16 changes: 16 additions & 0 deletions infrastructure/aws/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
plugins {
id 'java'
id 'java-conventions'
id 'spring-conventions'
id 'testcontainers-conventions'
}

repositories {
mavenCentral()
}

dependencies {
implementation "com.amazonaws:aws-java-sdk-s3:1.12.380"
implementation "org.springframework.boot:spring-boot-starter"
testImplementation 'org.testcontainers:localstack'
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.innovationhub.prox.infra.storage;
package de.innovationhub.prox.infra.aws;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
Expand All @@ -7,6 +7,7 @@
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

Expand All @@ -16,12 +17,14 @@ public class AwsConfig {
private final AwsConfigurationProperties config;

@Bean
@ConditionalOnMissingBean
public AWSCredentials awsCredentials() {
return new BasicAWSCredentials(config.credentials().accessKey(), config.credentials()
.secretKey());
}

@Bean
@ConditionalOnMissingBean
public AmazonS3Client s3(AWSCredentials credentials) {
return (AmazonS3Client) AmazonS3ClientBuilder
.standard()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.innovationhub.prox.infra.storage;
package de.innovationhub.prox.infra.aws;

import org.springframework.boot.context.properties.ConfigurationProperties;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package de.innovationhub.prox.infra.storage;
package de.innovationhub.prox.infra.aws.s3;

import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import de.innovationhub.prox.infra.aws.AwsConfigurationProperties;
import java.io.ByteArrayInputStream;
import org.springframework.stereotype.Component;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.innovationhub.prox.infra.storage;
package de.innovationhub.prox.infra.aws.s3;

import java.io.IOException;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package de.innovationhub.prox.infra.aws.s3.storage;

import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import org.testcontainers.containers.localstack.LocalStackContainer;
import org.testcontainers.containers.localstack.LocalStackContainer.Service;
import org.testcontainers.utility.DockerImageName;

public class AbstractLocalStackTest {

static LocalStackContainer localStack = new LocalStackContainer(
DockerImageName.parse("localstack/localstack:1.3"))
.withServices(LocalStackContainer.Service.S3);

static {
localStack.start();
}

@DynamicPropertySource
static void setLocalStack(DynamicPropertyRegistry registry) {
registry.add("cloud.aws.credentials.accessKey", () -> localStack.getAccessKey());
registry.add("cloud.aws.credentials.secretKey", () -> localStack.getSecretKey());
registry.add("cloud.aws.region", () -> localStack.getRegion());
registry.add("cloud.aws.s3.endpoint", () -> localStack.getEndpointOverride(Service.S3));
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,30 @@
package de.innovationhub.prox.infra.storage;
package de.innovationhub.prox.infra.aws.s3.storage;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;

import com.amazonaws.services.s3.AmazonS3;
import de.innovationhub.prox.AbstractIntegrationTest;
import de.innovationhub.prox.infra.aws.AwsConfig;
import de.innovationhub.prox.infra.aws.AwsConfigurationProperties;
import de.innovationhub.prox.infra.aws.s3.S3StorageProvider;
import java.io.IOException;
import java.util.UUID;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;

// TODO: We probably do not need to spin up spring boot at all. Re-evaluate test slices
class S3StorageProviderIntegrationTest extends AbstractIntegrationTest {
@SpringBootTest
@ContextConfiguration(classes = {S3StorageProvider.class, AwsConfig.class})
@EnableConfigurationProperties(AwsConfigurationProperties.class)
class S3StorageProviderIntegrationTest extends AbstractLocalStackTest {

@Autowired
S3StorageProvider s3StorageProvider;

@Autowired
AmazonS3 s3Client;

@Autowired
AwsConfigurationProperties config;

Expand Down
8 changes: 8 additions & 0 deletions infrastructure/aws/src/test/resources/application.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
cloud:
aws:
region: eu-central-1
credentials:
access-key: ${AWS_ACCESS_KEY:}
secret-key: ${AWS_SECRET_KEY:}
s3:
bucket: ${AWS_S3_BUCKET:prox}
16 changes: 16 additions & 0 deletions infrastructure/cache/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
plugins {
id 'java'
id 'java-conventions'
id 'spring-conventions'
id 'testcontainers-conventions'
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'com.github.ben-manes.caffeine:caffeine'
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.innovationhub.prox.config;
package de.innovationhub.prox.infra.cache;

import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.List;
Expand Down
17 changes: 17 additions & 0 deletions infrastructure/keycloak/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
plugins {
id 'java'
id 'java-library'
id 'java-conventions'
id 'spring-conventions'
}

repositories {
mavenCentral()
}

dependencies {
api "org.keycloak:keycloak-server-spi-private:20.0.2"
api "org.keycloak:keycloak-admin-client:20.0.2"
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.innovationhub.prox.config;
package de.innovationhub.prox.infra.keycloak;

import static org.keycloak.OAuth2Constants.CLIENT_CREDENTIALS;

Expand All @@ -7,6 +7,7 @@
import org.keycloak.admin.client.KeycloakBuilder;
import org.keycloak.admin.client.resource.RealmResource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

Expand All @@ -27,6 +28,7 @@ public class KeycloakConfig {
private String realm;

@Bean
@ConditionalOnMissingBean
public Keycloak keycloak() {
return KeycloakBuilder.builder()
.grantType(CLIENT_CREDENTIALS)
Expand All @@ -38,6 +40,7 @@ public Keycloak keycloak() {
}

@Bean
@ConditionalOnMissingBean
public RealmResource realmResource(Keycloak keycloak) {
return keycloak.realm(realm);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.innovationhub.prox.config;
package de.innovationhub.prox.infra.keycloak;


import java.util.Collection;
Expand Down
13 changes: 13 additions & 0 deletions infrastructure/rabbitmq/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
plugins {
id 'java'
id 'java-conventions'
id 'spring-conventions'
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-amqp'
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.innovationhub.prox.config;
package de.innovationhub.prox.infra.rabbitmq;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
Expand Down
12 changes: 12 additions & 0 deletions modules/commons/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
plugins {
id 'java'
id "java-conventions"
id 'spring-conventions'
}

dependencies {
implementation 'org.springframework.data:spring-data-commons'
implementation 'org.springframework.data:spring-data-jpa'
implementation 'jakarta.persistence:jakarta.persistence-api'

}
12 changes: 12 additions & 0 deletions modules/profile/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
plugins {
id 'java'
id "java-conventions"
id 'spring-conventions'
}

dependencies {
implementation 'org.springframework.data:spring-data-commons'
implementation 'org.springframework.data:spring-data-jpa'
implementation 'jakarta.persistence:jakarta.persistence-api'

}
Loading