From 151dba5abfc94ee67839c2949fd8fcbade9109dc Mon Sep 17 00:00:00 2001 From: kgy1008 Date: Thu, 17 Oct 2024 17:28:36 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[fix]=20yml=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20(#212)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [fix] change server-yml for database * [fix] change server-yml for database --- server-yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server-yml b/server-yml index 0ec6f37d..1e7e3c37 160000 --- a/server-yml +++ b/server-yml @@ -1 +1 @@ -Subproject commit 0ec6f37d33e106d28a6d3b33c1653546da1b1641 +Subproject commit 1e7e3c37e950d3890bd22b55be8f3d6c91f0a524 From 04e70b61598995dd8617eeb7faada71ee7cfd9f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=9C=EC=A7=84?= <109809242+PicturePark1101@users.noreply.github.com> Date: Tue, 12 Nov 2024 17:29:24 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[feat]=20=EB=8C=80=ED=95=99=EA=B5=90=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20API=20=EA=B5=AC=ED=98=84=20(#214)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [feat] make command, request DTO * [feat] add static method in UniversityEntity * [feat] implements controller * [feat] implements service * [chore] update submodule * [refactor] change package * [chore] update submodule * [refactor] add a line break --- server-yml | 2 +- .../controller/UniversityController.java | 12 ++++++++++ .../request/UniversitiesPostRequest.java | 7 ++++++ .../service/UniversityCommandService.java | 18 +++++++++++++++ .../university/service/UniversityUpdater.java | 18 +++++++++++++++ .../command/UniversitiesPostCommand.java | 23 +++++++++++++++++++ .../domain/university/model/University.java | 20 +++++++++++++++- 7 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/hankki/hankkiserver/api/university/controller/request/UniversitiesPostRequest.java create mode 100644 src/main/java/org/hankki/hankkiserver/api/university/service/UniversityCommandService.java create mode 100644 src/main/java/org/hankki/hankkiserver/api/university/service/UniversityUpdater.java create mode 100644 src/main/java/org/hankki/hankkiserver/api/university/service/command/UniversitiesPostCommand.java diff --git a/server-yml b/server-yml index 1e7e3c37..ffaf66c6 160000 --- a/server-yml +++ b/server-yml @@ -1 +1 @@ -Subproject commit 1e7e3c37e950d3890bd22b55be8f3d6c91f0a524 +Subproject commit ffaf66c6224b53675d85223154b72999317670d7 diff --git a/src/main/java/org/hankki/hankkiserver/api/university/controller/UniversityController.java b/src/main/java/org/hankki/hankkiserver/api/university/controller/UniversityController.java index e652e481..62dc2308 100644 --- a/src/main/java/org/hankki/hankkiserver/api/university/controller/UniversityController.java +++ b/src/main/java/org/hankki/hankkiserver/api/university/controller/UniversityController.java @@ -2,10 +2,15 @@ import lombok.RequiredArgsConstructor; import org.hankki.hankkiserver.api.dto.HankkiResponse; +import org.hankki.hankkiserver.api.university.controller.request.UniversitiesPostRequest; +import org.hankki.hankkiserver.api.university.service.UniversityCommandService; import org.hankki.hankkiserver.api.university.service.UniversityQueryService; +import org.hankki.hankkiserver.api.university.service.command.UniversitiesPostCommand; import org.hankki.hankkiserver.api.university.service.response.UniversitiesResponse; import org.hankki.hankkiserver.common.code.CommonSuccessCode; 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.RestController; @@ -15,9 +20,16 @@ public class UniversityController { private final UniversityQueryService universityQueryService; + private final UniversityCommandService universityCommandService; @GetMapping("/universities") public HankkiResponse getUniversities() { return HankkiResponse.success(CommonSuccessCode.OK, universityQueryService.findAllByOrderByName()); } + + @PostMapping("/universities") + public HankkiResponse createUniversities(@RequestBody UniversitiesPostRequest universitiesPostRequest) { + universityCommandService.createUniversities(UniversitiesPostCommand.of(universitiesPostRequest)); + return HankkiResponse.success(CommonSuccessCode.CREATED); + } } diff --git a/src/main/java/org/hankki/hankkiserver/api/university/controller/request/UniversitiesPostRequest.java b/src/main/java/org/hankki/hankkiserver/api/university/controller/request/UniversitiesPostRequest.java new file mode 100644 index 00000000..52ec5459 --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/api/university/controller/request/UniversitiesPostRequest.java @@ -0,0 +1,7 @@ +package org.hankki.hankkiserver.api.university.controller.request; + +import java.util.List; + +public record UniversitiesPostRequest(List universities) { + public record UniversityRequest(String name, double longitude, double latitude) { } +} diff --git a/src/main/java/org/hankki/hankkiserver/api/university/service/UniversityCommandService.java b/src/main/java/org/hankki/hankkiserver/api/university/service/UniversityCommandService.java new file mode 100644 index 00000000..1f387b05 --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/api/university/service/UniversityCommandService.java @@ -0,0 +1,18 @@ +package org.hankki.hankkiserver.api.university.service; + +import lombok.RequiredArgsConstructor; +import org.hankki.hankkiserver.api.university.service.command.UniversitiesPostCommand; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class UniversityCommandService { + + private final UniversityUpdater universityUpdater; + + @Transactional + public void createUniversities(UniversitiesPostCommand universitiesPostCommand) { + universityUpdater.saveAll(universitiesPostCommand.toEntityList()); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/api/university/service/UniversityUpdater.java b/src/main/java/org/hankki/hankkiserver/api/university/service/UniversityUpdater.java new file mode 100644 index 00000000..9eb157f6 --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/api/university/service/UniversityUpdater.java @@ -0,0 +1,18 @@ +package org.hankki.hankkiserver.api.university.service; + +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.hankki.hankkiserver.domain.university.model.University; +import org.hankki.hankkiserver.domain.university.repository.UniversityRepository; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class UniversityUpdater { + + private final UniversityRepository universityRepository; + + void saveAll(List universities){ + universityRepository.saveAll(universities); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/api/university/service/command/UniversitiesPostCommand.java b/src/main/java/org/hankki/hankkiserver/api/university/service/command/UniversitiesPostCommand.java new file mode 100644 index 00000000..bf1c13be --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/api/university/service/command/UniversitiesPostCommand.java @@ -0,0 +1,23 @@ +package org.hankki.hankkiserver.api.university.service.command; + +import java.util.List; +import org.hankki.hankkiserver.api.university.controller.request.UniversitiesPostRequest; +import org.hankki.hankkiserver.domain.common.Point; +import org.hankki.hankkiserver.domain.university.model.University; + +public record UniversitiesPostCommand(List universityCommands) { + + record UniversityCommand(String name, double longitude, double latitude) { + University toEntity() { + return University.create(name, new Point(latitude, longitude)); + } + } + + public static UniversitiesPostCommand of(UniversitiesPostRequest universitiesPostRequest) { + return new UniversitiesPostCommand(universitiesPostRequest.universities().stream().map(it -> new UniversityCommand(it.name(), it.longitude(), it.latitude())).toList()); + } + + public List toEntityList() { + return universityCommands.stream().map(UniversityCommand::toEntity).toList(); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/domain/university/model/University.java b/src/main/java/org/hankki/hankkiserver/domain/university/model/University.java index f60cd0b7..238cc3b7 100644 --- a/src/main/java/org/hankki/hankkiserver/domain/university/model/University.java +++ b/src/main/java/org/hankki/hankkiserver/domain/university/model/University.java @@ -1,7 +1,13 @@ package org.hankki.hankkiserver.domain.university.model; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hankki.hankkiserver.domain.common.Point; @@ -22,4 +28,16 @@ public class University { @Column(nullable = false) private String name; + public static University create(String name, Point point) { + return University.builder() + .name(name) + .point(point) + .build(); + } + + @Builder + private University(String name, Point point) { + this.name = name; + this.point = point; + } } From 68baf506b8ef65a8ee480af03fce83e3e93836e2 Mon Sep 17 00:00:00 2001 From: kgy1008 Date: Tue, 12 Nov 2024 22:06:32 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[fix]=20=EC=8B=9D=EB=8B=B9=EC=97=90=20?= =?UTF-8?q?=EB=A9=94=EB=89=B4=201=EA=B0=9C=20=EB=82=A8=EC=95=98=EC=9D=84?= =?UTF-8?q?=20=EB=95=8C=20=EB=A9=94=EB=89=B4=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EC=8B=9C,=20=EC=8B=9D=EB=8B=B9=20=EC=82=AD=EC=A0=9C=20(#216)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [refac] delete store when menu does not exist * [refactor] change wrapper type to primitive * [refactor] add path variable validation * [refactor] change method name --- .../api/menu/controller/MenuController.java | 23 ++++++++++++++----- .../api/menu/service/MenuCommandService.java | 21 +++++++++++++---- .../api/menu/service/MenuFinder.java | 8 +++++-- .../menu/repository/MenuRepository.java | 4 +++- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/hankki/hankkiserver/api/menu/controller/MenuController.java b/src/main/java/org/hankki/hankkiserver/api/menu/controller/MenuController.java index 604b9784..5c5fab9a 100644 --- a/src/main/java/org/hankki/hankkiserver/api/menu/controller/MenuController.java +++ b/src/main/java/org/hankki/hankkiserver/api/menu/controller/MenuController.java @@ -1,6 +1,8 @@ package org.hankki.hankkiserver.api.menu.controller; import jakarta.validation.Valid; +import jakarta.validation.constraints.Min; +import java.util.List; import lombok.RequiredArgsConstructor; import org.hankki.hankkiserver.api.dto.HankkiResponse; import org.hankki.hankkiserver.api.menu.service.MenuCommandService; @@ -11,32 +13,41 @@ import org.hankki.hankkiserver.api.menu.service.response.MenusPostResponse; import org.hankki.hankkiserver.api.store.controller.request.MenuPostRequest; import org.hankki.hankkiserver.common.code.CommonSuccessCode; -import org.springframework.web.bind.annotation.*; - -import java.util.List; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor @RequestMapping("/api/v1") +@Validated public class MenuController { private final MenuCommandService menuCommandService; @DeleteMapping("/{storeId}/menus/{id}") - public HankkiResponse deleteMenu(@PathVariable("storeId") final Long storeId, @PathVariable("id") final Long id) { + public HankkiResponse deleteMenu(@PathVariable("storeId") @Min(value = 1L) final long storeId, + @PathVariable("id") @Min(value = 1L) final long id) { menuCommandService.deleteMenu(MenuDeleteCommand.of(storeId, id)); return HankkiResponse.success(CommonSuccessCode.NO_CONTENT); } @PatchMapping("/{storeId}/menus/{id}") - public HankkiResponse updateMenu(@PathVariable("storeId") final Long storeId, @PathVariable("id") final Long id, + public HankkiResponse updateMenu(@PathVariable("storeId") @Min(value = 1L) final long storeId, + @PathVariable("id") @Min(value = 1L) final long id, @Valid @RequestBody final MenuPostRequest request) { menuCommandService.modifyMenu(MenuPatchCommand.of(storeId, id, request.name(), request.price())); return HankkiResponse.success(CommonSuccessCode.OK); } @PostMapping("{storeId}/menus/bulk") - public HankkiResponse createMenu(@PathVariable final Long storeId, @Valid @RequestBody final List request) { + public HankkiResponse createMenus(@PathVariable @Min(value = 1L) final long storeId, + @Valid @RequestBody final List request) { List command = request.stream() .map(r -> MenuPostCommand.of(r.name(), r.price())) .toList(); diff --git a/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuCommandService.java b/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuCommandService.java index 2ae835bf..55bd49f8 100644 --- a/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuCommandService.java +++ b/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuCommandService.java @@ -1,5 +1,6 @@ package org.hankki.hankkiserver.api.menu.service; +import java.util.List; import lombok.RequiredArgsConstructor; import org.hankki.hankkiserver.api.menu.service.command.MenuDeleteCommand; import org.hankki.hankkiserver.api.menu.service.command.MenuPatchCommand; @@ -11,8 +12,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - @Service @RequiredArgsConstructor public class MenuCommandService { @@ -26,6 +25,10 @@ public class MenuCommandService { public void deleteMenu(final MenuDeleteCommand command) { Menu menu = menuFinder.findByStoreIdAndId(command.storeId(), command.id()); menuDeleter.deleteMenu(menu); + if (emptyMenuInStore(command.storeId())) { + deleteStore(command.storeId()); + return; + } updateLowestPriceInStore(storeFinder.findByIdWhereDeletedIsFalse(command.storeId())); } @@ -48,11 +51,21 @@ public MenusPostResponse createMenus(final MenusPostCommand command) { return MenusPostResponse.of(menus); } + private void deleteStore(final long id) { + Store store = storeFinder.findByIdWhereDeletedIsFalse(id); + store.updateLowestPrice(0); + store.softDelete(); + } + private void updateLowestPriceInStore(final Store findStore) { findStore.updateLowestPrice(menuFinder.findLowestPriceByStore(findStore)); } - private boolean validateMenuConflict(Store store, String menuName) { + private boolean validateMenuConflict(final Store store, final String menuName) { return menuFinder.existsByStoreAndName(store, menuName); } -} \ No newline at end of file + + private boolean emptyMenuInStore(final long storeId) { + return !menuFinder.existsByStoreId(storeId); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuFinder.java b/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuFinder.java index c377896a..56912c7c 100644 --- a/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuFinder.java +++ b/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuFinder.java @@ -20,7 +20,7 @@ public List findAllByStore(final Store store) { return menuRepository.findAllByStore(store); } - protected Menu findByStoreIdAndId(final Long storeId, final Long id) { + protected Menu findByStoreIdAndId(final long storeId, final long id) { return menuRepository.findByStoreIdAndId(storeId,id).orElseThrow(() -> new NotFoundException(MenuErrorCode.MENU_NOT_FOUND)); } @@ -28,7 +28,11 @@ protected boolean existsByStoreAndName(final Store store, final String name) { return menuRepository.existsByStoreAndName(store, name); } - protected int findLowestPriceByStore(Store store) { + protected int findLowestPriceByStore(final Store store) { return menuRepository.findLowestPriceByStore(store); } + + protected boolean existsByStoreId(final long storeId) { + return menuRepository.existsByStoreId(storeId); + } } diff --git a/src/main/java/org/hankki/hankkiserver/domain/menu/repository/MenuRepository.java b/src/main/java/org/hankki/hankkiserver/domain/menu/repository/MenuRepository.java index 26f4e210..97e1c87d 100644 --- a/src/main/java/org/hankki/hankkiserver/domain/menu/repository/MenuRepository.java +++ b/src/main/java/org/hankki/hankkiserver/domain/menu/repository/MenuRepository.java @@ -10,9 +10,11 @@ public interface MenuRepository extends JpaRepository { List findAllByStore(Store store); - Optional findByStoreIdAndId(Long storeId, Long id); + Optional findByStoreIdAndId(long storeId, long id); boolean existsByStoreAndName(Store store, String name); @Query("SELECT MIN(m.price) FROM Menu m WHERE m.store = :store") int findLowestPriceByStore(Store store); + + boolean existsByStoreId(long storeId); } From 963655d67f806b435d04250def05fe4f5c35efdd Mon Sep 17 00:00:00 2001 From: kgy1008 Date: Wed, 13 Nov 2024 21:55:52 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[feat]=20=EC=8B=9D=EB=8B=B9=20Id=EB=A1=9C?= =?UTF-8?q?=20=EB=A9=94=EB=89=B4=20=EB=AA=A9=EB=A1=9D=20=EB=B6=88=EB=9F=AC?= =?UTF-8?q?=EC=98=A4=EA=B8=B0=20(#218)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [feat] get menu list of store * [refactor] change to primitive type * [refactor] add '/' * [refactor] transfer logic to dto * [refactor] add path variable validation * [refactor] add exception * [refactor] change store delete query * [refactor] divide method * [refactor] change method name * [refactor] put data in deletedMenu Repository * [refactor] delete unused method * [refactor] change variable name * [fix] save deleted menu when menu deleted --- .../api/advice/GlobalExceptionHandler.java | 12 ++++- .../api/menu/controller/MenuController.java | 22 ++++++--- .../api/menu/service/DeletedMenuUpdater.java | 17 +++++++ .../api/menu/service/MenuCommandService.java | 38 +++++++++----- .../api/menu/service/MenuFinder.java | 3 +- .../service/command/MenuDeleteCommand.java | 7 +-- .../service/response/MenuGetResponse.java | 13 +++++ .../service/response/MenusGetResponse.java | 15 ++++++ .../api/store/service/StoreUpdater.java | 8 +++ .../domain/menu/model/DeletedMenu.java | 49 +++++++++++++++++++ .../repository/DeletedMenuRepository.java | 7 +++ .../menu/repository/MenuRepository.java | 2 +- 12 files changed, 170 insertions(+), 23 deletions(-) create mode 100644 src/main/java/org/hankki/hankkiserver/api/menu/service/DeletedMenuUpdater.java create mode 100644 src/main/java/org/hankki/hankkiserver/api/menu/service/response/MenuGetResponse.java create mode 100644 src/main/java/org/hankki/hankkiserver/api/menu/service/response/MenusGetResponse.java create mode 100644 src/main/java/org/hankki/hankkiserver/domain/menu/model/DeletedMenu.java create mode 100644 src/main/java/org/hankki/hankkiserver/domain/menu/repository/DeletedMenuRepository.java diff --git a/src/main/java/org/hankki/hankkiserver/api/advice/GlobalExceptionHandler.java b/src/main/java/org/hankki/hankkiserver/api/advice/GlobalExceptionHandler.java index fc1ac00a..1858acec 100644 --- a/src/main/java/org/hankki/hankkiserver/api/advice/GlobalExceptionHandler.java +++ b/src/main/java/org/hankki/hankkiserver/api/advice/GlobalExceptionHandler.java @@ -1,11 +1,15 @@ package org.hankki.hankkiserver.api.advice; +import jakarta.validation.ConstraintViolationException; import lombok.extern.slf4j.Slf4j; import org.hankki.hankkiserver.api.dto.HankkiResponse; import org.hankki.hankkiserver.common.code.BusinessErrorCode; import org.hankki.hankkiserver.common.code.StoreErrorCode; import org.hankki.hankkiserver.common.code.StoreImageErrorCode; -import org.hankki.hankkiserver.common.exception.*; +import org.hankki.hankkiserver.common.exception.BadRequestException; +import org.hankki.hankkiserver.common.exception.ConflictException; +import org.hankki.hankkiserver.common.exception.NotFoundException; +import org.hankki.hankkiserver.common.exception.UnauthorizedException; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -98,4 +102,10 @@ public HankkiResponse handleException(Exception e) { log.error("[500] INTERNAL SERVER ERROR({}) : {}",e.getClass() , e.getMessage()); return HankkiResponse.fail(BusinessErrorCode.INTERNAL_SERVER_ERROR); } + + @ExceptionHandler(ConstraintViolationException.class) + public HankkiResponse handleConstraintViolationException(ConstraintViolationException e) { + log.warn("handleConstraintViolationException() in GlobalExceptionHandler throw ConstraintViolationException : {}", e.getMessage()); + return HankkiResponse.fail(BusinessErrorCode.BAD_REQUEST); + } } diff --git a/src/main/java/org/hankki/hankkiserver/api/menu/controller/MenuController.java b/src/main/java/org/hankki/hankkiserver/api/menu/controller/MenuController.java index 5c5fab9a..589a2092 100644 --- a/src/main/java/org/hankki/hankkiserver/api/menu/controller/MenuController.java +++ b/src/main/java/org/hankki/hankkiserver/api/menu/controller/MenuController.java @@ -10,11 +10,14 @@ import org.hankki.hankkiserver.api.menu.service.command.MenuPatchCommand; import org.hankki.hankkiserver.api.menu.service.command.MenuPostCommand; import org.hankki.hankkiserver.api.menu.service.command.MenusPostCommand; +import org.hankki.hankkiserver.api.menu.service.response.MenusGetResponse; import org.hankki.hankkiserver.api.menu.service.response.MenusPostResponse; import org.hankki.hankkiserver.api.store.controller.request.MenuPostRequest; +import org.hankki.hankkiserver.auth.UserId; import org.hankki.hankkiserver.common.code.CommonSuccessCode; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -32,8 +35,9 @@ public class MenuController { @DeleteMapping("/{storeId}/menus/{id}") public HankkiResponse deleteMenu(@PathVariable("storeId") @Min(value = 1L) final long storeId, - @PathVariable("id") @Min(value = 1L) final long id) { - menuCommandService.deleteMenu(MenuDeleteCommand.of(storeId, id)); + @PathVariable("id") @Min(value = 1L) final long id, + @UserId final Long userId) { + menuCommandService.deleteMenu(MenuDeleteCommand.of(storeId, id, userId)); return HankkiResponse.success(CommonSuccessCode.NO_CONTENT); } @@ -45,12 +49,18 @@ public HankkiResponse updateMenu(@PathVariable("storeId") @Min(value = 1L) return HankkiResponse.success(CommonSuccessCode.OK); } - @PostMapping("{storeId}/menus/bulk") - public HankkiResponse createMenus(@PathVariable @Min(value = 1L) final long storeId, - @Valid @RequestBody final List request) { + @PostMapping("/{storeId}/menus/bulk") + public HankkiResponse createMenu(@PathVariable @Min(value = 1L) final long storeId, + @Valid @RequestBody final List request) { List command = request.stream() .map(r -> MenuPostCommand.of(r.name(), r.price())) .toList(); - return HankkiResponse.success(CommonSuccessCode.CREATED, menuCommandService.createMenus(MenusPostCommand.of(storeId, command))); + return HankkiResponse.success(CommonSuccessCode.CREATED, + menuCommandService.createMenus(MenusPostCommand.of(storeId, command))); + } + + @GetMapping("/{storeId}/menus") + public HankkiResponse getMenus(@PathVariable @Min(value = 1L) final long storeId) { + return HankkiResponse.success(CommonSuccessCode.OK, menuCommandService.getMenus(storeId)); } } diff --git a/src/main/java/org/hankki/hankkiserver/api/menu/service/DeletedMenuUpdater.java b/src/main/java/org/hankki/hankkiserver/api/menu/service/DeletedMenuUpdater.java new file mode 100644 index 00000000..acdaf770 --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/api/menu/service/DeletedMenuUpdater.java @@ -0,0 +1,17 @@ +package org.hankki.hankkiserver.api.menu.service; + +import lombok.RequiredArgsConstructor; +import org.hankki.hankkiserver.domain.menu.model.DeletedMenu; +import org.hankki.hankkiserver.domain.menu.repository.DeletedMenuRepository; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class DeletedMenuUpdater { + + private final DeletedMenuRepository deletedMenuRepository; + + public void save(final DeletedMenu deletedMenu) { + deletedMenuRepository.save(deletedMenu); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuCommandService.java b/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuCommandService.java index 55bd49f8..134d027a 100644 --- a/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuCommandService.java +++ b/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuCommandService.java @@ -5,10 +5,15 @@ import org.hankki.hankkiserver.api.menu.service.command.MenuDeleteCommand; import org.hankki.hankkiserver.api.menu.service.command.MenuPatchCommand; import org.hankki.hankkiserver.api.menu.service.command.MenusPostCommand; +import org.hankki.hankkiserver.api.menu.service.response.MenusGetResponse; import org.hankki.hankkiserver.api.menu.service.response.MenusPostResponse; import org.hankki.hankkiserver.api.store.service.StoreFinder; +import org.hankki.hankkiserver.api.store.service.StoreUpdater; +import org.hankki.hankkiserver.domain.menu.model.DeletedMenu; import org.hankki.hankkiserver.domain.menu.model.Menu; import org.hankki.hankkiserver.domain.store.model.Store; +import org.hankki.hankkiserver.event.EventPublisher; +import org.hankki.hankkiserver.event.store.DeleteStoreEvent; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -20,16 +25,18 @@ public class MenuCommandService { private final MenuFinder menuFinder; private final MenuUpdater menuUpdater; private final StoreFinder storeFinder; + private final StoreUpdater storeUpdater; + private final DeletedMenuUpdater deletedMenuUpdater; + private final EventPublisher publisher; @Transactional public void deleteMenu(final MenuDeleteCommand command) { - Menu menu = menuFinder.findByStoreIdAndId(command.storeId(), command.id()); + Store findStore = storeFinder.findByIdWhereDeletedIsFalse(command.storeId()); + Menu menu = menuFinder.findByStoreIdAndId(findStore.getId(), command.id()); menuDeleter.deleteMenu(menu); - if (emptyMenuInStore(command.storeId())) { - deleteStore(command.storeId()); - return; - } + saveToDeletedMenu(menu, findStore.getId()); updateLowestPriceInStore(storeFinder.findByIdWhereDeletedIsFalse(command.storeId())); + checkNoMenuInStore(findStore, command.userId()); } @Transactional @@ -51,10 +58,11 @@ public MenusPostResponse createMenus(final MenusPostCommand command) { return MenusPostResponse.of(menus); } - private void deleteStore(final long id) { - Store store = storeFinder.findByIdWhereDeletedIsFalse(id); - store.updateLowestPrice(0); - store.softDelete(); + @Transactional(readOnly = true) + public MenusGetResponse getMenus(final long storeId) { + Store findStore = storeFinder.findByIdWhereDeletedIsFalse(storeId); + List findMenus = menuFinder.findAllByStore(findStore); + return MenusGetResponse.of(findMenus); } private void updateLowestPriceInStore(final Store findStore) { @@ -65,7 +73,15 @@ private boolean validateMenuConflict(final Store store, final String menuName) { return menuFinder.existsByStoreAndName(store, menuName); } - private boolean emptyMenuInStore(final long storeId) { - return !menuFinder.existsByStoreId(storeId); + private void checkNoMenuInStore(final Store store, final long userId) { + if (!menuFinder.existsByStoreId(store.getId())) { + storeUpdater.deleteStore(store.getId()); + publisher.publish(DeleteStoreEvent.of(store.getName(), userId)); + } + } + + private void saveToDeletedMenu(final Menu menu, final long storedId) { + DeletedMenu deletedMenu = DeletedMenu.create(menu.getName(), menu.getPrice(), storedId); + deletedMenuUpdater.save(deletedMenu); } } diff --git a/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuFinder.java b/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuFinder.java index 56912c7c..c0e949a8 100644 --- a/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuFinder.java +++ b/src/main/java/org/hankki/hankkiserver/api/menu/service/MenuFinder.java @@ -21,7 +21,8 @@ public List findAllByStore(final Store store) { } protected Menu findByStoreIdAndId(final long storeId, final long id) { - return menuRepository.findByStoreIdAndId(storeId,id).orElseThrow(() -> new NotFoundException(MenuErrorCode.MENU_NOT_FOUND)); + return menuRepository.findByStoreIdAndId(storeId,id) + .orElseThrow(() -> new NotFoundException(MenuErrorCode.MENU_NOT_FOUND)); } protected boolean existsByStoreAndName(final Store store, final String name) { diff --git a/src/main/java/org/hankki/hankkiserver/api/menu/service/command/MenuDeleteCommand.java b/src/main/java/org/hankki/hankkiserver/api/menu/service/command/MenuDeleteCommand.java index bfc3f2ff..eccabc68 100644 --- a/src/main/java/org/hankki/hankkiserver/api/menu/service/command/MenuDeleteCommand.java +++ b/src/main/java/org/hankki/hankkiserver/api/menu/service/command/MenuDeleteCommand.java @@ -2,9 +2,10 @@ public record MenuDeleteCommand( long storeId, - long id + long id, + long userId ) { - public static MenuDeleteCommand of(long storeId, long id) { - return new MenuDeleteCommand(storeId, id); + public static MenuDeleteCommand of(long storeId, long id, long userId) { + return new MenuDeleteCommand(storeId, id, userId); } } diff --git a/src/main/java/org/hankki/hankkiserver/api/menu/service/response/MenuGetResponse.java b/src/main/java/org/hankki/hankkiserver/api/menu/service/response/MenuGetResponse.java new file mode 100644 index 00000000..9c4b6eb5 --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/api/menu/service/response/MenuGetResponse.java @@ -0,0 +1,13 @@ +package org.hankki.hankkiserver.api.menu.service.response; + +import org.hankki.hankkiserver.domain.menu.model.Menu; + +public record MenuGetResponse ( + long id, + int price, + String name +){ + public static MenuGetResponse of(final Menu menu) { + return new MenuGetResponse(menu.getId(), menu.getPrice(), menu.getName()); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/api/menu/service/response/MenusGetResponse.java b/src/main/java/org/hankki/hankkiserver/api/menu/service/response/MenusGetResponse.java new file mode 100644 index 00000000..9493ca74 --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/api/menu/service/response/MenusGetResponse.java @@ -0,0 +1,15 @@ +package org.hankki.hankkiserver.api.menu.service.response; + +import java.util.List; +import org.hankki.hankkiserver.domain.menu.model.Menu; + +public record MenusGetResponse( + List menus +) { + public static MenusGetResponse of(final List menus) { + List findmenus = menus.stream() + .map(MenuGetResponse::of) + .toList(); + return new MenusGetResponse(findmenus); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/api/store/service/StoreUpdater.java b/src/main/java/org/hankki/hankkiserver/api/store/service/StoreUpdater.java index 93141e50..e098521f 100644 --- a/src/main/java/org/hankki/hankkiserver/api/store/service/StoreUpdater.java +++ b/src/main/java/org/hankki/hankkiserver/api/store/service/StoreUpdater.java @@ -1,6 +1,8 @@ package org.hankki.hankkiserver.api.store.service; import lombok.RequiredArgsConstructor; +import org.hankki.hankkiserver.common.code.StoreErrorCode; +import org.hankki.hankkiserver.common.exception.NotFoundException; import org.hankki.hankkiserver.domain.store.model.Store; import org.hankki.hankkiserver.domain.store.repository.StoreRepository; import org.springframework.stereotype.Component; @@ -14,4 +16,10 @@ public class StoreUpdater { public Store save(final Store store) { return storeRepository.save(store); } + + public void deleteStore(final Long id) { + Store store = storeRepository.findByIdAndIsDeletedIsFalse(id) + .orElseThrow(() -> new NotFoundException(StoreErrorCode.STORE_NOT_FOUND)); + store.softDelete(); + } } diff --git a/src/main/java/org/hankki/hankkiserver/domain/menu/model/DeletedMenu.java b/src/main/java/org/hankki/hankkiserver/domain/menu/model/DeletedMenu.java new file mode 100644 index 00000000..b4741edc --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/domain/menu/model/DeletedMenu.java @@ -0,0 +1,49 @@ +package org.hankki.hankkiserver.domain.menu.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hankki.hankkiserver.domain.common.BaseCreatedAtEntity; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "deleted_menu") +public class DeletedMenu extends BaseCreatedAtEntity { + + @Id + @Column(name = "deleted_menu_id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "name", nullable = false) + private String name; + + @Column(name = "price", nullable = false) + private int price; + + @Column(name = "store_id", nullable = false) + private Long storeId; + + @Builder + private DeletedMenu(final String name, final int price, final Long storeId) { + this.name = name; + this.price = price; + this.storeId = storeId; + } + + public static DeletedMenu create(final String name, final int price, final Long storeId) { + return DeletedMenu.builder() + .name(name) + .price(price) + .storeId(storeId) + .build(); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/domain/menu/repository/DeletedMenuRepository.java b/src/main/java/org/hankki/hankkiserver/domain/menu/repository/DeletedMenuRepository.java new file mode 100644 index 00000000..6e31f469 --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/domain/menu/repository/DeletedMenuRepository.java @@ -0,0 +1,7 @@ +package org.hankki.hankkiserver.domain.menu.repository; + +import org.hankki.hankkiserver.domain.menu.model.DeletedMenu; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface DeletedMenuRepository extends JpaRepository { +} diff --git a/src/main/java/org/hankki/hankkiserver/domain/menu/repository/MenuRepository.java b/src/main/java/org/hankki/hankkiserver/domain/menu/repository/MenuRepository.java index 97e1c87d..f23c6f14 100644 --- a/src/main/java/org/hankki/hankkiserver/domain/menu/repository/MenuRepository.java +++ b/src/main/java/org/hankki/hankkiserver/domain/menu/repository/MenuRepository.java @@ -13,7 +13,7 @@ public interface MenuRepository extends JpaRepository { Optional findByStoreIdAndId(long storeId, long id); boolean existsByStoreAndName(Store store, String name); - @Query("SELECT MIN(m.price) FROM Menu m WHERE m.store = :store") + @Query("SELECT COALESCE(MIN(m.price), 0) FROM Menu m WHERE m.store = :store") int findLowestPriceByStore(Store store); boolean existsByStoreId(long storeId); From ee814a3cde657bca6d9af384e8ff458c849614f5 Mon Sep 17 00:00:00 2001 From: kgy1008 Date: Thu, 14 Nov 2024 22:38:06 +0900 Subject: [PATCH 5/5] [refac] change variable name (#220) --- .../api/menu/service/response/MenusPostResponse.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/hankki/hankkiserver/api/menu/service/response/MenusPostResponse.java b/src/main/java/org/hankki/hankkiserver/api/menu/service/response/MenusPostResponse.java index 41126d8d..3276786d 100644 --- a/src/main/java/org/hankki/hankkiserver/api/menu/service/response/MenusPostResponse.java +++ b/src/main/java/org/hankki/hankkiserver/api/menu/service/response/MenusPostResponse.java @@ -5,7 +5,7 @@ import java.util.List; public record MenusPostResponse( - List menuList + List menus ) { public static MenusPostResponse of(List menus) { List menuResponses = menus.stream() @@ -13,4 +13,4 @@ public static MenusPostResponse of(List menus) { .toList(); return new MenusPostResponse(menuResponses); } -} \ No newline at end of file +}