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: