diff --git a/server-yml b/server-yml index 0ec6f37d..ffaf66c6 160000 --- a/server-yml +++ b/server-yml @@ -1 +1 @@ -Subproject commit 0ec6f37d33e106d28a6d3b33c1653546da1b1641 +Subproject commit ffaf66c6224b53675d85223154b72999317670d7 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 604b9784..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 @@ -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; @@ -8,38 +10,57 @@ 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.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.GetMapping; +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) { - menuCommandService.deleteMenu(MenuDeleteCommand.of(storeId, id)); + public HankkiResponse deleteMenu(@PathVariable("storeId") @Min(value = 1L) final long storeId, + @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); } @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) { + @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 2ae835bf..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 @@ -1,18 +1,22 @@ 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; 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; -import java.util.List; - @Service @RequiredArgsConstructor public class MenuCommandService { @@ -21,12 +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); + saveToDeletedMenu(menu, findStore.getId()); updateLowestPriceInStore(storeFinder.findByIdWhereDeletedIsFalse(command.storeId())); + checkNoMenuInStore(findStore, command.userId()); } @Transactional @@ -48,11 +58,30 @@ public MenusPostResponse createMenus(final MenusPostCommand command) { return MenusPostResponse.of(menus); } + @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) { 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 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 c377896a..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 @@ -20,15 +20,20 @@ public List findAllByStore(final Store store) { return menuRepository.findAllByStore(store); } - protected Menu findByStoreIdAndId(final Long storeId, final Long id) { - return menuRepository.findByStoreIdAndId(storeId,id).orElseThrow(() -> new NotFoundException(MenuErrorCode.MENU_NOT_FOUND)); + protected Menu findByStoreIdAndId(final long storeId, final long id) { + return menuRepository.findByStoreIdAndId(storeId,id) + .orElseThrow(() -> new NotFoundException(MenuErrorCode.MENU_NOT_FOUND)); } 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/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/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 +} 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/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/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 26f4e210..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 @@ -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") + @Query("SELECT COALESCE(MIN(m.price), 0) FROM Menu m WHERE m.store = :store") int findLowestPriceByStore(Store store); + + boolean existsByStoreId(long storeId); } 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; + } }