diff --git a/common/src/main/java/com/hubEleven/common/annotation/SoftDeletable.java b/common/src/main/java/com/hubEleven/common/annotation/SoftDeletable.java index a0c36b18..4312188f 100644 --- a/common/src/main/java/com/hubEleven/common/annotation/SoftDeletable.java +++ b/common/src/main/java/com/hubEleven/common/annotation/SoftDeletable.java @@ -1,14 +1,12 @@ package com.hubEleven.common.annotation; -import org.hibernate.annotations.SQLRestriction; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.hibernate.annotations.SQLRestriction; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @SQLRestriction("deleted_at IS NULL") -public @interface SoftDeletable { -} +public @interface SoftDeletable {} diff --git a/common/src/main/java/com/hubEleven/common/code/ErrorCode.java b/common/src/main/java/com/hubEleven/common/code/ErrorCode.java index f92689ad..cdafdfb0 100644 --- a/common/src/main/java/com/hubEleven/common/code/ErrorCode.java +++ b/common/src/main/java/com/hubEleven/common/code/ErrorCode.java @@ -1,21 +1,21 @@ package com.hubEleven.common.code; +import static org.springframework.http.HttpStatus.*; + import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; -import static org.springframework.http.HttpStatus.*; - @RequiredArgsConstructor @Getter public enum ErrorCode implements StatusCode { - SERVER_ERROR(INTERNAL_SERVER_ERROR, "서버 에러가 발생하였습니다."); + SERVER_ERROR(INTERNAL_SERVER_ERROR, "서버 에러가 발생하였습니다."); - private final HttpStatus httpStatus; - private final String message; + private final HttpStatus httpStatus; + private final String message; - @Override - public String getName() { - return this.name(); - } + @Override + public String getName() { + return this.name(); + } } diff --git a/common/src/main/java/com/hubEleven/common/code/StatusCode.java b/common/src/main/java/com/hubEleven/common/code/StatusCode.java index 36c805df..75f01a44 100644 --- a/common/src/main/java/com/hubEleven/common/code/StatusCode.java +++ b/common/src/main/java/com/hubEleven/common/code/StatusCode.java @@ -3,7 +3,9 @@ import org.springframework.http.HttpStatus; public interface StatusCode { - HttpStatus getHttpStatus(); - String getMessage(); - String getName(); + HttpStatus getHttpStatus(); + + String getMessage(); + + String getName(); } diff --git a/common/src/main/java/com/hubEleven/common/code/SuccessCode.java b/common/src/main/java/com/hubEleven/common/code/SuccessCode.java index ac492f02..3265d869 100644 --- a/common/src/main/java/com/hubEleven/common/code/SuccessCode.java +++ b/common/src/main/java/com/hubEleven/common/code/SuccessCode.java @@ -1,17 +1,16 @@ package com.hubEleven.common.code; +import static org.springframework.http.HttpStatus.*; + import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; -import static org.springframework.http.HttpStatus.*; - @Getter @RequiredArgsConstructor public enum SuccessCode { + SUCCESS(OK, "성공했습니다."); - SUCCESS(OK, "성공했습니다."); - - private final HttpStatus status; - private final String message; + private final HttpStatus status; + private final String message; } diff --git a/common/src/main/java/com/hubEleven/common/exception/GlobalException.java b/common/src/main/java/com/hubEleven/common/exception/GlobalException.java index 7bae01e2..7f4451cb 100644 --- a/common/src/main/java/com/hubEleven/common/exception/GlobalException.java +++ b/common/src/main/java/com/hubEleven/common/exception/GlobalException.java @@ -7,5 +7,5 @@ @Getter @RequiredArgsConstructor public class GlobalException extends RuntimeException { - private final StatusCode errorCode; + private final StatusCode errorCode; } diff --git a/common/src/main/java/com/hubEleven/common/exception/GlobalExceptionHandler.java b/common/src/main/java/com/hubEleven/common/exception/GlobalExceptionHandler.java index ca41c1c3..a8ffb794 100644 --- a/common/src/main/java/com/hubEleven/common/exception/GlobalExceptionHandler.java +++ b/common/src/main/java/com/hubEleven/common/exception/GlobalExceptionHandler.java @@ -1,5 +1,7 @@ package com.hubEleven.common.exception; +import static com.hubEleven.common.code.ErrorCode.*; + import com.hubEleven.common.response.ApiResponse; import com.hubEleven.common.response.ApiResponseEntity; import org.springframework.http.ResponseEntity; @@ -7,18 +9,16 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; -import static com.hubEleven.common.code.ErrorCode.*; - @RestControllerAdvice public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { - @ExceptionHandler(GlobalException.class) - ResponseEntity globalExceptionHandler(GlobalException e) { - return ApiResponseEntity.onFailure(e.getErrorCode()); - } + @ExceptionHandler(GlobalException.class) + ResponseEntity globalExceptionHandler(GlobalException e) { + return ApiResponseEntity.onFailure(e.getErrorCode()); + } - @ExceptionHandler(Exception.class) - public ResponseEntity> handleException(final Exception e) { - return ApiResponseEntity.onFailure(SERVER_ERROR); - } + @ExceptionHandler(Exception.class) + public ResponseEntity> handleException(final Exception e) { + return ApiResponseEntity.onFailure(SERVER_ERROR); + } } diff --git a/common/src/main/java/com/hubEleven/common/model/BaseEntity.java b/common/src/main/java/com/hubEleven/common/model/BaseEntity.java index f031b36e..ddd15468 100644 --- a/common/src/main/java/com/hubEleven/common/model/BaseEntity.java +++ b/common/src/main/java/com/hubEleven/common/model/BaseEntity.java @@ -3,6 +3,7 @@ import jakarta.persistence.Column; import jakarta.persistence.EntityListeners; import jakarta.persistence.MappedSuperclass; +import java.time.LocalDateTime; import lombok.Getter; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; @@ -10,37 +11,33 @@ import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import java.time.LocalDateTime; - @Getter @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public abstract class BaseEntity { - @CreatedDate - @Column(updatable = false, nullable = false) - private LocalDateTime createdAt; + @CreatedDate + @Column(updatable = false, nullable = false) + private LocalDateTime createdAt; - @CreatedBy - @Column(updatable = false) - private Long createdBy; + @CreatedBy + @Column(updatable = false) + private Long createdBy; - @LastModifiedDate - private LocalDateTime updatedAt; + @LastModifiedDate private LocalDateTime updatedAt; - @LastModifiedBy - private Long updatedBy; + @LastModifiedBy private Long updatedBy; - private LocalDateTime deletedAt; + private LocalDateTime deletedAt; - private Long deletedBy; + private Long deletedBy; - public void delete(Long deletedBy) { - this.deletedAt = LocalDateTime.now(); - this.deletedBy = deletedBy; - } + public void delete(Long deletedBy) { + this.deletedAt = LocalDateTime.now(); + this.deletedBy = deletedBy; + } - public boolean isDeleted() { - return this.deletedAt != null; - } + public boolean isDeleted() { + return this.deletedAt != null; + } } diff --git a/common/src/main/java/com/hubEleven/common/request/CommonPageRequest.java b/common/src/main/java/com/hubEleven/common/request/CommonPageRequest.java index c1279cbb..f79808ce 100644 --- a/common/src/main/java/com/hubEleven/common/request/CommonPageRequest.java +++ b/common/src/main/java/com/hubEleven/common/request/CommonPageRequest.java @@ -5,46 +5,41 @@ import org.springframework.data.domain.Sort; public record CommonPageRequest( - int page, - int size, - SortType sortType, - Sort.Direction direction, - String keyword -) { - public CommonPageRequest { - if (page < 0) { - page = 0; - } - - if (size != 10 && size != 30 && size != 50) { - size = 10; - } - - if (sortType == null) { - sortType = SortType.CREATED_AT; - } - - if (direction == null) { - direction = Sort.Direction.DESC; - } - } - - public Pageable toPageable() { - return PageRequest.of(page, size, Sort.by(direction, sortType.getFieldName())); - } - - public enum SortType { - CREATED_AT("createdAt"), - UPDATED_AT("updatedAt"); - - private final String fieldName; - - SortType(String fieldName) { - this.fieldName = fieldName; - } - - public String getFieldName() { - return fieldName; - } - } + int page, int size, SortType sortType, Sort.Direction direction, String keyword) { + public CommonPageRequest { + if (page < 0) { + page = 0; + } + + if (size != 10 && size != 30 && size != 50) { + size = 10; + } + + if (sortType == null) { + sortType = SortType.CREATED_AT; + } + + if (direction == null) { + direction = Sort.Direction.DESC; + } + } + + public Pageable toPageable() { + return PageRequest.of(page, size, Sort.by(direction, sortType.getFieldName())); + } + + public enum SortType { + CREATED_AT("createdAt"), + UPDATED_AT("updatedAt"); + + private final String fieldName; + + SortType(String fieldName) { + this.fieldName = fieldName; + } + + public String getFieldName() { + return fieldName; + } + } } diff --git a/common/src/main/java/com/hubEleven/common/response/ApiResponse.java b/common/src/main/java/com/hubEleven/common/response/ApiResponse.java index 8190e69c..95630ec2 100644 --- a/common/src/main/java/com/hubEleven/common/response/ApiResponse.java +++ b/common/src/main/java/com/hubEleven/common/response/ApiResponse.java @@ -4,9 +4,5 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; @JsonPropertyOrder({"code", "message", "result"}) -public record ApiResponse ( - String code, - String message, - @JsonInclude(JsonInclude.Include.NON_NULL) T result -) { -} +public record ApiResponse( + String code, String message, @JsonInclude(JsonInclude.Include.NON_NULL) T result) {} diff --git a/common/src/main/java/com/hubEleven/common/response/ApiResponseEntity.java b/common/src/main/java/com/hubEleven/common/response/ApiResponseEntity.java index 8af7d9ae..ece09fd0 100644 --- a/common/src/main/java/com/hubEleven/common/response/ApiResponseEntity.java +++ b/common/src/main/java/com/hubEleven/common/response/ApiResponseEntity.java @@ -2,38 +2,40 @@ import com.hubEleven.common.code.StatusCode; import com.hubEleven.common.code.SuccessCode; +import java.net.URI; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import java.net.URI; - public class ApiResponseEntity { - public static ResponseEntity> success(T result) { - return ResponseEntity.ok().body(new ApiResponse<>(SuccessCode.SUCCESS.name(), SuccessCode.SUCCESS.getMessage(), result)); - } - - public static ResponseEntity> from(StatusCode code, T result) { - return ResponseEntity.status(code.getHttpStatus()) - .body(new ApiResponse<>(code.getName(), code.getMessage(), result)); - } - - public static ResponseEntity> create(StatusCode code, String url, T result) { - return ResponseEntity.created(URI.create(url)) - .body(new ApiResponse<>(code.getName(), code.getMessage(), result)); - } - - public static ResponseEntity> onFailure(StatusCode code) { - return ResponseEntity.status(code.getHttpStatus()) - .body(new ApiResponse<>(code.getName(), code.getMessage(), null)); - } - - public static ResponseEntity> badRequest(String message) { - return ResponseEntity.badRequest() - .body(new ApiResponse<>(HttpStatus.BAD_REQUEST.name(), message, null)); - } - - public static ResponseEntity> ok(String message) { - return ResponseEntity.ok().body(new ApiResponse<>(HttpStatus.OK.name(), message, null)); - } + public static ResponseEntity> success(T result) { + return ResponseEntity.ok() + .body( + new ApiResponse<>( + SuccessCode.SUCCESS.name(), SuccessCode.SUCCESS.getMessage(), result)); + } + + public static ResponseEntity> from(StatusCode code, T result) { + return ResponseEntity.status(code.getHttpStatus()) + .body(new ApiResponse<>(code.getName(), code.getMessage(), result)); + } + + public static ResponseEntity> create(StatusCode code, String url, T result) { + return ResponseEntity.created(URI.create(url)) + .body(new ApiResponse<>(code.getName(), code.getMessage(), result)); + } + + public static ResponseEntity> onFailure(StatusCode code) { + return ResponseEntity.status(code.getHttpStatus()) + .body(new ApiResponse<>(code.getName(), code.getMessage(), null)); + } + + public static ResponseEntity> badRequest(String message) { + return ResponseEntity.badRequest() + .body(new ApiResponse<>(HttpStatus.BAD_REQUEST.name(), message, null)); + } + + public static ResponseEntity> ok(String message) { + return ResponseEntity.ok().body(new ApiResponse<>(HttpStatus.OK.name(), message, null)); + } } diff --git a/common/src/main/java/com/hubEleven/common/response/CommonPageResponse.java b/common/src/main/java/com/hubEleven/common/response/CommonPageResponse.java index c6db7d36..b9d9d2f1 100644 --- a/common/src/main/java/com/hubEleven/common/response/CommonPageResponse.java +++ b/common/src/main/java/com/hubEleven/common/response/CommonPageResponse.java @@ -1,27 +1,24 @@ package com.hubEleven.common.response; -import org.springframework.data.domain.Page; - import java.util.List; +import org.springframework.data.domain.Page; -public record CommonPageResponse ( - List content, - int page, - int size, - long totalElements, - int totalPages, - boolean first, - boolean last -) { - public static CommonPageResponse of(Page page) { - return new CommonPageResponse<>( - page.getContent(), - page.getNumber(), - page.getSize(), - page.getTotalElements(), - page.getTotalPages(), - page.isFirst(), - page.isLast() - ); - } +public record CommonPageResponse( + List content, + int page, + int size, + long totalElements, + int totalPages, + boolean first, + boolean last) { + public static CommonPageResponse of(Page page) { + return new CommonPageResponse<>( + page.getContent(), + page.getNumber(), + page.getSize(), + page.getTotalElements(), + page.getTotalPages(), + page.isFirst(), + page.isLast()); + } } diff --git a/common/src/main/java/com/hubEleven/common/utils/PagingUtils.java b/common/src/main/java/com/hubEleven/common/utils/PagingUtils.java index 4540d5c8..5eb6b2db 100644 --- a/common/src/main/java/com/hubEleven/common/utils/PagingUtils.java +++ b/common/src/main/java/com/hubEleven/common/utils/PagingUtils.java @@ -1,13 +1,12 @@ package com.hubEleven.common.utils; import com.hubEleven.common.response.CommonPageResponse; -import org.springframework.data.domain.Page; - import java.util.function.Function; +import org.springframework.data.domain.Page; public class PagingUtils { - public static CommonPageResponse convert(Page page, Function mapper) { - return CommonPageResponse.of(page.map(mapper)); - } + public static CommonPageResponse convert(Page page, Function mapper) { + return CommonPageResponse.of(page.map(mapper)); + } } diff --git a/common/src/test/java/com/hubEleven/common/CommonApplicationTests.java b/common/src/test/java/com/hubEleven/common/CommonApplicationTests.java index 5b206589..e9e17456 100644 --- a/common/src/test/java/com/hubEleven/common/CommonApplicationTests.java +++ b/common/src/test/java/com/hubEleven/common/CommonApplicationTests.java @@ -1,9 +1,6 @@ package com.hubEleven.common; -import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest -class CommonApplicationTests { - -} +class CommonApplicationTests {} diff --git a/config/src/main/resources/config-repo/delivery-service.yml b/config/src/main/resources/config-repo/delivery-service.yml index 3e2f2276..6f5f4a6e 100644 --- a/config/src/main/resources/config-repo/delivery-service.yml +++ b/config/src/main/resources/config-repo/delivery-service.yml @@ -2,14 +2,14 @@ spring: application: name: delivery-service datasource: - url: jdbc:mysql://localhost:3306/hubEleven?useSSL=false&serverTimezone=Asia/Seoul + url: jdbc:mysql://localhost:3306/hubEleven?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul username: ${DB_USERNAME} password: ${DB_PASSWORD} driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: - ddl-auto: create + ddl-auto: update show-sql: true properties: hibernate: diff --git a/delivery/build.gradle b/delivery/build.gradle index 9c70a061..63f62451 100644 --- a/delivery/build.gradle +++ b/delivery/build.gradle @@ -33,6 +33,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.cloud:spring-cloud-starter-config' + implementation 'org.springframework.boot:spring-boot-starter-validation' + compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.mysql:mysql-connector-j' annotationProcessor 'org.projectlombok:lombok' diff --git a/delivery/settings.gradle b/delivery/settings.gradle deleted file mode 100644 index 6a6c7abd..00000000 --- a/delivery/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'delivery' diff --git a/delivery/src/main/java/com/hubEleven/deliveryManager/application/DeliveryManagerService.java b/delivery/src/main/java/com/hubEleven/deliveryManager/application/DeliveryManagerService.java new file mode 100644 index 00000000..77d27eb9 --- /dev/null +++ b/delivery/src/main/java/com/hubEleven/deliveryManager/application/DeliveryManagerService.java @@ -0,0 +1,79 @@ +package com.hubEleven.deliveryManager.application; + +import com.hubEleven.deliveryManager.domain.DeliveryManager; +import com.hubEleven.deliveryManager.domain.DeliveryManagerRepository; +import com.hubEleven.deliveryManager.domain.DeliveryType; +import com.hubEleven.deliveryManager.presentation.dto.request.DeliveryManagerCreateRequestDto; +import com.hubEleven.deliveryManager.presentation.dto.response.DeliveryManagerResponseDto; +import java.util.UUID; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Service +public class DeliveryManagerService { + + private final DeliveryManagerRepository deliveryManagerRepository; + + public DeliveryManagerService(DeliveryManagerRepository deliveryManagerRepository) { + this.deliveryManagerRepository = deliveryManagerRepository; + } + + // 배송 담당자 생성 + @Transactional + public DeliveryManagerResponseDto createDeliveryManager( + DeliveryManagerCreateRequestDto createRequestDto) { + // plan : 요청 dto로 유저id만 받고, 유저서비스에서 id로 정보를 조회해 나머지 엔티티 필드 채우기(hubID, slackId, DeliveryType, + // deliveryOrder(배송순번)) + /** + * TODO : 1. 생성 권한이 있는지 확인하기 (로그인한 유저가 마스터 혹은 허브관리자인가?) -> 컨트롤러에서 2. RequestDto에서 id 꺼내와 + * FeignClient로 User-Service 서버에서 user정보 받아오기 (user정보에 id, slackId, 권한, 소속업체(허브)ID 존재) 3. 위에서 + * 받아온 user정보에서 id 존재 여부 조회 후, role이 배송담당자인지 확인, 소속업체 확인하기(허브면 허브가 존재하는가?) 3-1 요청한 id가 이미 배달기사로 + * 등록된 아이디가 아닌지 검증 3-2 소속업체 id가 NULL이면 허브배송 담당자, NULL이 아니면 업체담당자(소속업체 id가 허브id가 맞는지도 검증해야 할까?) + * (배송담당자는 소속이 없거나, 허브소속이니까, 유저정보에서 배송담당자 권한이면서 소속이 있다면 그 소속은 허브라고 생각하고 검증을 안해도 되는가? -> 유저에서 검증 + * ) 4. 배송순번 부여하기 (전략: 배송담당자 타입별로 순번을 각각 부여해야하므로, 배송담당자 타입으로 조회하여 순번최댓값을 가져오고, +1 증가시켜 부여) -> + * 동시성 문제 생각할 것 + */ + log.info("[Service] 배달 담당자 생성 요청"); + // 임시 데이터---------------------------- + Long id = createRequestDto.deliveryManagerId(); + UUID hubId = UUID.randomUUID(); + String slackId = "slack001"; + DeliveryType deliveryType = DeliveryType.COMPANY; + // ---------------------------------- + + // TODO: DB에 이미 존재하는 id 인지 확인 + Integer maxOrder; + + // 배송순번 부여 + int deliveryOrder = setDeliveryOrder(deliveryType); + + DeliveryManager deliveryManager = + DeliveryManager.create(id, hubId, slackId, deliveryType, deliveryOrder); + + deliveryManagerRepository.save(deliveryManager); + + log.info("[Service] 배달 담당자 생성 - DB 저장 성공"); + + DeliveryManagerResponseDto responseDto = DeliveryManagerResponseDto.from(deliveryManager); + + return responseDto; + } + + public int setDeliveryOrder(DeliveryType deliveryType) { + Integer maxOrder; + if (deliveryType == DeliveryType.HUB) { + maxOrder = deliveryManagerRepository.findMaxDeliveryOrderByDeliveryType(DeliveryType.HUB); + int nextOrder = maxOrder == null ? 1 : maxOrder + 1; + log.info("현재 마지막 순번 : {} , 생성된 배달 순번 : {}", maxOrder, nextOrder); + return nextOrder; + } else { + maxOrder = deliveryManagerRepository.findMaxDeliveryOrderByDeliveryType(DeliveryType.COMPANY); + int nextOrder = maxOrder == null ? 1 : maxOrder + 1; + log.info("현재 마지막 순번 : {} , 생성된 배달 순번 : {}", maxOrder, nextOrder); + + return nextOrder; + } + } +} diff --git a/delivery/src/main/java/com/hubEleven/deliveryManager/domain/DeliveryManager.java b/delivery/src/main/java/com/hubEleven/deliveryManager/domain/DeliveryManager.java new file mode 100644 index 00000000..9ab8d143 --- /dev/null +++ b/delivery/src/main/java/com/hubEleven/deliveryManager/domain/DeliveryManager.java @@ -0,0 +1,47 @@ +package com.hubEleven.deliveryManager.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import java.util.UUID; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class DeliveryManager { + + @Id private Long deliveryManagerId; // userId를 받아올 것임 + + private UUID hubId; + + private String slackId; + + @Enumerated(EnumType.STRING) + private DeliveryType deliveryType; + + @Column(updatable = false, nullable = false) + private int deliveryOrder; + + private DeliveryManager( + Long deliveryManagerId, + UUID hubId, + String slackId, + DeliveryType deliveryType, + int deliveryOrder) { + this.deliveryManagerId = deliveryManagerId; + this.hubId = hubId; + this.slackId = slackId; + this.deliveryType = deliveryType; + this.deliveryOrder = deliveryOrder; + } + + public static DeliveryManager create( + Long id, UUID hubId, String slackId, DeliveryType deliveryType, int deliveryOrder) { + return new DeliveryManager(id, hubId, slackId, deliveryType, deliveryOrder); + } +} diff --git a/delivery/src/main/java/com/hubEleven/deliveryManager/domain/DeliveryManagerRepository.java b/delivery/src/main/java/com/hubEleven/deliveryManager/domain/DeliveryManagerRepository.java new file mode 100644 index 00000000..e8540485 --- /dev/null +++ b/delivery/src/main/java/com/hubEleven/deliveryManager/domain/DeliveryManagerRepository.java @@ -0,0 +1,9 @@ +package com.hubEleven.deliveryManager.domain; + +public interface DeliveryManagerRepository { + + // deliveryType에 따른 최대 순번값 조회 + Integer findMaxDeliveryOrderByDeliveryType(DeliveryType type); + + DeliveryManager save(DeliveryManager deliveryManager); +} diff --git a/delivery/src/main/java/com/hubEleven/deliveryManager/domain/DeliveryType.java b/delivery/src/main/java/com/hubEleven/deliveryManager/domain/DeliveryType.java new file mode 100644 index 00000000..4c527e99 --- /dev/null +++ b/delivery/src/main/java/com/hubEleven/deliveryManager/domain/DeliveryType.java @@ -0,0 +1,13 @@ +package com.hubEleven.deliveryManager.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum DeliveryType { + HUB("허브 배송 담당자"), + COMPANY("업체 배송 담당자"); + + private final String description; +} diff --git a/delivery/src/main/java/com/hubEleven/deliveryManager/infrastructure/DeliveryManagerJpaRepository.java b/delivery/src/main/java/com/hubEleven/deliveryManager/infrastructure/DeliveryManagerJpaRepository.java new file mode 100644 index 00000000..62ab647e --- /dev/null +++ b/delivery/src/main/java/com/hubEleven/deliveryManager/infrastructure/DeliveryManagerJpaRepository.java @@ -0,0 +1,13 @@ +package com.hubEleven.deliveryManager.infrastructure; + +import com.hubEleven.deliveryManager.domain.DeliveryManager; +import com.hubEleven.deliveryManager.domain.DeliveryType; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +public interface DeliveryManagerJpaRepository extends JpaRepository { + + @Query( + "SELECT MAX(dm.deliveryOrder) FROM DeliveryManager dm WHERE dm.deliveryType = :deliveryType") + Integer findMaxDeliveryOrderByDeliveryType(DeliveryType deliveryType); +} diff --git a/delivery/src/main/java/com/hubEleven/deliveryManager/infrastructure/DeliveryManagerRepositoryImpl.java b/delivery/src/main/java/com/hubEleven/deliveryManager/infrastructure/DeliveryManagerRepositoryImpl.java new file mode 100644 index 00000000..3fe30e49 --- /dev/null +++ b/delivery/src/main/java/com/hubEleven/deliveryManager/infrastructure/DeliveryManagerRepositoryImpl.java @@ -0,0 +1,26 @@ +package com.hubEleven.deliveryManager.infrastructure; + +import com.hubEleven.deliveryManager.domain.DeliveryManager; +import com.hubEleven.deliveryManager.domain.DeliveryManagerRepository; +import com.hubEleven.deliveryManager.domain.DeliveryType; +import org.springframework.stereotype.Repository; + +@Repository +public class DeliveryManagerRepositoryImpl implements DeliveryManagerRepository { + + private final DeliveryManagerJpaRepository deliveryManagerJpaRepository; + + public DeliveryManagerRepositoryImpl(DeliveryManagerJpaRepository deliveryManagerJpaRepository) { + this.deliveryManagerJpaRepository = deliveryManagerJpaRepository; + } + + @Override + public Integer findMaxDeliveryOrderByDeliveryType(DeliveryType deliveryType) { + return deliveryManagerJpaRepository.findMaxDeliveryOrderByDeliveryType(deliveryType); + } + + @Override + public DeliveryManager save(DeliveryManager deliveryManager) { + return deliveryManagerJpaRepository.save(deliveryManager); + } +} diff --git a/delivery/src/main/java/com/hubEleven/deliveryManager/presentation/DeliveryManagerController.java b/delivery/src/main/java/com/hubEleven/deliveryManager/presentation/DeliveryManagerController.java index 322e113f..a93b7b07 100644 --- a/delivery/src/main/java/com/hubEleven/deliveryManager/presentation/DeliveryManagerController.java +++ b/delivery/src/main/java/com/hubEleven/deliveryManager/presentation/DeliveryManagerController.java @@ -1,6 +1,35 @@ package com.hubEleven.deliveryManager.presentation; +import com.hubEleven.deliveryManager.application.DeliveryManagerService; +import com.hubEleven.deliveryManager.presentation.dto.request.DeliveryManagerCreateRequestDto; +import com.hubEleven.deliveryManager.presentation.dto.response.DeliveryManagerResponseDto; +import jakarta.validation.Valid; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +@Slf4j @RestController -public class DeliveryManagerController {} +@RequestMapping("/v1/delivery-managers") +public class DeliveryManagerController { + + private final DeliveryManagerService deliveryManagerService; + + public DeliveryManagerController(DeliveryManagerService deliveryManagerService) { + this.deliveryManagerService = deliveryManagerService; + } + + @PostMapping + public ResponseEntity createDeliveryManager( + @RequestBody @Valid DeliveryManagerCreateRequestDto createRequestDto) { + // TODO: JWT토큰 파싱하여 권한 검증 + log.info("[Controller] 배달 담당자 생성 요청"); + DeliveryManagerResponseDto responseDto = + deliveryManagerService.createDeliveryManager(createRequestDto); + + return ResponseEntity.ok(responseDto); + } +} diff --git a/delivery/src/main/java/com/hubEleven/deliveryManager/presentation/dto/request/DeliveryManagerCreateRequestDto.java b/delivery/src/main/java/com/hubEleven/deliveryManager/presentation/dto/request/DeliveryManagerCreateRequestDto.java new file mode 100644 index 00000000..8db3e745 --- /dev/null +++ b/delivery/src/main/java/com/hubEleven/deliveryManager/presentation/dto/request/DeliveryManagerCreateRequestDto.java @@ -0,0 +1,7 @@ +package com.hubEleven.deliveryManager.presentation.dto.request; + +import jakarta.validation.constraints.NotNull; + +public record DeliveryManagerCreateRequestDto( + // 배송타입이 허브일때는 null, 업체일때는 id필수여야함 + @NotNull(message = "ID는 필수입니다.") Long deliveryManagerId) {} diff --git a/delivery/src/main/java/com/hubEleven/deliveryManager/presentation/dto/response/DeliveryManagerResponseDto.java b/delivery/src/main/java/com/hubEleven/deliveryManager/presentation/dto/response/DeliveryManagerResponseDto.java new file mode 100644 index 00000000..42d198a7 --- /dev/null +++ b/delivery/src/main/java/com/hubEleven/deliveryManager/presentation/dto/response/DeliveryManagerResponseDto.java @@ -0,0 +1,21 @@ +package com.hubEleven.deliveryManager.presentation.dto.response; + +import com.hubEleven.deliveryManager.domain.DeliveryManager; +import com.hubEleven.deliveryManager.domain.DeliveryType; +import java.util.UUID; + +public record DeliveryManagerResponseDto( + Long deliveryManagerId, + UUID hubId, + String slackId, + DeliveryType deliveryType, + int deliveryOrder) { + public static DeliveryManagerResponseDto from(DeliveryManager deliveryManager) { + return new DeliveryManagerResponseDto( + deliveryManager.getDeliveryManagerId(), + deliveryManager.getHubId(), + deliveryManager.getSlackId(), + deliveryManager.getDeliveryType(), + deliveryManager.getDeliveryOrder()); + } +} diff --git a/delivery/src/main/resources/application.yml b/delivery/src/main/resources/application.yml index 9d441c6e..d5571889 100644 --- a/delivery/src/main/resources/application.yml +++ b/delivery/src/main/resources/application.yml @@ -1,10 +1,8 @@ spring: - application: - name: delivery-service - profiles: - active: native config: import: "configserver:" + application: + name: delivery-service cloud: config: discovery: diff --git a/gradlew b/gradlew old mode 100644 new mode 100755