diff --git a/build.gradle b/build.gradle
index d760df0..ce68457 100644
--- a/build.gradle
+++ b/build.gradle
@@ -15,6 +15,10 @@ jar {
enabled = false
}
+ext {
+ jjwtVersion = "0.11.5"
+}
+
repositories {
mavenCentral()
}
@@ -26,6 +30,9 @@ dependencies {
implementation("org.springframework.boot:spring-boot-starter-amqp")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.integration:spring-integration-mqtt")
+ implementation("io.jsonwebtoken:jjwt-api:${jjwtVersion}")
+ runtimeOnly("io.jsonwebtoken:jjwt-impl:${jjwtVersion}")
+ runtimeOnly("io.jsonwebtoken:jjwt-jackson:${jjwtVersion}")
runtimeOnly("org.postgresql:postgresql")
testImplementation("org.springframework.boot:spring-boot-starter-test")
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/application/DefaultDeployerService.java b/src/main/java/inc/sdt/blokworks/devicedeployer/application/DefaultDeployerService.java
index 54c5894..d4f224c 100644
--- a/src/main/java/inc/sdt/blokworks/devicedeployer/application/DefaultDeployerService.java
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/application/DefaultDeployerService.java
@@ -3,6 +3,7 @@ package inc.sdt.blokworks.devicedeployer.application;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import inc.sdt.blokworks.devicedeployer.domain.AssetApp;
+import inc.sdt.blokworks.devicedeployer.domain.DeployRequest;
import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
import inc.sdt.blokworks.devicedeployer.domain.OperationType;
import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.InboundDeployMessagePayload;
@@ -14,33 +15,42 @@ import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
+import java.util.Optional;
+
@Service
public class DefaultDeployerService implements DeployerService{
private final Logger log;
private final IMqttClient mqttClient;
private final ObjectMapper objectMapper;
private final DeployerRepositoryDelegate deployerRepositoryDelegate;
- private String requestId;
+ private final DeployRequestRepositoryDelegate requestRepositoryDelegate;
+ private final String filePath;
public DefaultDeployerService(IMqttClient mqttClient,
ObjectMapper objectMapper,
- DeployerRepositoryDelegate deployerRepositoryDelegate) {
+ DeployerRepositoryDelegate deployerRepositoryDelegate,
+ DeployRequestRepositoryDelegate requestRepositoryDelegate,
+ @Value("${stackbase.api.host}") String filePath) {
this.log = LoggerFactory.getLogger(this.getClass());
this.mqttClient = mqttClient;
this.objectMapper = objectMapper;
this.deployerRepositoryDelegate = deployerRepositoryDelegate;
+ this.requestRepositoryDelegate = requestRepositoryDelegate;
+ this.filePath = filePath;
}
@Override
public void publish(OutboundMessage deployMessage, String assetCode) {
- log.info("[publish]");
+ log.info("[publish] deployMessage = {}, assetCode = {}", deployMessage, assetCode);
+ final String url = filePath + deployMessage.getFileId();
try {
OutboundMessagePayload payload = new OutboundMessagePayload(
- deployMessage.getFileId(),
+ url,
deployMessage.getName(),
deployMessage.getCommand(),
deployMessage.getEnv(),
@@ -53,24 +63,29 @@ public class DefaultDeployerService implements DeployerService{
message.setPayload(bytes);
mqttClient.publish("/assets/"+assetCode+"/apps/deploy", message);
- requestId = deployMessage.getRequestId();
log.info("[publish] message = {}", message);
}catch (JsonProcessingException | MqttException e) {
throw new IllegalArgumentException();
}
}
+ @Override
+ public DeployRequest save(DeployRequest deployRequest) {
+ log.info("[save] deployRequest = {}", deployRequest);
+ requestRepositoryDelegate.save(deployRequest);
+ return deployRequest;
+ }
+
@Override
public Mono<Void> apply(InboundDeployMessagePayload payload) {
- log.info("[apply] inboundDeployMessagePayload = {}", payload);
- // 배포된 앱 정보 저장
- // request Id 판별
- if(requestId.equals(payload.requestId())) {
+ log.info("[apply] payload = {}", payload);
+ Optional<DeployRequest> deployRequest = requestRepositoryDelegate.findByRequestId(payload.requestId());
+ if(deployRequest.isPresent()) {
return Mono.just(payload)
.doOnNext(deployerRepositoryDelegate)
.then();
}else {
- throw new ConflictException("This process is already exists.");
+ throw new IllegalArgumentException();
}
}
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployRequestRepositoryDelegate.java b/src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployRequestRepositoryDelegate.java
new file mode 100644
index 0000000..ed2af9b
--- /dev/null
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployRequestRepositoryDelegate.java
@@ -0,0 +1,10 @@
+package inc.sdt.blokworks.devicedeployer.application;
+
+import inc.sdt.blokworks.devicedeployer.domain.DeployRequest;
+
+import java.util.Optional;
+
+public interface DeployRequestRepositoryDelegate {
+ DeployRequest save(DeployRequest deployRequest);
+ Optional<DeployRequest> findByRequestId(String requestId);
+}
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployerService.java b/src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployerService.java
index 083f550..0ac5f75 100644
--- a/src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployerService.java
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployerService.java
@@ -1,6 +1,7 @@
package inc.sdt.blokworks.devicedeployer.application;
import inc.sdt.blokworks.devicedeployer.domain.AssetApp;
+import inc.sdt.blokworks.devicedeployer.domain.DeployRequest;
import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.InboundDeployMessagePayload;
import org.springframework.data.domain.Page;
@@ -10,5 +11,6 @@ import java.util.function.Function;
public interface DeployerService extends Function<InboundDeployMessagePayload, Mono<Void>> {
void publish(OutboundMessage assetApp, String assetCode);
+ DeployRequest save(DeployRequest deployRequest);
Page<AssetApp> getAll(String assetCode, int page, int size);
}
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/domain/DeployRequest.java b/src/main/java/inc/sdt/blokworks/devicedeployer/domain/DeployRequest.java
new file mode 100644
index 0000000..59ef682
--- /dev/null
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/domain/DeployRequest.java
@@ -0,0 +1,83 @@
+package inc.sdt.blokworks.devicedeployer.domain;
+
+public class DeployRequest {
+ private String requestId;
+ private String assetCode;
+ private String appName;
+ private OperationType operationType;
+
+ protected DeployRequest() {}
+
+ public DeployRequest(String requestId, String assetCode, String appName, OperationType operationType) {
+ this.requestId = requestId;
+ this.assetCode = assetCode;
+ this.appName = appName;
+ this.operationType = operationType;
+ }
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public String getAssetCode() {
+ return assetCode;
+ }
+
+ public String getAppName() {
+ return appName;
+ }
+
+ public OperationType getOperationType() {
+ return operationType;
+ }
+
+ @Override
+ public String toString() {
+ return "DeployRequest{" +
+ "requestId='" + requestId + '\'' +
+ ", assetCode='" + assetCode + '\'' +
+ ", appName='" + appName + '\'' +
+ ", operationType='" + operationType + '\'' +
+ '}';
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public static final class Builder {
+ private String requestId;
+ private String assetCode;
+ private String appName;
+ private OperationType operationType;
+
+ public Builder requestId(String requestId) {
+ this.requestId = requestId;
+ return this;
+ }
+
+ public Builder assetCode(String assetCode) {
+ this.assetCode = assetCode;
+ return this;
+ }
+
+ public Builder appName(String appName) {
+ this.appName = appName;
+ return this;
+ }
+
+ public Builder operationType(OperationType operationType) {
+ this.operationType = operationType;
+ return this;
+ }
+
+ public DeployRequest build() {
+ DeployRequest deployRequest = new DeployRequest();
+ deployRequest.requestId = this.requestId;
+ deployRequest.assetCode = this.assetCode;
+ deployRequest.appName = this.appName;
+ deployRequest.operationType = this.operationType;
+ return deployRequest;
+ }
+ }
+}
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/domain/OutboundMessage.java b/src/main/java/inc/sdt/blokworks/devicedeployer/domain/OutboundMessage.java
index 9fdd335..2e25ec4 100644
--- a/src/main/java/inc/sdt/blokworks/devicedeployer/domain/OutboundMessage.java
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/domain/OutboundMessage.java
@@ -8,7 +8,6 @@ public class OutboundMessage {
private String name;
private HashMap<String, String> env;
private String command;
- private OperationType operationType;
private String requestId;
protected OutboundMessage() {}
@@ -29,10 +28,6 @@ public class OutboundMessage {
return command;
}
- public OperationType getOperationType() {
- return operationType;
- }
-
public void setRequestId(String requestId) {
this.requestId = requestId;
}
@@ -48,7 +43,6 @@ public class OutboundMessage {
", name='" + name + '\'' +
", env=" + env +
", command='" + command + '\'' +
- ", operationType=" + operationType +
", requestId='" + requestId + '\'' +
'}';
}
@@ -62,7 +56,6 @@ public class OutboundMessage {
private String name;
private HashMap<String, String> env;
private String command;
- private OperationType operationType;
private String requestId;
public Builder fileId(String fileId) {
@@ -85,11 +78,6 @@ public class OutboundMessage {
return this;
}
- public Builder operationType(OperationType operationType) {
- this.operationType = operationType;
- return this;
- }
-
public Builder requestId(String requestId) {
this.requestId = requestId;
return this;
@@ -101,7 +89,6 @@ public class OutboundMessage {
deployMessage.name = this.name;
deployMessage.env = this.env;
deployMessage.command = this.command;
- deployMessage.operationType = this.operationType;
deployMessage.requestId = this.requestId;
return deployMessage;
}
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/mqtt/InboundDeployMessagePayload.java b/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/mqtt/InboundDeployMessagePayload.java
index 9ed20c8..c94d153 100644
--- a/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/mqtt/InboundDeployMessagePayload.java
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/mqtt/InboundDeployMessagePayload.java
@@ -5,10 +5,10 @@ import inc.sdt.blokworks.devicedeployer.domain.Status;
public record InboundDeployMessagePayload(
Status status,
String assetCode,
+ String requestId,
String name,
Long size,
Long releasedAt,
- Long updatedAt,
- String requestId
+ Long updatedAt
) {
}
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/AssetAppEntity.java b/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/AssetAppEntity.java
index d7184f5..05b002f 100644
--- a/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/AssetAppEntity.java
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/AssetAppEntity.java
@@ -2,8 +2,6 @@ package inc.sdt.blokworks.devicedeployer.infrastructure.relational;
import jakarta.persistence.*;
-import java.sql.Timestamp;
-
@Entity(name = "asset_app")
class AssetAppEntity {
@Id
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/AssetAppRelationalRepository.java b/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/AssetAppRelationalRepository.java
index a9c9c78..1422ffc 100644
--- a/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/AssetAppRelationalRepository.java
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/AssetAppRelationalRepository.java
@@ -23,6 +23,7 @@ public class AssetAppRelationalRepository implements DeployerRepositoryDelegate
@Override
public void accept(InboundDeployMessagePayload inboundDeployMessagePayload) {
+ log.info("[accept] payload = {}", inboundDeployMessagePayload);
this.save(this.fromMessage(inboundDeployMessagePayload));
}
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/DeployRequestEntity.java b/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/DeployRequestEntity.java
new file mode 100644
index 0000000..8359da7
--- /dev/null
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/DeployRequestEntity.java
@@ -0,0 +1,50 @@
+package inc.sdt.blokworks.devicedeployer.infrastructure.relational;
+
+import inc.sdt.blokworks.devicedeployer.domain.OperationType;
+import jakarta.persistence.*;
+
+@Entity(name = "deploy_request")
+public class DeployRequestEntity {
+ @Id
+ @GeneratedValue(strategy = GenerationType.UUID)
+ @Column(name = "id")
+ private String id;
+ @Column(name = "request_id")
+ private String requestId;
+ @Column(name = "asset_code", length = 255)
+ private String assetCode;
+ @Column(name = "app_name", length = 255)
+ private String appName;
+ @Enumerated(EnumType.STRING)
+ @Column(name = "operation_type", length = 255)
+ private OperationType operationType;
+
+ protected DeployRequestEntity() {}
+
+ public DeployRequestEntity(String requestId, String assetCode, String appName, OperationType operationType) {
+ this.requestId = requestId;
+ this.assetCode = assetCode;
+ this.appName = appName;
+ this.operationType = operationType;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public String getAssetCode() {
+ return assetCode;
+ }
+
+ public String getAppName() {
+ return appName;
+ }
+
+ public OperationType getOperationType() {
+ return operationType;
+ }
+}
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/DeployRequestJpaRepository.java b/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/DeployRequestJpaRepository.java
new file mode 100644
index 0000000..954bc3a
--- /dev/null
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/DeployRequestJpaRepository.java
@@ -0,0 +1,7 @@
+package inc.sdt.blokworks.devicedeployer.infrastructure.relational;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface DeployRequestJpaRepository extends JpaRepository<DeployRequestEntity, String> {
+ DeployRequestEntity findByRequestId(String requestId);
+}
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/DeployRequestRelationalRepository.java b/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/DeployRequestRelationalRepository.java
new file mode 100644
index 0000000..7db3027
--- /dev/null
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/infrastructure/relational/DeployRequestRelationalRepository.java
@@ -0,0 +1,54 @@
+package inc.sdt.blokworks.devicedeployer.infrastructure.relational;
+
+import inc.sdt.blokworks.devicedeployer.application.DeployRequestRepositoryDelegate;
+import inc.sdt.blokworks.devicedeployer.domain.DeployRequest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.Optional;
+
+@Component
+public class DeployRequestRelationalRepository implements DeployRequestRepositoryDelegate {
+ private final Logger log;
+ private final DeployRequestJpaRepository deployRequestJpaRepository;
+
+ public DeployRequestRelationalRepository(DeployRequestJpaRepository deployRequestJpaRepository) {
+ this.log = LoggerFactory.getLogger(this.getClass());
+ this.deployRequestJpaRepository = deployRequestJpaRepository;
+ }
+
+ @Override
+ public DeployRequest save(DeployRequest deployRequest) {
+ log.info("[save] deployRequest = {}", deployRequest);
+ DeployRequestEntity entity = this.toEntity(deployRequest);
+ deployRequestJpaRepository.save(entity);
+ return deployRequest;
+ }
+
+ @Override
+ public Optional<DeployRequest> findByRequestId(String requestId) {
+ log.info("[findByRequestId] requestId = {}", requestId);
+ DeployRequestEntity entity = deployRequestJpaRepository.findByRequestId(requestId);
+ log.info("[findByRequestId] entity = {}", entity);
+ return Optional.of(this.fromEntity(entity));
+ }
+
+ private DeployRequestEntity toEntity(DeployRequest deployRequest) {
+ return new DeployRequestEntity(
+ deployRequest.getRequestId(),
+ deployRequest.getAssetCode(),
+ deployRequest.getAppName(),
+ deployRequest.getOperationType()
+ );
+ }
+
+ private DeployRequest fromEntity(DeployRequestEntity entity) {
+ return DeployRequest.builder()
+ .requestId(entity.getRequestId())
+ .assetCode(entity.getAssetCode())
+ .appName(entity.getAppName())
+ .operationType(entity.getOperationType())
+ .build();
+ }
+}
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/DeployerController.java b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/DeployerController.java
index 9636826..cbff6c7 100644
--- a/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/DeployerController.java
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/DeployerController.java
@@ -2,15 +2,14 @@ package inc.sdt.blokworks.devicedeployer.presentation;
import inc.sdt.blokworks.devicedeployer.application.DeployerService;
import inc.sdt.blokworks.devicedeployer.application.ProcessService;
-import inc.sdt.blokworks.devicedeployer.domain.AssetApp;
-import inc.sdt.blokworks.devicedeployer.domain.OperationType;
-import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
+import inc.sdt.blokworks.devicedeployer.domain.*;
import inc.sdt.blokworks.devicedeployer.domain.Process;
import inc.sdt.blokworks.devicedeployer.infrastructure.amqp.ResourceMapping;
import jakarta.servlet.http.HttpSession;
import jakarta.validation.Valid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
@@ -47,6 +46,15 @@ public class DeployerController {
String requestId = UUID.randomUUID().toString();
OutboundMessage outboundMessage = outboundMessageResourceConverter.fromResource(assetAppResource);
outboundMessage.setRequestId(requestId);
+
+ DeployRequest deployRequest = DeployRequest.builder()
+ .requestId(requestId)
+ .assetCode(assetCode)
+ .appName(outboundMessage.getName())
+ .operationType(OperationType.DEPLOY)
+ .build();
+
+ DeployRequest request = deployerService.save(deployRequest);
deployerService.publish(outboundMessage, assetCode);
}
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/MqttMessageHandler.java b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/MqttMessageHandler.java
index b8121e6..b337d73 100644
--- a/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/MqttMessageHandler.java
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/MqttMessageHandler.java
@@ -44,11 +44,11 @@ public class MqttMessageHandler {
.map(p -> new InboundDeployMessagePayload(
p.status(),
p.assetCode(),
+ id,
p.name(),
p.size(),
p.releasedAt(),
- p.updatedAt(),
- id))
+ p.updatedAt()))
.flatMap(deployerService)
.subscribe();
}else {
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/configuration/WebConfiguration.java b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/configuration/WebConfiguration.java
new file mode 100644
index 0000000..ed65810
--- /dev/null
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/configuration/WebConfiguration.java
@@ -0,0 +1,31 @@
+package inc.sdt.blokworks.devicedeployer.presentation.configuration;
+
+import inc.sdt.blokworks.devicedeployer.presentation.filter.AuthorizationFilter;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Component
+class WebConfiguration implements WebMvcConfigurer {
+ private final AuthorizationFilter authorizationFilter;
+
+ public WebConfiguration(AuthorizationFilter authorizationFilter) {
+ this.authorizationFilter = authorizationFilter;
+ }
+
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**")
+ .allowedOrigins("*")
+ .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
+ .maxAge(3600);
+ }
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(authorizationFilter).addPathPatterns(
+ "/assets/**"
+ );
+ }
+}
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/exception/UnauthorizedException.java b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/exception/UnauthorizedException.java
new file mode 100644
index 0000000..239891b
--- /dev/null
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/exception/UnauthorizedException.java
@@ -0,0 +1,14 @@
+package inc.sdt.blokworks.devicedeployer.presentation.exception;
+
+public class UnauthorizedException extends RuntimeException {
+ private static final String DEFAULT_MESSAGE = "Unauthorized";
+
+ public UnauthorizedException() {
+ super(DEFAULT_MESSAGE);
+ }
+
+ public UnauthorizedException(String message) {
+ super(message);
+ }
+}
+
diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/filter/AuthorizationFilter.java b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/filter/AuthorizationFilter.java
new file mode 100644
index 0000000..7eda7ff
--- /dev/null
+++ b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/filter/AuthorizationFilter.java
@@ -0,0 +1,50 @@
+package inc.sdt.blokworks.devicedeployer.presentation.filter;
+
+import inc.sdt.blokworks.devicedeployer.presentation.exception.UnauthorizedException;
+import io.jsonwebtoken.ExpiredJwtException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import java.util.NoSuchElementException;
+
+@Component
+public class AuthorizationFilter implements HandlerInterceptor {
+ private final Logger log;
+ private final String secretKey;
+
+ public AuthorizationFilter(@Value("${application.security.jwt.secret-key}") String secretKey) {
+ this.secretKey = secretKey;
+ this.log = LoggerFactory.getLogger(this.getClass());
+ }
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+ log.info("[preHandle]");
+ if(request.getHeader("Authorization") == null) {
+ throw new NoSuchElementException("token does not exist.");
+ }
+
+ String token = request.getHeader("Authorization").substring("Bearer ".length());
+
+ byte[] keyBytes = io.jsonwebtoken.io.Decoders.BASE64.decode(secretKey);
+ javax.crypto.SecretKey secretKey = io.jsonwebtoken.security.Keys.hmacShaKeyFor(keyBytes);
+
+ try {
+ io.jsonwebtoken.Claims claims = io.jsonwebtoken.Jwts
+ .parserBuilder()
+ .setSigningKey(secretKey)
+ .build()
+ .parseClaimsJws(token)
+ .getBody();
+ request.setAttribute("userId", claims.get("id").toString());
+ return true;
+ }catch (ExpiredJwtException e) {
+ throw new UnauthorizedException("Token has expired");
+ }
+ }
+}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index f68aaf5..02a79fe 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -27,4 +27,8 @@ iam:
username: ${IAM_AMQP_CREDENTIALS_USERNAME}
password: ${IAM_AMQP_CREDENTIALS_PASSWORD}
exchange: ${IAM_AMQP_EXCHANGE}
- routing-key: ${IAM_AMQP_ROUTING_KEY}
\ No newline at end of file
+ routing-key: ${IAM_AMQP_ROUTING_KEY}
+
+stackbase:
+ api:
+ host: https://sdt-site-bucket.s3.ap-northeast-2.amazonaws.com/app/
\ No newline at end of file
diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml
index c5b7052..6829d20 100644
--- a/src/main/resources/application-local.yml
+++ b/src/main/resources/application-local.yml
@@ -13,8 +13,13 @@ spring:
inbound:
mqtt:
url: tcp://localhost:1883
+ #url: tcp://13.209.39.139:32259
username: sdt
password: 251327
topics:
- /assets/+/command-req/+
- - /assets/+/apps/process
\ No newline at end of file
+ - /assets/+/apps/process
+
+stackbase:
+ api:
+ host: https://sdt-site-bucket.s3.ap-northeast-2.amazonaws.com/app/
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 90a30bd..1428cbf 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -5,12 +5,20 @@ spring:
name: device-deployer
datasource:
driver-class-name: org.postgresql.Driver
+application:
+ security:
+ jwt:
+ secret-key: D3KJ3G92IWW3W3QWZLU416IN4T9AFYEWM84P5HKHRFEA8C4I1HWALFXGP2HYD87Q
inbound:
mqtt:
- url: tcp://192.168.1.162:32102
+ url: tcp://13.209.39.139:32259
username: sdt
password: 251327
topics:
- /assets/+/command-req/+
- - /assets/+/apps/process
\ No newline at end of file
+ - /assets/+/apps/process
+
+stackbase:
+ api:
+ host: https://sdt-site-bucket.s3.ap-northeast-2.amazonaws.com/app/
\ No newline at end of file