diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..20dac54 --- /dev/null +++ b/.env.example @@ -0,0 +1,7 @@ +DATABASE_URL=jdbc:postgresql://postgres:5432/db +DATABASE_PASSWORD=password +DATABASE_USERNAME=user + +S3_ENDPOINT=http://s3:9000 +S3_ACCESS_KEY=minioadmin +S3_SECRET_KEY=minioadmin diff --git a/.gitignore b/.gitignore index 667aaef..b9fcd77 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ build/ ### VS Code ### .vscode/ + +.env diff --git a/pom.xml b/pom.xml index 23ab33b..4655418 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,7 @@ 21 3.2.4 + 4.0.0 @@ -81,6 +82,12 @@ s3 + + me.paulschwarz + spring-dotenv + ${spring-dotenv.version} + + org.postgresql postgresql diff --git a/src/main/java/com/bivashy/backend/composer/config/StorageS3Config.java b/src/main/java/com/bivashy/backend/composer/config/StorageS3Config.java new file mode 100644 index 0000000..8307caa --- /dev/null +++ b/src/main/java/com/bivashy/backend/composer/config/StorageS3Config.java @@ -0,0 +1,31 @@ +package com.bivashy.backend.composer.config; + +import java.net.URI; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; + +@Configuration +public class StorageS3Config { + @Value("${spring.s3.endpoint}") + private String endpoint; + @Value("${spring.s3.access-key}") + private String accessKey; + @Value("${spring.s3.secret-key}") + private String secretKey; + + @Bean + public S3Client s3Client() { + return S3Client.builder() + .endpointOverride(URI.create(endpoint)) + .region(Region.US_WEST_1) + .credentialsProvider(() -> AwsBasicCredentials.create(accessKey, secretKey)) + .build(); + } + +} diff --git a/src/main/java/com/bivashy/backend/composer/dto/ErrorResponse.java b/src/main/java/com/bivashy/backend/composer/dto/ErrorResponse.java new file mode 100644 index 0000000..2135efc --- /dev/null +++ b/src/main/java/com/bivashy/backend/composer/dto/ErrorResponse.java @@ -0,0 +1,20 @@ +package com.bivashy.backend.composer.dto; + +public class ErrorResponse { + private final int status; + private final String message; + + public ErrorResponse(int status, String message) { + this.status = status; + this.message = message; + } + + public int getStatus() { + return status; + } + + public String getMessage() { + return message; + } + +} diff --git a/src/main/java/com/bivashy/backend/composer/exception/GlobalExceptionHandler.java b/src/main/java/com/bivashy/backend/composer/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..5d6a674 --- /dev/null +++ b/src/main/java/com/bivashy/backend/composer/exception/GlobalExceptionHandler.java @@ -0,0 +1,25 @@ +package com.bivashy.backend.composer.exception; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import com.bivashy.backend.composer.dto.ErrorResponse; + +@ControllerAdvice +public class GlobalExceptionHandler { + private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + @ExceptionHandler(DataIntegrityViolationException.class) + public ResponseEntity handleDataIntegrityViolation(DataIntegrityViolationException ex) { + ErrorResponse error = new ErrorResponse( + HttpStatus.CONFLICT.value(), + "Conflict: " + ex.getMostSpecificCause().getMessage()); + logger.error("SQL create conflict", ex); + return ResponseEntity.status(HttpStatus.CONFLICT).body(error); + } +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 345078e..b4b4fcf 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -3,9 +3,14 @@ spring: name: composer datasource: driver-class-name: org.postgresql.Driver - password: password - url: jdbc:postgresql://postgres:5432/db - username: user + username: ${DATABASE_USERNAME} + password: ${DATABASE_PASSWORD} + url: ${DATABASE_URL} + s3: + endpoint: ${S3_ENDPOINT} + access-key: ${S3_ACCESS_KEY} + secret-key: ${S3_SECRET_KEY} + bucket: ${S3_BUCKET} logging: level: