diff --git a/build.gradle b/build.gradle index fdc90722a8..ca8455c637 100644 --- a/build.gradle +++ b/build.gradle @@ -22,12 +22,18 @@ dependencies { testImplementation "org.mockito:mockito-core:3.+" //JdbcTemplate 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-jdbc' - + //web implementation 'org.springframework.boot:spring-boot-starter-web' - + //타입리프 implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + //mapStruct + implementation 'org.mapstruct:mapstruct:1.5.5.Final' + annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final' //DB설정 runtimeOnly 'mysql:mysql-connector-java:8.0.32' + + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation "com.fasterxml.uuid:java-uuid-generator:4.0.1" } tasks.named('test') { diff --git a/src/main/generated/org/prgrms/kdt/member/controller/mapper/ControllerMemberMapperImpl.java b/src/main/generated/org/prgrms/kdt/member/controller/mapper/ControllerMemberMapperImpl.java new file mode 100644 index 0000000000..497803b1ff --- /dev/null +++ b/src/main/generated/org/prgrms/kdt/member/controller/mapper/ControllerMemberMapperImpl.java @@ -0,0 +1,33 @@ +package org.prgrms.kdt.member.controller.mapper; + +import javax.annotation.processing.Generated; +import org.prgrms.kdt.member.controller.dto.CreateMemberApiRequest; +import org.prgrms.kdt.member.domain.MemberStatus; +import org.prgrms.kdt.member.service.dto.CreateMemberRequest; +import org.springframework.stereotype.Component; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2023-08-01T21:55:33+0900", + comments = "version: 1.5.5.Final, compiler: javac, environment: Java 17.0.7 (Oracle Corporation)" +) +@Component +public class ControllerMemberMapperImpl implements ControllerMemberMapper { + + @Override + public CreateMemberRequest convertRequest(CreateMemberApiRequest request) { + if ( request == null ) { + return null; + } + + String name = null; + MemberStatus status = null; + + name = request.name(); + status = request.status(); + + CreateMemberRequest createMemberRequest = new CreateMemberRequest( name, status ); + + return createMemberRequest; + } +} diff --git a/src/main/generated/org/prgrms/kdt/voucher/controller/mapper/ControllerVoucherMapperImpl.java b/src/main/generated/org/prgrms/kdt/voucher/controller/mapper/ControllerVoucherMapperImpl.java new file mode 100644 index 0000000000..e480800861 --- /dev/null +++ b/src/main/generated/org/prgrms/kdt/voucher/controller/mapper/ControllerVoucherMapperImpl.java @@ -0,0 +1,54 @@ +package org.prgrms.kdt.voucher.controller.mapper; + +import javax.annotation.processing.Generated; +import org.prgrms.kdt.voucher.controller.dto.CreateVoucherApiRequest; +import org.prgrms.kdt.voucher.controller.dto.SearchApiRequest; +import org.prgrms.kdt.voucher.domain.VoucherType; +import org.prgrms.kdt.voucher.service.dto.CreateVoucherRequest; +import org.prgrms.kdt.voucher.service.dto.SearchRequest; +import org.springframework.stereotype.Component; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2023-08-01T21:55:34+0900", + comments = "version: 1.5.5.Final, compiler: javac, environment: Java 17.0.7 (Oracle Corporation)" +) +@Component +public class ControllerVoucherMapperImpl implements ControllerVoucherMapper { + + @Override + public CreateVoucherRequest convertRequest(CreateVoucherApiRequest createVoucherApiRequest) { + if ( createVoucherApiRequest == null ) { + return null; + } + + VoucherType voucherType = null; + double discountAmount = 0.0d; + + voucherType = createVoucherApiRequest.voucherType(); + discountAmount = createVoucherApiRequest.discountAmount(); + + CreateVoucherRequest createVoucherRequest = new CreateVoucherRequest( voucherType, discountAmount ); + + return createVoucherRequest; + } + + @Override + public SearchRequest convertRequest(SearchApiRequest searchApiRequest) { + if ( searchApiRequest == null ) { + return null; + } + + long page = 0L; + long recordSize = 0L; + VoucherType voucherType = null; + + page = searchApiRequest.getPage(); + recordSize = searchApiRequest.getRecordSize(); + voucherType = searchApiRequest.getVoucherType(); + + SearchRequest searchRequest = new SearchRequest( page, recordSize, voucherType ); + + return searchRequest; + } +} diff --git a/src/main/generated/org/prgrms/kdt/wallet/controller/mapper/ControllerWalletMapperImpl.java b/src/main/generated/org/prgrms/kdt/wallet/controller/mapper/ControllerWalletMapperImpl.java new file mode 100644 index 0000000000..db257ea416 --- /dev/null +++ b/src/main/generated/org/prgrms/kdt/wallet/controller/mapper/ControllerWalletMapperImpl.java @@ -0,0 +1,33 @@ +package org.prgrms.kdt.wallet.controller.mapper; + +import java.util.UUID; +import javax.annotation.processing.Generated; +import org.prgrms.kdt.wallet.controller.dto.CreateWalletApiRequest; +import org.prgrms.kdt.wallet.service.dto.CreateWalletRequest; +import org.springframework.stereotype.Component; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2023-08-01T21:55:34+0900", + comments = "version: 1.5.5.Final, compiler: javac, environment: Java 17.0.7 (Oracle Corporation)" +) +@Component +public class ControllerWalletMapperImpl implements ControllerWalletMapper { + + @Override + public CreateWalletRequest convertRequest(CreateWalletApiRequest request) { + if ( request == null ) { + return null; + } + + UUID memberId = null; + UUID voucherId = null; + + memberId = request.memberId(); + voucherId = request.voucherId(); + + CreateWalletRequest createWalletRequest = new CreateWalletRequest( memberId, voucherId ); + + return createWalletRequest; + } +} diff --git a/src/main/java/org/prgrms/kdt/CommendLineRunner.java b/src/main/java/org/prgrms/kdt/CommendLineRunner.java index bfed8d1145..e386cf1504 100644 --- a/src/main/java/org/prgrms/kdt/CommendLineRunner.java +++ b/src/main/java/org/prgrms/kdt/CommendLineRunner.java @@ -1,8 +1,8 @@ package org.prgrms.kdt; import org.prgrms.kdt.commendLine.Console; -import org.prgrms.kdt.exception.InvalidInputException; -import org.prgrms.kdt.util.Menu; +import org.prgrms.kdt.global.exception.InvalidInputException; +import org.prgrms.kdt.global.Menu; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; @@ -12,7 +12,7 @@ import java.io.IOException; -@Profile("!test") +@Profile("console") @Component public class CommendLineRunner implements CommandLineRunner { private static final Logger logger = LoggerFactory.getLogger(CommendLineRunner.class); @@ -27,13 +27,12 @@ public CommendLineRunner(ViewManager viewManager, Console console) { @Override public void run(String... args) { - boolean isRunning = true; - while (isRunning) { + while (true) { try { console.printMenu(); int getUserMenu = Integer.parseInt(console.getUserMenu()); Menu menu = Menu.getMenu(getUserMenu); - isRunning = menu.isNotExit(); + if (menu.isExit()) break; executeAction(menu); } catch (InvalidInputException e) { diff --git a/src/main/java/org/prgrms/kdt/HomeController.java b/src/main/java/org/prgrms/kdt/HomeController.java new file mode 100644 index 0000000000..d5deb98364 --- /dev/null +++ b/src/main/java/org/prgrms/kdt/HomeController.java @@ -0,0 +1,13 @@ +package org.prgrms.kdt; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class HomeController { + + @GetMapping("/") + public String home(){ + return "home"; + } +} diff --git a/src/main/java/org/prgrms/kdt/ViewManager.java b/src/main/java/org/prgrms/kdt/ViewManager.java index 039acc99bc..f00fcaf265 100644 --- a/src/main/java/org/prgrms/kdt/ViewManager.java +++ b/src/main/java/org/prgrms/kdt/ViewManager.java @@ -3,13 +3,13 @@ import org.prgrms.kdt.commendLine.Console; import org.prgrms.kdt.member.controller.MemberController; import org.prgrms.kdt.member.domain.MemberStatus; -import org.prgrms.kdt.member.dto.CreateMemberRequest; +import org.prgrms.kdt.member.controller.dto.CreateMemberApiRequest; import org.prgrms.kdt.voucher.controller.VoucherController; +import org.prgrms.kdt.voucher.controller.dto.CreateVoucherApiRequest; import org.prgrms.kdt.voucher.domain.VoucherType; -import org.prgrms.kdt.voucher.dto.CreateVoucherRequest; import org.prgrms.kdt.wallet.controller.WalletController; -import org.prgrms.kdt.wallet.dto.request.CreateWalletRequest; -import org.prgrms.kdt.wallet.dto.response.JoinedWalletResponses; +import org.prgrms.kdt.wallet.controller.dto.CreateWalletApiRequest; +import org.prgrms.kdt.wallet.service.dto.JoinedWalletResponses; import org.springframework.stereotype.Component; import java.io.IOException; @@ -32,7 +32,7 @@ public ViewManager(VoucherController voucherController, MemberController memberC public void createVoucher() throws IOException { VoucherType voucherType = VoucherType.getTypeByNum(console.getVoucherTypes()); double discountAmount = Double.parseDouble(console.getDiscountAmount()); - voucherController.create(new CreateVoucherRequest(voucherType, discountAmount)); + voucherController.create(new CreateVoucherApiRequest(voucherType, discountAmount)); } public void findAllVoucher() { @@ -45,7 +45,7 @@ public void findAllBlackMember() { public void createMember() throws IOException { String memberName = console.getMemberName(); - memberController.createMember(new CreateMemberRequest(memberName, MemberStatus.COMMON)); + memberController.createMember(new CreateMemberApiRequest(memberName, MemberStatus.COMMON)); } public void findAllMember() { @@ -55,7 +55,7 @@ public void findAllMember() { public void assignVoucher() throws IOException { UUID memberUuid = console.getMemberId(); UUID voucherUuid = console.getVoucherId(); - walletController.createWallet(new CreateWalletRequest(memberUuid, voucherUuid)); + walletController.createWallet(new CreateWalletApiRequest(memberUuid, voucherUuid)); } public void findVouchersByMember() throws IOException { diff --git a/src/main/java/org/prgrms/kdt/commendLine/Console.java b/src/main/java/org/prgrms/kdt/commendLine/Console.java index 20eb6cc04c..edda56c303 100644 --- a/src/main/java/org/prgrms/kdt/commendLine/Console.java +++ b/src/main/java/org/prgrms/kdt/commendLine/Console.java @@ -1,8 +1,8 @@ package org.prgrms.kdt.commendLine; -import org.prgrms.kdt.member.dto.MemberResponses; -import org.prgrms.kdt.voucher.dto.VoucherResponses; -import org.prgrms.kdt.wallet.dto.response.JoinedWalletResponses; +import org.prgrms.kdt.member.service.dto.MemberResponses; +import org.prgrms.kdt.voucher.service.dto.VoucherResponses; +import org.prgrms.kdt.wallet.service.dto.JoinedWalletResponses; import org.springframework.stereotype.Component; import java.io.BufferedReader; diff --git a/src/main/java/org/prgrms/kdt/exception/FileAccessException.java b/src/main/java/org/prgrms/kdt/exception/FileAccessException.java deleted file mode 100644 index 3cdc8292c9..0000000000 --- a/src/main/java/org/prgrms/kdt/exception/FileAccessException.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.prgrms.kdt.exception; - -public class FileAccessException extends RuntimeException { - public FileAccessException() { - } - - public FileAccessException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/src/main/java/org/prgrms/kdt/global/ApiExceptionHandler.java b/src/main/java/org/prgrms/kdt/global/ApiExceptionHandler.java new file mode 100644 index 0000000000..78290fe0fd --- /dev/null +++ b/src/main/java/org/prgrms/kdt/global/ApiExceptionHandler.java @@ -0,0 +1,63 @@ +package org.prgrms.kdt.global; + +import org.prgrms.kdt.global.exception.EntityNotFoundException; +import org.prgrms.kdt.global.exception.InvalidInputException; +import org.prgrms.kdt.voucher.exception.InvalidDiscountException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MissingRequestHeaderException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.servlet.NoHandlerFoundException; + +import javax.servlet.http.HttpServletRequest; + +@RestControllerAdvice +public class ApiExceptionHandler { + private static final Logger logger = LoggerFactory.getLogger(ApiExceptionHandler.class); + + @ExceptionHandler(BindException.class) + public ResponseEntity handleBindException(HttpServletRequest request, BindException e) { + BindingResult bindingResult = e.getBindingResult(); + StringBuilder stringBuilder = new StringBuilder(); + + for (FieldError fieldError : bindingResult.getFieldErrors()) { + stringBuilder.append(fieldError.getField()).append(":"); + stringBuilder.append(fieldError.getDefaultMessage()); + stringBuilder.append(", "); + } + int statusCode = HttpStatus.BAD_REQUEST.value(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(getErrorResponse(statusCode, stringBuilder.toString(), request.getRequestURI())); + } + + @ExceptionHandler({NullPointerException.class, InvalidInputException.class, InvalidDiscountException.class, MissingRequestHeaderException.class, HttpMessageNotReadableException.class, + HttpClientErrorException.BadRequest.class, NoHandlerFoundException.class}) + public ResponseEntity handleBadRequestException(HttpServletRequest request, Exception e) { + int statusCode = HttpStatus.BAD_REQUEST.value(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(getErrorResponse(statusCode, e.getMessage(), request.getRequestURI())); + } + + @ExceptionHandler(EntityNotFoundException.class) + public ResponseEntity handleNotFoundException(HttpServletRequest request, EntityNotFoundException e) { + int statusCode = HttpStatus.NOT_FOUND.value(); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(getErrorResponse(statusCode, e.getMessage(), request.getRequestURI())); + } + + @ExceptionHandler(Exception.class) + public ResponseEntity handleException(HttpServletRequest request, Exception e) { + logger.error("Sever Exception: ", e.getMessage()); + int statusCode = HttpStatus.OK.value(); + return ResponseEntity.ok(getErrorResponse(statusCode, e.getMessage(), request.getRequestURI())); + } + + private static ErrorResponse getErrorResponse(int status, String masesage, String requestURI) { + return new ErrorResponse(status, masesage, requestURI); + } +} diff --git a/src/main/java/org/prgrms/kdt/global/ErrorResponse.java b/src/main/java/org/prgrms/kdt/global/ErrorResponse.java new file mode 100644 index 0000000000..e7561417ea --- /dev/null +++ b/src/main/java/org/prgrms/kdt/global/ErrorResponse.java @@ -0,0 +1,9 @@ +package org.prgrms.kdt.global; + +import java.time.LocalDateTime; + +public record ErrorResponse(int statusCode, String detail, String instance, String time) { + public ErrorResponse(int statusCode, String detail, String instance) { + this(statusCode, detail, instance, LocalDateTime.now().toString()); + } +} diff --git a/src/main/java/org/prgrms/kdt/global/Generator.java b/src/main/java/org/prgrms/kdt/global/Generator.java new file mode 100644 index 0000000000..c701fcc6e7 --- /dev/null +++ b/src/main/java/org/prgrms/kdt/global/Generator.java @@ -0,0 +1,10 @@ +package org.prgrms.kdt.global; + +import java.time.LocalDateTime; +import java.util.UUID; + +public interface Generator { + UUID generateId(); + + LocalDateTime generateTime(); +} diff --git a/src/main/java/org/prgrms/kdt/global/GeneratorImp.java b/src/main/java/org/prgrms/kdt/global/GeneratorImp.java new file mode 100644 index 0000000000..84098f24f1 --- /dev/null +++ b/src/main/java/org/prgrms/kdt/global/GeneratorImp.java @@ -0,0 +1,25 @@ +package org.prgrms.kdt.global; + +import com.fasterxml.uuid.Generators; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Component +public class GeneratorImp implements Generator{ + private GeneratorImp() { + } + + @Override + public UUID generateId() { + UUID generateId = Generators.timeBasedGenerator().generate(); + String[] idArr = generateId.toString().split("-"); + return UUID.fromString(idArr[2]+"-"+idArr[1]+"-"+idArr[0]+"-"+idArr[3]+"-"+idArr[4]); + } + + @Override + public LocalDateTime generateTime() { + return LocalDateTime.now(); + } +} diff --git a/src/main/java/org/prgrms/kdt/util/Menu.java b/src/main/java/org/prgrms/kdt/global/Menu.java similarity index 81% rename from src/main/java/org/prgrms/kdt/util/Menu.java rename to src/main/java/org/prgrms/kdt/global/Menu.java index 9ca7ed0807..e955d40eed 100644 --- a/src/main/java/org/prgrms/kdt/util/Menu.java +++ b/src/main/java/org/prgrms/kdt/global/Menu.java @@ -1,6 +1,6 @@ -package org.prgrms.kdt.util; +package org.prgrms.kdt.global; -import org.prgrms.kdt.exception.InvalidInputException; +import org.prgrms.kdt.global.exception.InvalidInputException; import java.util.Arrays; @@ -30,7 +30,7 @@ public static Menu getMenu(int num) { .orElseThrow(() -> new InvalidInputException("잘못된 입력입니다.")); } - public boolean isNotExit() { - return this != EXIT; + public boolean isExit() { + return this == EXIT; } } diff --git a/src/main/java/org/prgrms/kdt/exception/EntityNotFoundException.java b/src/main/java/org/prgrms/kdt/global/exception/EntityNotFoundException.java similarity index 57% rename from src/main/java/org/prgrms/kdt/exception/EntityNotFoundException.java rename to src/main/java/org/prgrms/kdt/global/exception/EntityNotFoundException.java index aa0eae108a..4a66b73ce0 100644 --- a/src/main/java/org/prgrms/kdt/exception/EntityNotFoundException.java +++ b/src/main/java/org/prgrms/kdt/global/exception/EntityNotFoundException.java @@ -1,4 +1,4 @@ -package org.prgrms.kdt.exception; +package org.prgrms.kdt.global.exception; public class EntityNotFoundException extends RuntimeException { public EntityNotFoundException() { @@ -7,8 +7,4 @@ public EntityNotFoundException() { public EntityNotFoundException(String message) { super(message); } - - public EntityNotFoundException(String message, Throwable cause) { - super(message, cause); - } } diff --git a/src/main/java/org/prgrms/kdt/exception/InvalidInputException.java b/src/main/java/org/prgrms/kdt/global/exception/InvalidInputException.java similarity index 65% rename from src/main/java/org/prgrms/kdt/exception/InvalidInputException.java rename to src/main/java/org/prgrms/kdt/global/exception/InvalidInputException.java index 7353fa4e3e..3ad54dca2f 100644 --- a/src/main/java/org/prgrms/kdt/exception/InvalidInputException.java +++ b/src/main/java/org/prgrms/kdt/global/exception/InvalidInputException.java @@ -1,8 +1,6 @@ -package org.prgrms.kdt.exception; +package org.prgrms.kdt.global.exception; public class InvalidInputException extends RuntimeException { - public InvalidInputException() { - } public InvalidInputException(String message) { super(message); diff --git a/src/main/java/org/prgrms/kdt/exception/NotUpdateException.java b/src/main/java/org/prgrms/kdt/global/exception/NotUpdateException.java similarity index 65% rename from src/main/java/org/prgrms/kdt/exception/NotUpdateException.java rename to src/main/java/org/prgrms/kdt/global/exception/NotUpdateException.java index c9a21fb9ad..0c1f7e33b7 100644 --- a/src/main/java/org/prgrms/kdt/exception/NotUpdateException.java +++ b/src/main/java/org/prgrms/kdt/global/exception/NotUpdateException.java @@ -1,8 +1,6 @@ -package org.prgrms.kdt.exception; +package org.prgrms.kdt.global.exception; public class NotUpdateException extends RuntimeException { - public NotUpdateException() { - } public NotUpdateException(String message) { super(message); diff --git a/src/main/java/org/prgrms/kdt/member/controller/MemberController.java b/src/main/java/org/prgrms/kdt/member/controller/MemberController.java index 4688a63a50..db6c120cae 100644 --- a/src/main/java/org/prgrms/kdt/member/controller/MemberController.java +++ b/src/main/java/org/prgrms/kdt/member/controller/MemberController.java @@ -1,20 +1,23 @@ package org.prgrms.kdt.member.controller; -import org.prgrms.kdt.member.dto.CreateMemberRequest; -import org.prgrms.kdt.member.dto.MemberResponses; +import org.prgrms.kdt.member.controller.dto.CreateMemberApiRequest; +import org.prgrms.kdt.member.controller.mapper.ControllerMemberMapper; +import org.prgrms.kdt.member.service.dto.MemberResponses; import org.prgrms.kdt.member.service.MemberService; import org.springframework.stereotype.Component; @Component public class MemberController { private final MemberService memberService; + private final ControllerMemberMapper mapper; - public MemberController(MemberService memberService) { + public MemberController(MemberService memberService, ControllerMemberMapper mapper) { this.memberService = memberService; + this.mapper = mapper; } - public void createMember(CreateMemberRequest request) { - memberService.createMember(request); + public void createMember(CreateMemberApiRequest request) { + memberService.createMember(mapper.convertRequest(request)); } public MemberResponses findAllMember() { diff --git a/src/main/java/org/prgrms/kdt/member/controller/dto/CreateMemberApiRequest.java b/src/main/java/org/prgrms/kdt/member/controller/dto/CreateMemberApiRequest.java new file mode 100644 index 0000000000..a2f4a6c467 --- /dev/null +++ b/src/main/java/org/prgrms/kdt/member/controller/dto/CreateMemberApiRequest.java @@ -0,0 +1,6 @@ +package org.prgrms.kdt.member.controller.dto; + +import org.prgrms.kdt.member.domain.MemberStatus; + +public record CreateMemberApiRequest(String name, MemberStatus status) { +} diff --git a/src/main/java/org/prgrms/kdt/member/controller/mapper/ControllerMemberMapper.java b/src/main/java/org/prgrms/kdt/member/controller/mapper/ControllerMemberMapper.java new file mode 100644 index 0000000000..4d16c46d5a --- /dev/null +++ b/src/main/java/org/prgrms/kdt/member/controller/mapper/ControllerMemberMapper.java @@ -0,0 +1,10 @@ +package org.prgrms.kdt.member.controller.mapper; + +import org.mapstruct.Mapper; +import org.prgrms.kdt.member.controller.dto.CreateMemberApiRequest; +import org.prgrms.kdt.member.service.dto.CreateMemberRequest; + +@Mapper(componentModel = "spring") +public interface ControllerMemberMapper { + CreateMemberRequest convertRequest(CreateMemberApiRequest request); +} diff --git a/src/main/java/org/prgrms/kdt/member/dao/BlackListRepository.java b/src/main/java/org/prgrms/kdt/member/dao/BlackListRepository.java deleted file mode 100644 index 01f0955f2e..0000000000 --- a/src/main/java/org/prgrms/kdt/member/dao/BlackListRepository.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.prgrms.kdt.member.dao; - -import org.prgrms.kdt.member.domain.Member; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Component; - -import javax.annotation.PreDestroy; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -@Profile("file") -@Component -public class BlackListRepository { - private final Map storage; - private final MemberLoader memberLoader; - - public BlackListRepository(MemberLoader memberLoader) { - this.memberLoader = memberLoader; - this.storage = this.memberLoader.loadFileToMemoryMember(); - } - - public Member insert(Member member) { - storage.put(member.getMemberId(), member); - return member; - } - - public List findAllBlackMember() { - return List.copyOf(storage.values()); - } - - @PreDestroy - public void fileWrite() { - memberLoader.saveMemoryMemberToFile(storage); - } -} diff --git a/src/main/java/org/prgrms/kdt/member/dao/JdbcMemberRepository.java b/src/main/java/org/prgrms/kdt/member/dao/JdbcMemberRepository.java index d6f2a102a9..6a7567b1f3 100644 --- a/src/main/java/org/prgrms/kdt/member/dao/JdbcMemberRepository.java +++ b/src/main/java/org/prgrms/kdt/member/dao/JdbcMemberRepository.java @@ -1,6 +1,6 @@ package org.prgrms.kdt.member.dao; -import org.prgrms.kdt.exception.NotUpdateException; +import org.prgrms.kdt.global.exception.NotUpdateException; import org.prgrms.kdt.member.domain.Member; import org.prgrms.kdt.member.domain.MemberStatus; import org.springframework.dao.EmptyResultDataAccessException; @@ -8,7 +8,6 @@ import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; -import javax.sql.DataSource; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -24,8 +23,8 @@ public class JdbcMemberRepository implements MemberRepository { private final JdbcTemplate jdbcTemplate; - public JdbcMemberRepository(DataSource dataSource) { - this.jdbcTemplate = new JdbcTemplate(dataSource); + public JdbcMemberRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; } @Override diff --git a/src/main/java/org/prgrms/kdt/member/dao/MemberLoader.java b/src/main/java/org/prgrms/kdt/member/dao/MemberLoader.java deleted file mode 100644 index 0fe7cfb7eb..0000000000 --- a/src/main/java/org/prgrms/kdt/member/dao/MemberLoader.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.prgrms.kdt.member.dao; - -import org.prgrms.kdt.exception.FileAccessException; -import org.prgrms.kdt.member.domain.Member; -import org.prgrms.kdt.member.domain.MemberStatus; -import org.prgrms.kdt.util.Converter; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -@Component -public class MemberLoader { - private final String filePath; - - public MemberLoader(@Value("${filePath.blackList}") String filePath) { - this.filePath = filePath; - } - - public Map loadFileToMemoryMember() { - Map Members = new ConcurrentHashMap<>(); - try { - BufferedReader reader = new BufferedReader(new FileReader(filePath)); - String line = ""; - - while ((line = reader.readLine()) != null) { - UUID curId = UUID.fromString(Converter.stringToArray(line, ",")[0]); - Members.put(curId, Converter.stringToMember(line, MemberStatus.BLACK)); - } - return Members; - } catch (IOException e) { - throw new FileAccessException("파일에 접근하다 문제가 생겼습니다.", e); - } - } - - public void saveMemoryMemberToFile(Map memoryStorage) { - try (FileWriter writer = new FileWriter(filePath, false)) { - for (Map.Entry entry : memoryStorage.entrySet()) { - writer.append(Converter.memberToString(entry.getValue()) + "\n"); - } - } catch (IOException e) { - throw new FileAccessException("파일에 접근하다 문제가 생겼습니다.", e); - } - } -} diff --git a/src/main/java/org/prgrms/kdt/member/domain/Member.java b/src/main/java/org/prgrms/kdt/member/domain/Member.java index 6a3fe12c5c..37a96d4970 100644 --- a/src/main/java/org/prgrms/kdt/member/domain/Member.java +++ b/src/main/java/org/prgrms/kdt/member/domain/Member.java @@ -13,12 +13,6 @@ public Member(UUID memberId, String name, MemberStatus status) { this.status = status; } - public Member(String name, MemberStatus status) { - this.memberId = UUID.randomUUID(); - this.name = new MemberName(name); - this.status = status; - } - public UUID getMemberId() { return memberId; } diff --git a/src/main/java/org/prgrms/kdt/member/domain/MemberStatus.java b/src/main/java/org/prgrms/kdt/member/domain/MemberStatus.java index 8d514a3cc6..07686303e8 100644 --- a/src/main/java/org/prgrms/kdt/member/domain/MemberStatus.java +++ b/src/main/java/org/prgrms/kdt/member/domain/MemberStatus.java @@ -1,6 +1,6 @@ package org.prgrms.kdt.member.domain; -import org.prgrms.kdt.exception.InvalidInputException; +import org.prgrms.kdt.global.exception.InvalidInputException; import java.util.Arrays; import java.util.Objects; diff --git a/src/main/java/org/prgrms/kdt/member/service/MemberService.java b/src/main/java/org/prgrms/kdt/member/service/MemberService.java index 361f702b93..0723906c45 100644 --- a/src/main/java/org/prgrms/kdt/member/service/MemberService.java +++ b/src/main/java/org/prgrms/kdt/member/service/MemberService.java @@ -3,21 +3,27 @@ import org.prgrms.kdt.member.domain.Member; import org.prgrms.kdt.member.dao.MemberRepository; import org.prgrms.kdt.member.domain.MemberStatus; -import org.prgrms.kdt.member.dto.CreateMemberRequest; -import org.prgrms.kdt.member.dto.MemberResponse; -import org.prgrms.kdt.member.dto.MemberResponses; +import org.prgrms.kdt.member.service.dto.CreateMemberRequest; +import org.prgrms.kdt.member.service.dto.MemberResponse; +import org.prgrms.kdt.member.service.dto.MemberResponses; +import org.prgrms.kdt.member.service.mapper.ServiceMemberMapper; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +@Transactional(readOnly = true) @Service public class MemberService { private final MemberRepository memberRepository; + private final ServiceMemberMapper mapper; - public MemberService(MemberRepository memberRepository) { + public MemberService(MemberRepository memberRepository, ServiceMemberMapper mapper) { this.memberRepository = memberRepository; + this.mapper = mapper; } + @Transactional public MemberResponse createMember(CreateMemberRequest request) { - Member member = new Member(request.name(), request.status()); + Member member = mapper.convertMember(request); return new MemberResponse(memberRepository.insert(member)); } diff --git a/src/main/java/org/prgrms/kdt/member/dto/CreateMemberRequest.java b/src/main/java/org/prgrms/kdt/member/service/dto/CreateMemberRequest.java similarity index 74% rename from src/main/java/org/prgrms/kdt/member/dto/CreateMemberRequest.java rename to src/main/java/org/prgrms/kdt/member/service/dto/CreateMemberRequest.java index 89a5ebc823..35a1e7ea93 100644 --- a/src/main/java/org/prgrms/kdt/member/dto/CreateMemberRequest.java +++ b/src/main/java/org/prgrms/kdt/member/service/dto/CreateMemberRequest.java @@ -1,4 +1,4 @@ -package org.prgrms.kdt.member.dto; +package org.prgrms.kdt.member.service.dto; import org.prgrms.kdt.member.domain.MemberStatus; diff --git a/src/main/java/org/prgrms/kdt/member/dto/MemberResponse.java b/src/main/java/org/prgrms/kdt/member/service/dto/MemberResponse.java similarity index 87% rename from src/main/java/org/prgrms/kdt/member/dto/MemberResponse.java rename to src/main/java/org/prgrms/kdt/member/service/dto/MemberResponse.java index f6f8059b5e..eea2c58892 100644 --- a/src/main/java/org/prgrms/kdt/member/dto/MemberResponse.java +++ b/src/main/java/org/prgrms/kdt/member/service/dto/MemberResponse.java @@ -1,4 +1,4 @@ -package org.prgrms.kdt.member.dto; +package org.prgrms.kdt.member.service.dto; import org.prgrms.kdt.member.domain.Member; diff --git a/src/main/java/org/prgrms/kdt/member/dto/MemberResponses.java b/src/main/java/org/prgrms/kdt/member/service/dto/MemberResponses.java similarity index 92% rename from src/main/java/org/prgrms/kdt/member/dto/MemberResponses.java rename to src/main/java/org/prgrms/kdt/member/service/dto/MemberResponses.java index 0d3ef35d01..524a21fc35 100644 --- a/src/main/java/org/prgrms/kdt/member/dto/MemberResponses.java +++ b/src/main/java/org/prgrms/kdt/member/service/dto/MemberResponses.java @@ -1,4 +1,4 @@ -package org.prgrms.kdt.member.dto; +package org.prgrms.kdt.member.service.dto; import org.prgrms.kdt.member.domain.Member; diff --git a/src/main/java/org/prgrms/kdt/member/service/mapper/ServiceMemberMapper.java b/src/main/java/org/prgrms/kdt/member/service/mapper/ServiceMemberMapper.java new file mode 100644 index 0000000000..b907452905 --- /dev/null +++ b/src/main/java/org/prgrms/kdt/member/service/mapper/ServiceMemberMapper.java @@ -0,0 +1,19 @@ +package org.prgrms.kdt.member.service.mapper; + +import org.prgrms.kdt.global.Generator; +import org.prgrms.kdt.member.domain.Member; +import org.prgrms.kdt.member.service.dto.CreateMemberRequest; +import org.springframework.stereotype.Component; + +@Component +public class ServiceMemberMapper { + private final Generator generator; + + public ServiceMemberMapper(Generator generator) { + this.generator = generator; + } + + public Member convertMember(CreateMemberRequest request){ + return new Member(generator.generateId(), request.name(), request.status()); + } +} diff --git a/src/main/java/org/prgrms/kdt/util/Converter.java b/src/main/java/org/prgrms/kdt/util/Converter.java deleted file mode 100644 index c86ae557f4..0000000000 --- a/src/main/java/org/prgrms/kdt/util/Converter.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.prgrms.kdt.util; - -import org.prgrms.kdt.exception.EntityNotFoundException; -import org.prgrms.kdt.exception.InvalidInputException; -import org.prgrms.kdt.member.domain.Member; -import org.prgrms.kdt.member.domain.MemberStatus; -import org.prgrms.kdt.voucher.domain.FixedDiscountPolicy; -import org.prgrms.kdt.voucher.domain.PercentDiscountPolicy; -import org.prgrms.kdt.voucher.domain.Voucher; -import org.prgrms.kdt.voucher.domain.VoucherType; - -import java.text.MessageFormat; -import java.util.UUID; - -public final class Converter { - private Converter() { - throw new RuntimeException("생성 안돼!!"); - } - - public static String voucherToString(Voucher voucher) { - return MessageFormat.format("{0},{1},{2}", voucher.getVoucherId(), voucher.getVoucherType(), voucher.getDiscountPolicy().getAmount()); - } - - public static String memberToString(Member member) { - try { - return MessageFormat.format("{0},{1}", member.getMemberId(), member.getMemberName()); - } catch (NullPointerException e) { - throw new EntityNotFoundException("멤버 엔티티의 필드값에 null이 포함되어 있습니다", e); - } - } - - public static String[] stringToArray(String originalString, String delimiter) { - return originalString.split(delimiter); - } - - public static Voucher stringToVoucher(String str) { - String[] stringArr = str.split(","); - if (stringArr[1].equals("FIXED")) { - return new Voucher(UUID.fromString(stringArr[0]), VoucherType.FIXED, new FixedDiscountPolicy(Double.parseDouble(stringArr[2]))); - } - if (stringArr[1].equals("PERCENT")) { - return new Voucher(UUID.fromString(stringArr[0]), VoucherType.PERCENT, new PercentDiscountPolicy(Double.parseDouble(stringArr[2]))); - } - throw new InvalidInputException(); - } - - public static Member stringToMember(String str, MemberStatus status) { - String[] stringArr = str.split(","); - return new Member(UUID.fromString(stringArr[0]), stringArr[1], status); - } -} diff --git a/src/main/java/org/prgrms/kdt/voucher/controller/VoucherApiController.java b/src/main/java/org/prgrms/kdt/voucher/controller/VoucherApiController.java new file mode 100644 index 0000000000..c8ab92f60b --- /dev/null +++ b/src/main/java/org/prgrms/kdt/voucher/controller/VoucherApiController.java @@ -0,0 +1,59 @@ +package org.prgrms.kdt.voucher.controller; + +import org.prgrms.kdt.voucher.controller.dto.SearchApiRequest; +import org.prgrms.kdt.voucher.controller.dto.CreateVoucherApiRequest; +import org.prgrms.kdt.voucher.controller.mapper.ControllerVoucherMapper; +import org.prgrms.kdt.voucher.service.VoucherService; +import org.prgrms.kdt.voucher.service.dto.VoucherDetailResponse; +import org.prgrms.kdt.voucher.service.dto.VoucherResponse; +import org.prgrms.kdt.voucher.service.dto.VoucherResponses; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import javax.validation.Valid; +import java.net.URI; +import java.util.UUID; + +@RequestMapping("/api/vouchers") +@RestController +public class VoucherApiController { + private final VoucherService voucherService; + private final ControllerVoucherMapper mapper; + + public VoucherApiController(VoucherService voucherService, ControllerVoucherMapper mapper) { + this.voucherService = voucherService; + this.mapper = mapper; + } + + @PostMapping + public ResponseEntity create(@RequestBody @Valid CreateVoucherApiRequest request) { + VoucherResponse response = voucherService.createVoucher(mapper.convertRequest(request)); + + URI uri = ServletUriComponentsBuilder + .fromCurrentRequest() + .path("/{id}") + .buildAndExpand(response.voucherId()) + .toUri(); + + return ResponseEntity.created(uri).body(response); + } + + @GetMapping("/{id}") + public ResponseEntity findById(@PathVariable UUID id) { + VoucherDetailResponse response = voucherService.findById(id); + return ResponseEntity.ok(response); + } + + @GetMapping + public ResponseEntity findAllBy(@ModelAttribute @Valid SearchApiRequest request) { + VoucherResponses response = voucherService.findAll(mapper.convertRequest(request)); + return ResponseEntity.ok(response); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteById(@PathVariable UUID id) { + voucherService.deleteById(id); + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/org/prgrms/kdt/voucher/controller/VoucherController.java b/src/main/java/org/prgrms/kdt/voucher/controller/VoucherController.java index 3f80b98794..9001655bb3 100644 --- a/src/main/java/org/prgrms/kdt/voucher/controller/VoucherController.java +++ b/src/main/java/org/prgrms/kdt/voucher/controller/VoucherController.java @@ -1,23 +1,26 @@ package org.prgrms.kdt.voucher.controller; -import org.prgrms.kdt.voucher.dto.CreateVoucherRequest; -import org.prgrms.kdt.voucher.dto.VoucherResponses; +import org.prgrms.kdt.voucher.controller.dto.CreateVoucherApiRequest; +import org.prgrms.kdt.voucher.controller.mapper.ControllerVoucherMapper; +import org.prgrms.kdt.voucher.service.dto.VoucherResponses; import org.prgrms.kdt.voucher.service.VoucherService; import org.springframework.stereotype.Component; @Component public class VoucherController { private final VoucherService voucherService; + private final ControllerVoucherMapper mapper; - public VoucherController(VoucherService voucherService) { + public VoucherController(VoucherService voucherService, ControllerVoucherMapper mapper) { this.voucherService = voucherService; + this.mapper = mapper; } - public void create(CreateVoucherRequest request) { - voucherService.createVoucher(request); + public void create(CreateVoucherApiRequest request) { + voucherService.createVoucher(mapper.convertRequest(request)); } public VoucherResponses findAll() { - return voucherService.findAll(); + return voucherService.findAll(null); } } diff --git a/src/main/java/org/prgrms/kdt/voucher/controller/VoucherViewController.java b/src/main/java/org/prgrms/kdt/voucher/controller/VoucherViewController.java index ae1da5ffa5..a4a34e80ad 100644 --- a/src/main/java/org/prgrms/kdt/voucher/controller/VoucherViewController.java +++ b/src/main/java/org/prgrms/kdt/voucher/controller/VoucherViewController.java @@ -1,32 +1,57 @@ package org.prgrms.kdt.voucher.controller; -import org.prgrms.kdt.voucher.dto.CreateVoucherRequest; -import org.prgrms.kdt.voucher.dto.VoucherResponses; +import org.prgrms.kdt.voucher.controller.dto.CreateVoucherApiRequest; +import org.prgrms.kdt.voucher.controller.dto.SearchApiRequest; +import org.prgrms.kdt.voucher.controller.mapper.ControllerVoucherMapper; +import org.prgrms.kdt.voucher.service.dto.VoucherDetailResponse; +import org.prgrms.kdt.voucher.service.dto.VoucherResponses; import org.prgrms.kdt.voucher.service.VoucherService; +import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.*; -@RequestMapping("/voucher") +import java.util.UUID; + +@Controller +@RequestMapping("/view/vouchers") public class VoucherViewController { private final VoucherService voucherService; + private final ControllerVoucherMapper mapper; - public VoucherViewController(VoucherService voucherService) { + public VoucherViewController(VoucherService voucherService, ControllerVoucherMapper mapper) { this.voucherService = voucherService; + this.mapper = mapper; + } + + @GetMapping("/new") + public String create() { + return "voucher/voucher_create"; } - @PostMapping - public String create(@RequestBody CreateVoucherRequest request) { - voucherService.createVoucher(request); - return "redirect:/voucher"; + @PostMapping("/new") + public String create(CreateVoucherApiRequest request) { + voucherService.createVoucher(mapper.convertRequest(request)); + return "redirect:/view/vouchers"; + } + + @GetMapping("/{id}") + public String findById(@PathVariable UUID id, Model model) { + VoucherDetailResponse response = voucherService.findById(id); + model.addAttribute("voucher", response); + return "voucher/voucher_detail"; } @GetMapping public String findAll(Model model) { - VoucherResponses response = voucherService.findAll(); + SearchApiRequest request = new SearchApiRequest(1, 100, null); + VoucherResponses response = voucherService.findAll(mapper.convertRequest(request)); model.addAttribute("vouchers", response); return "voucher/vouchers"; } + + @PostMapping("/delete/{id}") + public String deleteById(@PathVariable UUID id) { + voucherService.deleteById(id); + return "redirect:/view/vouchers"; + } } diff --git a/src/main/java/org/prgrms/kdt/voucher/controller/dto/CreateVoucherApiRequest.java b/src/main/java/org/prgrms/kdt/voucher/controller/dto/CreateVoucherApiRequest.java new file mode 100644 index 0000000000..b339452748 --- /dev/null +++ b/src/main/java/org/prgrms/kdt/voucher/controller/dto/CreateVoucherApiRequest.java @@ -0,0 +1,9 @@ +package org.prgrms.kdt.voucher.controller.dto; + +import org.prgrms.kdt.voucher.domain.VoucherType; + +import javax.validation.constraints.NotNull; + +public record CreateVoucherApiRequest(@NotNull VoucherType voucherType, + @NotNull double discountAmount) { +} \ No newline at end of file diff --git a/src/main/java/org/prgrms/kdt/voucher/controller/dto/SearchApiRequest.java b/src/main/java/org/prgrms/kdt/voucher/controller/dto/SearchApiRequest.java new file mode 100644 index 0000000000..602c9f652e --- /dev/null +++ b/src/main/java/org/prgrms/kdt/voucher/controller/dto/SearchApiRequest.java @@ -0,0 +1,37 @@ +package org.prgrms.kdt.voucher.controller.dto; + +import org.prgrms.kdt.voucher.domain.VoucherType; + +import javax.validation.constraints.Min; + +public class SearchApiRequest { + @Min(1) + private final long page; + @Min(0) + private final long recordSize; + private final long offset; + private final VoucherType voucherType; + + public SearchApiRequest(long page, long recordSize, VoucherType voucherType) { + this.page = page; + this.recordSize = recordSize; + this.offset = (page - 1) * recordSize; + this.voucherType = voucherType; + } + + public long getPage() { + return page; + } + + public long getRecordSize() { + return recordSize; + } + + public long getOffset() { + return offset; + } + + public VoucherType getVoucherType() { + return voucherType; + } +} diff --git a/src/main/java/org/prgrms/kdt/voucher/controller/mapper/ControllerVoucherMapper.java b/src/main/java/org/prgrms/kdt/voucher/controller/mapper/ControllerVoucherMapper.java new file mode 100644 index 0000000000..4eedd19563 --- /dev/null +++ b/src/main/java/org/prgrms/kdt/voucher/controller/mapper/ControllerVoucherMapper.java @@ -0,0 +1,13 @@ +package org.prgrms.kdt.voucher.controller.mapper; + +import org.mapstruct.Mapper; +import org.prgrms.kdt.voucher.controller.dto.CreateVoucherApiRequest; +import org.prgrms.kdt.voucher.controller.dto.SearchApiRequest; +import org.prgrms.kdt.voucher.service.dto.CreateVoucherRequest; +import org.prgrms.kdt.voucher.service.dto.SearchRequest; + +@Mapper(componentModel = "spring") +public interface ControllerVoucherMapper { + CreateVoucherRequest convertRequest(CreateVoucherApiRequest createVoucherApiRequest); + SearchRequest convertRequest(SearchApiRequest searchApiRequest); +} diff --git a/src/main/java/org/prgrms/kdt/voucher/dao/FileVoucherRepository.java b/src/main/java/org/prgrms/kdt/voucher/dao/FileVoucherRepository.java deleted file mode 100644 index 77d69144e5..0000000000 --- a/src/main/java/org/prgrms/kdt/voucher/dao/FileVoucherRepository.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.prgrms.kdt.voucher.dao; - -import org.prgrms.kdt.voucher.domain.Voucher; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Component; - -import javax.annotation.PreDestroy; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; - - -@Profile("file") -@Component -public class FileVoucherRepository implements VoucherRepository { - private final Map storage; - private final VoucherLoader voucherLoader; - - public FileVoucherRepository(VoucherLoader voucherLoader) { - this.voucherLoader = voucherLoader; - this.storage = this.voucherLoader.loadFileToMemoryVoucher(); - } - - @Override - public Optional findById(UUID voucherId) { - return Optional.ofNullable(storage.get(voucherId)); - } - - @Override - public Voucher insert(Voucher voucher) { - storage.put(voucher.getVoucherId(), voucher); - return voucher; - } - - @Override - public List findAll() { - return List.copyOf(storage.values()); - } - - @PreDestroy - public void fileWrite() { - voucherLoader.saveMemoryVoucherToFile(storage); - } -} diff --git a/src/main/java/org/prgrms/kdt/voucher/dao/JdbcVoucherRepository.java b/src/main/java/org/prgrms/kdt/voucher/dao/JdbcVoucherRepository.java index deff41022d..14701522f0 100644 --- a/src/main/java/org/prgrms/kdt/voucher/dao/JdbcVoucherRepository.java +++ b/src/main/java/org/prgrms/kdt/voucher/dao/JdbcVoucherRepository.java @@ -1,40 +1,42 @@ package org.prgrms.kdt.voucher.dao; -import org.prgrms.kdt.exception.NotUpdateException; +import org.prgrms.kdt.global.exception.NotUpdateException; import org.prgrms.kdt.voucher.domain.DiscountPolicy; import org.prgrms.kdt.voucher.domain.Voucher; import org.prgrms.kdt.voucher.domain.VoucherType; -import org.springframework.context.annotation.Profile; +import org.prgrms.kdt.voucher.service.dto.SearchRequest; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; -import javax.sql.DataSource; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; -@Profile({"default", "test"}) @Repository public class JdbcVoucherRepository implements VoucherRepository { private final RowMapper voucherRowMapper = (resultSet, i) -> { UUID voucherId = UUID.fromString(resultSet.getString("id")); VoucherType voucherType = VoucherType.getTypeByStr(resultSet.getString("type")); DiscountPolicy discountPolicy = voucherType.createPolicy(resultSet.getDouble("amount")); - return new Voucher(voucherId, voucherType, discountPolicy); + LocalDateTime createdAt = resultSet.getTimestamp("created_at").toLocalDateTime(); + return new Voucher(voucherId, voucherType, discountPolicy, createdAt); }; private final JdbcTemplate jdbcTemplate; - public JdbcVoucherRepository(DataSource dataSource) { - this.jdbcTemplate = new JdbcTemplate(dataSource); + public JdbcVoucherRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; } @Override public Optional findById(UUID voucherId) { - String sql = "select id, type, amount from voucher WHERE id = ?"; + String sql = "select id, type, amount, created_at from voucher WHERE id = ?"; try { return Optional.ofNullable(jdbcTemplate.queryForObject(sql, voucherRowMapper, @@ -46,11 +48,12 @@ public Optional findById(UUID voucherId) { @Override public Voucher insert(Voucher voucher) { - String sql = "INSERT INTO voucher(id, type, amount) VALUES (?, ?, ?)"; + String sql = "INSERT INTO voucher(id, type, amount, created_at) VALUES (?, ?, ?, ?)"; int update = jdbcTemplate.update(sql, voucher.getVoucherId().toString(), voucher.getVoucherType().getDescripton(), - voucher.getDiscountPolicy().getAmount()); + voucher.getDiscountPolicy().getAmount(), + Timestamp.valueOf(voucher.getCreatedAt())); if (update != 1) { throw new NotUpdateException("insert가 제대로 이루어지지 않았습니다."); } @@ -58,7 +61,34 @@ public Voucher insert(Voucher voucher) { } @Override - public List findAll() { - return jdbcTemplate.query("select id, type, amount from voucher", voucherRowMapper); + public List findAll(SearchRequest searchRequest) { + StringBuilder query = new StringBuilder("SELECT id, type, amount, created_at FROM voucher WHERE 1 = 1"); + ArrayList queryArgs = new ArrayList<>(); + + VoucherType voucherType = searchRequest.getVoucherType(); + if (voucherType != null){ + query.append(" AND type = ?"); + queryArgs.add(String.valueOf(voucherType.getDescripton())); + } + + query.append(" LIMIT ?, ?"); + queryArgs.add(searchRequest.getOffset()); + queryArgs.add(searchRequest.getRecordSize()); + return jdbcTemplate.query(query.toString(), voucherRowMapper, queryArgs.toArray()); + } + + @Override + public void deleteById(UUID id) { + String sql = "delete from voucher where id = ?"; + int update = jdbcTemplate.update(sql, id.toString()); + if (update != 1) { + throw new NotUpdateException("delete가 제대로 이루어지지 않았습니다."); + } + } + + @Override + public List findByType(VoucherType type) { + String sql = "SELECT id, type, amount, created_at FROM voucher WHERE type = ? "; + return jdbcTemplate.query(sql, voucherRowMapper, type.getDescripton()); } } diff --git a/src/main/java/org/prgrms/kdt/voucher/dao/MemoryVoucherRepository.java b/src/main/java/org/prgrms/kdt/voucher/dao/MemoryVoucherRepository.java index b24c0ee239..cff66dc36a 100644 --- a/src/main/java/org/prgrms/kdt/voucher/dao/MemoryVoucherRepository.java +++ b/src/main/java/org/prgrms/kdt/voucher/dao/MemoryVoucherRepository.java @@ -1,6 +1,8 @@ package org.prgrms.kdt.voucher.dao; import org.prgrms.kdt.voucher.domain.Voucher; +import org.prgrms.kdt.voucher.domain.VoucherType; +import org.prgrms.kdt.voucher.service.dto.SearchRequest; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @@ -9,6 +11,7 @@ import java.util.Optional; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; @Profile("dev") @Component @@ -27,7 +30,19 @@ public Voucher insert(Voucher voucher) { } @Override - public List findAll() { - return List.copyOf(storage.values()); + public List findAll(SearchRequest searchRequest) { + throw new RuntimeException("지원이 중지된 기능입니다."); + } + + @Override + public void deleteById(UUID id) { + storage.remove(id); + } + + @Override + public List findByType(VoucherType type) { + return storage.values().stream() + .filter(e -> e.getVoucherType() == type) + .collect(Collectors.toList()); } } diff --git a/src/main/java/org/prgrms/kdt/voucher/dao/VoucherLoader.java b/src/main/java/org/prgrms/kdt/voucher/dao/VoucherLoader.java deleted file mode 100644 index 71157483ad..0000000000 --- a/src/main/java/org/prgrms/kdt/voucher/dao/VoucherLoader.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.prgrms.kdt.voucher.dao; - -import org.prgrms.kdt.exception.FileAccessException; -import org.prgrms.kdt.util.Converter; -import org.prgrms.kdt.voucher.domain.Voucher; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -@Component -public class VoucherLoader { - private final String filePath; - - public VoucherLoader(@Value("${filePath.voucher}") String filePath) { - this.filePath = filePath; - } - - public Map loadFileToMemoryVoucher() { - Map vouchers = new ConcurrentHashMap<>(); - try { - BufferedReader reader = new BufferedReader(new FileReader(filePath)); - String line = ""; - - while ((line = reader.readLine()) != null) { - UUID curId = UUID.fromString(Converter.stringToArray(line, ",")[0]); - vouchers.put(curId, Converter.stringToVoucher(line)); - } - return vouchers; - } catch (IOException e) { - throw new FileAccessException("파일에 접근하다 문제가 생겼습니다.", e); - } - } - - public void saveMemoryVoucherToFile(Map memoryStorage) { - try (FileWriter writer = new FileWriter(filePath, false)) { - for (Map.Entry entry : memoryStorage.entrySet()) { - writer.append(Converter.voucherToString(entry.getValue()) + "\n"); - } - } catch (IOException e) { - throw new FileAccessException("파일에 접근하다 문제가 생겼습니다.", e); - } - } -} \ No newline at end of file diff --git a/src/main/java/org/prgrms/kdt/voucher/dao/VoucherRepository.java b/src/main/java/org/prgrms/kdt/voucher/dao/VoucherRepository.java index d799ca8075..c38dc27ec8 100644 --- a/src/main/java/org/prgrms/kdt/voucher/dao/VoucherRepository.java +++ b/src/main/java/org/prgrms/kdt/voucher/dao/VoucherRepository.java @@ -1,6 +1,8 @@ package org.prgrms.kdt.voucher.dao; import org.prgrms.kdt.voucher.domain.Voucher; +import org.prgrms.kdt.voucher.domain.VoucherType; +import org.prgrms.kdt.voucher.service.dto.SearchRequest; import java.util.List; import java.util.Optional; @@ -11,5 +13,9 @@ public interface VoucherRepository { Voucher insert(Voucher voucher); - List findAll(); + List findAll(SearchRequest searchRequest); + + void deleteById(UUID id); + + List findByType(VoucherType type); } diff --git a/src/main/java/org/prgrms/kdt/voucher/domain/FixedDiscountPolicy.java b/src/main/java/org/prgrms/kdt/voucher/domain/FixedDiscountPolicy.java index 031fb5f115..bb066aba94 100644 --- a/src/main/java/org/prgrms/kdt/voucher/domain/FixedDiscountPolicy.java +++ b/src/main/java/org/prgrms/kdt/voucher/domain/FixedDiscountPolicy.java @@ -11,7 +11,7 @@ public FixedDiscountPolicy(double amount) { } private void validate(double amount) { - if (amount < MIN_AMOUNT) throw new InvalidDiscountException("올바르지 않은 할인 금액입니다."); + if (amount <= MIN_AMOUNT) throw new InvalidDiscountException("올바르지 않은 할인 금액입니다."); } @Override diff --git a/src/main/java/org/prgrms/kdt/voucher/domain/PercentDiscountPolicy.java b/src/main/java/org/prgrms/kdt/voucher/domain/PercentDiscountPolicy.java index a88343b924..b1b3b43727 100644 --- a/src/main/java/org/prgrms/kdt/voucher/domain/PercentDiscountPolicy.java +++ b/src/main/java/org/prgrms/kdt/voucher/domain/PercentDiscountPolicy.java @@ -12,7 +12,7 @@ public PercentDiscountPolicy(double amount) { } private void validate(double amount) { - if (MAX_AMOUNT < amount || amount < MIN_AMOUNT) throw new InvalidDiscountException("올바르지 않은 할인 퍼센트입니다."); + if (MAX_AMOUNT < amount || amount <= MIN_AMOUNT) throw new InvalidDiscountException("올바르지 않은 할인 퍼센트입니다."); } @Override diff --git a/src/main/java/org/prgrms/kdt/voucher/domain/Voucher.java b/src/main/java/org/prgrms/kdt/voucher/domain/Voucher.java index 8c42e67dc4..7c3c5a100f 100644 --- a/src/main/java/org/prgrms/kdt/voucher/domain/Voucher.java +++ b/src/main/java/org/prgrms/kdt/voucher/domain/Voucher.java @@ -1,22 +1,19 @@ package org.prgrms.kdt.voucher.domain; +import java.time.LocalDateTime; import java.util.UUID; public class Voucher { private final UUID voucherId; private final VoucherType voucherType; private final DiscountPolicy discountPolicy; + private final LocalDateTime createdAt; - public Voucher(VoucherType voucherType, DiscountPolicy discountPolicy) { - this.voucherId = UUID.randomUUID(); - this.voucherType = voucherType; - this.discountPolicy = discountPolicy; - } - - public Voucher(UUID voucherId, VoucherType voucherType, DiscountPolicy discountPolicy) { + public Voucher(UUID voucherId, VoucherType voucherType, DiscountPolicy discountPolicy, LocalDateTime createdAt) { this.voucherId = voucherId; this.voucherType = voucherType; this.discountPolicy = discountPolicy; + this.createdAt = createdAt; } public UUID getVoucherId() { @@ -31,6 +28,10 @@ public DiscountPolicy getDiscountPolicy() { return discountPolicy; } + public LocalDateTime getCreatedAt() { + return createdAt; + } + public double discount(double originPrice) { return discountPolicy.applyDiscount(originPrice); } diff --git a/src/main/java/org/prgrms/kdt/voucher/domain/VoucherType.java b/src/main/java/org/prgrms/kdt/voucher/domain/VoucherType.java index 774abe248f..ae009477bb 100644 --- a/src/main/java/org/prgrms/kdt/voucher/domain/VoucherType.java +++ b/src/main/java/org/prgrms/kdt/voucher/domain/VoucherType.java @@ -1,6 +1,6 @@ package org.prgrms.kdt.voucher.domain; -import org.prgrms.kdt.exception.InvalidInputException; +import org.prgrms.kdt.global.exception.InvalidInputException; import java.util.Arrays; import java.util.Objects; diff --git a/src/main/java/org/prgrms/kdt/voucher/service/VoucherService.java b/src/main/java/org/prgrms/kdt/voucher/service/VoucherService.java index 23af375c33..0d30e76f92 100644 --- a/src/main/java/org/prgrms/kdt/voucher/service/VoucherService.java +++ b/src/main/java/org/prgrms/kdt/voucher/service/VoucherService.java @@ -1,30 +1,47 @@ package org.prgrms.kdt.voucher.service; +import org.prgrms.kdt.global.exception.EntityNotFoundException; import org.prgrms.kdt.voucher.domain.Voucher; import org.prgrms.kdt.voucher.dao.VoucherRepository; import org.prgrms.kdt.voucher.domain.VoucherType; -import org.prgrms.kdt.voucher.dto.CreateVoucherRequest; -import org.prgrms.kdt.voucher.dto.VoucherResponse; -import org.prgrms.kdt.voucher.dto.VoucherResponses; +import org.prgrms.kdt.voucher.service.dto.*; +import org.prgrms.kdt.voucher.service.mapper.ServiceVoucherMapper; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.UUID; + +@Transactional(readOnly = true) @Service public class VoucherService { private final VoucherRepository voucherRepository; + private final ServiceVoucherMapper mapper; - public VoucherService(VoucherRepository voucherRepository) { + public VoucherService(VoucherRepository voucherRepository, ServiceVoucherMapper mapper) { this.voucherRepository = voucherRepository; + this.mapper = mapper; } + @Transactional public VoucherResponse createVoucher(CreateVoucherRequest request) { - VoucherType voucherType = request.voucherType(); - double discountAmount = request.discountAmount(); - - Voucher voucher = voucherRepository.insert(new Voucher(voucherType, voucherType.createPolicy(discountAmount))); + Voucher voucher = voucherRepository.insert(mapper.convertVoucher(request)); return new VoucherResponse(voucher); } - public VoucherResponses findAll() { - return VoucherResponses.of(voucherRepository.findAll()); + public VoucherResponses findAll(SearchRequest request) { + return VoucherResponses.of(voucherRepository.findAll(request)); + } + + public VoucherDetailResponse findById(UUID id) { + return new VoucherDetailResponse(voucherRepository.findById(id).orElseThrow(EntityNotFoundException::new)); + } + + @Transactional + public void deleteById(UUID id) { + voucherRepository.deleteById(id); + } + + public VoucherResponses findByType(VoucherType type) { + return VoucherResponses.of(voucherRepository.findByType(type)); } } diff --git a/src/main/java/org/prgrms/kdt/voucher/dto/CreateVoucherRequest.java b/src/main/java/org/prgrms/kdt/voucher/service/dto/CreateVoucherRequest.java similarity index 74% rename from src/main/java/org/prgrms/kdt/voucher/dto/CreateVoucherRequest.java rename to src/main/java/org/prgrms/kdt/voucher/service/dto/CreateVoucherRequest.java index 008e51d78a..2e5f12b21b 100644 --- a/src/main/java/org/prgrms/kdt/voucher/dto/CreateVoucherRequest.java +++ b/src/main/java/org/prgrms/kdt/voucher/service/dto/CreateVoucherRequest.java @@ -1,6 +1,6 @@ -package org.prgrms.kdt.voucher.dto; +package org.prgrms.kdt.voucher.service.dto; import org.prgrms.kdt.voucher.domain.VoucherType; public record CreateVoucherRequest(VoucherType voucherType, double discountAmount) { -} \ No newline at end of file +} diff --git a/src/main/java/org/prgrms/kdt/voucher/service/dto/SearchRequest.java b/src/main/java/org/prgrms/kdt/voucher/service/dto/SearchRequest.java new file mode 100644 index 0000000000..d8379e1046 --- /dev/null +++ b/src/main/java/org/prgrms/kdt/voucher/service/dto/SearchRequest.java @@ -0,0 +1,33 @@ +package org.prgrms.kdt.voucher.service.dto; + +import org.prgrms.kdt.voucher.domain.VoucherType; + +public class SearchRequest { + private final long page; + private final long recordSize; + private final long offset; + private final VoucherType voucherType; + + public SearchRequest(long page, long recordSize, VoucherType voucherType) { + this.page = page; + this.recordSize = recordSize; + this.offset = (page - 1) * recordSize; + this.voucherType = voucherType; + } + + public long getPage() { + return page; + } + + public long getRecordSize() { + return recordSize; + } + + public long getOffset() { + return offset; + } + + public VoucherType getVoucherType() { + return voucherType; + } +} \ No newline at end of file diff --git a/src/main/java/org/prgrms/kdt/voucher/service/dto/VoucherDetailResponse.java b/src/main/java/org/prgrms/kdt/voucher/service/dto/VoucherDetailResponse.java new file mode 100644 index 0000000000..d82bd8a33f --- /dev/null +++ b/src/main/java/org/prgrms/kdt/voucher/service/dto/VoucherDetailResponse.java @@ -0,0 +1,12 @@ +package org.prgrms.kdt.voucher.service.dto; + +import org.prgrms.kdt.voucher.domain.Voucher; + +import java.time.LocalDateTime; +import java.util.UUID; + +public record VoucherDetailResponse(UUID voucherId, String voucherType, double amount, LocalDateTime createdAt) { + public VoucherDetailResponse(Voucher voucher) { + this(voucher.getVoucherId(), voucher.getVoucherType().getDescripton(), voucher.getDiscountPolicy().getAmount(), voucher.getCreatedAt()); + } +} diff --git a/src/main/java/org/prgrms/kdt/voucher/dto/VoucherResponse.java b/src/main/java/org/prgrms/kdt/voucher/service/dto/VoucherResponse.java similarity index 88% rename from src/main/java/org/prgrms/kdt/voucher/dto/VoucherResponse.java rename to src/main/java/org/prgrms/kdt/voucher/service/dto/VoucherResponse.java index da90e48fc4..581e1d9f29 100644 --- a/src/main/java/org/prgrms/kdt/voucher/dto/VoucherResponse.java +++ b/src/main/java/org/prgrms/kdt/voucher/service/dto/VoucherResponse.java @@ -1,4 +1,4 @@ -package org.prgrms.kdt.voucher.dto; +package org.prgrms.kdt.voucher.service.dto; import org.prgrms.kdt.voucher.domain.Voucher; diff --git a/src/main/java/org/prgrms/kdt/voucher/dto/VoucherResponses.java b/src/main/java/org/prgrms/kdt/voucher/service/dto/VoucherResponses.java similarity index 92% rename from src/main/java/org/prgrms/kdt/voucher/dto/VoucherResponses.java rename to src/main/java/org/prgrms/kdt/voucher/service/dto/VoucherResponses.java index 1c13d985b3..9991b94878 100644 --- a/src/main/java/org/prgrms/kdt/voucher/dto/VoucherResponses.java +++ b/src/main/java/org/prgrms/kdt/voucher/service/dto/VoucherResponses.java @@ -1,4 +1,4 @@ -package org.prgrms.kdt.voucher.dto; +package org.prgrms.kdt.voucher.service.dto; import org.prgrms.kdt.voucher.domain.Voucher; diff --git a/src/main/java/org/prgrms/kdt/voucher/service/mapper/ServiceVoucherMapper.java b/src/main/java/org/prgrms/kdt/voucher/service/mapper/ServiceVoucherMapper.java new file mode 100644 index 0000000000..0ee06af5f8 --- /dev/null +++ b/src/main/java/org/prgrms/kdt/voucher/service/mapper/ServiceVoucherMapper.java @@ -0,0 +1,25 @@ +package org.prgrms.kdt.voucher.service.mapper; + +import org.prgrms.kdt.global.Generator; +import org.prgrms.kdt.voucher.domain.Voucher; +import org.prgrms.kdt.voucher.domain.VoucherType; +import org.prgrms.kdt.voucher.service.dto.CreateVoucherRequest; +import org.springframework.stereotype.Component; + + +@Component +public class ServiceVoucherMapper { + private final Generator generator; + + public ServiceVoucherMapper(Generator generator) { + this.generator = generator; + } + + public Voucher convertVoucher(CreateVoucherRequest request){ + VoucherType voucherType = request.voucherType(); + return new Voucher(generator.generateId(), + voucherType, + voucherType.createPolicy(request.discountAmount()), + generator.generateTime()); + } +} diff --git a/src/main/java/org/prgrms/kdt/wallet/controller/WalletController.java b/src/main/java/org/prgrms/kdt/wallet/controller/WalletController.java index 5aa4aebb09..d847220f5b 100644 --- a/src/main/java/org/prgrms/kdt/wallet/controller/WalletController.java +++ b/src/main/java/org/prgrms/kdt/wallet/controller/WalletController.java @@ -1,7 +1,8 @@ package org.prgrms.kdt.wallet.controller; -import org.prgrms.kdt.wallet.dto.request.CreateWalletRequest; -import org.prgrms.kdt.wallet.dto.response.JoinedWalletResponses; +import org.prgrms.kdt.wallet.controller.dto.CreateWalletApiRequest; +import org.prgrms.kdt.wallet.controller.mapper.ControllerWalletMapper; +import org.prgrms.kdt.wallet.service.dto.JoinedWalletResponses; import org.prgrms.kdt.wallet.service.WalletService; import org.springframework.stereotype.Component; @@ -10,13 +11,15 @@ @Component public class WalletController { private final WalletService walletService; + private final ControllerWalletMapper mapper; - public WalletController(WalletService walletService) { + public WalletController(WalletService walletService, ControllerWalletMapper mapper) { this.walletService = walletService; + this.mapper = mapper; } - public void createWallet(CreateWalletRequest request) { - walletService.assignVoucherToCustomer(request); + public void createWallet(CreateWalletApiRequest request) { + walletService.assignVoucherToCustomer(mapper.convertRequest(request)); } public JoinedWalletResponses findVouchersByMemberId(UUID memberId) { diff --git a/src/main/java/org/prgrms/kdt/wallet/controller/dto/CreateWalletApiRequest.java b/src/main/java/org/prgrms/kdt/wallet/controller/dto/CreateWalletApiRequest.java new file mode 100644 index 0000000000..9771763505 --- /dev/null +++ b/src/main/java/org/prgrms/kdt/wallet/controller/dto/CreateWalletApiRequest.java @@ -0,0 +1,6 @@ +package org.prgrms.kdt.wallet.controller.dto; + +import java.util.UUID; + +public record CreateWalletApiRequest(UUID memberId, UUID voucherId) { +} diff --git a/src/main/java/org/prgrms/kdt/wallet/controller/mapper/ControllerWalletMapper.java b/src/main/java/org/prgrms/kdt/wallet/controller/mapper/ControllerWalletMapper.java new file mode 100644 index 0000000000..3d5b3bb1f4 --- /dev/null +++ b/src/main/java/org/prgrms/kdt/wallet/controller/mapper/ControllerWalletMapper.java @@ -0,0 +1,10 @@ +package org.prgrms.kdt.wallet.controller.mapper; + +import org.mapstruct.Mapper; +import org.prgrms.kdt.wallet.controller.dto.CreateWalletApiRequest; +import org.prgrms.kdt.wallet.service.dto.CreateWalletRequest; + +@Mapper(componentModel = "spring") +public interface ControllerWalletMapper { + CreateWalletRequest convertRequest(CreateWalletApiRequest request); +} diff --git a/src/main/java/org/prgrms/kdt/wallet/dao/JdbcWalletCommandRepository.java b/src/main/java/org/prgrms/kdt/wallet/dao/JdbcWalletCommandRepository.java new file mode 100644 index 0000000000..ddeb7ee7e5 --- /dev/null +++ b/src/main/java/org/prgrms/kdt/wallet/dao/JdbcWalletCommandRepository.java @@ -0,0 +1,36 @@ +package org.prgrms.kdt.wallet.dao; + +import org.prgrms.kdt.global.exception.NotUpdateException; +import org.prgrms.kdt.wallet.domain.Wallet; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +public class JdbcWalletCommandRepository implements WalletCommandRepository { + private final JdbcTemplate jdbcTemplate; + + public JdbcWalletCommandRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public Wallet insert(Wallet wallet) { + String sql = "INSERT INTO wallet(id, member_id, voucher_id) VALUES (?, ?, ?)"; + int update = jdbcTemplate.update(sql, wallet.getWalletId().toString(), + wallet.getMemberId().toString(), + wallet.getVoucherId().toString()); + if (update != 1) { + throw new NotUpdateException("db에 insert가 수행되지 못했습니다."); + } + return wallet; + } + + @Override + public void deleteById(UUID walletId) { + String sql = "DELETE FROM wallet WHERE id = ?"; + int update = jdbcTemplate.update(sql, walletId.toString()); + if (update != 1) throw new NotUpdateException("db에 delete가 수행되지 못했습니다."); + } +} diff --git a/src/main/java/org/prgrms/kdt/wallet/dao/JdbcWalletRepository.java b/src/main/java/org/prgrms/kdt/wallet/dao/JdbcWalletQueryRepository.java similarity index 52% rename from src/main/java/org/prgrms/kdt/wallet/dao/JdbcWalletRepository.java rename to src/main/java/org/prgrms/kdt/wallet/dao/JdbcWalletQueryRepository.java index 12494d1e25..9c46ea1410 100644 --- a/src/main/java/org/prgrms/kdt/wallet/dao/JdbcWalletRepository.java +++ b/src/main/java/org/prgrms/kdt/wallet/dao/JdbcWalletQueryRepository.java @@ -1,24 +1,22 @@ package org.prgrms.kdt.wallet.dao; -import org.prgrms.kdt.exception.NotUpdateException; import org.prgrms.kdt.member.domain.Member; import org.prgrms.kdt.member.domain.MemberStatus; import org.prgrms.kdt.voucher.domain.DiscountPolicy; import org.prgrms.kdt.voucher.domain.Voucher; import org.prgrms.kdt.voucher.domain.VoucherType; -import org.prgrms.kdt.wallet.domain.JoinedWallet; -import org.prgrms.kdt.wallet.domain.Wallet; +import org.prgrms.kdt.wallet.domain.QueryWallet; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; -import javax.sql.DataSource; +import java.time.LocalDateTime; import java.util.List; import java.util.UUID; @Repository -public class JdbcWalletRepository implements WalletRepository { - private static final RowMapper joinedWalletRowMapper = (resultSet, i) -> { +public class JdbcWalletQueryRepository implements WalletQueryRepository { + private static final RowMapper QueryWalletRowMapper = (resultSet, i) -> { UUID walletId = UUID.fromString(resultSet.getString("W.id")); UUID memberId = UUID.fromString(resultSet.getString("W.member_id")); @@ -28,59 +26,42 @@ public class JdbcWalletRepository implements WalletRepository { UUID voucherId = UUID.fromString(resultSet.getString("W.voucher_id")); VoucherType voucherType = VoucherType.getTypeByStr(resultSet.getString("V.type")); DiscountPolicy discountPolicy = voucherType.createPolicy(resultSet.getDouble("V.amount")); + LocalDateTime createdAt = resultSet.getTimestamp("V.created_at").toLocalDateTime(); Member member = new Member(memberId, memberName, memberStatus); - Voucher voucher = new Voucher(voucherId, voucherType, discountPolicy); - return new JoinedWallet(walletId, member, voucher); + Voucher voucher = new Voucher(voucherId, voucherType, discountPolicy, createdAt); + return new QueryWallet(walletId, member, voucher); }; private final JdbcTemplate jdbcTemplate; - public JdbcWalletRepository(DataSource dataSource) { - this.jdbcTemplate = new JdbcTemplate(dataSource); + public JdbcWalletQueryRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; } @Override - public Wallet insert(Wallet wallet) { - String sql = "INSERT INTO wallet(id, member_id, voucher_id) VALUES (?, ?, ?)"; - int update = jdbcTemplate.update(sql, wallet.getWalletId().toString(), - wallet.getMemberId().toString(), - wallet.getVoucherId().toString()); - if (update != 1) { - throw new NotUpdateException("db에 insert가 수행되지 못했습니다."); - } - return wallet; - } - - @Override - public List findWithMemeberAndVoucherByMemberId(UUID memberId) { - String sql = "select W.id, W.member_id, M.name, M.status, W.voucher_id, V.type, V.amount from wallet W " + + public List findWithMemeberAndVoucherByMemberId(UUID memberId) { + String sql = "select W.id, W.member_id, M.name, M.status, W.voucher_id, V.type, V.amount, V.created_at from wallet W " + "INNER JOIN member M ON W.member_id = M.id " + "INNER JOIN voucher V ON W.voucher_id = V.id " + "WHERE W.member_id = ?"; - return jdbcTemplate.query(sql, joinedWalletRowMapper, memberId.toString()); + return jdbcTemplate.query(sql, QueryWalletRowMapper, memberId.toString()); } @Override - public List findWithMemeberAndVoucherByVoucherId(UUID voucherId) { - String sql = "select W.id, W.member_id, M.name, M.status, W.voucher_id, V.type, V.amount from wallet W " + + public List findWithMemeberAndVoucherByVoucherId(UUID voucherId) { + String sql = "select W.id, W.member_id, M.name, M.status, W.voucher_id, V.type, V.amount, V.created_at from wallet W " + "INNER JOIN member M ON W.member_id = M.id " + "INNER JOIN voucher V ON W.voucher_id = V.id " + "WHERE W.voucher_id = ?"; - return jdbcTemplate.query(sql, joinedWalletRowMapper, voucherId.toString()); - } - - @Override - public void deleteById(UUID walletId) { - String sql = "DELETE FROM wallet WHERE id = ?"; - jdbcTemplate.update(sql, walletId.toString()); + return jdbcTemplate.query(sql, QueryWalletRowMapper, voucherId.toString()); } @Override - public List findWithMemeberAndVoucherAll() { - String sql = "select W.id, W.member_id, M.name, M.status, W.voucher_id, V.type, V.amount from wallet W " + + public List findWithMemeberAndVoucherAll() { + String sql = "select W.id, W.member_id, M.name, M.status, W.voucher_id, V.type, V.amount, V.created_at from wallet W " + "INNER JOIN member M ON W.member_id = M.id " + "INNER JOIN voucher V ON W.voucher_id = V.id"; - return jdbcTemplate.query(sql, joinedWalletRowMapper); + return jdbcTemplate.query(sql, QueryWalletRowMapper); } } \ No newline at end of file diff --git a/src/main/java/org/prgrms/kdt/wallet/dao/WalletCommandRepository.java b/src/main/java/org/prgrms/kdt/wallet/dao/WalletCommandRepository.java new file mode 100644 index 0000000000..56d8940dfe --- /dev/null +++ b/src/main/java/org/prgrms/kdt/wallet/dao/WalletCommandRepository.java @@ -0,0 +1,11 @@ +package org.prgrms.kdt.wallet.dao; + +import org.prgrms.kdt.wallet.domain.Wallet; + +import java.util.UUID; + +public interface WalletCommandRepository { + Wallet insert(Wallet wallet); + + void deleteById(UUID walletId); +} diff --git a/src/main/java/org/prgrms/kdt/wallet/dao/WalletQueryRepository.java b/src/main/java/org/prgrms/kdt/wallet/dao/WalletQueryRepository.java new file mode 100644 index 0000000000..a74852b0aa --- /dev/null +++ b/src/main/java/org/prgrms/kdt/wallet/dao/WalletQueryRepository.java @@ -0,0 +1,14 @@ +package org.prgrms.kdt.wallet.dao; + +import org.prgrms.kdt.wallet.domain.QueryWallet; + +import java.util.List; +import java.util.UUID; + +public interface WalletQueryRepository { + List findWithMemeberAndVoucherByMemberId(UUID memberId); + + List findWithMemeberAndVoucherByVoucherId(UUID voucherId); + + List findWithMemeberAndVoucherAll(); +} diff --git a/src/main/java/org/prgrms/kdt/wallet/dao/WalletRepository.java b/src/main/java/org/prgrms/kdt/wallet/dao/WalletRepository.java deleted file mode 100644 index a679b9b2c3..0000000000 --- a/src/main/java/org/prgrms/kdt/wallet/dao/WalletRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.prgrms.kdt.wallet.dao; - -import org.prgrms.kdt.wallet.domain.JoinedWallet; -import org.prgrms.kdt.wallet.domain.Wallet; - -import java.util.List; -import java.util.UUID; - -public interface WalletRepository { - Wallet insert(Wallet wallet); - - List findWithMemeberAndVoucherByMemberId(UUID memberId); - - List findWithMemeberAndVoucherByVoucherId(UUID voucherId); - - void deleteById(UUID walletId); - - List findWithMemeberAndVoucherAll(); -} diff --git a/src/main/java/org/prgrms/kdt/wallet/domain/JoinedWallet.java b/src/main/java/org/prgrms/kdt/wallet/domain/QueryWallet.java similarity index 84% rename from src/main/java/org/prgrms/kdt/wallet/domain/JoinedWallet.java rename to src/main/java/org/prgrms/kdt/wallet/domain/QueryWallet.java index 2688873f41..1515a0ac2f 100644 --- a/src/main/java/org/prgrms/kdt/wallet/domain/JoinedWallet.java +++ b/src/main/java/org/prgrms/kdt/wallet/domain/QueryWallet.java @@ -5,12 +5,12 @@ import java.util.UUID; -public class JoinedWallet { +public class QueryWallet { private final UUID walletId; private final Member member; private final Voucher voucher; - public JoinedWallet(UUID walletId, Member member, Voucher voucher) { + public QueryWallet(UUID walletId, Member member, Voucher voucher) { this.walletId = walletId; this.member = member; this.voucher = voucher; diff --git a/src/main/java/org/prgrms/kdt/wallet/dto/request/CreateWalletRequest.java b/src/main/java/org/prgrms/kdt/wallet/dto/request/CreateWalletRequest.java deleted file mode 100644 index 0727c5b7b9..0000000000 --- a/src/main/java/org/prgrms/kdt/wallet/dto/request/CreateWalletRequest.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.prgrms.kdt.wallet.dto.request; - -import java.util.UUID; - -public record CreateWalletRequest(UUID walletId, UUID memberId, UUID voucherId) { - public CreateWalletRequest(UUID memberId, UUID voucherId) { - this(UUID.randomUUID(), memberId, voucherId); - } -} diff --git a/src/main/java/org/prgrms/kdt/wallet/dto/response/JoinedWalletResponse.java b/src/main/java/org/prgrms/kdt/wallet/dto/response/JoinedWalletResponse.java deleted file mode 100644 index c7c1b1be8d..0000000000 --- a/src/main/java/org/prgrms/kdt/wallet/dto/response/JoinedWalletResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.prgrms.kdt.wallet.dto.response; - -import org.prgrms.kdt.wallet.domain.JoinedWallet; - -import java.util.UUID; - -public record JoinedWalletResponse(UUID walletId, String memberName, String voucherType, double voucherAmount) { - public JoinedWalletResponse(JoinedWallet joinedWallet) { - this(joinedWallet.getWalletId(), - joinedWallet.getMember().getMemberName(), - joinedWallet.getVoucher().getVoucherType().getDescripton(), - joinedWallet.getVoucher().getDiscountPolicy().getAmount()); - } -} diff --git a/src/main/java/org/prgrms/kdt/wallet/service/WalletService.java b/src/main/java/org/prgrms/kdt/wallet/service/WalletService.java index 2a5118fb6c..bf139bd1c9 100644 --- a/src/main/java/org/prgrms/kdt/wallet/service/WalletService.java +++ b/src/main/java/org/prgrms/kdt/wallet/service/WalletService.java @@ -1,60 +1,67 @@ package org.prgrms.kdt.wallet.service; -import org.prgrms.kdt.exception.EntityNotFoundException; +import org.prgrms.kdt.global.Generator; +import org.prgrms.kdt.global.exception.EntityNotFoundException; import org.prgrms.kdt.member.dao.MemberRepository; import org.prgrms.kdt.voucher.dao.VoucherRepository; -import org.prgrms.kdt.wallet.dao.WalletRepository; -import org.prgrms.kdt.wallet.domain.JoinedWallet; +import org.prgrms.kdt.wallet.dao.WalletCommandRepository; +import org.prgrms.kdt.wallet.dao.WalletQueryRepository; +import org.prgrms.kdt.wallet.domain.QueryWallet; import org.prgrms.kdt.wallet.domain.Wallet; -import org.prgrms.kdt.wallet.dto.request.CreateWalletRequest; -import org.prgrms.kdt.wallet.dto.response.JoinedWalletResponses; -import org.prgrms.kdt.wallet.dto.response.WalletResponse; -import org.springframework.stereotype.Component; +import org.prgrms.kdt.wallet.service.dto.CreateWalletRequest; +import org.prgrms.kdt.wallet.service.dto.JoinedWalletResponses; +import org.prgrms.kdt.wallet.service.dto.WalletResponse; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.UUID; -@Component +@Transactional(readOnly = true) +@Service public class WalletService { private final MemberRepository memberRepository; private final VoucherRepository voucherRepository; - private final WalletRepository walletRepository; + private final WalletQueryRepository walletQueryRepository; + private final WalletCommandRepository walletCommandRepository; + private final Generator generator; - public WalletService(MemberRepository memberRepository, VoucherRepository voucherRepository, WalletRepository walletRepository) { + public WalletService(MemberRepository memberRepository, VoucherRepository voucherRepository, WalletQueryRepository walletQueryRepository, WalletCommandRepository walletCommandRepository, Generator generator) { this.memberRepository = memberRepository; this.voucherRepository = voucherRepository; - this.walletRepository = walletRepository; + this.walletQueryRepository = walletQueryRepository; + this.walletCommandRepository = walletCommandRepository; + this.generator = generator; } @Transactional public WalletResponse assignVoucherToCustomer(CreateWalletRequest request) { memberRepository.findById(request.memberId()) - .orElseThrow(() -> new EntityNotFoundException("존재하지 않는 바우처 입니다.")); + .orElseThrow(() -> new EntityNotFoundException("존재하지 않는 멤버 입니다.")); voucherRepository.findById(request.voucherId()) .orElseThrow(() -> new EntityNotFoundException("존재하지 않는 바우처 입니다.")); - Wallet wallet = new Wallet(request.walletId(), request.memberId(), request.voucherId()); - return new WalletResponse(walletRepository.insert(wallet)); + Wallet wallet = new Wallet(generator.generateId(), request.memberId(), request.voucherId()); + return new WalletResponse(walletCommandRepository.insert(wallet)); } public JoinedWalletResponses findVouchersByMemberId(UUID memberId) { - List joinedWallets = walletRepository.findWithMemeberAndVoucherByMemberId(memberId); - return JoinedWalletResponses.of(joinedWallets); + List queryWallets = walletQueryRepository.findWithMemeberAndVoucherByMemberId(memberId); + return JoinedWalletResponses.of(queryWallets); } @Transactional public void deleteWalletById(UUID walletId) { - walletRepository.deleteById(walletId); + walletCommandRepository.deleteById(walletId); } public JoinedWalletResponses findMembersByVoucherId(UUID voucherId) { - List joinedWallets = walletRepository.findWithMemeberAndVoucherByVoucherId(voucherId); - return JoinedWalletResponses.of(joinedWallets); + List queryWallets = walletQueryRepository.findWithMemeberAndVoucherByVoucherId(voucherId); + return JoinedWalletResponses.of(queryWallets); } public JoinedWalletResponses findAllWallet() { - List joinedWallets = walletRepository.findWithMemeberAndVoucherAll(); - return JoinedWalletResponses.of(joinedWallets); + List queryWallets = walletQueryRepository.findWithMemeberAndVoucherAll(); + return JoinedWalletResponses.of(queryWallets); } } diff --git a/src/main/java/org/prgrms/kdt/wallet/service/dto/CreateWalletRequest.java b/src/main/java/org/prgrms/kdt/wallet/service/dto/CreateWalletRequest.java new file mode 100644 index 0000000000..10cc1624b2 --- /dev/null +++ b/src/main/java/org/prgrms/kdt/wallet/service/dto/CreateWalletRequest.java @@ -0,0 +1,6 @@ +package org.prgrms.kdt.wallet.service.dto; + +import java.util.UUID; + +public record CreateWalletRequest(UUID memberId, UUID voucherId) { +} diff --git a/src/main/java/org/prgrms/kdt/wallet/service/dto/JoinedWalletResponse.java b/src/main/java/org/prgrms/kdt/wallet/service/dto/JoinedWalletResponse.java new file mode 100644 index 0000000000..923ebc3654 --- /dev/null +++ b/src/main/java/org/prgrms/kdt/wallet/service/dto/JoinedWalletResponse.java @@ -0,0 +1,14 @@ +package org.prgrms.kdt.wallet.service.dto; + +import org.prgrms.kdt.wallet.domain.QueryWallet; + +import java.util.UUID; + +public record JoinedWalletResponse(UUID walletId, String memberName, String voucherType, double voucherAmount) { + public JoinedWalletResponse(QueryWallet queryWallet) { + this(queryWallet.getWalletId(), + queryWallet.getMember().getMemberName(), + queryWallet.getVoucher().getVoucherType().getDescripton(), + queryWallet.getVoucher().getDiscountPolicy().getAmount()); + } +} diff --git a/src/main/java/org/prgrms/kdt/wallet/dto/response/JoinedWalletResponses.java b/src/main/java/org/prgrms/kdt/wallet/service/dto/JoinedWalletResponses.java similarity index 50% rename from src/main/java/org/prgrms/kdt/wallet/dto/response/JoinedWalletResponses.java rename to src/main/java/org/prgrms/kdt/wallet/service/dto/JoinedWalletResponses.java index 15556f14b8..bb2a4d48fd 100644 --- a/src/main/java/org/prgrms/kdt/wallet/dto/response/JoinedWalletResponses.java +++ b/src/main/java/org/prgrms/kdt/wallet/service/dto/JoinedWalletResponses.java @@ -1,14 +1,14 @@ -package org.prgrms.kdt.wallet.dto.response; +package org.prgrms.kdt.wallet.service.dto; -import org.prgrms.kdt.wallet.domain.JoinedWallet; +import org.prgrms.kdt.wallet.domain.QueryWallet; import java.util.List; import java.util.stream.Collectors; public record JoinedWalletResponses(List wallets) { - public static JoinedWalletResponses of(List joinedWallets) { - List walletsResponse = joinedWallets.stream().map(JoinedWalletResponse::new).collect(Collectors.toList()); + public static JoinedWalletResponses of(List queryWallets) { + List walletsResponse = queryWallets.stream().map(JoinedWalletResponse::new).collect(Collectors.toList()); return new JoinedWalletResponses(walletsResponse); } diff --git a/src/main/java/org/prgrms/kdt/wallet/dto/response/WalletResponse.java b/src/main/java/org/prgrms/kdt/wallet/service/dto/WalletResponse.java similarity index 86% rename from src/main/java/org/prgrms/kdt/wallet/dto/response/WalletResponse.java rename to src/main/java/org/prgrms/kdt/wallet/service/dto/WalletResponse.java index f1b5be5fd8..31334ad32a 100644 --- a/src/main/java/org/prgrms/kdt/wallet/dto/response/WalletResponse.java +++ b/src/main/java/org/prgrms/kdt/wallet/service/dto/WalletResponse.java @@ -1,4 +1,4 @@ -package org.prgrms.kdt.wallet.dto.response; +package org.prgrms.kdt.wallet.service.dto; import org.prgrms.kdt.wallet.domain.Wallet; diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 7c8ae2db92..11fe2e4422 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,7 +1,3 @@ -filePath: - voucher: "file/Voucher.csv" - blackList: "file/customer_blacklist.csv" - spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html new file mode 100644 index 0000000000..8d990c8876 --- /dev/null +++ b/src/main/resources/templates/home.html @@ -0,0 +1,14 @@ + + + + + + Voucher service + + +

Voucher Service

+ Show All Voucher + + \ No newline at end of file diff --git a/src/main/resources/templates/voucher/voucher_create.html b/src/main/resources/templates/voucher/voucher_create.html new file mode 100644 index 0000000000..15519c8cfc --- /dev/null +++ b/src/main/resources/templates/voucher/voucher_create.html @@ -0,0 +1,35 @@ + + + + + + + + Title + + +
+

New Voucher

+ +
+
+
+ +
+
+ + + +
+ +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/voucher/voucher_detail.html b/src/main/resources/templates/voucher/voucher_detail.html new file mode 100644 index 0000000000..7bcba4fc8a --- /dev/null +++ b/src/main/resources/templates/voucher/voucher_detail.html @@ -0,0 +1,37 @@ + + + + + + + + Voucher Detail + + +

Voucher Detail Page

+Show All Voucher + + + + + + + + + + + + + + + + + +
VoucherIdVoucherTypeAmountCreatedAt
+
+ +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/voucher/vouchers.html b/src/main/resources/templates/voucher/vouchers.html index fbb6c77502..3119b253b6 100644 --- a/src/main/resources/templates/voucher/vouchers.html +++ b/src/main/resources/templates/voucher/vouchers.html @@ -12,25 +12,23 @@

All Voucher

- - - - - + + + - - - - - - + + + +
IDNameEmailCreatedAtLastLoginAtVoucherIdVoucherTypeAmount
+ +
diff --git a/src/test/TestVoucher.csv b/src/test/TestVoucher.csv deleted file mode 100644 index 6eccc6613c..0000000000 --- a/src/test/TestVoucher.csv +++ /dev/null @@ -1,7 +0,0 @@ -<<<<<<< HEAD -4d35aa02-3076-4bee-beba-51fdc5efc1ed,FIXED,30 -73e57be5-5ab3-4f2d-b297-62b88ad7b418,FIXED,30 -======= -53e6c2e0-a9ae-4138-8f10-939f1b7ac1e6,FIXED,30 -c1005d6d-c035-4f60-80b2-e51e8d23bf8f,FIXED,30 ->>>>>>> part.2 diff --git a/src/test/java/org/prgrms/kdt/member/dao/BlackListRepositoryTest.java b/src/test/java/org/prgrms/kdt/member/dao/BlackListRepositoryTest.java deleted file mode 100644 index da82ef0bbf..0000000000 --- a/src/test/java/org/prgrms/kdt/member/dao/BlackListRepositoryTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.prgrms.kdt.member.dao; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.mockito.BDDMockito; -import org.mockito.Mockito; -import org.prgrms.kdt.member.domain.Member; -import org.prgrms.kdt.member.domain.MemberStatus; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.List; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.mockito.ArgumentMatchers.anyMap; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - - -class BlackListRepositoryTest { - static MemberLoader mockMemberLoader; - - @Configuration - static class TestConfig { - - @Bean - BlackListRepository blackListRepository() { - mockMemberLoader = Mockito.mock(MemberLoader.class); - return new BlackListRepository(mockMemberLoader); - } - } - - BlackListRepository blackListRepository; - AnnotationConfigApplicationContext testContext; - - @BeforeEach - void setup() { - testContext = new AnnotationConfigApplicationContext(TestConfig.class); - blackListRepository = testContext.getBean(BlackListRepository.class); - BDDMockito.given(mockMemberLoader.loadFileToMemoryMember()).willReturn(new ConcurrentHashMap<>()); - blackListRepository.insert(new Member(UUID.randomUUID(), "yaho", MemberStatus.BLACK)); - blackListRepository.insert(new Member(UUID.randomUUID(), "abc", MemberStatus.BLACK)); - blackListRepository.insert(new Member(UUID.randomUUID(), "defg", MemberStatus.BLACK)); - } - - @Test - @DisplayName("블랙리스트 맴버 전체 조회") - void findAllBlackMember() { - //when - List foundBlackMembers = blackListRepository.findAllBlackMember(); - - //then - assertThat(foundBlackMembers.size(), is(3)); - } - - @Test - @DisplayName("BlackListRepository의 빈이 소멸할 때 fileWrite를 호출하는지 확인") - void fileWrite() { - //when - testContext.close(); - - //then - verify(mockMemberLoader, times(1)).saveMemoryMemberToFile(anyMap()); - } -} \ No newline at end of file diff --git a/src/test/java/org/prgrms/kdt/member/dao/MemberLoaderTest.java b/src/test/java/org/prgrms/kdt/member/dao/MemberLoaderTest.java deleted file mode 100644 index 615f7b3569..0000000000 --- a/src/test/java/org/prgrms/kdt/member/dao/MemberLoaderTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.prgrms.kdt.member.dao; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; -import org.prgrms.kdt.member.domain.Member; -import org.prgrms.kdt.member.domain.MemberStatus; - -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Stream; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -class MemberLoaderTest { - MemberLoader memberLoader; - - @BeforeEach - void setup() { - memberLoader = new MemberLoader("src/test/test_customer_blacklist.csv"); - } - - - @ParameterizedTest - @MethodSource("mamberSource") - @DisplayName("메모리의 블랙리스트들 파일에 저장 후 저장된 파일 확인") - void saveMemoryMemberToFile(Member blackMember1, Member blackMember2) { - //given - Map memberMap = new ConcurrentHashMap<>(); - memberMap.put(blackMember1.getMemberId(), blackMember1); - memberMap.put(blackMember2.getMemberId(), blackMember2); - - //when - memberLoader.saveMemoryMemberToFile(memberMap); - Map foundMembers = memberLoader.loadFileToMemoryMember(); - - //then - assertThat(foundMembers.size(), is(2)); - } - - static Stream mamberSource() { - Member member1 = new Member(UUID.randomUUID(), "haha", MemberStatus.BLACK); - Member member2 = new Member(UUID.randomUUID(), "hoho", MemberStatus.BLACK); - return Stream.of(new Member[][]{{member1, member2}}); - } - -} \ No newline at end of file diff --git a/src/test/java/org/prgrms/kdt/member/service/MemberServiceTest.java b/src/test/java/org/prgrms/kdt/member/service/MemberServiceTest.java index 55534ab902..f4a52fea16 100644 --- a/src/test/java/org/prgrms/kdt/member/service/MemberServiceTest.java +++ b/src/test/java/org/prgrms/kdt/member/service/MemberServiceTest.java @@ -4,15 +4,17 @@ import org.prgrms.kdt.member.dao.JdbcMemberRepository; import org.prgrms.kdt.member.domain.Member; import org.prgrms.kdt.member.domain.MemberStatus; -import org.prgrms.kdt.member.dto.CreateMemberRequest; -import org.prgrms.kdt.member.dto.MemberResponse; -import org.prgrms.kdt.member.dto.MemberResponses; +import org.prgrms.kdt.member.service.dto.CreateMemberRequest; +import org.prgrms.kdt.member.service.dto.MemberResponse; +import org.prgrms.kdt.member.service.dto.MemberResponses; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.transaction.annotation.Transactional; +import java.util.UUID; + import static org.assertj.core.api.Assertions.assertThat; @ActiveProfiles("test") @@ -28,9 +30,9 @@ class MemberServiceTest { @BeforeEach void setup(){ - jdbcMemberRepository.insert(new Member("lala", MemberStatus.BLACK)); - jdbcMemberRepository.insert(new Member("pipo", MemberStatus.BLACK)); - jdbcMemberRepository.insert(new Member("pipo", MemberStatus.COMMON)); + jdbcMemberRepository.insert(new Member(UUID.randomUUID(), "lala", MemberStatus.BLACK)); + jdbcMemberRepository.insert(new Member(UUID.randomUUID(), "pipo", MemberStatus.BLACK)); + jdbcMemberRepository.insert(new Member(UUID.randomUUID(), "pipo", MemberStatus.COMMON)); } @Test diff --git a/src/test/java/org/prgrms/kdt/util/ConverterTest.java b/src/test/java/org/prgrms/kdt/util/ConverterTest.java deleted file mode 100644 index 095f5d22f7..0000000000 --- a/src/test/java/org/prgrms/kdt/util/ConverterTest.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.prgrms.kdt.util; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.prgrms.kdt.exception.EntityNotFoundException; -import org.prgrms.kdt.member.domain.Member; -import org.prgrms.kdt.member.domain.MemberStatus; -import org.prgrms.kdt.voucher.domain.Voucher; -import org.prgrms.kdt.voucher.domain.VoucherType; - -import java.text.MessageFormat; -import java.util.UUID; - -import static org.assertj.core.api.Assertions.catchException; -import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -class ConverterTest { - @Test - @DisplayName("바우처 객체를 스트링으로 변환") - void voucherToString() { - //given - Voucher voucher = new Voucher(VoucherType.PERCENT, VoucherType.PERCENT.createPolicy(30.0)); - UUID uuid = voucher.getVoucherId(); - - //when - String voucherString = Converter.voucherToString(voucher); - - //then - String expectString = MessageFormat.format("{0},{1},{2}", uuid, voucher.getVoucherType(), voucher.getDiscountPolicy().getAmount()); - assertThat(voucherString, is(expectString)); - } - - @Test - @DisplayName("올바른 멤버 객체를 인자로 전해주어 올바른 스트링으로 변환") - void memberToString_correctMember_correctStr() { - //given - UUID uuid = UUID.randomUUID(); - Member member = new Member(uuid, "abc", MemberStatus.BLACK); - - //when - String memberString = Converter.memberToString(member); - - //then - String expectString = MessageFormat.format("{0},{1}", uuid, member.getMemberName()); - assertThat(memberString, is(expectString)); - } - - @Test - @DisplayName("필드에 null이 포함된 올바르지 않은 멤버 객체를 인자로 전해주는 경우 EntityNotFoundException 확인") - void memberToString_incorrectMember_EntityNotFoundException() { - //given - UUID uuid = UUID.randomUUID(); - Member member = new Member(uuid, "abc", MemberStatus.BLACK); - member.setName(null); - - //when - Exception expectException = catchException(() -> Converter.memberToString(member)); - - //then - assertThat(expectException).isInstanceOf(EntityNotFoundException.class); - } - - @Test - @DisplayName("스트링을 바우처 객체로 변환") - void stringToVoucher() { - //given - String voucherString = "e6801502-7989-4b9a-ac83-9bf9dc38e0b0,PERCENT,20"; - - //when - Voucher voucher = Converter.stringToVoucher(voucherString); - - //then - String voucherId = voucher.getVoucherId().toString(); - assertThat(voucherId, is("e6801502-7989-4b9a-ac83-9bf9dc38e0b0")); - } - - @Test - @DisplayName("스트링을 멤버 객체로 변환") - void stringToMember() { - //given - String memberString = "a5b5a660-cb51-4445-9c6b-84c7a9e2131b,James"; - - //when - Member member = Converter.stringToMember(memberString, MemberStatus.BLACK); - - //then - String memberId = member.getMemberId().toString(); - assertThat(memberId, is("a5b5a660-cb51-4445-9c6b-84c7a9e2131b")); - } -} \ No newline at end of file diff --git a/src/test/java/org/prgrms/kdt/voucher/dao/FileVoucherRepositoryTest.java b/src/test/java/org/prgrms/kdt/voucher/dao/FileVoucherRepositoryTest.java deleted file mode 100644 index 30463da923..0000000000 --- a/src/test/java/org/prgrms/kdt/voucher/dao/FileVoucherRepositoryTest.java +++ /dev/null @@ -1,136 +0,0 @@ -package org.prgrms.kdt.voucher.dao; - -import org.hamcrest.Matchers; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.BDDMockito; -import org.mockito.Mockito; -import org.prgrms.kdt.exception.FileAccessException; -import org.prgrms.kdt.voucher.domain.Voucher; -import org.prgrms.kdt.voucher.domain.VoucherType; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Stream; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.is; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.anyMap; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -class FileVoucherRepositoryTest { - static VoucherLoader mockVoucherLoader; - - @Configuration - static class TestConfig { - - @Bean - FileVoucherRepository fileVoucherRepository() { - mockVoucherLoader = Mockito.mock(VoucherLoader.class); - return new FileVoucherRepository(mockVoucherLoader); - } - } - - FileVoucherRepository fileVoucherRepository; - AnnotationConfigApplicationContext testContext; - - @BeforeEach - void setup() { - testContext = new AnnotationConfigApplicationContext(TestConfig.class); - fileVoucherRepository = testContext.getBean(FileVoucherRepository.class); - BDDMockito.given(mockVoucherLoader.loadFileToMemoryVoucher()).willReturn(new ConcurrentHashMap<>()); - } - - @ParameterizedTest - @MethodSource("voucherSource") - @DisplayName("존재하는 바우처Id로 바우처 찾기") - void findByExistId(List voucherList) { - //given - voucherList.forEach(v -> fileVoucherRepository.insert(v)); - UUID existVoucherId = voucherList.get(0).getVoucherId(); - - //when - Optional foundVoucher = fileVoucherRepository.findById(existVoucherId); - - //then - UUID foundVoucherId = foundVoucher.get().getVoucherId(); - assertThat(foundVoucherId, Matchers.is(existVoucherId)); - } - - @ParameterizedTest - @MethodSource("voucherSource") - @DisplayName("존재하지 않는 바우처Id로 바우처 찾기") - void findByNonExistId(List voucherList) { - //given - voucherList.forEach(v -> fileVoucherRepository.insert(v)); - UUID notExistVoucherId = UUID.randomUUID(); - - //when - Optional foundVoucher = fileVoucherRepository.findById(notExistVoucherId); - - //then - assertThrows(FileAccessException.class, () -> { - foundVoucher.orElseThrow(FileAccessException::new); - }); - } - - @Test - @DisplayName("바우처 저장 후 성공적으로 저장 되었는지 확인") - void insert() { - //given - Voucher insertVoucher = new Voucher(VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0)); - - //when - fileVoucherRepository.insert(insertVoucher); - - //then - Optional foundVoucher = fileVoucherRepository.findById(insertVoucher.getVoucherId()); - assertThat(foundVoucher.get(), is(insertVoucher)); - } - - @ParameterizedTest - @MethodSource("voucherSource") - @DisplayName("바우처 전체 조회 테스트") - void findAll(List voucherList) { - //given - voucherList.forEach(v -> fileVoucherRepository.insert(v)); - - //when - List foundVoucherList = fileVoucherRepository.findAll(); - - //then - Voucher insertedVoucher1 = voucherList.get(0); - Voucher insertedvoucher2 = voucherList.get(1); - assertThat(foundVoucherList, containsInAnyOrder(insertedVoucher1, insertedvoucher2)); - } - - @Test - @DisplayName("FileVoucherRepository의 빈이 소멸할 때 fileWrite를 호출하는지 확인") - void fileWrite() { - //when - testContext.close(); - - //then - verify(mockVoucherLoader, times(1)).saveMemoryVoucherToFile(anyMap()); - } - - static Stream voucherSource() { - List voucherList = new ArrayList<>(); - voucherList.add(new Voucher(VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0))); - voucherList.add(new Voucher(VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0))); - return Stream.of(Arguments.of(voucherList)); - } -} \ No newline at end of file diff --git a/src/test/java/org/prgrms/kdt/voucher/dao/MemoryVoucherRepositoryTest.java b/src/test/java/org/prgrms/kdt/voucher/dao/MemoryVoucherRepositoryTest.java index a8380d4015..ea3a45ec22 100644 --- a/src/test/java/org/prgrms/kdt/voucher/dao/MemoryVoucherRepositoryTest.java +++ b/src/test/java/org/prgrms/kdt/voucher/dao/MemoryVoucherRepositoryTest.java @@ -1,14 +1,16 @@ package org.prgrms.kdt.voucher.dao; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; 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.prgrms.kdt.exception.FileAccessException; +import org.prgrms.kdt.global.exception.EntityNotFoundException; import org.prgrms.kdt.voucher.domain.Voucher; import org.prgrms.kdt.voucher.domain.VoucherType; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -30,7 +32,7 @@ void setup() { @DisplayName("존재하는 바우처Id로 바우처 찾기") void findByExistId() { //given - Voucher savedVoucher = new Voucher(VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0)); + Voucher savedVoucher = new Voucher(UUID.randomUUID(), VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0), LocalDateTime.now()); memoryVoucherRepository.insert(savedVoucher); UUID existVoucherId = savedVoucher.getVoucherId(); @@ -45,7 +47,7 @@ void findByExistId() { @DisplayName("존재하지 않는 바우처Id로 바우처 찾기") void findByNonExistId() { //given - Voucher savedVoucher = new Voucher(VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0)); + Voucher savedVoucher = new Voucher(UUID.randomUUID(), VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0), LocalDateTime.now()); memoryVoucherRepository.insert(savedVoucher); UUID notExistVoucherId = UUID.randomUUID(); @@ -53,8 +55,8 @@ void findByNonExistId() { Optional foundVoucher = memoryVoucherRepository.findById(notExistVoucherId); //then - assertThrows(FileAccessException.class, () -> { - foundVoucher.orElseThrow(FileAccessException::new); + assertThrows(EntityNotFoundException.class, () -> { + foundVoucher.orElseThrow(EntityNotFoundException::new); }); } @@ -62,7 +64,7 @@ void findByNonExistId() { @DisplayName("바우처 저장 후 성공적으로 저장 되었는지 확인") void insert() { //given - Voucher insertVoucher = new Voucher(VoucherType.PERCENT, VoucherType.PERCENT.createPolicy(30.0)); + Voucher insertVoucher = new Voucher(UUID.randomUUID(), VoucherType.PERCENT, VoucherType.PERCENT.createPolicy(30.0), LocalDateTime.now()); //when memoryVoucherRepository.insert(insertVoucher); @@ -72,26 +74,27 @@ void insert() { assertThat(foundVoucher.get(), is(insertVoucher)); } + @Disabled @ParameterizedTest @MethodSource("voucherSource") @DisplayName("바우처 전체 조회 테스트") void findAll() { //given - Voucher savedVoucher1 = new Voucher(VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0)); - Voucher savedVoucher2 = new Voucher(VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0)); + Voucher savedVoucher1 = new Voucher(UUID.randomUUID(), VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0), LocalDateTime.now()); + Voucher savedVoucher2 = new Voucher(UUID.randomUUID(), VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0), LocalDateTime.now()); memoryVoucherRepository.insert(savedVoucher1); memoryVoucherRepository.insert(savedVoucher2); //when - List foundVoucherList = memoryVoucherRepository.findAll(); + List foundVoucherList = memoryVoucherRepository.findAll(null); //then assertThat(foundVoucherList, containsInAnyOrder(savedVoucher1, savedVoucher2)); } static Stream voucherSource() { - Voucher voucher1 = new Voucher(VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0)); - Voucher voucher2 = new Voucher(VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0)); + Voucher voucher1 = new Voucher(UUID.randomUUID(), VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0), LocalDateTime.now()); + Voucher voucher2 = new Voucher(UUID.randomUUID(), VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0), LocalDateTime.now()); return Stream.of(new Voucher[][]{{voucher1, voucher2}}); } } \ No newline at end of file diff --git a/src/test/java/org/prgrms/kdt/voucher/dao/VoucherLoaderTest.java b/src/test/java/org/prgrms/kdt/voucher/dao/VoucherLoaderTest.java deleted file mode 100644 index 156a53b4ce..0000000000 --- a/src/test/java/org/prgrms/kdt/voucher/dao/VoucherLoaderTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.prgrms.kdt.voucher.dao; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; -import org.prgrms.kdt.voucher.domain.Voucher; -import org.prgrms.kdt.voucher.domain.VoucherType; - -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Stream; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -class VoucherLoaderTest { - VoucherLoader voucherLoader; - - @BeforeEach - void setup() { - voucherLoader = new VoucherLoader("src/test/TestVoucher.csv"); - } - - @ParameterizedTest - @MethodSource("voucherSource") - @DisplayName("메모리의 바우처들 파일에 저장 후 저장된 파일 확인") - void saveMemoryVoucherToFile(Voucher voucher1, Voucher voucher2) { - //given - Map voucherMap = new ConcurrentHashMap<>(); - voucherMap.put(voucher1.getVoucherId(), voucher1); - voucherMap.put(voucher2.getVoucherId(), voucher2); - - //when - voucherLoader.saveMemoryVoucherToFile(voucherMap); - Map foundVouchers = voucherLoader.loadFileToMemoryVoucher(); - - //then - assertThat(foundVouchers.size(), is(2)); - } - - static Stream voucherSource() { - Voucher voucher1 = new Voucher(VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0)); - Voucher voucher2 = new Voucher(VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0)); - return Stream.of(new Voucher[][]{{voucher1, voucher2}}); - } -} \ No newline at end of file diff --git a/src/test/java/org/prgrms/kdt/voucher/service/VoucherServiceTest.java b/src/test/java/org/prgrms/kdt/voucher/service/VoucherServiceTest.java index 8337bc5eeb..c60a117ecb 100644 --- a/src/test/java/org/prgrms/kdt/voucher/service/VoucherServiceTest.java +++ b/src/test/java/org/prgrms/kdt/voucher/service/VoucherServiceTest.java @@ -6,14 +6,15 @@ import org.prgrms.kdt.voucher.dao.JdbcVoucherRepository; import org.prgrms.kdt.voucher.domain.Voucher; import org.prgrms.kdt.voucher.domain.VoucherType; -import org.prgrms.kdt.voucher.dto.CreateVoucherRequest; -import org.prgrms.kdt.voucher.dto.VoucherResponse; -import org.prgrms.kdt.voucher.dto.VoucherResponses; +import org.prgrms.kdt.voucher.service.dto.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; +import java.util.UUID; + import static org.assertj.core.api.Assertions.assertThat; @@ -30,19 +31,20 @@ class VoucherServiceTest { @BeforeEach void setup() { - jdbcVoucherRepository.insert(new Voucher(VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0))); - jdbcVoucherRepository.insert(new Voucher(VoucherType.PERCENT, VoucherType.PERCENT.createPolicy(35.0))); - jdbcVoucherRepository.insert(new Voucher(VoucherType.PERCENT, VoucherType.PERCENT.createPolicy(70.0))); + /** + * 테스트용 db에 바우처 3개 저장해 놓은 상태 (PERCENT 2개, FIXED 1개) + */ + setupInsertVouchers(); } @Test @DisplayName("바우처 생성 후 반환된 바우처의 amount 확인") void createVoucher_correctRequest_correctAmount() { //given - CreateVoucherRequest createVoucherRequest = new CreateVoucherRequest(VoucherType.FIXED, 50.0); + CreateVoucherRequest request = new CreateVoucherRequest(VoucherType.FIXED, 50.0); //when - VoucherResponse voucher = voucherService.createVoucher(createVoucherRequest); + VoucherResponse voucher = voucherService.createVoucher(request); //then double resultAmount = voucher.amount(); @@ -50,13 +52,62 @@ void createVoucher_correctRequest_correctAmount() { } @Test - @DisplayName("바우처 전체 조회하여 사이즈 검증") + @DisplayName("바우처 전체 조회하여 사이즈 확인") void findAll_correctSize() { //when - VoucherResponses vouchers = voucherService.findAll(); + SearchRequest searchRequest = new SearchRequest(1, 10, null); + VoucherResponses vouchers = voucherService.findAll(searchRequest); //then - int resultsize = vouchers.vouchers().size(); - assertThat(resultsize).isEqualTo(3); + int resultSize = vouchers.vouchers().size(); + assertThat(resultSize).isEqualTo(3); + } + + @Test + @DisplayName("바우처id로 바우처 조회 후 반환받은 바우처 Id 확인") + void findById_correctId(){ + //given + UUID uuid = UUID.fromString("3c3dda5e-eb09-4b21-b57f-d9ef54bacd29"); + + //when + VoucherDetailResponse response = voucherService.findById(uuid); + + //then + assertThat(response.voucherId()).isEqualTo(uuid); + } + + @Test + @DisplayName("바우처Id로 바우처 한개 삭제 후 사이즈 확인") + void deleteById_correctId(){ + //given + UUID uuid = UUID.fromString("4267f1d3-8945-422b-88e0-dfef54756a37"); + + //when + voucherService.deleteById(uuid); + + //then + SearchRequest searchRequest = new SearchRequest(1, 10, null); + int size = jdbcVoucherRepository.findAll(searchRequest).size(); + assertThat(size).isEqualTo(2); + } + + @Test + @DisplayName("바우처 타입으로 조건 조회 후 사이즈 확인") + void findByType_correctType() { + //when + VoucherResponses responses = voucherService.findByType(VoucherType.PERCENT); + + //then + int resultSize = responses.vouchers().size(); + assertThat(resultSize).isEqualTo(2); + } + + private void setupInsertVouchers() { + UUID voucherId1 = UUID.fromString("3c3dda5e-eb09-4b21-b57f-d9ef54bacd29"); + UUID voucherId2 = UUID.fromString("4267f1d3-8945-422b-88e0-dfef54756a37"); + UUID voucherId3 = UUID.fromString("5f237bf7-67b5-4175-bf02-2206ad28c2e2"); + jdbcVoucherRepository.insert(new Voucher(voucherId1, VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0), LocalDateTime.now())); + jdbcVoucherRepository.insert(new Voucher(voucherId2, VoucherType.PERCENT, VoucherType.PERCENT.createPolicy(35.0), LocalDateTime.now())); + jdbcVoucherRepository.insert(new Voucher(voucherId3, VoucherType.PERCENT, VoucherType.PERCENT.createPolicy(70.0), LocalDateTime.now())); } } \ No newline at end of file diff --git a/src/test/java/org/prgrms/kdt/wallet/service/WalletServiceTest.java b/src/test/java/org/prgrms/kdt/wallet/service/WalletServiceTest.java index 5622cd35f8..00a33f84f7 100644 --- a/src/test/java/org/prgrms/kdt/wallet/service/WalletServiceTest.java +++ b/src/test/java/org/prgrms/kdt/wallet/service/WalletServiceTest.java @@ -3,24 +3,26 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.prgrms.kdt.exception.EntityNotFoundException; +import org.prgrms.kdt.global.exception.EntityNotFoundException; import org.prgrms.kdt.member.dao.MemberRepository; import org.prgrms.kdt.member.domain.Member; import org.prgrms.kdt.member.domain.MemberStatus; import org.prgrms.kdt.voucher.dao.VoucherRepository; import org.prgrms.kdt.voucher.domain.Voucher; import org.prgrms.kdt.voucher.domain.VoucherType; -import org.prgrms.kdt.wallet.dao.WalletRepository; -import org.prgrms.kdt.wallet.domain.JoinedWallet; +import org.prgrms.kdt.wallet.dao.WalletCommandRepository; +import org.prgrms.kdt.wallet.dao.WalletQueryRepository; +import org.prgrms.kdt.wallet.domain.QueryWallet; import org.prgrms.kdt.wallet.domain.Wallet; -import org.prgrms.kdt.wallet.dto.request.CreateWalletRequest; -import org.prgrms.kdt.wallet.dto.response.JoinedWalletResponses; -import org.prgrms.kdt.wallet.dto.response.WalletResponse; +import org.prgrms.kdt.wallet.service.dto.CreateWalletRequest; +import org.prgrms.kdt.wallet.service.dto.JoinedWalletResponses; +import org.prgrms.kdt.wallet.service.dto.WalletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.List; import java.util.UUID; @@ -36,7 +38,9 @@ class WalletServiceTest { @Autowired WalletService walletService; @Autowired - WalletRepository walletRepository; + WalletQueryRepository walletQueryRepository; + @Autowired + WalletCommandRepository walletCommandRepository; @Autowired MemberRepository memberRepository; @Autowired @@ -57,11 +61,11 @@ void assignVoucherToCustomer_correctRequest_correctWalletResponse() { //given UUID expectMemberId = UUID.fromString("9a3d5b3e-2d12-4958-9ef3-52d424485895"); Member member = memberRepository.insert(new Member(expectMemberId, "giho", MemberStatus.COMMON)); - Voucher voucher = voucherRepository.insert(new Voucher(VoucherType.FIXED, VoucherType.FIXED.createPolicy(35.0))); - CreateWalletRequest createWalletRequest = new CreateWalletRequest(member.getMemberId(), voucher.getVoucherId()); + Voucher voucher = voucherRepository.insert(new Voucher(UUID.randomUUID(), VoucherType.FIXED, VoucherType.FIXED.createPolicy(35.0), LocalDateTime.now())); + CreateWalletRequest request = new CreateWalletRequest(member.getMemberId(), voucher.getVoucherId()); //when - WalletResponse resultWallet = walletService.assignVoucherToCustomer(createWalletRequest); + WalletResponse resultWallet = walletService.assignVoucherToCustomer(request); //then UUID resultMemberId = resultWallet.memberId(); @@ -72,12 +76,12 @@ void assignVoucherToCustomer_correctRequest_correctWalletResponse() { @DisplayName("존재하지 않는 바우처가 담긴 request객체를 통해 월렛 할당 시 EntityNotFoundException 확인") void assignVoucherToCustomer_incorrectRequest_EntityNotFoundException() { //given - Member member = memberRepository.insert(new Member("giho", MemberStatus.COMMON)); - Voucher voucher = new Voucher(VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0)); - CreateWalletRequest createWalletRequest = new CreateWalletRequest(member.getMemberId(), voucher.getVoucherId()); + Member member = memberRepository.insert(new Member(UUID.randomUUID(), "giho", MemberStatus.COMMON)); + Voucher voucher = new Voucher(UUID.randomUUID(), VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0), LocalDateTime.now()); + CreateWalletRequest request = new CreateWalletRequest(member.getMemberId(), voucher.getVoucherId()); //when - Exception exception = catchException(() -> walletService.assignVoucherToCustomer(createWalletRequest)); + Exception exception = catchException(() -> walletService.assignVoucherToCustomer(request)); //then assertThat(exception).isInstanceOf(EntityNotFoundException.class); @@ -101,8 +105,8 @@ void deleteWalletById_correctId_correctResponseSize() { walletService.deleteWalletById(UUID.fromString("f7c23946-7174-4f56-b464-3ed1fa5224d7")); //then - List findJoinedWalletList = walletRepository.findWithMemeberAndVoucherByMemberId(UUID.fromString("1a3d5b3e-2d12-4958-9ef3-52d424485895")); - assertThat(findJoinedWalletList.size()).isEqualTo(1); + List findQueryWalletList = walletQueryRepository.findWithMemeberAndVoucherByMemberId(UUID.fromString("1a3d5b3e-2d12-4958-9ef3-52d424485895")); + assertThat(findQueryWalletList.size()).isEqualTo(1); } @Test @@ -120,10 +124,10 @@ void findMembersByVoucherId_correctVoucherId_correctMemberName() { @DisplayName("setup을 통해 저장된 월렛2개 전체 조회를 통해 사이즈 확인") void findAllWallet_collectWalletSize() { //when - List joinedWallets = walletRepository.findWithMemeberAndVoucherAll(); + List queryWallets = walletQueryRepository.findWithMemeberAndVoucherAll(); //then - assertThat(joinedWallets.size()).isEqualTo(2); + assertThat(queryWallets.size()).isEqualTo(2); } void setupInsertWallets() { @@ -134,8 +138,8 @@ void setupInsertWallets() { UUID voucherId1 = UUID.fromString("3c3dda5e-eb09-4b21-b57f-d9ef54bacd29"); UUID voucherId2 = UUID.fromString("5c3aba5e-eb09-4b21-b57f-d9ef54bacd29"); - Voucher voucher1 = new Voucher(voucherId1, VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0)); - Voucher voucher2 = new Voucher(voucherId2, VoucherType.PERCENT, VoucherType.PERCENT.createPolicy(70.0)); + Voucher voucher1 = new Voucher(voucherId1, VoucherType.FIXED, VoucherType.FIXED.createPolicy(30.0), LocalDateTime.now()); + Voucher voucher2 = new Voucher(voucherId2, VoucherType.PERCENT, VoucherType.PERCENT.createPolicy(70.0), LocalDateTime.now()); UUID walletId1 = UUID.fromString("f7c23946-7174-4f56-b464-3ed1fa5224d7"); UUID walletId2 = UUID.fromString("c9c23946-7174-4f56-b464-3ed1fa5224d7"); @@ -146,7 +150,7 @@ void setupInsertWallets() { memberRepository.insert(member2); voucherRepository.insert(voucher1); voucherRepository.insert(voucher2); - walletRepository.insert(wallet1); - walletRepository.insert(wallet2); + walletCommandRepository.insert(wallet1); + walletCommandRepository.insert(wallet2); } } \ No newline at end of file diff --git a/src/test/resources/application-test.yaml b/src/test/resources/application-test.yaml index e9f4e13496..81dc961af7 100644 --- a/src/test/resources/application-test.yaml +++ b/src/test/resources/application-test.yaml @@ -1,7 +1,3 @@ -filePath: - voucher: "src/test/TestVoucher.csv" - blackList: "src/test/test_customer_blacklist.csv" - spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/src/test/test_customer_blacklist.csv b/src/test/test_customer_blacklist.csv deleted file mode 100644 index 4d54d3feb1..0000000000 --- a/src/test/test_customer_blacklist.csv +++ /dev/null @@ -1,7 +0,0 @@ -<<<<<<< HEAD -1f1862fc-a3ee-42d3-b497-4376aaed41f6,haha -11d857ad-c517-4dce-ba78-7ae6088d78c3,hoho -======= -593fddea-bf77-45cf-beed-6810a83bf61c,hoho -ed92d041-722d-4044-8522-19ee97249c09,haha ->>>>>>> part.2