diff --git a/build.gradle b/build.gradle index 494e83d7cd..b03625990b 100644 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,19 @@ dependencies { //configuration annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" + + //web + implementation 'org.springframework.boot:spring-boot-starter-web' + + //map struct + implementation 'org.mapstruct:mapstruct:1.5.5.Final' + annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final' + + //validation + implementation 'org.springframework.boot:spring-boot-starter-validation' + + // ulid-creator + implementation group: 'com.github.f4b6a3', name: 'ulid-creator', version: '5.1.0' } tasks.named('test') { diff --git a/src/main/java/org/programmers/VoucherManagement/global/entity/BaseTimeEntity.java b/src/main/java/org/programmers/VoucherManagement/global/entity/BaseTimeEntity.java new file mode 100644 index 0000000000..ba4c34401f --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/global/entity/BaseTimeEntity.java @@ -0,0 +1,19 @@ +package org.programmers.VoucherManagement.global.entity; + +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Component +public class BaseTimeEntity { + protected String createdAt; + + public BaseTimeEntity() { + this.createdAt = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } + + public String getCreatedAt() { + return createdAt; + } +} diff --git a/src/main/java/org/programmers/VoucherManagement/global/exception/GlobalExceptionHandler.java b/src/main/java/org/programmers/VoucherManagement/global/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000000..da246c6bb9 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/global/exception/GlobalExceptionHandler.java @@ -0,0 +1,123 @@ +package org.programmers.VoucherManagement.global.exception; + +import com.fasterxml.jackson.core.JsonProcessingException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.programmers.VoucherManagement.global.response.ErrorCode; +import org.programmers.VoucherManagement.global.response.ErrorResponse; +import org.programmers.VoucherManagement.member.exception.MemberException; +import org.programmers.VoucherManagement.voucher.exception.VoucherException; +import org.programmers.VoucherManagement.wallet.exception.WalletException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; + +@RequiredArgsConstructor +@RestControllerAdvice +@Slf4j +public class GlobalExceptionHandler { + /** + * [Exception] 객체 혹은 파라미터의 데이터 값이 유효하지 않은 경우 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + protected ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + log.error("Handle MothodArgumentNotValidException", e.getMessage()); + final ErrorResponse response = ErrorResponse.of(ErrorCode.INVALID_METHOD_ERROR, e.getBindingResult()); + return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); + } + + /** + * [Exception] 클라이언트에서 request로 '파라미터로' 데이터가 넘어오지 않았을 경우 + * + * @param ex MissingServletRequestParameterException + * @return ResponseEntity + */ + @ExceptionHandler(MissingServletRequestParameterException.class) + protected ResponseEntity handleMissingRequestHeaderExceptionException( + MissingServletRequestParameterException ex) { + log.error("Handle MissingServletRequestParameterException", ex); + final ErrorResponse response = ErrorResponse.of(ErrorCode.REQUEST_PARAM_MISSING_ERROR, ex.getMessage()); + return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); + } + + /** + * [Exception] enum type 일치하지 않아 binding 못할 경우 + * 주로 @RequestParam enum으로 binding 못했을 경우 발생 + */ + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + protected ResponseEntity handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e) { + log.error("Handle MethodArgumentTypeMismatchException", e); + final ErrorResponse response = ErrorResponse.of(ErrorCode.INVALID_INPUT_VALUE_ERROR, e.getMessage()); + return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); + } + + + /** + * [Exception] com.fasterxml.jackson.core 내에 Exception 발생하는 경우 + * + * @param ex JsonProcessingException + * @return ResponseEntity + */ + @ExceptionHandler(JsonProcessingException.class) + protected ResponseEntity handleJsonProcessingException(JsonProcessingException ex) { + log.error("handleJsonProcessingException", ex); + final ErrorResponse response = ErrorResponse.of(ErrorCode.REQUEST_BODY_MISSING_ERROR, ex.getMessage()); + return new ResponseEntity<>(response, HttpStatus.OK); + } + + /** + * [Exception] @ModelAttribute 으로 binding error 발생할 경우 + */ + @ExceptionHandler(BindException.class) + protected ResponseEntity handleBindException(BindException e) { + log.error("Handle BindException : ", e); + final ErrorResponse response = ErrorResponse.of(ErrorCode.INVALID_INPUT_VALUE_ERROR, e.getBindingResult()); + return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); + } + + /** + * [Exception] 서버에 정의되지 않은 모든 예외 + */ + @ExceptionHandler(Exception.class) + public ResponseEntity handleAllException(Exception e) { + log.error("Handle Exception :", e); + final ErrorResponse response = ErrorResponse.of(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage()); + return new ResponseEntity<>(response, HttpStatus.OK); + } + + /** + * [Exception] 커스텀 예외 - MemberException + */ + @ExceptionHandler(MemberException.class) + public ResponseEntity handleNotFoundException(MemberException e) { + log.error("Handle NotFoundException :", e); + final ErrorResponse response = ErrorResponse.of(e.getErrorCode(), e.getMessage()); + return new ResponseEntity<>(response, HttpStatus.OK); + } + + /** + * [Exception] 커스텀 예외 - VoucherException + */ + @ExceptionHandler(VoucherException.class) + public ResponseEntity handlePermissionDeniedException(VoucherException e) { + log.error("Handle PermissionDeniedException :", e); + final ErrorResponse response = ErrorResponse.of(e.getErrorCode(), e.getMessage()); + return new ResponseEntity<>(response, HttpStatus.OK); + } + + /** + * [Exception] 커스텀 예외 - WalletException + */ + @ExceptionHandler(WalletException.class) + public ResponseEntity handlePermissionDeniedException(WalletException e) { + log.error("Handle PermissionDeniedException :", e); + final ErrorResponse response = ErrorResponse.of(e.getErrorCode(), e.getMessage()); + return new ResponseEntity<>(response, HttpStatus.OK); + } + +} diff --git a/src/main/java/org/programmers/VoucherManagement/global/response/BaseResponse.java b/src/main/java/org/programmers/VoucherManagement/global/response/BaseResponse.java new file mode 100644 index 0000000000..22ecdb542b --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/global/response/BaseResponse.java @@ -0,0 +1,39 @@ +package org.programmers.VoucherManagement.global.response; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import static org.programmers.VoucherManagement.global.response.SuccessCode.SUCCESS; + +@Getter +@AllArgsConstructor +@JsonPropertyOrder({"code", "message", "result"}) +public class BaseResponse { + private final String message; + private final String code; + @JsonInclude(JsonInclude.Include.NON_NULL) + private T result; + + /** + * 요청에 성공하고 반환값이 있는 경우 + * + * @param result + */ + public BaseResponse(T result) { + this.message = SUCCESS.getMessage(); + this.code = SUCCESS.getCode(); + this.result = result; + } + + /** + * 요청에 성공하고 반환값이 없는 경우 + * + * @param status + */ + public BaseResponse(SuccessCode status) { + this.message = status.getMessage(); + this.code = status.getCode(); + } +} diff --git a/src/main/java/org/programmers/VoucherManagement/global/response/ErrorCode.java b/src/main/java/org/programmers/VoucherManagement/global/response/ErrorCode.java new file mode 100644 index 0000000000..f92f548e3c --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/global/response/ErrorCode.java @@ -0,0 +1,78 @@ +package org.programmers.VoucherManagement.global.response; + +public enum ErrorCode { + /** + * 10000번 -> Global에서 발생하는 에러코드 관리 + * [Http Status code] + * 400 : Bad Request + * 401 : Unauthorized + * 403 : Forbidden + * 404 : Not Found + * 405 : Method Not Allowed + * 500 : Internal Server Error + */ + FAIL(500, "10000", "요청에 실패하였습니다."), + INVALID_INPUT_VALUE_ERROR(400, "10001", "유효하지 않은 입력값입니다."), + INVALID_METHOD_ERROR(405, "10002", "Method Argument가 적절하지 않습니다."), + REQUEST_BODY_MISSING_ERROR(400, "10003", "RequestBody에 데이터가 존재하지 않습니다."), + REQUEST_PARAM_MISSING_ERROR(400, "10004", "RequestParam에 데이터가 전달되지 않았습니다."), + INVALID_TYPE_VALUE_ERROR(400, "10005", "타입이 유효하지 않습니다."), + INTERNAL_SERVER_ERROR(500, "10006", "서버 오류 입니다."), + + /** + * ========================================================================== + * 20000번 -> Member에서 발생하는 에러코드 관리 + * ========================================================================== + */ + NOT_EXIST_MEMBER_STATUS(400, "M20000", "해당하는 회원 상태가 존재하지 않습니다."), + NOT_FOUND_MEMBER(404, "M20001", "회원을 찾을 수 없습니다."), + FAIL_TO_INSERT_MEMBER(500, "M20002", "데이터가 정상적으로 저장되지 않았습니다."), + FAIL_TO_UPDATE_MEMBER(500, "M20003", "데이터가 정상적으로 수정되지 않았습니다."), + FAIL_TO_DELETE_MEMBER(500, "M20004", "데이터가 정상적으로 삭제되지 않았습니다."), + + /** + * ========================================================================== + * 30000번 -> Voucher에서 발생하는 에러코드 관리 + * ========================================================================== + */ + NOT_INCLUDE_1_TO_100(400, "V30000", "할인율은 1부터 100사이의 값이여야 합니다."), + AMOUNT_IS_NOT_NUMBER(400, "V30001", "숫자만 입력가능합니다."), + NOT_EXIST_COMMAND(400, "V30002", "해당하는 Command가 존재하지 않습니다."), + NOT_EXIST_DISCOUNT_TYPE(400, "V30003", "해당하는 유형의 바우처가 존재하지 않습니다."), + NOT_FOUND_VOUCHER(404, "V30004", "바우처를 찾을 수 없습니다."), + FAIL_TO_INSERT_VOUCHER(500, "V30005", "데이터가 정상적으로 저장되지 않았습니다."), + FAIL_TO_UPDATE_VOUCHER(500, "V30006", "데이터가 정상적으로 수정되지 않았습니다."), + FAIL_TO_DELETE_VOUCHER(500, "V30007", "데이터가 정상적으로 삭제되지 않았습니다."), + + /** + * ========================================================================== + * 40000번 -> Wallet에서 발생하는 에러코드 관리 + * ========================================================================== + */ + FAIL_TO_INSERT_WALLET(500, "W40000", "데이터가 정상적으로 저장되지 않았습니다."), + FAIL_TO_DELETE_WALLET(500, "W40001", "데이터가 정상적으로 삭제되지 않았습니다."); + + + private final int status; //코드 상태(Http) + private final String divisionCode; //서버 내 코드 구분 값 + private final String message; //에러 코드 메시지 + + ErrorCode(int status, String divisionCode, String message) { + this.status = status; + this.divisionCode = divisionCode; + this.message = message; + } + + public String getMessage() { + return message; + } + + public int getStatus() { + return status; + } + + public String getDivisionCode() { + return divisionCode; + } + +} diff --git a/src/main/java/org/programmers/VoucherManagement/global/response/ErrorResponse.java b/src/main/java/org/programmers/VoucherManagement/global/response/ErrorResponse.java new file mode 100644 index 0000000000..b2d80932e1 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/global/response/ErrorResponse.java @@ -0,0 +1,125 @@ +package org.programmers.VoucherManagement.global.response; + + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.validation.BindingResult; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Global Exception Handler에서 발생한 에러에 대한 응답 처리를 관리 + */ +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ErrorResponse { + private int status; // 에러 상태 코드 + @JsonInclude(JsonInclude.Include.NON_NULL) + private String divisionCode; // 서버 내 에러 구분 코드 + private String resultMsg; // 에러 메시지 + private List errors; // 상세 에러 메시지 + private String reason; // 에러 이유 + + /** + * ErrorResponse 생성자-1 + * + * @param code ErrorCode + */ + @Builder + protected ErrorResponse(final ErrorCode code) { + this.resultMsg = code.getMessage(); + this.status = code.getStatus(); + this.divisionCode = code.getDivisionCode(); + this.errors = new ArrayList<>(); + } + + /** + * ErrorResponse 생성자-2 + * + * @param code ErrorCode + * @param reason String + */ + @Builder + protected ErrorResponse(final ErrorCode code, final String reason) { + this.resultMsg = code.getMessage(); + this.status = code.getStatus(); + this.divisionCode = code.getDivisionCode(); + this.reason = reason; + } + + /** + * ErrorResponse 생성자-3 + * + * @param code ErrorCode + * @param errors List + */ + @Builder + protected ErrorResponse(final ErrorCode code, final List errors) { + this.resultMsg = code.getMessage(); + this.status = code.getStatus(); + this.errors = errors; + this.divisionCode = code.getDivisionCode(); + } + + + /** + * Global Exception 전송 타입 - 1 + */ + public static ErrorResponse of(final ErrorCode code, final BindingResult bindingResult) { + return new ErrorResponse(code, FieldError.of(bindingResult)); + } + + /** + * Global Exception 전송 타입 - 2 + */ + public static ErrorResponse of(final ErrorCode code) { + return new ErrorResponse(code); + } + + /** + * Global Exception 전송 타입 - 3 + */ + public static ErrorResponse of(final ErrorCode code, final String reason) { + return new ErrorResponse(code, reason); + } + + + /** + * 에러를 e.getBindingResult() 형태로 전달 받는 경우 해당 내용을 상세 내용으로 변경 + */ + @Getter + public static class FieldError { + private final String field; + private final String value; + private final String reason; + + public static List of(final String field, final String value, final String reason) { + List fieldErrors = new ArrayList<>(); + fieldErrors.add(new FieldError(field, value, reason)); + return fieldErrors; + } + + private static List of(final BindingResult bindingResult) { + final List fieldErrors = bindingResult.getFieldErrors(); + return fieldErrors.stream() + .map(error -> new FieldError( + error.getField(), + error.getRejectedValue() == null ? "" : error.getRejectedValue().toString(), + error.getDefaultMessage())) + .collect(Collectors.toList()); + } + + @Builder + FieldError(String field, String value, String reason) { + this.field = field; + this.value = value; + this.reason = reason; + } + } + +} diff --git a/src/main/java/org/programmers/VoucherManagement/global/response/SuccessCode.java b/src/main/java/org/programmers/VoucherManagement/global/response/SuccessCode.java new file mode 100644 index 0000000000..08a43a01d2 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/global/response/SuccessCode.java @@ -0,0 +1,48 @@ +package org.programmers.VoucherManagement.global.response; + +public enum SuccessCode { + /** + * 1000번 -> 성공 + */ + SUCCESS(200, "1000", "요청에 성공하였습니다."), + + /** + * 2000번 -> Voucher + */ + DELETE_VOUCHER_SUCCESS(200, "V2000", "바우처 삭제를 성공하였습니다"), + UPDATE_VOUCHER_SUCCESS(200, "V2001", "바우처 수정을 성공하였습니다"), + + /** + * 3000번 -> Member + */ + UPDATE_MEMBER_SUCCESS(200, "V3000", "멤버 수정을 성공하였습니다"), + DELETE_MEMBER_SUCCESS(200, "V3001", "멤버 삭제를 성공하였습니다"), + + /** + * 4000번 -> Wallet + */ + DELETE_WALLET_SUCCESS(200, "V4000", "월렛 삭제를 성공하였습니다"); + + + private final int status; + private final String code; + private final String message; + + private SuccessCode(int status, String code, String message) { + this.status = status; + this.code = code; + this.message = message; + } + + public String getMessage() { + return message; + } + + public String getCode() { + return code; + } + + public int getStatus() { + return status; + } +} diff --git a/src/main/java/org/programmers/VoucherManagement/global/util/MemberConverter.java b/src/main/java/org/programmers/VoucherManagement/global/util/MemberConverter.java index c85fdb848c..463483b7b7 100644 --- a/src/main/java/org/programmers/VoucherManagement/global/util/MemberConverter.java +++ b/src/main/java/org/programmers/VoucherManagement/global/util/MemberConverter.java @@ -4,7 +4,6 @@ import org.programmers.VoucherManagement.member.domain.MemberStatus; import java.util.List; -import java.util.UUID; import java.util.stream.Collectors; public class MemberConverter { @@ -16,11 +15,11 @@ private MemberConverter() { public static Member toMember(String line) { String[] chunks = line.split(SEPARATOR); - UUID uuid = UUID.fromString(chunks[0]); + String id = chunks[0]; String name = chunks[1]; MemberStatus memberStatus = MemberStatus.from(chunks[2]); - return new Member(uuid, name, memberStatus); + return new Member(id, name, memberStatus); } public static List toMembers(List lines) { diff --git a/src/main/java/org/programmers/VoucherManagement/io/CommandExecutor.java b/src/main/java/org/programmers/VoucherManagement/io/CommandExecutor.java index 800e14856a..b4bd7d67dc 100644 --- a/src/main/java/org/programmers/VoucherManagement/io/CommandExecutor.java +++ b/src/main/java/org/programmers/VoucherManagement/io/CommandExecutor.java @@ -1,22 +1,20 @@ package org.programmers.VoucherManagement.io; +import org.programmers.VoucherManagement.member.application.dto.MemberCreateRequest; +import org.programmers.VoucherManagement.member.application.dto.MemberGetResponses; +import org.programmers.VoucherManagement.member.application.dto.MemberUpdateRequest; import org.programmers.VoucherManagement.member.domain.MemberStatus; -import org.programmers.VoucherManagement.member.dto.request.MemberCreateRequest; -import org.programmers.VoucherManagement.member.dto.request.MemberUpdateRequest; -import org.programmers.VoucherManagement.member.dto.response.MemberGetResponses; import org.programmers.VoucherManagement.member.presentation.MemberController; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherCreateRequest; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherGetResponses; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherUpdateRequest; import org.programmers.VoucherManagement.voucher.domain.DiscountType; -import org.programmers.VoucherManagement.voucher.dto.request.VoucherCreateRequest; -import org.programmers.VoucherManagement.voucher.dto.request.VoucherUpdateRequest; -import org.programmers.VoucherManagement.voucher.dto.response.VoucherGetResponses; import org.programmers.VoucherManagement.voucher.presentation.VoucherController; -import org.programmers.VoucherManagement.wallet.dto.request.WalletCreateRequest; -import org.programmers.VoucherManagement.wallet.dto.response.WalletGetResponses; +import org.programmers.VoucherManagement.wallet.application.dto.WalletCreateRequest; +import org.programmers.VoucherManagement.wallet.application.dto.WalletGetResponses; import org.programmers.VoucherManagement.wallet.presentation.WalletController; import org.springframework.stereotype.Component; -import java.util.UUID; - import static org.programmers.VoucherManagement.io.ConsoleMessage.*; @Component @@ -47,12 +45,12 @@ public void execute(MenuType menuType) { case UPDATE_VOUCHER -> { String voucherId = console.readVoucherId(); int voucherValue = console.readDiscountValue(); - voucherController.updateVoucher(UUID.fromString(voucherId), new VoucherUpdateRequest(voucherValue)); + voucherController.updateVoucher(voucherId, new VoucherUpdateRequest(voucherValue)); console.printConsoleMessage(TASK_SUCCESSFUL_MESSAGE); } case DELETE_VOUCHER -> { String voucherId = console.readVoucherId(); - voucherController.deleteVoucher(UUID.fromString(voucherId)); + voucherController.deleteVoucher(voucherId); console.printConsoleMessage(TASK_SUCCESSFUL_MESSAGE); } case VOUCHER_LIST -> { @@ -70,12 +68,12 @@ public void execute(MenuType menuType) { case UPDATE_MEMBER -> { String memberId = console.readMemberId(); MemberStatus memberStatus = MemberStatus.from(console.readMemberStatus()); - memberController.updateMember(UUID.fromString(memberId), new MemberUpdateRequest(memberStatus)); + memberController.updateMember(memberId, new MemberUpdateRequest(memberStatus)); console.printConsoleMessage(TASK_SUCCESSFUL_MESSAGE); } case DELETE_MEMBER -> { String memberId = console.readMemberId(); - memberController.deleteMember(UUID.fromString(memberId)); + memberController.deleteMember(memberId); console.printConsoleMessage(TASK_SUCCESSFUL_MESSAGE); } case BLACK_MEMBER_LIST -> { @@ -93,17 +91,17 @@ public void execute(MenuType menuType) { } case LIST_WALLET_BY_MEMBER -> { String memberId = console.readMemberId(); - WalletGetResponses walletList = walletController.getWalletsByMemberId(UUID.fromString(memberId)); + WalletGetResponses walletList = walletController.getWalletsByMemberId(memberId); console.printWalletList(walletList); } case LIST_WALLET_BY_VOUCHER -> { String voucherId = console.readVoucherId(); - WalletGetResponses walletList = walletController.getWalletsByVoucherId(UUID.fromString(voucherId)); + WalletGetResponses walletList = walletController.getWalletsByVoucherId(voucherId); console.printWalletList(walletList); } case DELETE_WALLET -> { String walletId = console.readWalletId(); - walletController.deleteWallet(UUID.fromString(walletId)); + walletController.deleteWallet(walletId); console.printConsoleMessage(TASK_SUCCESSFUL_MESSAGE); } } @@ -113,7 +111,7 @@ private VoucherCreateRequest makeCreateVoucherRequest() { DiscountType discountType = DiscountType.from(console.readDiscountType()); int discountValue = console.readDiscountValue(); - return new VoucherCreateRequest(discountType, discountValue); + return new VoucherCreateRequest(discountType.toString(), discountValue); } private MemberCreateRequest makeCreateMemberRequest() { diff --git a/src/main/java/org/programmers/VoucherManagement/io/Console.java b/src/main/java/org/programmers/VoucherManagement/io/Console.java index 420a48b3b8..ea2fa4e880 100644 --- a/src/main/java/org/programmers/VoucherManagement/io/Console.java +++ b/src/main/java/org/programmers/VoucherManagement/io/Console.java @@ -1,15 +1,15 @@ package org.programmers.VoucherManagement.io; -import org.programmers.VoucherManagement.member.dto.response.MemberGetResponses; -import org.programmers.VoucherManagement.voucher.dto.response.VoucherGetResponses; -import org.programmers.VoucherManagement.wallet.dto.response.WalletGetResponses; +import org.programmers.VoucherManagement.member.application.dto.MemberGetResponses; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherGetResponses; +import org.programmers.VoucherManagement.wallet.application.dto.WalletGetResponses; import org.springframework.stereotype.Component; import java.text.MessageFormat; import java.util.Scanner; +import static org.programmers.VoucherManagement.global.response.ErrorCode.AMOUNT_IS_NOT_NUMBER; import static org.programmers.VoucherManagement.io.ConsoleMessage.*; -import static org.programmers.VoucherManagement.voucher.exception.VoucherExceptionMessage.AMOUNT_IS_NOT_NUMBER; @Component public class Console implements Input, Output { diff --git a/src/main/java/org/programmers/VoucherManagement/io/MenuType.java b/src/main/java/org/programmers/VoucherManagement/io/MenuType.java index 06b0ef49ea..3a54686be4 100644 --- a/src/main/java/org/programmers/VoucherManagement/io/MenuType.java +++ b/src/main/java/org/programmers/VoucherManagement/io/MenuType.java @@ -1,5 +1,6 @@ package org.programmers.VoucherManagement.io; +import org.programmers.VoucherManagement.global.response.ErrorCode; import org.programmers.VoucherManagement.voucher.exception.VoucherException; import java.util.Arrays; @@ -8,8 +9,6 @@ import java.util.function.Function; import java.util.stream.Collectors; -import static org.programmers.VoucherManagement.voucher.exception.VoucherExceptionMessage.NOT_EXIST_COMMAND; - public enum MenuType { //Member INSERT_MEMBER(1), @@ -50,7 +49,7 @@ private int getNumber() { public static MenuType from(int type) { if (!COMMAND_TYPE_MAP.containsKey(type)) { - throw new VoucherException(NOT_EXIST_COMMAND); + throw new VoucherException(ErrorCode.NOT_EXIST_COMMAND); } return COMMAND_TYPE_MAP.get(type); } diff --git a/src/main/java/org/programmers/VoucherManagement/io/Output.java b/src/main/java/org/programmers/VoucherManagement/io/Output.java index 30d94e3334..25a8017c26 100644 --- a/src/main/java/org/programmers/VoucherManagement/io/Output.java +++ b/src/main/java/org/programmers/VoucherManagement/io/Output.java @@ -1,8 +1,8 @@ package org.programmers.VoucherManagement.io; -import org.programmers.VoucherManagement.member.dto.response.MemberGetResponses; -import org.programmers.VoucherManagement.voucher.dto.response.VoucherGetResponses; -import org.programmers.VoucherManagement.wallet.dto.response.WalletGetResponses; +import org.programmers.VoucherManagement.member.application.dto.MemberGetResponses; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherGetResponses; +import org.programmers.VoucherManagement.wallet.application.dto.WalletGetResponses; public interface Output { void printConsoleMessage(ConsoleMessage message); diff --git a/src/main/java/org/programmers/VoucherManagement/member/application/MemberService.java b/src/main/java/org/programmers/VoucherManagement/member/application/MemberService.java index e7a44936d6..8156a47a42 100644 --- a/src/main/java/org/programmers/VoucherManagement/member/application/MemberService.java +++ b/src/main/java/org/programmers/VoucherManagement/member/application/MemberService.java @@ -1,21 +1,21 @@ package org.programmers.VoucherManagement.member.application; +import org.programmers.VoucherManagement.member.application.dto.MemberCreateRequest; +import org.programmers.VoucherManagement.member.application.dto.MemberCreateResponse; +import org.programmers.VoucherManagement.member.application.dto.MemberGetResponses; +import org.programmers.VoucherManagement.member.application.dto.MemberUpdateRequest; +import org.programmers.VoucherManagement.member.application.mapper.MemberServiceMapper; import org.programmers.VoucherManagement.member.domain.Member; import org.programmers.VoucherManagement.member.domain.MemberStatus; -import org.programmers.VoucherManagement.member.dto.request.MemberCreateRequest; -import org.programmers.VoucherManagement.member.dto.request.MemberUpdateRequest; -import org.programmers.VoucherManagement.member.dto.response.MemberGetResponses; import org.programmers.VoucherManagement.member.exception.MemberException; import org.programmers.VoucherManagement.member.infrastructure.MemberReaderRepository; import org.programmers.VoucherManagement.member.infrastructure.MemberStoreRepository; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.UUID; +import static org.programmers.VoucherManagement.global.response.ErrorCode.NOT_FOUND_MEMBER; -import static org.programmers.VoucherManagement.member.exception.MemberExceptionMessage.NOT_FOUND_MEMBER; - -@Component +@Service @Transactional(readOnly = true) public class MemberService { private final MemberReaderRepository memberReaderRepository; @@ -26,7 +26,6 @@ public MemberService(MemberReaderRepository memberReaderRepository, MemberStoreR this.memberStoreRepository = memberStoreRepository; } - public MemberGetResponses getAllMembers() { return new MemberGetResponses(memberReaderRepository.findAll()); } @@ -36,22 +35,23 @@ public MemberGetResponses getAllBlackMembers() { } @Transactional - public void createMember(MemberCreateRequest memberCreateRequest) { - Member member = new Member(UUID.randomUUID(), - memberCreateRequest.name(), - memberCreateRequest.memberStatus()); + public MemberCreateResponse createMember(MemberCreateRequest memberCreateRequest) { + + Member member = MemberServiceMapper.INSTANCE.createRequestToDomain(memberCreateRequest); memberStoreRepository.insert(member); + + return MemberServiceMapper.INSTANCE.domainToCreateResponse(member); } @Transactional - public void updateMember(UUID memberId, MemberUpdateRequest memberUpdateRequest) { + public void updateMember(String memberId, MemberUpdateRequest memberUpdateRequest) { Member member = memberReaderRepository.findById(memberId).orElseThrow(() -> new MemberException(NOT_FOUND_MEMBER)); member.changeMemberStatus(memberUpdateRequest.memberStatus()); memberStoreRepository.update(member); } @Transactional - public void deleteMember(UUID memberId) { + public void deleteMember(String memberId) { memberStoreRepository.delete(memberId); } } diff --git a/src/main/java/org/programmers/VoucherManagement/member/dto/request/MemberCreateRequest.java b/src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberCreateRequest.java similarity index 71% rename from src/main/java/org/programmers/VoucherManagement/member/dto/request/MemberCreateRequest.java rename to src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberCreateRequest.java index f52eee0669..ba707bdab4 100644 --- a/src/main/java/org/programmers/VoucherManagement/member/dto/request/MemberCreateRequest.java +++ b/src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberCreateRequest.java @@ -1,4 +1,4 @@ -package org.programmers.VoucherManagement.member.dto.request; +package org.programmers.VoucherManagement.member.application.dto; import org.programmers.VoucherManagement.member.domain.MemberStatus; diff --git a/src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberCreateResponse.java b/src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberCreateResponse.java new file mode 100644 index 0000000000..95656af040 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberCreateResponse.java @@ -0,0 +1,10 @@ +package org.programmers.VoucherManagement.member.application.dto; + +import org.programmers.VoucherManagement.member.domain.MemberStatus; + +public record MemberCreateResponse( + String memberId, + String name, + MemberStatus memberStatus +) { +} diff --git a/src/main/java/org/programmers/VoucherManagement/member/dto/response/MemberGetResponse.java b/src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberGetResponse.java similarity index 75% rename from src/main/java/org/programmers/VoucherManagement/member/dto/response/MemberGetResponse.java rename to src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberGetResponse.java index f1c0e476c0..e2deaed1ad 100644 --- a/src/main/java/org/programmers/VoucherManagement/member/dto/response/MemberGetResponse.java +++ b/src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberGetResponse.java @@ -1,20 +1,18 @@ -package org.programmers.VoucherManagement.member.dto.response; +package org.programmers.VoucherManagement.member.application.dto; import lombok.Builder; import org.programmers.VoucherManagement.member.domain.Member; import org.programmers.VoucherManagement.member.domain.MemberStatus; -import java.util.UUID; - @Builder public record MemberGetResponse( - UUID memberId, + String memberId, String name, MemberStatus memberStatus ) { public static MemberGetResponse toDto(Member member) { return MemberGetResponse.builder() - .memberId(member.getMemberUUID()) + .memberId(member.getMemberId()) .name(member.getName()) .memberStatus(member.getMemberStatus()) .build(); diff --git a/src/main/java/org/programmers/VoucherManagement/member/dto/response/MemberGetResponses.java b/src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberGetResponses.java similarity index 75% rename from src/main/java/org/programmers/VoucherManagement/member/dto/response/MemberGetResponses.java rename to src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberGetResponses.java index 113d8d9200..3cce036162 100644 --- a/src/main/java/org/programmers/VoucherManagement/member/dto/response/MemberGetResponses.java +++ b/src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberGetResponses.java @@ -1,4 +1,4 @@ -package org.programmers.VoucherManagement.member.dto.response; +package org.programmers.VoucherManagement.member.application.dto; import org.programmers.VoucherManagement.member.domain.Member; @@ -12,7 +12,8 @@ public class MemberGetResponses { public MemberGetResponses(List members) { this.memberResponses = members .stream() - .map(MemberGetResponse::toDto).collect(Collectors.toList()); + .map(MemberGetResponse::toDto) + .collect(Collectors.toList()); } public List getGetMemberListRes() { diff --git a/src/main/java/org/programmers/VoucherManagement/member/dto/request/MemberUpdateRequest.java b/src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberUpdateRequest.java similarity index 67% rename from src/main/java/org/programmers/VoucherManagement/member/dto/request/MemberUpdateRequest.java rename to src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberUpdateRequest.java index e8996d42d8..1205f362a6 100644 --- a/src/main/java/org/programmers/VoucherManagement/member/dto/request/MemberUpdateRequest.java +++ b/src/main/java/org/programmers/VoucherManagement/member/application/dto/MemberUpdateRequest.java @@ -1,4 +1,4 @@ -package org.programmers.VoucherManagement.member.dto.request; +package org.programmers.VoucherManagement.member.application.dto; import org.programmers.VoucherManagement.member.domain.MemberStatus; diff --git a/src/main/java/org/programmers/VoucherManagement/member/application/mapper/MemberServiceMapper.java b/src/main/java/org/programmers/VoucherManagement/member/application/mapper/MemberServiceMapper.java new file mode 100644 index 0000000000..75eef51aab --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/member/application/mapper/MemberServiceMapper.java @@ -0,0 +1,24 @@ +package org.programmers.VoucherManagement.member.application.mapper; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; +import org.programmers.VoucherManagement.member.application.dto.MemberCreateRequest; +import org.programmers.VoucherManagement.member.application.dto.MemberCreateResponse; +import org.programmers.VoucherManagement.member.domain.Member; + +@Mapper(componentModel = "spring") +public interface MemberServiceMapper { + + MemberServiceMapper INSTANCE = Mappers.getMapper(MemberServiceMapper.class); + + @Mapping(source = "memberId", target = "memberId") + @Mapping(source = "name", target = "name") + @Mapping(source = "memberStatus", target = "memberStatus") + MemberCreateResponse domainToCreateResponse(Member member); + + @Mapping(target = "memberId", expression = "java(com.github.f4b6a3.ulid.UlidCreator.getUlid().toString())") + @Mapping(source = "name", target = "name") + @Mapping(source = "memberStatus", target = "memberStatus") + Member createRequestToDomain(MemberCreateRequest request); +} diff --git a/src/main/java/org/programmers/VoucherManagement/member/domain/Member.java b/src/main/java/org/programmers/VoucherManagement/member/domain/Member.java index 816f27635d..f9bbb2ebf7 100644 --- a/src/main/java/org/programmers/VoucherManagement/member/domain/Member.java +++ b/src/main/java/org/programmers/VoucherManagement/member/domain/Member.java @@ -1,21 +1,21 @@ package org.programmers.VoucherManagement.member.domain; -import java.util.UUID; +import org.programmers.VoucherManagement.global.entity.BaseTimeEntity; -public class Member { - - private UUID memberUUID; +public class Member extends BaseTimeEntity { + private String memberId; private String name; private MemberStatus memberStatus; - public Member(UUID memberUUID, String name, MemberStatus memberStatus) { - this.memberUUID = memberUUID; + public Member(String memberId, String name, MemberStatus memberStatus) { + super(); + this.memberId = memberId; this.name = name; this.memberStatus = memberStatus; } - public UUID getMemberUUID() { - return memberUUID; + public String getMemberId() { + return memberId; } public String getName() { diff --git a/src/main/java/org/programmers/VoucherManagement/member/domain/MemberStatus.java b/src/main/java/org/programmers/VoucherManagement/member/domain/MemberStatus.java index 8e691a04fc..2f0f280653 100644 --- a/src/main/java/org/programmers/VoucherManagement/member/domain/MemberStatus.java +++ b/src/main/java/org/programmers/VoucherManagement/member/domain/MemberStatus.java @@ -2,7 +2,7 @@ import java.util.Arrays; -import static org.programmers.VoucherManagement.member.exception.MemberExceptionMessage.NOT_EXIST_MEMBER_STATUS; +import static org.programmers.VoucherManagement.global.response.ErrorCode.NOT_EXIST_MEMBER_STATUS; public enum MemberStatus { BLACK, diff --git a/src/main/java/org/programmers/VoucherManagement/member/exception/MemberException.java b/src/main/java/org/programmers/VoucherManagement/member/exception/MemberException.java index d5a3385b2f..8caed465d7 100644 --- a/src/main/java/org/programmers/VoucherManagement/member/exception/MemberException.java +++ b/src/main/java/org/programmers/VoucherManagement/member/exception/MemberException.java @@ -1,8 +1,14 @@ package org.programmers.VoucherManagement.member.exception; +import lombok.Getter; +import org.programmers.VoucherManagement.global.response.ErrorCode; + +@Getter public class MemberException extends RuntimeException { + private final ErrorCode errorCode; - public MemberException(MemberExceptionMessage exceptionMessage) { - super(exceptionMessage.getMessage()); + public MemberException(ErrorCode errorCode) { + super(errorCode.getMessage()); + this.errorCode = errorCode; } } diff --git a/src/main/java/org/programmers/VoucherManagement/member/exception/MemberExceptionMessage.java b/src/main/java/org/programmers/VoucherManagement/member/exception/MemberExceptionMessage.java deleted file mode 100644 index e1f48e8e54..0000000000 --- a/src/main/java/org/programmers/VoucherManagement/member/exception/MemberExceptionMessage.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.programmers.VoucherManagement.member.exception; - -public enum MemberExceptionMessage { - NOT_EXIST_MEMBER_STATUS("해당하는 회원 상태가 존재하지 않습니다."), - NOT_FOUND_MEMBER("회원을 찾을 수 없습니다. "), - FAIL_TO_INSERT("데이터가 정상적으로 저장되지 않았습니다."), - FAIL_TO_UPDATE("데이터가 정상적으로 수정되지 않았습니다."), - FAIL_TO_DELETE("데이터가 정상적으로 삭제되지 않았습니다."); - - private final String message; - - MemberExceptionMessage(String message) { - this.message = message; - } - - public String getMessage() { - return this.message; - } -} diff --git a/src/main/java/org/programmers/VoucherManagement/member/infrastructure/JdbcMemberReaderRepository.java b/src/main/java/org/programmers/VoucherManagement/member/infrastructure/JdbcMemberReaderRepository.java index ccde991c9e..aa6298fc61 100644 --- a/src/main/java/org/programmers/VoucherManagement/member/infrastructure/JdbcMemberReaderRepository.java +++ b/src/main/java/org/programmers/VoucherManagement/member/infrastructure/JdbcMemberReaderRepository.java @@ -10,7 +10,6 @@ import java.util.List; import java.util.Optional; -import java.util.UUID; @Primary @Repository @@ -23,25 +22,25 @@ public JdbcMemberReaderRepository(JdbcTemplate jdbcTemplate) { @Override public List findAll() { - String sql = "select member_id, member_status, name from member_table"; + String sql = "SELECT member_id, member_status, name FROM member_table"; return jdbcTemplate.query(sql, memberRowMapper()); } @Override public List findAllByMemberStatus(MemberStatus memberStatus) { - String sql = "select member_id, member_status, name from member_table where member_status = ?"; + String sql = "SELECT member_id, member_status, name FROM member_table WHERE member_status = ?"; return jdbcTemplate.query(sql, memberRowMapper(), memberStatus.toString()); } @Override - public Optional findById(UUID memberId) { - String sql = "select member_id, member_status, name from member_table where member_id = ?"; + public Optional findById(String memberId) { + String sql = "SELECT member_id, member_status, name FROM member_table WHERE member_id = ?"; try { return Optional.ofNullable(jdbcTemplate.queryForObject(sql, memberRowMapper(), - memberId.toString())); + memberId)); } catch (EmptyResultDataAccessException e) { return Optional.empty(); } @@ -49,7 +48,8 @@ public Optional findById(UUID memberId) { public static RowMapper memberRowMapper() { return (result, rowNum) -> new Member( - UUID.fromString(result.getString("member_id")), +// UUID.fromString(result.getString("member_id")), + result.getString("member_id"), result.getString("name"), MemberStatus.from(result.getString("member_status")) ); diff --git a/src/main/java/org/programmers/VoucherManagement/member/infrastructure/JdbcMemberStoreRepository.java b/src/main/java/org/programmers/VoucherManagement/member/infrastructure/JdbcMemberStoreRepository.java index ae73ae56ab..501b17d468 100644 --- a/src/main/java/org/programmers/VoucherManagement/member/infrastructure/JdbcMemberStoreRepository.java +++ b/src/main/java/org/programmers/VoucherManagement/member/infrastructure/JdbcMemberStoreRepository.java @@ -6,9 +6,7 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; -import java.util.UUID; - -import static org.programmers.VoucherManagement.member.exception.MemberExceptionMessage.*; +import static org.programmers.VoucherManagement.global.response.ErrorCode.*; @Primary @Repository @@ -22,37 +20,39 @@ public JdbcMemberStoreRepository(JdbcTemplate jdbcTemplate) { @Override public Member insert(Member member) { - String sql = "insert into member_table(member_id, name, member_status) values (?,?,?)"; + String sql = "INSERT INTO member_table(member_id, name, member_status, created_at) VALUES (?,?,?,?)"; int insertCount = jdbcTemplate.update(sql, - member.getMemberUUID().toString(), + member.getMemberId(), member.getName(), - member.getMemberStatus().toString()); + member.getMemberStatus().toString(), + member.getCreatedAt() + ); if (insertCount != 1) { - throw new MemberException(FAIL_TO_INSERT); + throw new MemberException(FAIL_TO_INSERT_MEMBER); } return member; } @Override public void update(Member member) { - String sql = "update member_table set name = ?, member_status = ? where member_id = ?"; + String sql = "UPDATE member_table SET name = ?, member_status = ? WHERE member_id = ?"; int updateCount = jdbcTemplate.update(sql, member.getName(), member.getMemberStatus().toString(), - member.getMemberUUID().toString()); + member.getMemberId()); if (updateCount != 1) { - throw new MemberException(FAIL_TO_UPDATE); + throw new MemberException(FAIL_TO_UPDATE_MEMBER); } } @Override - public void delete(UUID memberId) { - String sql = "delete from member_table where member_id = ?"; + public void delete(String memberId) { + String sql = "DELETE FROM member_table WHERE member_id = ?"; int deleteCount = jdbcTemplate.update(sql, - memberId.toString()); + memberId); if (deleteCount != 1) { - throw new MemberException(FAIL_TO_DELETE); + throw new MemberException(FAIL_TO_DELETE_MEMBER); } } } diff --git a/src/main/java/org/programmers/VoucherManagement/member/infrastructure/MemberReaderRepository.java b/src/main/java/org/programmers/VoucherManagement/member/infrastructure/MemberReaderRepository.java index 09f1a0012f..6a240daf4b 100644 --- a/src/main/java/org/programmers/VoucherManagement/member/infrastructure/MemberReaderRepository.java +++ b/src/main/java/org/programmers/VoucherManagement/member/infrastructure/MemberReaderRepository.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Optional; -import java.util.UUID; public interface MemberReaderRepository { /** @@ -28,5 +27,5 @@ public interface MemberReaderRepository { * @param memberId * @return Optional - memberId값을 이용해 조회한 회원 */ - Optional findById(UUID memberId); + Optional findById(String memberId); } diff --git a/src/main/java/org/programmers/VoucherManagement/member/infrastructure/MemberStoreRepository.java b/src/main/java/org/programmers/VoucherManagement/member/infrastructure/MemberStoreRepository.java index 1535d4233c..218c108096 100644 --- a/src/main/java/org/programmers/VoucherManagement/member/infrastructure/MemberStoreRepository.java +++ b/src/main/java/org/programmers/VoucherManagement/member/infrastructure/MemberStoreRepository.java @@ -2,8 +2,6 @@ import org.programmers.VoucherManagement.member.domain.Member; -import java.util.UUID; - public interface MemberStoreRepository { /** * db에 회원 저장 @@ -25,5 +23,5 @@ public interface MemberStoreRepository { * * @param memberId */ - void delete(UUID memberId); //삭제 + void delete(String memberId); //삭제 } diff --git a/src/main/java/org/programmers/VoucherManagement/member/presentation/MemberController.java b/src/main/java/org/programmers/VoucherManagement/member/presentation/MemberController.java index b844c387b3..07f2b2fb6d 100644 --- a/src/main/java/org/programmers/VoucherManagement/member/presentation/MemberController.java +++ b/src/main/java/org/programmers/VoucherManagement/member/presentation/MemberController.java @@ -1,13 +1,11 @@ package org.programmers.VoucherManagement.member.presentation; import org.programmers.VoucherManagement.member.application.MemberService; -import org.programmers.VoucherManagement.member.dto.request.MemberCreateRequest; -import org.programmers.VoucherManagement.member.dto.request.MemberUpdateRequest; -import org.programmers.VoucherManagement.member.dto.response.MemberGetResponses; +import org.programmers.VoucherManagement.member.application.dto.MemberCreateRequest; +import org.programmers.VoucherManagement.member.application.dto.MemberGetResponses; +import org.programmers.VoucherManagement.member.application.dto.MemberUpdateRequest; import org.springframework.stereotype.Component; -import java.util.UUID; - @Component public class MemberController { private final MemberService memberService; @@ -28,11 +26,11 @@ public void createMember(MemberCreateRequest memberCreateRequest) { memberService.createMember(memberCreateRequest); } - public void updateMember(UUID memberId, MemberUpdateRequest memberUpdateRequest) { + public void updateMember(String memberId, MemberUpdateRequest memberUpdateRequest) { memberService.updateMember(memberId, memberUpdateRequest); } - public void deleteMember(UUID memberId) { + public void deleteMember(String memberId) { memberService.deleteMember(memberId); } } diff --git a/src/main/java/org/programmers/VoucherManagement/member/presentation/MemberRestController.java b/src/main/java/org/programmers/VoucherManagement/member/presentation/MemberRestController.java new file mode 100644 index 0000000000..ab3a250117 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/member/presentation/MemberRestController.java @@ -0,0 +1,56 @@ +package org.programmers.VoucherManagement.member.presentation; + +import jakarta.validation.Valid; +import org.programmers.VoucherManagement.global.response.BaseResponse; +import org.programmers.VoucherManagement.member.application.MemberService; +import org.programmers.VoucherManagement.member.application.dto.MemberGetResponses; +import org.programmers.VoucherManagement.member.presentation.dto.MemberCreateRequestData; +import org.programmers.VoucherManagement.member.presentation.dto.MemberCreateResponseData; +import org.programmers.VoucherManagement.member.presentation.dto.MemberUpdateRequestData; +import org.programmers.VoucherManagement.member.presentation.mapper.MemberControllerMapper; +import org.springframework.web.bind.annotation.*; + +import static org.programmers.VoucherManagement.global.response.SuccessCode.DELETE_MEMBER_SUCCESS; +import static org.programmers.VoucherManagement.global.response.SuccessCode.UPDATE_MEMBER_SUCCESS; + +@RestController +@RequestMapping("/member") +public class MemberRestController { + private final MemberService memberService; + + public MemberRestController(MemberService memberService) { + this.memberService = memberService; + } + + @GetMapping() + public BaseResponse getAllMembers() { + return new BaseResponse<>(memberService.getAllMembers()); + } + + + @GetMapping("/black-list") + public BaseResponse getAllBlackMembers() { + return new BaseResponse<>(memberService.getAllBlackMembers()); + } + + @PostMapping("") + public BaseResponse createMember(@Valid @RequestBody MemberCreateRequestData data) { + return new BaseResponse<>(MemberControllerMapper.INSTANCE.createResponseToData( + memberService.createMember(MemberControllerMapper.INSTANCE.dataToCreateRequest(data)) + )); + } + + @PatchMapping("/{memberId}") + public BaseResponse updateMember(@PathVariable String memberId, @Valid @RequestBody MemberUpdateRequestData data) { + memberService.updateMember(memberId, MemberControllerMapper.INSTANCE.dataToUpdateRequest(data)); + + return new BaseResponse<>(UPDATE_MEMBER_SUCCESS); + } + + @DeleteMapping("/{memberId}") + public BaseResponse deleteMember(@PathVariable String memberId) { + memberService.deleteMember(memberId); + + return new BaseResponse<>(DELETE_MEMBER_SUCCESS); + } +} diff --git a/src/main/java/org/programmers/VoucherManagement/member/presentation/dto/MemberCreateRequestData.java b/src/main/java/org/programmers/VoucherManagement/member/presentation/dto/MemberCreateRequestData.java new file mode 100644 index 0000000000..737281f8a3 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/member/presentation/dto/MemberCreateRequestData.java @@ -0,0 +1,11 @@ +package org.programmers.VoucherManagement.member.presentation.dto; + +import jakarta.validation.constraints.NotBlank; + +public record MemberCreateRequestData( + @NotBlank + String name, + @NotBlank + String memberStatus +) { +} diff --git a/src/main/java/org/programmers/VoucherManagement/member/presentation/dto/MemberCreateResponseData.java b/src/main/java/org/programmers/VoucherManagement/member/presentation/dto/MemberCreateResponseData.java new file mode 100644 index 0000000000..eb3364b3de --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/member/presentation/dto/MemberCreateResponseData.java @@ -0,0 +1,10 @@ +package org.programmers.VoucherManagement.member.presentation.dto; + +import org.programmers.VoucherManagement.member.domain.MemberStatus; + +public record MemberCreateResponseData( + String memberId, + String name, + MemberStatus memberStatus +) { +} diff --git a/src/main/java/org/programmers/VoucherManagement/member/presentation/dto/MemberUpdateRequestData.java b/src/main/java/org/programmers/VoucherManagement/member/presentation/dto/MemberUpdateRequestData.java new file mode 100644 index 0000000000..b312f3e6cd --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/member/presentation/dto/MemberUpdateRequestData.java @@ -0,0 +1,9 @@ +package org.programmers.VoucherManagement.member.presentation.dto; + +import jakarta.validation.constraints.NotBlank; + +public record MemberUpdateRequestData( + @NotBlank + String memberStatus +) { +} diff --git a/src/main/java/org/programmers/VoucherManagement/member/presentation/mapper/MemberControllerMapper.java b/src/main/java/org/programmers/VoucherManagement/member/presentation/mapper/MemberControllerMapper.java new file mode 100644 index 0000000000..483a5e74f2 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/member/presentation/mapper/MemberControllerMapper.java @@ -0,0 +1,28 @@ +package org.programmers.VoucherManagement.member.presentation.mapper; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; +import org.programmers.VoucherManagement.member.application.dto.MemberCreateRequest; +import org.programmers.VoucherManagement.member.application.dto.MemberCreateResponse; +import org.programmers.VoucherManagement.member.application.dto.MemberUpdateRequest; +import org.programmers.VoucherManagement.member.presentation.dto.MemberCreateRequestData; +import org.programmers.VoucherManagement.member.presentation.dto.MemberCreateResponseData; +import org.programmers.VoucherManagement.member.presentation.dto.MemberUpdateRequestData; + +@Mapper(componentModel = "spring") +public interface MemberControllerMapper { + MemberControllerMapper INSTANCE = Mappers.getMapper(MemberControllerMapper.class); + + @Mapping(source = "name", target = "name") + @Mapping(source = "memberStatus", target = "memberStatus") + MemberCreateRequest dataToCreateRequest(MemberCreateRequestData data); + + @Mapping(source = "memberStatus", target = "memberStatus") + MemberUpdateRequest dataToUpdateRequest(MemberUpdateRequestData data); + + @Mapping(source = "memberId", target = "memberId") + @Mapping(source = "name", target = "name") + @Mapping(source = "memberStatus", target = "memberStatus") + MemberCreateResponseData createResponseToData(MemberCreateResponse response); +} diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/application/VoucherService.java b/src/main/java/org/programmers/VoucherManagement/voucher/application/VoucherService.java index 960789b0e7..fa13ca54df 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/application/VoucherService.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/application/VoucherService.java @@ -1,23 +1,22 @@ package org.programmers.VoucherManagement.voucher.application; +import org.programmers.VoucherManagement.global.response.ErrorCode; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherCreateRequest; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherCreateResponse; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherGetResponses; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherUpdateRequest; +import org.programmers.VoucherManagement.voucher.application.mapper.VoucherServiceMapper; import org.programmers.VoucherManagement.voucher.domain.DiscountValue; import org.programmers.VoucherManagement.voucher.domain.Voucher; import org.programmers.VoucherManagement.voucher.domain.VoucherFactory; -import org.programmers.VoucherManagement.voucher.dto.request.VoucherCreateRequest; -import org.programmers.VoucherManagement.voucher.dto.request.VoucherUpdateRequest; -import org.programmers.VoucherManagement.voucher.dto.response.VoucherGetResponses; import org.programmers.VoucherManagement.voucher.exception.VoucherException; import org.programmers.VoucherManagement.voucher.infrastructure.VoucherReaderRepository; import org.programmers.VoucherManagement.voucher.infrastructure.VoucherStoreRepository; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.UUID; -import static org.programmers.VoucherManagement.voucher.exception.VoucherExceptionMessage.NOT_FOUND_VOUCHER; - - -@Component +@Service @Transactional(readOnly = true) public class VoucherService { private final VoucherReaderRepository voucherReaderRepository; @@ -29,19 +28,21 @@ public VoucherService(VoucherReaderRepository voucherReaderRepository, VoucherSt } @Transactional - public void updateVoucher(UUID voucherId, VoucherUpdateRequest voucherUpdateRequest) { - Voucher voucher = voucherReaderRepository.findById(voucherId).orElseThrow(() -> new VoucherException(NOT_FOUND_VOUCHER)); - DiscountValue discountValue = new DiscountValue(voucherUpdateRequest.discountValue()); - discountValue.validateValue(voucher.getDiscountType()); + public void updateVoucher(String voucherId, VoucherUpdateRequest voucherUpdateRequest) { + Voucher voucher = voucherReaderRepository + .findById(voucherId) + .orElseThrow(() -> new VoucherException(ErrorCode.NOT_FOUND_VOUCHER)); + + DiscountValue discountValue = new DiscountValue(voucherUpdateRequest.discountValue(), voucher.getDiscountType()); voucher.changeDiscountValue(discountValue); voucherStoreRepository.update(voucher); } @Transactional - public void saveVoucher(VoucherCreateRequest voucherCreateRequest) { + public VoucherCreateResponse saveVoucher(VoucherCreateRequest voucherCreateRequest) { Voucher voucher = VoucherFactory.createVoucher(voucherCreateRequest); - voucherStoreRepository.insert(voucher); + return VoucherServiceMapper.INSTANCE.domainToCreateResponse(voucherStoreRepository.insert(voucher)); } public VoucherGetResponses getVoucherList() { @@ -49,7 +50,7 @@ public VoucherGetResponses getVoucherList() { } @Transactional - public void deleteVoucher(UUID voucherId) { + public void deleteVoucher(String voucherId) { voucherStoreRepository.delete(voucherId); } } diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherCreateRequest.java b/src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherCreateRequest.java new file mode 100644 index 0000000000..fc6157c8d6 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherCreateRequest.java @@ -0,0 +1,7 @@ +package org.programmers.VoucherManagement.voucher.application.dto; + +public record VoucherCreateRequest( + String discountType, + int discountValue +) { +} diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherCreateResponse.java b/src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherCreateResponse.java new file mode 100644 index 0000000000..aa82321178 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherCreateResponse.java @@ -0,0 +1,21 @@ +package org.programmers.VoucherManagement.voucher.application.dto; + +import lombok.Builder; +import org.programmers.VoucherManagement.voucher.domain.DiscountType; +import org.programmers.VoucherManagement.voucher.domain.Voucher; + +@Builder +public record VoucherCreateResponse( + String voucherId, + DiscountType discountType, + int discountValue +) { + public static VoucherCreateResponse toDto(Voucher voucher) { + + return VoucherCreateResponse.builder() + .voucherId(voucher.getVoucherId()) + .discountType(voucher.getDiscountType()) + .discountValue(voucher.getDiscountValue().getValue()) + .build(); + } +} diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/dto/response/VoucherGetResponse.java b/src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherGetResponse.java similarity index 83% rename from src/main/java/org/programmers/VoucherManagement/voucher/dto/response/VoucherGetResponse.java rename to src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherGetResponse.java index 9dad91f2e5..22b9c5a122 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/dto/response/VoucherGetResponse.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherGetResponse.java @@ -1,14 +1,12 @@ -package org.programmers.VoucherManagement.voucher.dto.response; +package org.programmers.VoucherManagement.voucher.application.dto; import lombok.Builder; import org.programmers.VoucherManagement.voucher.domain.DiscountType; import org.programmers.VoucherManagement.voucher.domain.Voucher; -import java.util.UUID; - @Builder public record VoucherGetResponse( - UUID voucherId, + String voucherId, DiscountType discountType, int discountValue ) { diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/dto/response/VoucherGetResponses.java b/src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherGetResponses.java similarity index 70% rename from src/main/java/org/programmers/VoucherManagement/voucher/dto/response/VoucherGetResponses.java rename to src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherGetResponses.java index 0f1d31cf11..f76ed7d023 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/dto/response/VoucherGetResponses.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherGetResponses.java @@ -1,5 +1,6 @@ -package org.programmers.VoucherManagement.voucher.dto.response; +package org.programmers.VoucherManagement.voucher.application.dto; +import org.programmers.VoucherManagement.voucher.application.mapper.VoucherServiceMapper; import org.programmers.VoucherManagement.voucher.domain.Voucher; import java.util.Collections; @@ -12,8 +13,9 @@ public class VoucherGetResponses { public VoucherGetResponses(List vouchers) { this.voucherResponses = vouchers .stream() - .map(VoucherGetResponse::toDto) + .map(v -> VoucherServiceMapper.INSTANCE.domainToGetResponse(v)) .collect(Collectors.toList()); + } public List getGetVoucherListRes() { diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherUpdateRequest.java b/src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherUpdateRequest.java new file mode 100644 index 0000000000..4d89191c59 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/voucher/application/dto/VoucherUpdateRequest.java @@ -0,0 +1,4 @@ +package org.programmers.VoucherManagement.voucher.application.dto; + +public record VoucherUpdateRequest(int discountValue) { +} diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/application/mapper/VoucherServiceMapper.java b/src/main/java/org/programmers/VoucherManagement/voucher/application/mapper/VoucherServiceMapper.java new file mode 100644 index 0000000000..91fcd8b5f2 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/voucher/application/mapper/VoucherServiceMapper.java @@ -0,0 +1,25 @@ +package org.programmers.VoucherManagement.voucher.application.mapper; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherCreateResponse; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherGetResponse; +import org.programmers.VoucherManagement.voucher.domain.Voucher; + + +@Mapper(componentModel = "spring") +public interface VoucherServiceMapper { + VoucherServiceMapper INSTANCE = Mappers.getMapper(VoucherServiceMapper.class); + + @Mapping(source = "voucherId", target = "voucherId") + @Mapping(source = "discountType", target = "discountType") + @Mapping(source = "discountValue.value", target = "discountValue") + VoucherCreateResponse domainToCreateResponse(Voucher voucher); + + @Mapping(source = "voucherId", target = "voucherId") + @Mapping(source = "discountType", target = "discountType") + @Mapping(source = "discountValue.value", target = "discountValue") + VoucherGetResponse domainToGetResponse(Voucher voucher); + +} diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/domain/DiscountType.java b/src/main/java/org/programmers/VoucherManagement/voucher/domain/DiscountType.java index c6c380256e..7c085a211b 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/domain/DiscountType.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/domain/DiscountType.java @@ -8,7 +8,7 @@ import java.util.function.Function; import java.util.stream.Collectors; -import static org.programmers.VoucherManagement.voucher.exception.VoucherExceptionMessage.NOT_EXIST_DISCOUNT_TYPE; +import static org.programmers.VoucherManagement.global.response.ErrorCode.NOT_EXIST_DISCOUNT_TYPE; public enum DiscountType { PERCENT("percent", "%"), diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/domain/DiscountValue.java b/src/main/java/org/programmers/VoucherManagement/voucher/domain/DiscountValue.java index 20b2414258..7fb47a26c9 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/domain/DiscountValue.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/domain/DiscountValue.java @@ -2,22 +2,28 @@ import org.programmers.VoucherManagement.voucher.exception.VoucherException; -import static org.programmers.VoucherManagement.voucher.exception.VoucherExceptionMessage.NOT_INCLUDE_1_TO_100; +import static org.programmers.VoucherManagement.global.response.ErrorCode.NOT_INCLUDE_1_TO_100; -public class DiscountValue { +public class DiscountValue { private final int value; public DiscountValue(int value) { this.value = value; } + public DiscountValue(int discountValue, DiscountType discountType) { + validateValue(discountValue, discountType); + this.value = discountValue; + } + public int getValue() { return value; } - public void validateValue(DiscountType discountType) { - if (discountType == DiscountType.PERCENT && (value > 100 || value < 0)) { + private void validateValue(int discountValue, DiscountType discountType) { + + if (discountType == DiscountType.PERCENT && (discountValue > 100 || discountValue < 0)) { throw new VoucherException(NOT_INCLUDE_1_TO_100); } } diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/domain/FixedAmountVoucher.java b/src/main/java/org/programmers/VoucherManagement/voucher/domain/FixedAmountVoucher.java index 14afbd5283..6b8b25b9e4 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/domain/FixedAmountVoucher.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/domain/FixedAmountVoucher.java @@ -1,9 +1,7 @@ package org.programmers.VoucherManagement.voucher.domain; -import java.util.UUID; - public class FixedAmountVoucher extends Voucher { - public FixedAmountVoucher(UUID voucherId, DiscountType discountType, DiscountValue discountValue) { + public FixedAmountVoucher(String voucherId, DiscountType discountType, DiscountValue discountValue) { this.voucherId = voucherId; this.discountType = discountType; this.discountValue = discountValue; diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/domain/PercentAmountVoucher.java b/src/main/java/org/programmers/VoucherManagement/voucher/domain/PercentAmountVoucher.java index a0620100af..4cf1a8dabf 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/domain/PercentAmountVoucher.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/domain/PercentAmountVoucher.java @@ -2,12 +2,10 @@ import org.programmers.VoucherManagement.voucher.exception.VoucherException; -import java.util.UUID; - -import static org.programmers.VoucherManagement.voucher.exception.VoucherExceptionMessage.NOT_INCLUDE_1_TO_100; +import static org.programmers.VoucherManagement.global.response.ErrorCode.NOT_INCLUDE_1_TO_100; public class PercentAmountVoucher extends Voucher { - public PercentAmountVoucher(UUID voucherId, DiscountType discountType, DiscountValue discountValue) { + public PercentAmountVoucher(String voucherId, DiscountType discountType, DiscountValue discountValue) { validatePercentDiscountValue(discountValue); this.voucherId = voucherId; this.discountType = discountType; diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/domain/Voucher.java b/src/main/java/org/programmers/VoucherManagement/voucher/domain/Voucher.java index 8627013271..9c744142b5 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/domain/Voucher.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/domain/Voucher.java @@ -1,9 +1,9 @@ package org.programmers.VoucherManagement.voucher.domain; -import java.util.UUID; +import org.programmers.VoucherManagement.global.entity.BaseTimeEntity; -public abstract class Voucher { - protected UUID voucherId; +public abstract class Voucher extends BaseTimeEntity { + protected String voucherId; protected DiscountValue discountValue; protected DiscountType discountType; @@ -11,7 +11,7 @@ public DiscountType getDiscountType() { return discountType; } - public UUID getVoucherId() { + public String getVoucherId() { return voucherId; } diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/domain/VoucherFactory.java b/src/main/java/org/programmers/VoucherManagement/voucher/domain/VoucherFactory.java index ec75f2e71c..d455d4f632 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/domain/VoucherFactory.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/domain/VoucherFactory.java @@ -1,8 +1,7 @@ package org.programmers.VoucherManagement.voucher.domain; -import org.programmers.VoucherManagement.voucher.dto.request.VoucherCreateRequest; - -import java.util.UUID; +import com.github.f4b6a3.ulid.UlidCreator; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherCreateRequest; public class VoucherFactory { @@ -10,17 +9,17 @@ private VoucherFactory() { } public static Voucher createVoucher(VoucherCreateRequest voucherCreateRequest) { - DiscountType discountType = voucherCreateRequest.discountType(); + DiscountType discountType = DiscountType.from(voucherCreateRequest.discountType()); return switch (discountType) { case FIXED -> - new FixedAmountVoucher(UUID.randomUUID(), discountType, new DiscountValue(voucherCreateRequest.discountValue())); + new FixedAmountVoucher(UlidCreator.getUlid().toString(), discountType, new DiscountValue(voucherCreateRequest.discountValue())); case PERCENT -> - new PercentAmountVoucher(UUID.randomUUID(), discountType, new DiscountValue(voucherCreateRequest.discountValue())); + new PercentAmountVoucher(UlidCreator.getUlid().toString(), discountType, new DiscountValue(voucherCreateRequest.discountValue())); }; } - public static Voucher mapVoucher(UUID voucherId, int discountValue, DiscountType discountType) { + public static Voucher mapVoucher(String voucherId, int discountValue, DiscountType discountType) { return switch (discountType) { case FIXED -> new FixedAmountVoucher(voucherId, discountType, new DiscountValue(discountValue)); case PERCENT -> new PercentAmountVoucher(voucherId, discountType, new DiscountValue(discountValue)); diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/dto/request/VoucherUpdateRequest.java b/src/main/java/org/programmers/VoucherManagement/voucher/dto/request/VoucherUpdateRequest.java deleted file mode 100644 index b57ead9eee..0000000000 --- a/src/main/java/org/programmers/VoucherManagement/voucher/dto/request/VoucherUpdateRequest.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.programmers.VoucherManagement.voucher.dto.request; - -public record VoucherUpdateRequest(int discountValue) { -} diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/exception/VoucherException.java b/src/main/java/org/programmers/VoucherManagement/voucher/exception/VoucherException.java index 2229193978..c475672811 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/exception/VoucherException.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/exception/VoucherException.java @@ -1,16 +1,15 @@ package org.programmers.VoucherManagement.voucher.exception; -public class VoucherException extends RuntimeException { +import lombok.Getter; +import org.programmers.VoucherManagement.global.response.ErrorCode; - private final VoucherExceptionMessage exceptionMessage; +@Getter +public class VoucherException extends RuntimeException { + private final ErrorCode errorCode; - public VoucherException(VoucherExceptionMessage exceptionMessage) { - super(exceptionMessage.getMessage()); - this.exceptionMessage = exceptionMessage; + public VoucherException(ErrorCode errorCode) { + super(errorCode.getMessage()); + this.errorCode = errorCode; } - public VoucherException(VoucherExceptionMessage exceptionMessage, Throwable cause) { - super(exceptionMessage.getMessage(), cause); - this.exceptionMessage = exceptionMessage; - } } diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/exception/VoucherExceptionMessage.java b/src/main/java/org/programmers/VoucherManagement/voucher/exception/VoucherExceptionMessage.java deleted file mode 100644 index 5dcb02e2fc..0000000000 --- a/src/main/java/org/programmers/VoucherManagement/voucher/exception/VoucherExceptionMessage.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.programmers.VoucherManagement.voucher.exception; - -public enum VoucherExceptionMessage { - NOT_INCLUDE_1_TO_100("할인율은 1부터 100사이의 값이여야 합니다."), - AMOUNT_IS_NOT_NUMBER("숫자만 입력가능합니다."), - NOT_EXIST_COMMAND("해당하는 Command가 존재하지 않습니다."), - NOT_EXIST_DISCOUNT_TYPE("해당하는 유형의 바우처가 존재하지 않습니다."), - NOT_FOUND_VOUCHER("바우처를 찾을 수 없습니다."), - FAIL_TO_INSERT("데이터가 정상적으로 저장되지 않았습니다."), - FAIL_TO_UPDATE("데이터가 정상적으로 수정되지 않았습니다."), - FAIL_TO_DELETE("데이터가 정상적으로 삭제되지 않았습니다."); - - private final String message; - - VoucherExceptionMessage(String message) { - this.message = message; - } - - public String getMessage() { - return this.message; - } -} diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/JdbcVoucherReaderRepository.java b/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/JdbcVoucherReaderRepository.java index d61cd4ff7f..12626df578 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/JdbcVoucherReaderRepository.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/JdbcVoucherReaderRepository.java @@ -11,7 +11,6 @@ import java.util.List; import java.util.Optional; -import java.util.UUID; @Repository @Primary @@ -25,17 +24,17 @@ public JdbcVoucherReaderRepository(JdbcTemplate jdbcTemplate) { @Override public List findAll() { - String sql = "select voucher_id, voucher_value, voucher_type from voucher_table"; + String sql = "SELECT voucher_id, voucher_value, voucher_type FROM voucher_table"; return jdbcTemplate.query(sql, voucherRowMapper()); } @Override - public Optional findById(UUID voucherId) { - String sql = "select voucher_id, voucher_value, voucher_type from voucher_table where voucher_id = ?"; + public Optional findById(String voucherId) { + String sql = "SELECT voucher_id, voucher_value, voucher_type FROM voucher_table WHERE voucher_id = ?"; try { return Optional.ofNullable(jdbcTemplate.queryForObject(sql, voucherRowMapper(), - voucherId.toString())); + voucherId)); } catch (EmptyResultDataAccessException e) { return Optional.empty(); } @@ -43,7 +42,7 @@ public Optional findById(UUID voucherId) { public static RowMapper voucherRowMapper() { return (result, rowNum) -> VoucherFactory.mapVoucher( - UUID.fromString(result.getString("voucher_id")), + result.getString("voucher_id"), result.getInt("voucher_value"), DiscountType.from(result.getString("voucher_type")) ); diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/JdbcVoucherStoreRepository.java b/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/JdbcVoucherStoreRepository.java index 9f4c3eb46b..290737f83e 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/JdbcVoucherStoreRepository.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/JdbcVoucherStoreRepository.java @@ -6,9 +6,7 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; -import java.util.UUID; - -import static org.programmers.VoucherManagement.voucher.exception.VoucherExceptionMessage.*; +import static org.programmers.VoucherManagement.global.response.ErrorCode.*; @Repository @Primary @@ -21,36 +19,38 @@ public JdbcVoucherStoreRepository(JdbcTemplate jdbcTemplate) { @Override public Voucher insert(Voucher voucher) { - String sql = "insert into voucher_table(voucher_id, voucher_value , voucher_type) values (?,?,?)"; + String sql = "INSERT INTO voucher_table(voucher_id, voucher_value, voucher_type, created_at) VALUES (?,?,?,?)"; int insertCount = jdbcTemplate.update(sql, - voucher.getVoucherId().toString(), + voucher.getVoucherId(), voucher.getDiscountValue().getValue(), - voucher.getDiscountType().getType()); + voucher.getDiscountType().getType(), + voucher.getCreatedAt() + ); if (insertCount != 1) { - throw new VoucherException(FAIL_TO_INSERT); + throw new VoucherException(FAIL_TO_INSERT_VOUCHER); } return voucher; } @Override - public void delete(UUID voucherId) { - String sql = "delete from voucher_table where voucher_id = ?"; + public void delete(String voucherId) { + String sql = "DELETE FROM voucher_table WHERE voucher_id = ?"; int deleteCount = jdbcTemplate.update(sql, - voucherId.toString()); + voucherId); if (deleteCount != 1) { - throw new VoucherException(FAIL_TO_DELETE); + throw new VoucherException(FAIL_TO_DELETE_VOUCHER); } } @Override public void update(Voucher voucher) { - String sql = "update voucher_table set voucher_value = ? where voucher_id = ?"; + String sql = "UPDATE voucher_table SET voucher_value = ? WHERE voucher_id = ?"; int updateCount = jdbcTemplate.update(sql, voucher.getDiscountValue().getValue(), - voucher.getVoucherId().toString()); + voucher.getVoucherId()); if (updateCount != 1) { - throw new VoucherException(FAIL_TO_UPDATE); + throw new VoucherException(FAIL_TO_UPDATE_VOUCHER); } } } diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/MemoryVoucherRepository.java b/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/MemoryVoucherRepository.java index 7ae5562504..9fd3faa4ff 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/MemoryVoucherRepository.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/MemoryVoucherRepository.java @@ -4,12 +4,11 @@ import org.springframework.stereotype.Component; import java.util.*; -import java.util.stream.Collectors; @Component public class MemoryVoucherRepository implements VoucherRepository { - private final Map map = new LinkedHashMap<>(); + private final Map map = new LinkedHashMap<>(); @Override public Voucher insert(Voucher voucher) { @@ -25,19 +24,17 @@ public void update(Voucher voucher) { } @Override - public void delete(UUID voucherId) { + public void delete(String voucherId) { map.remove(voucherId); } @Override public List findAll() { - return map.values() - .stream() - .collect(Collectors.toList()); + return new ArrayList<>(map.values()); } @Override - public Optional findById(UUID voucherId) { + public Optional findById(String voucherId) { return Optional.ofNullable(map.get(voucherId)); } } diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/VoucherReaderRepository.java b/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/VoucherReaderRepository.java index 5f6cd535c8..95bd247f5f 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/VoucherReaderRepository.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/VoucherReaderRepository.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Optional; -import java.util.UUID; public interface VoucherReaderRepository { /** @@ -20,5 +19,5 @@ public interface VoucherReaderRepository { * @param voucherId * @return Optional - voucherId를 이용해 조회한 바우처 */ - Optional findById(UUID voucherId); //조회 + Optional findById(String voucherId); //조회 } diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/VoucherRepository.java b/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/VoucherRepository.java index 159d67f6bf..2ad920186c 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/VoucherRepository.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/VoucherRepository.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Optional; -import java.util.UUID; public interface VoucherRepository { /** @@ -27,7 +26,7 @@ public interface VoucherRepository { * * @param voucherId */ - void delete(UUID voucherId); //삭제 + void delete(String voucherId); //삭제 /** * db에 저장된 전체 바우처 조회 @@ -42,5 +41,5 @@ public interface VoucherRepository { * @param voucherId * @return Optional - voucherId를 이용해 조회한 바우처 */ - Optional findById(UUID voucherId); //조회 + Optional findById(String voucherId); //조회 } diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/VoucherStoreRepository.java b/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/VoucherStoreRepository.java index d5ded82264..fc14650e67 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/VoucherStoreRepository.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/infrastructure/VoucherStoreRepository.java @@ -2,8 +2,6 @@ import org.programmers.VoucherManagement.voucher.domain.Voucher; -import java.util.UUID; - public interface VoucherStoreRepository { /** * db에 바우처 저장 @@ -25,5 +23,5 @@ public interface VoucherStoreRepository { * * @param voucherId */ - void delete(UUID voucherId); + void delete(String voucherId); } diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/presentation/VoucherController.java b/src/main/java/org/programmers/VoucherManagement/voucher/presentation/VoucherController.java index bbb85a8d34..72ff26b9cf 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/presentation/VoucherController.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/presentation/VoucherController.java @@ -1,13 +1,11 @@ package org.programmers.VoucherManagement.voucher.presentation; import org.programmers.VoucherManagement.voucher.application.VoucherService; -import org.programmers.VoucherManagement.voucher.dto.request.VoucherCreateRequest; -import org.programmers.VoucherManagement.voucher.dto.request.VoucherUpdateRequest; -import org.programmers.VoucherManagement.voucher.dto.response.VoucherGetResponses; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherCreateRequest; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherGetResponses; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherUpdateRequest; import org.springframework.stereotype.Component; -import java.util.UUID; - @Component public class VoucherController { private final VoucherService voucherService; @@ -28,11 +26,11 @@ public VoucherGetResponses getVoucherList() { return voucherService.getVoucherList(); } - public void deleteVoucher(UUID voucherId) { + public void deleteVoucher(String voucherId) { voucherService.deleteVoucher(voucherId); } - public void updateVoucher(UUID voucherId, VoucherUpdateRequest voucherUpdateRequest) { + public void updateVoucher(String voucherId, VoucherUpdateRequest voucherUpdateRequest) { voucherService.updateVoucher(voucherId, voucherUpdateRequest); } } diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/presentation/VoucherRestController.java b/src/main/java/org/programmers/VoucherManagement/voucher/presentation/VoucherRestController.java new file mode 100644 index 0000000000..72233f4b45 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/voucher/presentation/VoucherRestController.java @@ -0,0 +1,74 @@ +package org.programmers.VoucherManagement.voucher.presentation; + + +import jakarta.validation.Valid; +import org.programmers.VoucherManagement.global.response.BaseResponse; +import org.programmers.VoucherManagement.voucher.application.VoucherService; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherGetResponses; +import org.programmers.VoucherManagement.voucher.presentation.dto.VoucherCreateRequestData; +import org.programmers.VoucherManagement.voucher.presentation.dto.VoucherCreateResponseData; +import org.programmers.VoucherManagement.voucher.presentation.dto.VoucherUpdateRequestData; +import org.programmers.VoucherManagement.voucher.presentation.mapper.VoucherControllerMapper; +import org.springframework.web.bind.annotation.*; + +import static org.programmers.VoucherManagement.global.response.SuccessCode.DELETE_VOUCHER_SUCCESS; +import static org.programmers.VoucherManagement.global.response.SuccessCode.UPDATE_VOUCHER_SUCCESS; + +@RestController +@RequestMapping("/voucher") +public class VoucherRestController { + private final VoucherService voucherService; + + public VoucherRestController(VoucherService voucherService) { + this.voucherService = voucherService; + } + + /** + * 바우처 생성 + * + * @param data + * @return BaseResponse + */ + @PostMapping() + public BaseResponse createVoucher(@Valid @RequestBody VoucherCreateRequestData data) { + return new BaseResponse<>(VoucherControllerMapper.INSTANCE.createResponseToData( + voucherService.saveVoucher(VoucherControllerMapper.INSTANCE.dataToCreateRequest(data)))); + } + + /** + * 바우처 수정 + * + * @param voucherId + * @param data + * @return BaseResponse + */ + @PatchMapping("/{voucherId}") + public BaseResponse updateVoucher(@PathVariable String voucherId, @Valid @RequestBody VoucherUpdateRequestData data) { + + voucherService.updateVoucher(voucherId, VoucherControllerMapper.INSTANCE.dataToUpdateRequest(data)); + return new BaseResponse<>(UPDATE_VOUCHER_SUCCESS); + } + + /** + * 저장된 모든 바우처 조회 + * + * @return BaseResponse + */ + @GetMapping() + public BaseResponse getVoucherList() { + return new BaseResponse<>(voucherService.getVoucherList()); + } + + /** + * 바우처 삭제 + * + * @param voucherId + * @return BaseResponse + */ + @DeleteMapping("/{voucherId}") + public BaseResponse deleteVoucher(@PathVariable String voucherId) { + voucherService.deleteVoucher(voucherId); + return new BaseResponse<>(DELETE_VOUCHER_SUCCESS); + } + +} diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/presentation/dto/VoucherCreateRequestData.java b/src/main/java/org/programmers/VoucherManagement/voucher/presentation/dto/VoucherCreateRequestData.java new file mode 100644 index 0000000000..9c97766359 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/voucher/presentation/dto/VoucherCreateRequestData.java @@ -0,0 +1,15 @@ +package org.programmers.VoucherManagement.voucher.presentation.dto; + +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +public record VoucherCreateRequestData( + @NotBlank + String discountType, + + @NotNull + @Min(value = 0, message = "할인 가격은 0보다 작을 수 없습니다.") + int discountValue +) { +} diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/dto/request/VoucherCreateRequest.java b/src/main/java/org/programmers/VoucherManagement/voucher/presentation/dto/VoucherCreateResponseData.java similarity index 50% rename from src/main/java/org/programmers/VoucherManagement/voucher/dto/request/VoucherCreateRequest.java rename to src/main/java/org/programmers/VoucherManagement/voucher/presentation/dto/VoucherCreateResponseData.java index a1709068b5..5fe9c2fe32 100644 --- a/src/main/java/org/programmers/VoucherManagement/voucher/dto/request/VoucherCreateRequest.java +++ b/src/main/java/org/programmers/VoucherManagement/voucher/presentation/dto/VoucherCreateResponseData.java @@ -1,8 +1,9 @@ -package org.programmers.VoucherManagement.voucher.dto.request; +package org.programmers.VoucherManagement.voucher.presentation.dto; import org.programmers.VoucherManagement.voucher.domain.DiscountType; -public record VoucherCreateRequest( +public record VoucherCreateResponseData( + String voucherId, DiscountType discountType, int discountValue ) { diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/presentation/dto/VoucherUpdateRequestData.java b/src/main/java/org/programmers/VoucherManagement/voucher/presentation/dto/VoucherUpdateRequestData.java new file mode 100644 index 0000000000..4202d56c32 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/voucher/presentation/dto/VoucherUpdateRequestData.java @@ -0,0 +1,7 @@ +package org.programmers.VoucherManagement.voucher.presentation.dto; + +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +public record VoucherUpdateRequestData(@NotNull @Min(value = 0, message = "할인 가격은 0보다 작을 수 없습니다.") int discountValue) { +} diff --git a/src/main/java/org/programmers/VoucherManagement/voucher/presentation/mapper/VoucherControllerMapper.java b/src/main/java/org/programmers/VoucherManagement/voucher/presentation/mapper/VoucherControllerMapper.java new file mode 100644 index 0000000000..a3ab1914c1 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/voucher/presentation/mapper/VoucherControllerMapper.java @@ -0,0 +1,30 @@ +package org.programmers.VoucherManagement.voucher.presentation.mapper; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherCreateRequest; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherCreateResponse; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherUpdateRequest; +import org.programmers.VoucherManagement.voucher.presentation.dto.VoucherCreateRequestData; +import org.programmers.VoucherManagement.voucher.presentation.dto.VoucherCreateResponseData; +import org.programmers.VoucherManagement.voucher.presentation.dto.VoucherUpdateRequestData; + + +@Mapper(componentModel = "spring") +public interface VoucherControllerMapper { + + VoucherControllerMapper INSTANCE = Mappers.getMapper(VoucherControllerMapper.class); + + @Mapping(source = "discountType", target = "discountType") + @Mapping(source = "discountValue", target = "discountValue") + VoucherCreateRequest dataToCreateRequest(VoucherCreateRequestData data); + + @Mapping(source = "discountValue", target = "discountValue") + VoucherUpdateRequest dataToUpdateRequest(VoucherUpdateRequestData data); + + @Mapping(source = "voucherId", target = "voucherId") + @Mapping(source = "discountType", target = "discountType") + @Mapping(source = "discountValue", target = "discountValue") + VoucherCreateResponseData createResponseToData(VoucherCreateResponse response); +} diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/application/WalletService.java b/src/main/java/org/programmers/VoucherManagement/wallet/application/WalletService.java index fd10e6027d..b1d52ac151 100644 --- a/src/main/java/org/programmers/VoucherManagement/wallet/application/WalletService.java +++ b/src/main/java/org/programmers/VoucherManagement/wallet/application/WalletService.java @@ -1,25 +1,26 @@ package org.programmers.VoucherManagement.wallet.application; +import com.github.f4b6a3.ulid.UlidCreator; import org.programmers.VoucherManagement.member.domain.Member; import org.programmers.VoucherManagement.member.exception.MemberException; import org.programmers.VoucherManagement.member.infrastructure.MemberReaderRepository; import org.programmers.VoucherManagement.voucher.domain.Voucher; import org.programmers.VoucherManagement.voucher.exception.VoucherException; import org.programmers.VoucherManagement.voucher.infrastructure.VoucherReaderRepository; +import org.programmers.VoucherManagement.wallet.application.dto.WalletCreateRequest; +import org.programmers.VoucherManagement.wallet.application.dto.WalletCreateResponse; +import org.programmers.VoucherManagement.wallet.application.dto.WalletGetResponses; +import org.programmers.VoucherManagement.wallet.application.mapper.WalletServiceMapper; import org.programmers.VoucherManagement.wallet.domain.Wallet; -import org.programmers.VoucherManagement.wallet.dto.request.WalletCreateRequest; -import org.programmers.VoucherManagement.wallet.dto.response.WalletGetResponses; import org.programmers.VoucherManagement.wallet.infrastructure.WalletReaderRepository; import org.programmers.VoucherManagement.wallet.infrastructure.WalletStoreRepository; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.UUID; +import static org.programmers.VoucherManagement.global.response.ErrorCode.NOT_FOUND_MEMBER; +import static org.programmers.VoucherManagement.global.response.ErrorCode.NOT_FOUND_VOUCHER; -import static org.programmers.VoucherManagement.member.exception.MemberExceptionMessage.NOT_FOUND_MEMBER; -import static org.programmers.VoucherManagement.voucher.exception.VoucherExceptionMessage.NOT_FOUND_VOUCHER; - -@Component +@Service @Transactional(readOnly = true) public class WalletService { private final WalletReaderRepository walletReaderRepository; @@ -38,31 +39,33 @@ public WalletService(WalletReaderRepository walletReaderRepository } @Transactional - public void createWallet(WalletCreateRequest walletCreateRequest) { + public WalletCreateResponse createWallet(WalletCreateRequest walletCreateRequest) { Voucher voucher = voucherReaderRepository - .findById(UUID.fromString(walletCreateRequest.voucherId())) + .findById(walletCreateRequest.voucherId()) .orElseThrow(() -> new VoucherException(NOT_FOUND_VOUCHER)); Member member = memberReaderRepository - .findById(UUID.fromString(walletCreateRequest.memberId())) + .findById(walletCreateRequest.memberId()) .orElseThrow(() -> new MemberException(NOT_FOUND_MEMBER)); - Wallet wallet = new Wallet(UUID.randomUUID(), + Wallet wallet = new Wallet(UlidCreator.getUlid().toString(), voucher, member); walletStoreRepository.insert(wallet); + + return WalletServiceMapper.INSTANCE.domainToCreateResponse(wallet); } - public WalletGetResponses getWalletsByVoucherId(UUID voucherId) { + public WalletGetResponses getWalletsByVoucherId(String voucherId) { return new WalletGetResponses(walletReaderRepository.findAllByVoucherId(voucherId)); } - public WalletGetResponses getWalletsByMemberId(UUID memberId) { + public WalletGetResponses getWalletsByMemberId(String memberId) { return new WalletGetResponses(walletReaderRepository.findAllByMemberId(memberId)); } @Transactional - public void deleteWallet(UUID walletId) { + public void deleteWallet(String walletId) { walletStoreRepository.delete(walletId); } } diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/dto/request/WalletCreateRequest.java b/src/main/java/org/programmers/VoucherManagement/wallet/application/dto/WalletCreateRequest.java similarity index 58% rename from src/main/java/org/programmers/VoucherManagement/wallet/dto/request/WalletCreateRequest.java rename to src/main/java/org/programmers/VoucherManagement/wallet/application/dto/WalletCreateRequest.java index 9057ab5679..f733315bc0 100644 --- a/src/main/java/org/programmers/VoucherManagement/wallet/dto/request/WalletCreateRequest.java +++ b/src/main/java/org/programmers/VoucherManagement/wallet/application/dto/WalletCreateRequest.java @@ -1,4 +1,4 @@ -package org.programmers.VoucherManagement.wallet.dto.request; +package org.programmers.VoucherManagement.wallet.application.dto; public record WalletCreateRequest( String voucherId, diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/application/dto/WalletCreateResponse.java b/src/main/java/org/programmers/VoucherManagement/wallet/application/dto/WalletCreateResponse.java new file mode 100644 index 0000000000..a33a1cca19 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/wallet/application/dto/WalletCreateResponse.java @@ -0,0 +1,8 @@ +package org.programmers.VoucherManagement.wallet.application.dto; + +public record WalletCreateResponse( + String walletId, + String voucherId, + String memberId +) { +} diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/dto/response/WalletGetResponse.java b/src/main/java/org/programmers/VoucherManagement/wallet/application/dto/WalletGetResponse.java similarity index 78% rename from src/main/java/org/programmers/VoucherManagement/wallet/dto/response/WalletGetResponse.java rename to src/main/java/org/programmers/VoucherManagement/wallet/application/dto/WalletGetResponse.java index a79bc43967..6a2fbcf895 100644 --- a/src/main/java/org/programmers/VoucherManagement/wallet/dto/response/WalletGetResponse.java +++ b/src/main/java/org/programmers/VoucherManagement/wallet/application/dto/WalletGetResponse.java @@ -1,4 +1,4 @@ -package org.programmers.VoucherManagement.wallet.dto.response; +package org.programmers.VoucherManagement.wallet.application.dto; import lombok.Builder; import org.programmers.VoucherManagement.member.domain.Member; @@ -9,9 +9,9 @@ import java.util.UUID; @Builder -public record WalletGetResponse(UUID walletId, - UUID memberId, - UUID voucherId, +public record WalletGetResponse(String walletId, + String memberId, + String voucherId, String memberName, DiscountType discountType, int discountValue) { @@ -22,7 +22,7 @@ public static WalletGetResponse toDto(Wallet wallet) { return WalletGetResponse.builder() .walletId(wallet.getWalletId()) - .memberId(member.getMemberUUID()) + .memberId(member.getMemberId()) .voucherId(voucher.getVoucherId()) .memberName(member.getName()) .discountType(voucher.getDiscountType()) diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/dto/response/WalletGetResponses.java b/src/main/java/org/programmers/VoucherManagement/wallet/application/dto/WalletGetResponses.java similarity index 89% rename from src/main/java/org/programmers/VoucherManagement/wallet/dto/response/WalletGetResponses.java rename to src/main/java/org/programmers/VoucherManagement/wallet/application/dto/WalletGetResponses.java index d7170b87ad..6e05053cf0 100644 --- a/src/main/java/org/programmers/VoucherManagement/wallet/dto/response/WalletGetResponses.java +++ b/src/main/java/org/programmers/VoucherManagement/wallet/application/dto/WalletGetResponses.java @@ -1,4 +1,4 @@ -package org.programmers.VoucherManagement.wallet.dto.response; +package org.programmers.VoucherManagement.wallet.application.dto; import org.programmers.VoucherManagement.wallet.domain.Wallet; diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/application/mapper/WalletServiceMapper.java b/src/main/java/org/programmers/VoucherManagement/wallet/application/mapper/WalletServiceMapper.java new file mode 100644 index 0000000000..ac9d51b43c --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/wallet/application/mapper/WalletServiceMapper.java @@ -0,0 +1,18 @@ +package org.programmers.VoucherManagement.wallet.application.mapper; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; +import org.programmers.VoucherManagement.wallet.application.dto.WalletCreateResponse; +import org.programmers.VoucherManagement.wallet.domain.Wallet; + + +@Mapper(componentModel = "spring") +public interface WalletServiceMapper { + WalletServiceMapper INSTANCE = Mappers.getMapper(WalletServiceMapper.class); + + @Mapping(source = "walletId", target = "walletId") + @Mapping(source = "voucher.voucherId", target = "voucherId") + @Mapping(source = "member.memberId", target = "memberId") + WalletCreateResponse domainToCreateResponse(Wallet wallet); +} diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/domain/Wallet.java b/src/main/java/org/programmers/VoucherManagement/wallet/domain/Wallet.java index 370b39da22..70ef53c178 100644 --- a/src/main/java/org/programmers/VoucherManagement/wallet/domain/Wallet.java +++ b/src/main/java/org/programmers/VoucherManagement/wallet/domain/Wallet.java @@ -1,22 +1,21 @@ package org.programmers.VoucherManagement.wallet.domain; +import org.programmers.VoucherManagement.global.entity.BaseTimeEntity; import org.programmers.VoucherManagement.member.domain.Member; import org.programmers.VoucherManagement.voucher.domain.Voucher; -import java.util.UUID; - -public class Wallet { - private UUID walletId; +public class Wallet extends BaseTimeEntity { + private String walletId; private Voucher voucher; private Member member; - public Wallet(UUID walletId, Voucher voucher, Member member) { + public Wallet(String walletId, Voucher voucher, Member member) { this.walletId = walletId; this.voucher = voucher; this.member = member; } - public UUID getWalletId() { + public String getWalletId() { return walletId; } diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/exception/WalletException.java b/src/main/java/org/programmers/VoucherManagement/wallet/exception/WalletException.java index 363fd96ca2..190fe9841d 100644 --- a/src/main/java/org/programmers/VoucherManagement/wallet/exception/WalletException.java +++ b/src/main/java/org/programmers/VoucherManagement/wallet/exception/WalletException.java @@ -1,7 +1,14 @@ package org.programmers.VoucherManagement.wallet.exception; +import lombok.Getter; +import org.programmers.VoucherManagement.global.response.ErrorCode; + +@Getter public class WalletException extends RuntimeException { - public WalletException(WalletExceptionMessage exceptionMessage) { - super(exceptionMessage.getMessage()); + private final ErrorCode errorCode; + + public WalletException(ErrorCode errorCode) { + super(errorCode.getMessage()); + this.errorCode = errorCode; } } diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/exception/WalletExceptionMessage.java b/src/main/java/org/programmers/VoucherManagement/wallet/exception/WalletExceptionMessage.java deleted file mode 100644 index c1c1dd09ee..0000000000 --- a/src/main/java/org/programmers/VoucherManagement/wallet/exception/WalletExceptionMessage.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.programmers.VoucherManagement.wallet.exception; - -public enum WalletExceptionMessage { - FAIL_TO_INSERT("데이터가 정상적으로 저장되지 않았습니다."), - FAIL_TO_DELETE("데이터가 정상적으로 삭제되지 않았습니다."); - - private final String message; - - WalletExceptionMessage(String message) { - this.message = message; - } - - public String getMessage() { - return this.message; - } -} diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/JdbcWalletReaderRepository.java b/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/JdbcWalletReaderRepository.java index 0cbfd4848d..1cf2a1aac8 100644 --- a/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/JdbcWalletReaderRepository.java +++ b/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/JdbcWalletReaderRepository.java @@ -1,5 +1,6 @@ package org.programmers.VoucherManagement.wallet.infrastructure; +import org.programmers.VoucherManagement.global.response.ErrorCode; import org.programmers.VoucherManagement.member.exception.MemberException; import org.programmers.VoucherManagement.member.infrastructure.MemberReaderRepository; import org.programmers.VoucherManagement.voucher.exception.VoucherException; @@ -13,10 +14,6 @@ import java.util.List; import java.util.Optional; -import java.util.UUID; - -import static org.programmers.VoucherManagement.member.exception.MemberExceptionMessage.NOT_FOUND_MEMBER; -import static org.programmers.VoucherManagement.voucher.exception.VoucherExceptionMessage.NOT_FOUND_VOUCHER; @Repository @Primary @@ -32,8 +29,8 @@ public JdbcWalletReaderRepository(JdbcTemplate jdbcTemplate, MemberReaderReposit } @Override - public Optional findById(UUID walletId) { - String sql = "select wallet_id, voucher_id, member_id from wallet_table where wallet_id = ?"; + public Optional findById(String walletId) { + String sql = "SELECT wallet_id, voucher_id, member_id FROM wallet_table WHERE wallet_id = ?"; try { return Optional.ofNullable(jdbcTemplate.queryForObject(sql, walletRowMapper(), @@ -44,24 +41,24 @@ public Optional findById(UUID walletId) { } @Override - public List findAllByMemberId(UUID memberId) { - String sql = "select wallet_id, voucher_id, member_id from wallet_table where member_id = ?"; + public List findAllByMemberId(String memberId) { + String sql = "SELECT wallet_id, voucher_id, member_id FROM wallet_table WHERE member_id = ?"; - return jdbcTemplate.query(sql, walletRowMapper(), memberId.toString()); + return jdbcTemplate.query(sql, walletRowMapper(), memberId); } @Override - public List findAllByVoucherId(UUID voucherId) { - String sql = "select wallet_id, voucher_id, member_id from wallet_table where voucher_id = ?"; + public List findAllByVoucherId(String voucherId) { + String sql = "SELECT wallet_id, voucher_id, member_id FROM wallet_table WHERE voucher_id = ?"; - return jdbcTemplate.query(sql, walletRowMapper(), voucherId.toString()); + return jdbcTemplate.query(sql, walletRowMapper(), voucherId); } public RowMapper walletRowMapper() { return (result, rowNum) -> new Wallet( - UUID.fromString(result.getString("wallet_id")), - voucherReaderRepository.findById(UUID.fromString(result.getString("voucher_id"))).orElseThrow(() -> new VoucherException(NOT_FOUND_VOUCHER)), - memberReaderRepository.findById(UUID.fromString(result.getString("member_id"))).orElseThrow(() -> new MemberException(NOT_FOUND_MEMBER)) + result.getString("wallet_id"), + voucherReaderRepository.findById(result.getString("voucher_id")).orElseThrow(() -> new VoucherException(ErrorCode.NOT_FOUND_VOUCHER)), + memberReaderRepository.findById(result.getString("member_id")).orElseThrow(() -> new MemberException(ErrorCode.NOT_FOUND_MEMBER)) ); } } diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/JdbcWalletStoreRepository.java b/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/JdbcWalletStoreRepository.java index 4144c2688d..cf41b40c7a 100644 --- a/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/JdbcWalletStoreRepository.java +++ b/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/JdbcWalletStoreRepository.java @@ -6,10 +6,8 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; -import java.util.UUID; - -import static org.programmers.VoucherManagement.wallet.exception.WalletExceptionMessage.FAIL_TO_DELETE; -import static org.programmers.VoucherManagement.wallet.exception.WalletExceptionMessage.FAIL_TO_INSERT; +import static org.programmers.VoucherManagement.global.response.ErrorCode.FAIL_TO_DELETE_WALLET; +import static org.programmers.VoucherManagement.global.response.ErrorCode.FAIL_TO_INSERT_WALLET; @Repository @Primary @@ -23,24 +21,26 @@ public JdbcWalletStoreRepository(JdbcTemplate jdbcTemplate) { @Override public Wallet insert(Wallet wallet) { - String sql = "insert into wallet_table(wallet_id, voucher_id, member_id) values (?,?,?)"; + String sql = "INSERT INTO wallet_table(wallet_id, voucher_id, member_id, created_at) VALUES (?,?,?,?)"; int insertCount = jdbcTemplate.update(sql, - wallet.getWalletId().toString(), - wallet.getVoucher().getVoucherId().toString(), - wallet.getMember().getMemberUUID().toString()); + wallet.getWalletId(), + wallet.getVoucher().getVoucherId(), + wallet.getMember().getMemberId(), + wallet.getCreatedAt() + ); if (insertCount != 1) { - throw new WalletException(FAIL_TO_INSERT); + throw new WalletException(FAIL_TO_INSERT_WALLET); } return wallet; } @Override - public void delete(UUID walletId) { - String sql = "delete from wallet_table where wallet_id = ?"; + public void delete(String walletId) { + String sql = "DELETE FROM wallet_table WHERE wallet_id = ?"; int deleteCount = jdbcTemplate.update(sql, - walletId.toString()); + walletId); if (deleteCount != 1) { - throw new WalletException(FAIL_TO_DELETE); + throw new WalletException(FAIL_TO_DELETE_WALLET); } } } diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/WalletReaderRepository.java b/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/WalletReaderRepository.java index 7a7c98bd66..040c7c9364 100644 --- a/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/WalletReaderRepository.java +++ b/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/WalletReaderRepository.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Optional; -import java.util.UUID; public interface WalletReaderRepository { /** @@ -13,7 +12,7 @@ public interface WalletReaderRepository { * @param walletId * @return Optional - walletId를 이용해 조회한 Wallet */ - Optional findById(UUID walletId); + Optional findById(String walletId); /** * memberId를 이용해 Wallet 조회 @@ -21,7 +20,7 @@ public interface WalletReaderRepository { * @param memberId * @return List - memberId를 이용해 조회한 특정 회원이 가지고 있는 Wallet 리스트 */ - List findAllByMemberId(UUID memberId); + List findAllByMemberId(String memberId); /** * voucherId를 이용해 Wallet 조회 @@ -29,5 +28,5 @@ public interface WalletReaderRepository { * @param voucherId * @return List - voucherId를 이용해 wallet에 저장된 Voucher 리스트 */ - List findAllByVoucherId(UUID voucherId); + List findAllByVoucherId(String voucherId); } diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/WalletStoreRepository.java b/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/WalletStoreRepository.java index 402caea692..dddc5ef22f 100644 --- a/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/WalletStoreRepository.java +++ b/src/main/java/org/programmers/VoucherManagement/wallet/infrastructure/WalletStoreRepository.java @@ -2,8 +2,6 @@ import org.programmers.VoucherManagement.wallet.domain.Wallet; -import java.util.UUID; - public interface WalletStoreRepository { /** * db에 wallet 저장 @@ -18,5 +16,5 @@ public interface WalletStoreRepository { * * @param walletId */ - void delete(UUID walletId); + void delete(String walletId); } diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/presentation/WalletController.java b/src/main/java/org/programmers/VoucherManagement/wallet/presentation/WalletController.java index 126920e9ca..2661cdef43 100644 --- a/src/main/java/org/programmers/VoucherManagement/wallet/presentation/WalletController.java +++ b/src/main/java/org/programmers/VoucherManagement/wallet/presentation/WalletController.java @@ -1,12 +1,10 @@ package org.programmers.VoucherManagement.wallet.presentation; import org.programmers.VoucherManagement.wallet.application.WalletService; -import org.programmers.VoucherManagement.wallet.dto.request.WalletCreateRequest; -import org.programmers.VoucherManagement.wallet.dto.response.WalletGetResponses; +import org.programmers.VoucherManagement.wallet.application.dto.WalletCreateRequest; +import org.programmers.VoucherManagement.wallet.application.dto.WalletGetResponses; import org.springframework.stereotype.Component; -import java.util.UUID; - @Component public class WalletController { private final WalletService walletService; @@ -19,15 +17,15 @@ public void createWallet(WalletCreateRequest walletCreateRequest) { walletService.createWallet(walletCreateRequest); } - public WalletGetResponses getWalletsByVoucherId(UUID voucherId) { + public WalletGetResponses getWalletsByVoucherId(String voucherId) { return walletService.getWalletsByVoucherId(voucherId); } - public WalletGetResponses getWalletsByMemberId(UUID memberId) { + public WalletGetResponses getWalletsByMemberId(String memberId) { return walletService.getWalletsByMemberId(memberId); } - public void deleteWallet(UUID walletId) { + public void deleteWallet(String walletId) { walletService.deleteWallet(walletId); } } diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/presentation/WalletRestController.java b/src/main/java/org/programmers/VoucherManagement/wallet/presentation/WalletRestController.java new file mode 100644 index 0000000000..5dae470117 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/wallet/presentation/WalletRestController.java @@ -0,0 +1,51 @@ +package org.programmers.VoucherManagement.wallet.presentation; + +import jakarta.validation.Valid; +import org.programmers.VoucherManagement.global.response.BaseResponse; +import org.programmers.VoucherManagement.wallet.application.WalletService; +import org.programmers.VoucherManagement.wallet.application.dto.WalletGetResponses; +import org.programmers.VoucherManagement.wallet.presentation.dto.WalletCreateRequestData; +import org.programmers.VoucherManagement.wallet.presentation.dto.WalletCreateResponseData; +import org.programmers.VoucherManagement.wallet.presentation.mapper.WalletControllerMapper; +import org.springframework.web.bind.annotation.*; + +import static org.programmers.VoucherManagement.global.response.SuccessCode.DELETE_WALLET_SUCCESS; + +@RestController +@RequestMapping("/wallets") +public class WalletRestController { + private final WalletService walletService; + + public WalletRestController(WalletService walletService) { + this.walletService = walletService; + } + + @PostMapping() + public BaseResponse createWallet(@Valid @RequestBody WalletCreateRequestData data) { + WalletCreateResponseData responseData = + WalletControllerMapper.INSTANCE.createResponseToData( + walletService.createWallet(WalletControllerMapper.INSTANCE.dataToCreateRequest(data)) + ); + return new BaseResponse<>(responseData); + } + + @GetMapping("/voucher/{voucherId}") + public BaseResponse getWalletsByVoucherId(@PathVariable String voucherId) { + WalletGetResponses responses = walletService.getWalletsByVoucherId(voucherId); + return new BaseResponse<>(responses); + } + + + @GetMapping("/member/{memberId}") + public BaseResponse getWalletsByMemberId(@PathVariable String memberId) { + WalletGetResponses responses = walletService.getWalletsByMemberId(memberId); + return new BaseResponse<>(responses); + } + + @DeleteMapping("/{walletId}") + public BaseResponse deleteWallet(@PathVariable String walletId) { + walletService.deleteWallet(walletId); + + return new BaseResponse<>(DELETE_WALLET_SUCCESS); + } +} diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/presentation/dto/WalletCreateRequestData.java b/src/main/java/org/programmers/VoucherManagement/wallet/presentation/dto/WalletCreateRequestData.java new file mode 100644 index 0000000000..d63236c0a7 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/wallet/presentation/dto/WalletCreateRequestData.java @@ -0,0 +1,7 @@ +package org.programmers.VoucherManagement.wallet.presentation.dto; + +public record WalletCreateRequestData( + String voucherId, + String memberId +) { +} diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/presentation/dto/WalletCreateResponseData.java b/src/main/java/org/programmers/VoucherManagement/wallet/presentation/dto/WalletCreateResponseData.java new file mode 100644 index 0000000000..6fbefaa59f --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/wallet/presentation/dto/WalletCreateResponseData.java @@ -0,0 +1,8 @@ +package org.programmers.VoucherManagement.wallet.presentation.dto; + +public record WalletCreateResponseData( + String walletId, + String voucherId, + String memberId +) { +} diff --git a/src/main/java/org/programmers/VoucherManagement/wallet/presentation/mapper/WalletControllerMapper.java b/src/main/java/org/programmers/VoucherManagement/wallet/presentation/mapper/WalletControllerMapper.java new file mode 100644 index 0000000000..7ac6800bb6 --- /dev/null +++ b/src/main/java/org/programmers/VoucherManagement/wallet/presentation/mapper/WalletControllerMapper.java @@ -0,0 +1,23 @@ +package org.programmers.VoucherManagement.wallet.presentation.mapper; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; +import org.programmers.VoucherManagement.wallet.application.dto.WalletCreateRequest; +import org.programmers.VoucherManagement.wallet.application.dto.WalletCreateResponse; +import org.programmers.VoucherManagement.wallet.presentation.dto.WalletCreateRequestData; +import org.programmers.VoucherManagement.wallet.presentation.dto.WalletCreateResponseData; + +@Mapper(componentModel = "spring") +public interface WalletControllerMapper { + WalletControllerMapper INSTANCE = Mappers.getMapper(WalletControllerMapper.class); + + @Mapping(source = "voucherId", target = "voucherId") + @Mapping(source = "memberId", target = "memberId") + WalletCreateRequest dataToCreateRequest(WalletCreateRequestData data); + + @Mapping(source = "walletId", target = "walletId") + @Mapping(source = "voucherId", target = "voucherId") + @Mapping(source = "memberId", target = "memberId") + WalletCreateResponseData createResponseToData(WalletCreateResponse response); +} diff --git a/src/main/resources/sql/schema.sql b/src/main/resources/sql/schema.sql index 773027c70e..3273ffaf26 100644 --- a/src/main/resources/sql/schema.sql +++ b/src/main/resources/sql/schema.sql @@ -7,6 +7,7 @@ create table member_table member_id varchar(60), member_status varchar(10) not null, name varchar(20) not null, + created_at varchar(20) not null, primary key (member_id) ); @@ -16,6 +17,7 @@ create table voucher_table voucher_id varchar(60), voucher_value int not null, voucher_type varchar(20) not null, + created_at varchar(20) not null, primary key (voucher_id) ); @@ -25,6 +27,7 @@ create table wallet_table wallet_id varchar(60), voucher_id varchar(60) not null, member_id varchar(60) not null, + created_at varchar(20) not null, primary key (wallet_id), foreign key (voucher_id) references voucher_table (voucher_id), diff --git a/src/test/java/org/programmers/VoucherManagement/io/MenuTypeTest.java b/src/test/java/org/programmers/VoucherManagement/io/MenuTypeTest.java index 3fd1823708..21fdda4da5 100644 --- a/src/test/java/org/programmers/VoucherManagement/io/MenuTypeTest.java +++ b/src/test/java/org/programmers/VoucherManagement/io/MenuTypeTest.java @@ -1,6 +1,7 @@ package org.programmers.VoucherManagement.io; import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -11,6 +12,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +@Disabled public class MenuTypeTest { @Test @DisplayName("입력값에 따라 MenuType을 반환한다. - 성공") diff --git a/src/test/java/org/programmers/VoucherManagement/member/application/MemberServiceMockTest.java b/src/test/java/org/programmers/VoucherManagement/member/application/MemberServiceMockTest.java index bdd6cee8d8..323da74dd9 100644 --- a/src/test/java/org/programmers/VoucherManagement/member/application/MemberServiceMockTest.java +++ b/src/test/java/org/programmers/VoucherManagement/member/application/MemberServiceMockTest.java @@ -1,23 +1,23 @@ package org.programmers.VoucherManagement.member.application; +import com.github.f4b6a3.ulid.UlidCreator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.programmers.VoucherManagement.member.application.dto.MemberGetResponse; +import org.programmers.VoucherManagement.member.application.dto.MemberGetResponses; +import org.programmers.VoucherManagement.member.application.dto.MemberUpdateRequest; import org.programmers.VoucherManagement.member.domain.Member; import org.programmers.VoucherManagement.member.domain.MemberStatus; -import org.programmers.VoucherManagement.member.dto.request.MemberUpdateRequest; -import org.programmers.VoucherManagement.member.dto.response.MemberGetResponse; -import org.programmers.VoucherManagement.member.dto.response.MemberGetResponses; import org.programmers.VoucherManagement.member.infrastructure.MemberReaderRepository; import org.programmers.VoucherManagement.member.infrastructure.MemberStoreRepository; import java.util.Arrays; import java.util.List; import java.util.Optional; -import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -42,7 +42,7 @@ public class MemberServiceMockTest { @DisplayName("회원 정보(status)를 BLACK으로 수정한다. - 성공") void updateMember_IdAndDto_Success() { //given - UUID memberId = UUID.randomUUID(); + String memberId = UlidCreator.getUlid().toString(); Member saveMember = new Member(memberId, "Kim", MemberStatus.WHITE); memberStoreRepository.insert(saveMember); MemberUpdateRequest updateRequestDto = new MemberUpdateRequest(MemberStatus.BLACK); @@ -62,12 +62,12 @@ void updateMember_IdAndDto_Success() { @DisplayName("회원Id를 입력받아 회원을 삭제할 수 있다. - 성공") void deleteMember_Id_Success() { //given - UUID memberId = UUID.randomUUID(); + String memberId = UlidCreator.getUlid().toString(); Member saveMember = new Member(memberId, "Kim", MemberStatus.BLACK); memberStoreRepository.insert(saveMember); //when - memberService.deleteMember(saveMember.getMemberUUID()); + memberService.deleteMember(saveMember.getMemberId()); //then verify(memberStoreRepository, times(1)).delete(memberId); @@ -77,8 +77,8 @@ void deleteMember_Id_Success() { @DisplayName("저장되어 있는 모든 멤버를 조회할 수 있다. - 성공") void getAllMembers_EqualsListOfMembers() { //given - Member member1 = new Member(UUID.randomUUID(), "Kim", MemberStatus.BLACK); - Member member2 = new Member(UUID.randomUUID(), "Park", MemberStatus.WHITE); + Member member1 = new Member(UlidCreator.getUlid().toString(), "Kim", MemberStatus.BLACK); + Member member2 = new Member(UlidCreator.getUlid().toString(), "Park", MemberStatus.WHITE); List memberList = Arrays.asList(member1, member2); //mocking @@ -100,9 +100,9 @@ void getAllMembers_EqualsListOfMembers() { @DisplayName("저장되어 있는 모든 블랙리스트 멤버를 조회할 수 있다. - 성공") void getAllBlackMembers_EqualsListOfMembers() { //given - Member member1 = new Member(UUID.randomUUID(), "Kim", MemberStatus.BLACK); - Member member2 = new Member(UUID.randomUUID(), "Park", MemberStatus.BLACK); - Member member3 = new Member(UUID.randomUUID(), "Lee", MemberStatus.WHITE); + Member member1 = new Member(UlidCreator.getUlid().toString(), "Kim", MemberStatus.BLACK); + Member member2 = new Member(UlidCreator.getUlid().toString(), "Park", MemberStatus.BLACK); + Member member3 = new Member(UlidCreator.getUlid().toString(), "Lee", MemberStatus.WHITE); List blackMemberList = Stream.of(member1, member2, member3) .filter(m -> m.getMemberStatus() == MemberStatus.BLACK) .collect(Collectors.toList()); diff --git a/src/test/java/org/programmers/VoucherManagement/member/application/MemberServiceTest.java b/src/test/java/org/programmers/VoucherManagement/member/application/MemberServiceTest.java index 06a1042d16..f00fba7fb1 100644 --- a/src/test/java/org/programmers/VoucherManagement/member/application/MemberServiceTest.java +++ b/src/test/java/org/programmers/VoucherManagement/member/application/MemberServiceTest.java @@ -1,14 +1,15 @@ package org.programmers.VoucherManagement.member.application; +import com.github.f4b6a3.ulid.UlidCreator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import org.programmers.VoucherManagement.member.application.dto.MemberGetResponse; +import org.programmers.VoucherManagement.member.application.dto.MemberGetResponses; +import org.programmers.VoucherManagement.member.application.dto.MemberUpdateRequest; import org.programmers.VoucherManagement.member.domain.Member; import org.programmers.VoucherManagement.member.domain.MemberStatus; -import org.programmers.VoucherManagement.member.dto.request.MemberUpdateRequest; -import org.programmers.VoucherManagement.member.dto.response.MemberGetResponse; -import org.programmers.VoucherManagement.member.dto.response.MemberGetResponses; import org.programmers.VoucherManagement.member.exception.MemberException; import org.programmers.VoucherManagement.member.infrastructure.MemberReaderRepository; import org.programmers.VoucherManagement.member.infrastructure.MemberStoreRepository; @@ -19,12 +20,12 @@ import java.util.List; import java.util.Optional; -import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.programmers.VoucherManagement.global.response.ErrorCode.FAIL_TO_DELETE_MEMBER; @ActiveProfiles("test") @SpringBootTest @@ -43,7 +44,7 @@ public class MemberServiceTest { @DisplayName("회원 정보(status)를 BLACK으로 수정한다. - 성공") void updateMember_IdAndDto_Success() { //given - UUID memberId = UUID.randomUUID(); + String memberId = UlidCreator.getUlid().toString(); Member saveMember = new Member(memberId, "Kim", MemberStatus.WHITE); memberStoreRepository.insert(saveMember); MemberUpdateRequest updateRequestDto = new MemberUpdateRequest(MemberStatus.BLACK); @@ -60,12 +61,12 @@ void updateMember_IdAndDto_Success() { @DisplayName("회원Id를 입력받아 회원을 삭제할 수 있다. - 성공") void deleteMember_Id_Success() { //given - UUID memberId = UUID.randomUUID(); + String memberId = UlidCreator.getUlid().toString(); Member saveMember = new Member(memberId, "Kim", MemberStatus.BLACK); memberStoreRepository.insert(saveMember); //when - memberService.deleteMember(saveMember.getMemberUUID()); + memberService.deleteMember(saveMember.getMemberId()); //then Optional optionalMember = memberReaderRepository.findById(memberId); @@ -76,18 +77,18 @@ void deleteMember_Id_Success() { @DisplayName("회원Id를 입력받아 회원을 삭제할 수 있다. - 실패") void deleteMember_Id_ThrowMemberException() { //given - UUID memberId = UUID.randomUUID(); + String memberId = UlidCreator.getUlid().toString(); Member saveMember = new Member(memberId, "Kim", MemberStatus.BLACK); memberStoreRepository.insert(saveMember); //when - memberService.deleteMember(saveMember.getMemberUUID()); + memberService.deleteMember(saveMember.getMemberId()); //then - UUID strangeId = UUID.randomUUID(); + String strangeId = UlidCreator.getUlid().toString(); assertThatThrownBy(() -> memberService.deleteMember(strangeId)) .isInstanceOf(MemberException.class) - .hasMessage("데이터가 정상적으로 삭제되지 않았습니다."); + .hasMessage(FAIL_TO_DELETE_MEMBER.getMessage()); } @ParameterizedTest @@ -132,8 +133,8 @@ void getAllBlackMembers_EqualsListOfMembers(List members) { } private static Stream> member_Data() { - Member member1 = new Member(UUID.randomUUID(), "Kim", MemberStatus.BLACK); - Member member2 = new Member(UUID.randomUUID(), "Park", MemberStatus.WHITE); + Member member1 = new Member(UlidCreator.getUlid().toString(), "Kim", MemberStatus.BLACK); + Member member2 = new Member(UlidCreator.getUlid().toString(), "Park", MemberStatus.WHITE); return Stream.of( List.of(member1, member2) ); diff --git a/src/test/java/org/programmers/VoucherManagement/member/domain/MemberTest.java b/src/test/java/org/programmers/VoucherManagement/member/domain/MemberTest.java index 56ff0187b6..0732d962c2 100644 --- a/src/test/java/org/programmers/VoucherManagement/member/domain/MemberTest.java +++ b/src/test/java/org/programmers/VoucherManagement/member/domain/MemberTest.java @@ -1,10 +1,9 @@ package org.programmers.VoucherManagement.member.domain; +import com.github.f4b6a3.ulid.UlidCreator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.util.UUID; - import static org.assertj.core.api.Assertions.assertThat; public class MemberTest { @@ -12,7 +11,7 @@ public class MemberTest { @DisplayName("회원의 상태(black/white)를 변경할 수 있다.") void changeMemberStatus_MemberStatus_EqualsUpdateMember() { //given - Member member = new Member(UUID.randomUUID(), "kim", MemberStatus.WHITE); + Member member = new Member(UlidCreator.getUlid().toString(), "kim", MemberStatus.WHITE); //when member.changeMemberStatus(MemberStatus.BLACK); diff --git a/src/test/java/org/programmers/VoucherManagement/member/infrastructure/JdbcMemberRepositoryTest.java b/src/test/java/org/programmers/VoucherManagement/member/infrastructure/JdbcMemberRepositoryTest.java index d5fd6bdca7..32871f5dc2 100644 --- a/src/test/java/org/programmers/VoucherManagement/member/infrastructure/JdbcMemberRepositoryTest.java +++ b/src/test/java/org/programmers/VoucherManagement/member/infrastructure/JdbcMemberRepositoryTest.java @@ -1,5 +1,6 @@ package org.programmers.VoucherManagement.member.infrastructure; +import com.github.f4b6a3.ulid.UlidCreator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -11,7 +12,6 @@ import java.util.List; import java.util.Optional; -import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -24,13 +24,13 @@ public class JdbcMemberRepositoryTest { @Autowired private JdbcMemberStoreRepository memberStoreRepository; - private Member blackMember = new Member(UUID.randomUUID(), "kim", MemberStatus.BLACK); - private Member whiteMember = new Member(UUID.randomUUID(), "park", MemberStatus.WHITE); + private Member blackMember = new Member(UlidCreator.getUlid().toString(), "kim", MemberStatus.BLACK); + private Member whiteMember = new Member(UlidCreator.getUlid().toString(), "park", MemberStatus.WHITE); @BeforeEach void initMember() { - blackMember = new Member(UUID.randomUUID(), "kim", MemberStatus.BLACK); - whiteMember = new Member(UUID.randomUUID(), "park", MemberStatus.WHITE); + blackMember = new Member(UlidCreator.getUlid().toString(), "kim", MemberStatus.BLACK); + whiteMember = new Member(UlidCreator.getUlid().toString(), "park", MemberStatus.WHITE); } @Test @@ -40,7 +40,7 @@ void insert_BlackMember_EqualsNewMember() { memberStoreRepository.insert(blackMember); //then - Member memberExpect = memberReaderRepository.findById(blackMember.getMemberUUID()).get(); + Member memberExpect = memberReaderRepository.findById(blackMember.getMemberId()).get(); assertThat(memberExpect).usingRecursiveComparison().isEqualTo(blackMember); } @@ -51,7 +51,7 @@ void insert_WhiteMember_EqualsNewMember() { memberStoreRepository.insert(whiteMember); //then - Member memberExpect = memberReaderRepository.findById(whiteMember.getMemberUUID()).get(); + Member memberExpect = memberReaderRepository.findById(whiteMember.getMemberId()).get(); assertThat(memberExpect).usingRecursiveComparison().isEqualTo(whiteMember); } @@ -66,7 +66,7 @@ void update_Member_EqualsUpdateMember() { memberStoreRepository.update(whiteMember); //then - Member memberExpect = memberReaderRepository.findById(whiteMember.getMemberUUID()).get(); + Member memberExpect = memberReaderRepository.findById(whiteMember.getMemberId()).get(); assertThat(memberExpect).usingRecursiveComparison().isEqualTo(whiteMember); } @@ -103,7 +103,7 @@ void findAllByMemberStatus_Success() { void findById_MemberId_EqualsFindMember() { //given memberStoreRepository.insert(blackMember); - UUID findMemberId = blackMember.getMemberUUID(); + String findMemberId = blackMember.getMemberId(); //when Member memberExpect = memberReaderRepository.findById(findMemberId).get(); @@ -117,7 +117,7 @@ void findById_MemberId_EqualsFindMember() { void delete_MemberId_Success() { //given memberStoreRepository.insert(blackMember); - UUID deleteMemberId = blackMember.getMemberUUID(); + String deleteMemberId = blackMember.getMemberId(); //when memberStoreRepository.delete(deleteMemberId); diff --git a/src/test/java/org/programmers/VoucherManagement/util/MemberConverterTest.java b/src/test/java/org/programmers/VoucherManagement/util/MemberConverterTest.java index fb86453343..58701adf39 100644 --- a/src/test/java/org/programmers/VoucherManagement/util/MemberConverterTest.java +++ b/src/test/java/org/programmers/VoucherManagement/util/MemberConverterTest.java @@ -6,8 +6,6 @@ import org.programmers.VoucherManagement.member.domain.Member; import org.programmers.VoucherManagement.member.domain.MemberStatus; -import java.util.UUID; - import static org.assertj.core.api.Assertions.assertThat; public class MemberConverterTest { @@ -15,17 +13,17 @@ public class MemberConverterTest { @DisplayName("문자열을 Member 객체로 변환할 수 있다. - 성공") void toMember_InputString_EqualsMember() { // Given - String line = "221d0e7d-0d28-4040-9012-62004a671427,Park,BLACK"; + String line = "01H6ETXP7DNQ09NXRB7D9F1ZJH,Park,BLACK"; // When Member member = MemberConverter.toMember(line); // Then - UUID expectedId = UUID.fromString("221d0e7d-0d28-4040-9012-62004a671427"); + String expectedId = "01H6ETXP7DNQ09NXRB7D9F1ZJH"; String expectedName = "Park"; MemberStatus expectedStatus = MemberStatus.BLACK; - assertThat(member.getMemberUUID()).isEqualTo(expectedId); + assertThat(member.getMemberId()).isEqualTo(expectedId); assertThat(member.getName()).isEqualTo(expectedName); assertThat(member.getMemberStatus()).isEqualTo(expectedStatus); } diff --git a/src/test/java/org/programmers/VoucherManagement/voucher/application/VoucherServiceMockTest.java b/src/test/java/org/programmers/VoucherManagement/voucher/application/VoucherServiceMockTest.java index 9509d316a5..b4a176126e 100644 --- a/src/test/java/org/programmers/VoucherManagement/voucher/application/VoucherServiceMockTest.java +++ b/src/test/java/org/programmers/VoucherManagement/voucher/application/VoucherServiceMockTest.java @@ -1,15 +1,17 @@ package org.programmers.VoucherManagement.voucher.application; +import com.github.f4b6a3.ulid.UlidCreator; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherGetResponse; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherGetResponses; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherUpdateRequest; import org.programmers.VoucherManagement.voucher.domain.*; -import org.programmers.VoucherManagement.voucher.dto.request.VoucherUpdateRequest; -import org.programmers.VoucherManagement.voucher.dto.response.VoucherGetResponse; -import org.programmers.VoucherManagement.voucher.dto.response.VoucherGetResponses; import org.programmers.VoucherManagement.voucher.exception.VoucherException; import org.programmers.VoucherManagement.voucher.infrastructure.VoucherReaderRepository; import org.programmers.VoucherManagement.voucher.infrastructure.VoucherStoreRepository; @@ -17,11 +19,9 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; -import java.util.UUID; import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -42,7 +42,7 @@ public class VoucherServiceMockTest { @DisplayName("Fixed 바우처를 수정할 수 있다. - 성공") void updateFixedVoucher_Dto_Success() { //given - UUID voucherId = UUID.randomUUID(); + String voucherId = UlidCreator.getUlid().toString(); Voucher saveVoucher = new FixedAmountVoucher(voucherId, DiscountType.FIXED, new DiscountValue(100)); voucherStoreRepository.insert(saveVoucher); VoucherUpdateRequest updateRequestDto = new VoucherUpdateRequest(1000); @@ -59,48 +59,49 @@ void updateFixedVoucher_Dto_Success() { } @Test - @DisplayName("Percent 바우처를 수정할 수 있다. - 성공") - void updatePercentVoucher_Dto_Success() { + @DisplayName("Percent 바우처를 수정할 수 있다.(1-100을 넘어가면 예외 발생) - 실패") + void updatePercentVoucher_Dto_ThrowVoucherException() { //given - UUID voucherId = UUID.randomUUID(); + String voucherId = UlidCreator.getUlid().toString(); Voucher saveVoucher = new PercentAmountVoucher(voucherId, DiscountType.PERCENT, new DiscountValue(10)); voucherStoreRepository.insert(saveVoucher); - VoucherUpdateRequest updateRequestDto = new VoucherUpdateRequest(40); + VoucherUpdateRequest updateRequestDto = new VoucherUpdateRequest(-1); //mocking given(voucherReaderRepository.findById(voucherId)).willReturn(Optional.of(saveVoucher)); - //when - voucherService.updateVoucher(voucherId, updateRequestDto); - //then - Voucher updateVoucher = voucherReaderRepository.findById(voucherId).get(); - assertThat(updateVoucher.getDiscountValue().getValue()).isEqualTo(40); + Assertions.assertThatThrownBy(() -> voucherService.updateVoucher(voucherId, updateRequestDto)) + .isInstanceOf(VoucherException.class) + .hasMessage("할인율은 1부터 100사이의 값이여야 합니다."); } + @Test - @DisplayName("Percent 바우처를 수정할 수 있다.(1-100을 넘어가면 예외 발생) - 실패") - void updatePercentVoucher_Dto_ThrowVoucherException() { + @DisplayName("Percent 바우처를 수정할 수 있다. - 성공") + void updatePercentVoucher_Dto_Success() { //given - UUID voucherId = UUID.randomUUID(); + String voucherId = UlidCreator.getUlid().toString(); Voucher saveVoucher = new PercentAmountVoucher(voucherId, DiscountType.PERCENT, new DiscountValue(10)); voucherStoreRepository.insert(saveVoucher); - VoucherUpdateRequest updateRequestDto = new VoucherUpdateRequest(-1); + VoucherUpdateRequest updateRequestDto = new VoucherUpdateRequest(40); //mocking given(voucherReaderRepository.findById(voucherId)).willReturn(Optional.of(saveVoucher)); + //when + voucherService.updateVoucher(voucherId, updateRequestDto); + //then - assertThatThrownBy(() -> voucherService.updateVoucher(voucherId, updateRequestDto)) - .isInstanceOf(VoucherException.class) - .hasMessage("할인율은 1부터 100사이의 값이여야 합니다."); + Voucher updateVoucher = voucherReaderRepository.findById(voucherId).get(); + assertThat(updateVoucher.getDiscountValue().getValue()).isEqualTo(40); } @Test @DisplayName("바우처ID를 입력받아 해당 바우처를 삭제할 수 있다. - 성공") void deleteVoucher_voucherId_Success() { //given - Voucher saveVoucher = new FixedAmountVoucher(UUID.randomUUID(), DiscountType.FIXED, new DiscountValue(1000)); + Voucher saveVoucher = new FixedAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.FIXED, new DiscountValue(1000)); voucherStoreRepository.insert(saveVoucher); //when @@ -114,8 +115,8 @@ void deleteVoucher_voucherId_Success() { @DisplayName("바우처 전체 목록을 가져올 수 있다. - 성공") void getVouchers_EqualsListOfVouchers() { //given - Voucher voucher1 = new FixedAmountVoucher(UUID.randomUUID(), DiscountType.FIXED, new DiscountValue(100)); - Voucher voucher2 = new PercentAmountVoucher(UUID.randomUUID(), DiscountType.PERCENT, new DiscountValue(10)); + Voucher voucher1 = new FixedAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.FIXED, new DiscountValue(100)); + Voucher voucher2 = new PercentAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.PERCENT, new DiscountValue(10)); List voucherList = Arrays.asList(voucher1, voucher2); //mocking diff --git a/src/test/java/org/programmers/VoucherManagement/voucher/application/VoucherServiceTest.java b/src/test/java/org/programmers/VoucherManagement/voucher/application/VoucherServiceTest.java index 6523c01929..6cea5f9c9c 100644 --- a/src/test/java/org/programmers/VoucherManagement/voucher/application/VoucherServiceTest.java +++ b/src/test/java/org/programmers/VoucherManagement/voucher/application/VoucherServiceTest.java @@ -1,11 +1,12 @@ package org.programmers.VoucherManagement.voucher.application; +import com.github.f4b6a3.ulid.UlidCreator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherGetResponse; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherGetResponses; +import org.programmers.VoucherManagement.voucher.application.dto.VoucherUpdateRequest; import org.programmers.VoucherManagement.voucher.domain.*; -import org.programmers.VoucherManagement.voucher.dto.request.VoucherUpdateRequest; -import org.programmers.VoucherManagement.voucher.dto.response.VoucherGetResponse; -import org.programmers.VoucherManagement.voucher.dto.response.VoucherGetResponses; import org.programmers.VoucherManagement.voucher.exception.VoucherException; import org.programmers.VoucherManagement.voucher.infrastructure.VoucherReaderRepository; import org.programmers.VoucherManagement.voucher.infrastructure.VoucherStoreRepository; @@ -17,7 +18,6 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; -import java.util.UUID; import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; @@ -40,7 +40,7 @@ public class VoucherServiceTest { @DisplayName("Fixed 바우처를 수정할 수 있다. - 성공") void updateFixedVoucher_Dto_Success() { //given - UUID voucherId = UUID.randomUUID(); + String voucherId = UlidCreator.getUlid().toString(); Voucher saveVoucher = new FixedAmountVoucher(voucherId, DiscountType.FIXED, new DiscountValue(100)); voucherStoreRepository.insert(saveVoucher); VoucherUpdateRequest updateRequestDto = new VoucherUpdateRequest(1000); @@ -57,7 +57,7 @@ void updateFixedVoucher_Dto_Success() { @DisplayName("Percent 바우처를 수정할 수 있다. - 성공") void updatePercentVoucher_Dto_Success() { //given - UUID voucherId = UUID.randomUUID(); + String voucherId = UlidCreator.getUlid().toString(); Voucher saveVoucher = new PercentAmountVoucher(voucherId, DiscountType.PERCENT, new DiscountValue(10)); voucherStoreRepository.insert(saveVoucher); VoucherUpdateRequest updateRequestDto = new VoucherUpdateRequest(40); @@ -74,7 +74,7 @@ void updatePercentVoucher_Dto_Success() { @DisplayName("Percent 바우처를 수정할 수 있다.(1-100을 넘어가면 예외 발생) - 실패") void updatePercentVoucher_Dto_ThrowVoucherException() { //given - UUID voucherId = UUID.randomUUID(); + String voucherId = UlidCreator.getUlid().toString(); Voucher saveVoucher = new PercentAmountVoucher(voucherId, DiscountType.PERCENT, new DiscountValue(10)); voucherStoreRepository.insert(saveVoucher); VoucherUpdateRequest updateRequestDto = new VoucherUpdateRequest(-1); @@ -89,7 +89,7 @@ void updatePercentVoucher_Dto_ThrowVoucherException() { @DisplayName("바우처ID를 입력받아 해당 바우처를 삭제할 수 있다. - 성공") void deleteVoucher_voucherId_Success() { //given - UUID voucherId = UUID.randomUUID(); + String voucherId = UlidCreator.getUlid().toString(); Voucher saveVoucher = new FixedAmountVoucher(voucherId, DiscountType.FIXED, new DiscountValue(1000)); voucherStoreRepository.insert(saveVoucher); @@ -105,8 +105,8 @@ void deleteVoucher_voucherId_Success() { @DisplayName("바우처 전체 목록을 가져올 수 있다. - 성공") void getVouchers_EqualsListOfVouchers() { //given - Voucher voucher1 = new FixedAmountVoucher(UUID.randomUUID(), DiscountType.FIXED, new DiscountValue(100)); - Voucher voucher2 = new PercentAmountVoucher(UUID.randomUUID(), DiscountType.PERCENT, new DiscountValue(10)); + Voucher voucher1 = new FixedAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.FIXED, new DiscountValue(100)); + Voucher voucher2 = new PercentAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.PERCENT, new DiscountValue(10)); voucherStoreRepository.insert(voucher1); voucherStoreRepository.insert(voucher2); List voucherList = Arrays.asList(voucher1, voucher2); diff --git a/src/test/java/org/programmers/VoucherManagement/voucher/domain/PercentAmountVoucherTest.java b/src/test/java/org/programmers/VoucherManagement/voucher/domain/PercentAmountVoucherTest.java index 30bb64314d..fd47e806f1 100644 --- a/src/test/java/org/programmers/VoucherManagement/voucher/domain/PercentAmountVoucherTest.java +++ b/src/test/java/org/programmers/VoucherManagement/voucher/domain/PercentAmountVoucherTest.java @@ -1,11 +1,10 @@ package org.programmers.VoucherManagement.voucher.domain; +import com.github.f4b6a3.ulid.UlidCreator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.programmers.VoucherManagement.voucher.exception.VoucherException; -import java.util.UUID; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -15,7 +14,7 @@ public class PercentAmountVoucherTest { @DisplayName("Percent 바우처를 생성한다. - 성공") void PercentAmountVoucher_Parameters_createPercentAmountVoucher() { //given - UUID voucherId = UUID.randomUUID(); + String voucherId = UlidCreator.getUlid().toString(); DiscountType discountType = DiscountType.PERCENT; DiscountValue discountValue = new DiscountValue(15); @@ -32,7 +31,7 @@ void PercentAmountVoucher_Parameters_createPercentAmountVoucher() { @DisplayName("Percent 바우처를 생성한다. - 실패") void PercentAmountVoucher_Parameters_throwVoucherException() { //given&when - UUID voucherId = UUID.randomUUID(); + String voucherId = UlidCreator.getUlid().toString(); DiscountType discountType = DiscountType.PERCENT; DiscountValue discountValue = new DiscountValue(101); diff --git a/src/test/java/org/programmers/VoucherManagement/voucher/domain/VoucherTest.java b/src/test/java/org/programmers/VoucherManagement/voucher/domain/VoucherTest.java index 2903498c9a..8b00318df8 100644 --- a/src/test/java/org/programmers/VoucherManagement/voucher/domain/VoucherTest.java +++ b/src/test/java/org/programmers/VoucherManagement/voucher/domain/VoucherTest.java @@ -1,10 +1,9 @@ package org.programmers.VoucherManagement.voucher.domain; +import com.github.f4b6a3.ulid.UlidCreator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.util.UUID; - import static org.assertj.core.api.Assertions.assertThat; public class VoucherTest { @@ -12,7 +11,7 @@ public class VoucherTest { @DisplayName("바우처의 할인 금액을 변경할 수 있다. - 성공") void changeDiscountValue_DiscountValue_Success() { //given - Voucher voucher = new FixedAmountVoucher(UUID.randomUUID(), DiscountType.FIXED, new DiscountValue(1000)); + Voucher voucher = new FixedAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.FIXED, new DiscountValue(1000)); //when voucher.changeDiscountValue(new DiscountValue(200)); diff --git a/src/test/java/org/programmers/VoucherManagement/voucher/infrastructure/JdbcVoucherRepositoryTest.java b/src/test/java/org/programmers/VoucherManagement/voucher/infrastructure/JdbcVoucherRepositoryTest.java index 96f7b3571f..7aeee9f797 100644 --- a/src/test/java/org/programmers/VoucherManagement/voucher/infrastructure/JdbcVoucherRepositoryTest.java +++ b/src/test/java/org/programmers/VoucherManagement/voucher/infrastructure/JdbcVoucherRepositoryTest.java @@ -1,5 +1,6 @@ package org.programmers.VoucherManagement.voucher.infrastructure; +import com.github.f4b6a3.ulid.UlidCreator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -10,7 +11,6 @@ import java.util.List; import java.util.Optional; -import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -28,15 +28,14 @@ public class JdbcVoucherRepositoryTest { @BeforeEach void initVoucher() { - fixedVoucher = new FixedAmountVoucher(UUID.randomUUID(), DiscountType.FIXED, new DiscountValue(1000)); - percentVoucher = new PercentAmountVoucher(UUID.randomUUID(), DiscountType.PERCENT, new DiscountValue(10)); + fixedVoucher = new FixedAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.FIXED, new DiscountValue(1000)); + percentVoucher = new PercentAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.PERCENT, new DiscountValue(10)); } @Test @DisplayName("Percent 바우처를 생성할 수 있다.") void insert_PercentVoucher_EqualsNewPercentVoucher() { //given - System.out.println(percentVoucher.getVoucherId()); voucherStoreRepository.insert(percentVoucher); //when @@ -94,7 +93,7 @@ void update_PercentVoucher_EqualsUpdatePercentVoucher() { @DisplayName("id를 이용해 Percent 바우처를 조회할 수 있다. - 성공") void findById_VoucherID_EqualsFindVoucher() { //given - UUID findVoucherId = percentVoucher.getVoucherId(); + String findVoucherId = percentVoucher.getVoucherId(); voucherStoreRepository.insert(percentVoucher); voucherStoreRepository.insert(fixedVoucher); @@ -125,7 +124,7 @@ void delete_VoucherId_Success() { //given voucherStoreRepository.insert(percentVoucher); voucherStoreRepository.insert(fixedVoucher); - UUID deleteVoucherId = percentVoucher.getVoucherId(); + String deleteVoucherId = percentVoucher.getVoucherId(); //when voucherStoreRepository.delete(deleteVoucherId); diff --git a/src/test/java/org/programmers/VoucherManagement/voucher/infrastructure/MemoryVoucherRepositoryTest.java b/src/test/java/org/programmers/VoucherManagement/voucher/infrastructure/MemoryVoucherRepositoryTest.java index 7a9cb230a8..2cc3038f96 100644 --- a/src/test/java/org/programmers/VoucherManagement/voucher/infrastructure/MemoryVoucherRepositoryTest.java +++ b/src/test/java/org/programmers/VoucherManagement/voucher/infrastructure/MemoryVoucherRepositoryTest.java @@ -1,5 +1,6 @@ package org.programmers.VoucherManagement.voucher.infrastructure; +import com.github.f4b6a3.ulid.UlidCreator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -10,7 +11,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.UUID; import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; @@ -32,8 +32,8 @@ void init() { @DisplayName("바우처를 메모리에 저장하는 테스트 - 성공") void save_Voucher_Success() { //given - Voucher fixedVoucher = new FixedAmountVoucher(UUID.randomUUID(), DiscountType.FIXED, new DiscountValue(1000)); - Voucher percentVoucher = new PercentAmountVoucher(UUID.randomUUID(), DiscountType.PERCENT, new DiscountValue(10)); + Voucher fixedVoucher = new FixedAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.FIXED, new DiscountValue(1000)); + Voucher percentVoucher = new PercentAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.PERCENT, new DiscountValue(10)); //when voucherRepository.insert(fixedVoucher); @@ -63,10 +63,10 @@ void findAll_Success(List voucherList) { private static Stream 저장된바우처를_모두조회_성공() { List voucherList = new ArrayList<>(); - voucherList.add(new FixedAmountVoucher(UUID.randomUUID(), DiscountType.FIXED, new DiscountValue(1000))); - voucherList.add(new PercentAmountVoucher(UUID.randomUUID(), DiscountType.PERCENT, new DiscountValue(10))); - voucherList.add(new FixedAmountVoucher(UUID.randomUUID(), DiscountType.FIXED, new DiscountValue(2000))); - voucherList.add(new PercentAmountVoucher(UUID.randomUUID(), DiscountType.PERCENT, new DiscountValue(20))); + voucherList.add(new FixedAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.FIXED, new DiscountValue(1000))); + voucherList.add(new PercentAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.PERCENT, new DiscountValue(10))); + voucherList.add(new FixedAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.FIXED, new DiscountValue(2000))); + voucherList.add(new PercentAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.PERCENT, new DiscountValue(20))); return Stream.of(Arguments.of(voucherList)); } } diff --git a/src/test/java/org/programmers/VoucherManagement/wallet/application/WalletServiceTest.java b/src/test/java/org/programmers/VoucherManagement/wallet/application/WalletServiceTest.java index 2a04c49672..7a1c17c71e 100644 --- a/src/test/java/org/programmers/VoucherManagement/wallet/application/WalletServiceTest.java +++ b/src/test/java/org/programmers/VoucherManagement/wallet/application/WalletServiceTest.java @@ -1,5 +1,6 @@ package org.programmers.VoucherManagement.wallet.application; +import com.github.f4b6a3.ulid.UlidCreator; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -9,9 +10,9 @@ import org.programmers.VoucherManagement.member.infrastructure.MemberStoreRepository; import org.programmers.VoucherManagement.voucher.domain.*; import org.programmers.VoucherManagement.voucher.infrastructure.VoucherStoreRepository; +import org.programmers.VoucherManagement.wallet.application.dto.WalletGetResponse; +import org.programmers.VoucherManagement.wallet.application.dto.WalletGetResponses; import org.programmers.VoucherManagement.wallet.domain.Wallet; -import org.programmers.VoucherManagement.wallet.dto.response.WalletGetResponse; -import org.programmers.VoucherManagement.wallet.dto.response.WalletGetResponses; import org.programmers.VoucherManagement.wallet.exception.WalletException; import org.programmers.VoucherManagement.wallet.infrastructure.WalletReaderRepository; import org.programmers.VoucherManagement.wallet.infrastructure.WalletStoreRepository; @@ -22,7 +23,6 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; -import java.util.UUID; import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; @@ -82,7 +82,7 @@ void getWalletsByMemberId_MemberId_Success() { walletStoreRepository.insert(wallet2); //when - WalletGetResponses walletListResponse = walletService.getWalletsByMemberId(member2.getMemberUUID()); + WalletGetResponses walletListResponse = walletService.getWalletsByMemberId(member2.getMemberId()); //then List responseExpect = walletList.stream() @@ -119,12 +119,12 @@ void deleteWallet_walletId_ThrowWalletException() { } private void setUpWalletServiceTest() { - member1 = new Member(UUID.randomUUID(), "Kim", MemberStatus.BLACK); - member2 = new Member(UUID.randomUUID(), "Park", MemberStatus.BLACK); - voucher1 = new PercentAmountVoucher(UUID.randomUUID(), DiscountType.PERCENT, new DiscountValue(10)); - voucher2 = new FixedAmountVoucher(UUID.randomUUID(), DiscountType.FIXED, new DiscountValue(10000)); - wallet1 = new Wallet(UUID.randomUUID(), voucher1, member1); - wallet2 = new Wallet(UUID.randomUUID(), voucher1, member2); + member1 = new Member(UlidCreator.getUlid().toString(), "Kim", MemberStatus.BLACK); + member2 = new Member(UlidCreator.getUlid().toString(), "Park", MemberStatus.BLACK); + voucher1 = new PercentAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.PERCENT, new DiscountValue(10)); + voucher2 = new FixedAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.FIXED, new DiscountValue(10000)); + wallet1 = new Wallet(UlidCreator.getUlid().toString(), voucher1, member1); + wallet2 = new Wallet(UlidCreator.getUlid().toString(), voucher1, member2); memberStoreRepository.insert(member1); memberStoreRepository.insert(member2); voucherStoreRepository.insert(voucher1); diff --git a/src/test/java/org/programmers/VoucherManagement/wallet/infrastructure/JdbcWalletRepositoryTest.java b/src/test/java/org/programmers/VoucherManagement/wallet/infrastructure/JdbcWalletRepositoryTest.java index 71d2631332..f86c34025a 100644 --- a/src/test/java/org/programmers/VoucherManagement/wallet/infrastructure/JdbcWalletRepositoryTest.java +++ b/src/test/java/org/programmers/VoucherManagement/wallet/infrastructure/JdbcWalletRepositoryTest.java @@ -1,5 +1,6 @@ package org.programmers.VoucherManagement.wallet.infrastructure; +import com.github.f4b6a3.ulid.UlidCreator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -17,7 +18,6 @@ import java.util.List; import java.util.Optional; -import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -43,10 +43,10 @@ public class JdbcWalletRepositoryTest { @BeforeEach void initVoucher() { - member1 = new Member(UUID.randomUUID(), "Kim", MemberStatus.BLACK); - member2 = new Member(UUID.randomUUID(), "Park", MemberStatus.BLACK); - voucher1 = new PercentAmountVoucher(UUID.randomUUID(), DiscountType.PERCENT, new DiscountValue(10)); - voucher2 = new FixedAmountVoucher(UUID.randomUUID(), DiscountType.FIXED, new DiscountValue(10000)); + member1 = new Member(UlidCreator.getUlid().toString(), "Kim", MemberStatus.BLACK); + member2 = new Member(UlidCreator.getUlid().toString(), "Park", MemberStatus.BLACK); + voucher1 = new PercentAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.PERCENT, new DiscountValue(10)); + voucher2 = new FixedAmountVoucher(UlidCreator.getUlid().toString(), DiscountType.FIXED, new DiscountValue(10000)); memberStoreRepository.insert(member1); memberStoreRepository.insert(member2); voucherStoreRepository.insert(voucher1); @@ -57,7 +57,7 @@ void initVoucher() { @DisplayName("Wallet을 생성할 수 있다. - 성공") void insert_Wallet_EqualsNewWallet() { //given - Wallet wallet = new Wallet(UUID.randomUUID(), voucher1, member1); + Wallet wallet = new Wallet(UlidCreator.getUlid().toString(), voucher1, member1); //when walletStoreRepository.insert(wallet); @@ -72,7 +72,7 @@ void insert_Wallet_EqualsNewWallet() { @DisplayName("id를 이용해 Wallet을 조회할 수 있다. - 성공") void findById_WalletID_EqualsFindWallet() { //given - Wallet wallet = new Wallet(UUID.randomUUID(), voucher1, member1); + Wallet wallet = new Wallet(UlidCreator.getUlid().toString(), voucher1, member1); walletStoreRepository.insert(wallet); //when @@ -86,13 +86,13 @@ void findById_WalletID_EqualsFindWallet() { @DisplayName("회원Id를 이용하여 가지고 있는 Wallet 리스트를 반환할 수 있다. - 성공") void findAllByMemberId_MemberId_Success() { //given - Wallet wallet1 = new Wallet(UUID.randomUUID(), voucher1, member1); - Wallet wallet2 = new Wallet(UUID.randomUUID(), voucher2, member1); + Wallet wallet1 = new Wallet(UlidCreator.getUlid().toString(), voucher1, member1); + Wallet wallet2 = new Wallet(UlidCreator.getUlid().toString(), voucher2, member1); walletStoreRepository.insert(wallet1); walletStoreRepository.insert(wallet2); //when - List walletList = walletReaderRepository.findAllByMemberId(member1.getMemberUUID()); + List walletList = walletReaderRepository.findAllByMemberId(member1.getMemberId()); //then assertThat(walletList.size()).isEqualTo(2); @@ -103,8 +103,8 @@ void findAllByMemberId_MemberId_Success() { @DisplayName("바우처Id를 이용하여 가지고 있는 Wallet 리스트를 반환할 수 있다. - 성공") void findAllByVoucherId_VoucherId_Success() { //given - Wallet wallet1 = new Wallet(UUID.randomUUID(), voucher1, member1); - Wallet wallet2 = new Wallet(UUID.randomUUID(), voucher2, member1); + Wallet wallet1 = new Wallet(UlidCreator.getUlid().toString(), voucher1, member1); + Wallet wallet2 = new Wallet(UlidCreator.getUlid().toString(), voucher2, member1); walletStoreRepository.insert(wallet1); walletStoreRepository.insert(wallet2); @@ -120,7 +120,7 @@ void findAllByVoucherId_VoucherId_Success() { @DisplayName("등록된 Wallet을 삭제할 수 있다. - 성공") void delete_VoucherId_Success() { //given - Wallet wallet = new Wallet(UUID.randomUUID(), voucher1, member1); + Wallet wallet = new Wallet(UlidCreator.getUlid().toString(), voucher1, member1); walletStoreRepository.insert(wallet); //when diff --git a/src/test/resources/sql/schema.sql b/src/test/resources/sql/schema.sql index 773027c70e..935fcef8e9 100644 --- a/src/test/resources/sql/schema.sql +++ b/src/test/resources/sql/schema.sql @@ -7,6 +7,7 @@ create table member_table member_id varchar(60), member_status varchar(10) not null, name varchar(20) not null, + created_at varchar(20) not null, primary key (member_id) ); @@ -16,6 +17,7 @@ create table voucher_table voucher_id varchar(60), voucher_value int not null, voucher_type varchar(20) not null, + created_at varchar(20) not null, primary key (voucher_id) ); @@ -25,6 +27,7 @@ create table wallet_table wallet_id varchar(60), voucher_id varchar(60) not null, member_id varchar(60) not null, + created_at varchar(20) not null, primary key (wallet_id), foreign key (voucher_id) references voucher_table (voucher_id),