diff --git a/api-admin/src/main/java/com/example/apiadmin/menu/controller/MenuController.java b/api-admin/src/main/java/com/example/apiadmin/menu/controller/MenuController.java index eb7523b7..bc709367 100644 --- a/api-admin/src/main/java/com/example/apiadmin/menu/controller/MenuController.java +++ b/api-admin/src/main/java/com/example/apiadmin/menu/controller/MenuController.java @@ -2,7 +2,9 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +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; @@ -11,6 +13,7 @@ import com.example.apiadmin.menu.dto.MenuCreateRequest; import com.example.apiadmin.menu.dto.MenuCreateResponse; +import com.example.apiadmin.menu.dto.MenuUpdateRequest; import com.example.apiadmin.menu.service.MenuService; import com.nowaiting.common.api.ApiUtils; @@ -43,7 +46,58 @@ public ResponseEntity getMenusByStoreId(@PathVariable Long storeId) { .status(HttpStatus.OK) .body( ApiUtils.success( - menuService.getMenusByStoreId(storeId) + menuService.getAllMenusByStoreId(storeId) + ) + ); + } + + @GetMapping("/{storeId}/{menuId}") + public ResponseEntity getMenuById( + @PathVariable Long storeId, + @PathVariable Long menuId + ) { + return ResponseEntity + .status(HttpStatus.OK) + .body( + ApiUtils.success( + menuService.getMenuById(storeId, menuId) + ) + ); + } + + + @PatchMapping("/update/{menuId}") + public ResponseEntity updateMenu( + @PathVariable Long menuId, + @Valid @RequestBody MenuUpdateRequest request + ) { + return ResponseEntity + .status(HttpStatus.OK) + .body( + ApiUtils.success( + menuService.updateMenu(menuId, request) + ) + ); + } + + @DeleteMapping("/delete/{menuId}") + public ResponseEntity deleteMenu(@PathVariable Long menuId) { + return ResponseEntity + .status(HttpStatus.OK) + .body( + ApiUtils.success( + menuService.deleteMenu(menuId) + ) + ); + } + + @PatchMapping("/toggle-soldout/{menuId}") + public ResponseEntity toggleSoldOut(@PathVariable Long menuId) { + return ResponseEntity + .status(HttpStatus.OK) + .body( + ApiUtils.success( + menuService.toggleSoldOut(menuId) ) ); } diff --git a/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuCreateRequest.java b/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuCreateRequest.java index 518dd06b..3dc462d2 100644 --- a/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuCreateRequest.java +++ b/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuCreateRequest.java @@ -28,6 +28,8 @@ public Menu toEntity() { .name(name) .description(description) .price(price) + .isSoldOut(false) + .deleted(false) .build(); } } diff --git a/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuCreateResponse.java b/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuCreateResponse.java index fccba560..c2d59e7f 100644 --- a/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuCreateResponse.java +++ b/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuCreateResponse.java @@ -17,6 +17,8 @@ public class MenuCreateResponse { private String name; private String description; private Integer price; + private Boolean isSoldOut; + private Boolean deleted; private LocalDateTime createdAt; public static MenuCreateResponse fromEntity(Menu menu) { @@ -27,6 +29,8 @@ public static MenuCreateResponse fromEntity(Menu menu) { .name(menu.getName()) .description(menu.getDescription()) .price(menu.getPrice()) + .isSoldOut(menu.getIsSoldOut()) + .deleted(menu.getDeleted()) .build(); } } diff --git a/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuReadDto.java b/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuReadDto.java index 17fd26ee..c369f0fc 100644 --- a/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuReadDto.java +++ b/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuReadDto.java @@ -17,6 +17,8 @@ public class MenuReadDto { private String name; private String description; private Integer price; + private Boolean isSoldOut; + private Boolean deleted; private List images; public static MenuReadDto fromEntity(Menu menu, List images) { @@ -26,6 +28,8 @@ public static MenuReadDto fromEntity(Menu menu, List im .name(menu.getName()) .description(menu.getDescription()) .price(menu.getPrice()) + .isSoldOut(menu.getIsSoldOut()) + .deleted(menu.getDeleted()) .images(images) .build(); } diff --git a/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuUpdateRequest.java b/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuUpdateRequest.java new file mode 100644 index 00000000..bdee0e15 --- /dev/null +++ b/api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuUpdateRequest.java @@ -0,0 +1,16 @@ +package com.example.apiadmin.menu.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class MenuUpdateRequest { + private String name; + private String description; + private Integer price; +} diff --git a/api-admin/src/main/java/com/example/apiadmin/menu/service/MenuService.java b/api-admin/src/main/java/com/example/apiadmin/menu/service/MenuService.java index eedb55a8..cf8fde2d 100644 --- a/api-admin/src/main/java/com/example/apiadmin/menu/service/MenuService.java +++ b/api-admin/src/main/java/com/example/apiadmin/menu/service/MenuService.java @@ -10,6 +10,7 @@ import com.example.apiadmin.menu.dto.MenuImageUploadResponse; import com.example.apiadmin.menu.dto.MenuReadDto; import com.example.apiadmin.menu.dto.MenuReadResponse; +import com.example.apiadmin.menu.dto.MenuUpdateRequest; import com.example.menu.entity.Menu; import com.example.menu.entity.MenuImage; import com.example.menu.repository.MenuImageRepository; @@ -34,10 +35,10 @@ public MenuCreateResponse createMenu(MenuCreateRequest request) { } @Transactional(readOnly = true) - public MenuReadResponse getMenusByStoreId(Long storeId) { - List menus = menuRepository.findAllByStoreId(storeId); + public MenuReadResponse getAllMenusByStoreId(Long storeId) { + List menus = menuRepository.findAllByStoreIdAndDeletedFalse(storeId); - List menuReadRespons = menus.stream() + List menuReadResponse = menus.stream() .map(menu -> { List images = menuImageRepository.findByMenu(menu); List imageDto = images.stream() @@ -47,6 +48,63 @@ public MenuReadResponse getMenusByStoreId(Long storeId) { }) .toList(); - return MenuReadResponse.of(menuReadRespons); + return MenuReadResponse.of(menuReadResponse); } + + @Transactional(readOnly = true) + public MenuReadDto getMenuById(Long storeId, Long menuId) { + Menu menu = menuRepository.findByStoreIdAndIdAndDeletedFalse(storeId, menuId) + .orElseThrow(() -> new IllegalArgumentException("Menu not found with id: " + menuId)); + + List images = menuImageRepository.findByMenu(menu); + List imageDto = images.stream() + .map(MenuImageUploadResponse::fromEntity) + .toList(); + + return MenuReadDto.fromEntity(menu, imageDto); + } + + + @Transactional + public MenuReadDto updateMenu(Long menuId, MenuUpdateRequest request) { + Menu menu = menuRepository.findByIdAndDeletedFalse(menuId) + .orElseThrow(() -> new IllegalArgumentException("Menu not found with id: " + menuId)); + + menu.updateInfo( + request.getName(), + request.getDescription(), + request.getPrice() + ); + + Menu saved = menuRepository.save(menu); + + List images = menuImageRepository.findByMenu(saved); + List imageDto = images.stream() + .map(MenuImageUploadResponse::fromEntity) + .toList(); + + return MenuReadDto.fromEntity(saved, imageDto); + } + + @Transactional + public String deleteMenu(Long menuId) { + Menu menu = menuRepository.findById(menuId) + .orElseThrow(() -> new IllegalArgumentException("Menu is already deleted with id: " + menuId)); + + menu.markAsDeleted(); + menuRepository.save(menu); + + return "Menu with ID " + menuId + " 삭제되었습니다."; + } + + @Transactional + public Boolean toggleSoldOut(Long menuId) { + Menu menu = menuRepository.findById(menuId) + .orElseThrow(() -> new IllegalArgumentException("해당 메뉴가 존재하지 않습니다.")); + + menu.toggleSoldOut(); + menuRepository.save(menu); + return menu.getIsSoldOut(); + } + } diff --git a/api-admin/src/main/java/com/example/apiadmin/store/controller/StoreController.java b/api-admin/src/main/java/com/example/apiadmin/store/controller/StoreController.java index 29824348..fac4a429 100644 --- a/api-admin/src/main/java/com/example/apiadmin/store/controller/StoreController.java +++ b/api-admin/src/main/java/com/example/apiadmin/store/controller/StoreController.java @@ -40,17 +40,6 @@ public ResponseEntity createStore(@Valid @RequestBody StoreCreateRequest requ ); } - @GetMapping("/all-stores") - public ResponseEntity getAllStores() { - return ResponseEntity - .status(HttpStatus.OK) - .body( - ApiUtils.success( - storeService.getAllStores() - ) - ); - } - @GetMapping("/{storeId}") public ResponseEntity getStoreById(@PathVariable Long storeId) { return ResponseEntity @@ -86,4 +75,15 @@ public ResponseEntity deleteStore(@PathVariable Long storeId) { ) ); } + + @PatchMapping("/toggle-active/{storeId}") + public ResponseEntity toggleActive(@PathVariable Long storeId) { + return ResponseEntity + .status(HttpStatus.OK) + .body( + ApiUtils.success( + storeService.toggleActive(storeId) + ) + ); + } } diff --git a/api-admin/src/main/java/com/example/apiadmin/store/controller/StoreImageController.java b/api-admin/src/main/java/com/example/apiadmin/store/controller/StoreImageController.java index 531a1bea..61bfbb34 100644 --- a/api-admin/src/main/java/com/example/apiadmin/store/controller/StoreImageController.java +++ b/api-admin/src/main/java/com/example/apiadmin/store/controller/StoreImageController.java @@ -28,8 +28,7 @@ public class StoreImageController { @PostMapping("/store-images/{storeId}") public ResponseEntity uploadStoreImage( @PathVariable Long storeId, - @RequestParam("files") List files, - @RequestParam(value = "types") List types + @RequestParam("files") List files ) { // TODO 관련 정책 확정되면 메서드로 분리 예정 // 파일 개수 제한 검증 @@ -46,7 +45,7 @@ public ResponseEntity uploadStoreImage( } } - List response = storeImageService.saveAll(storeId, files, types); + List response = storeImageService.saveAll(storeId, files); return ResponseEntity .status(HttpStatus.CREATED) .body( diff --git a/api-admin/src/main/java/com/example/apiadmin/store/dto/StoreImageUploadResponse.java b/api-admin/src/main/java/com/example/apiadmin/store/dto/StoreImageUploadResponse.java index 998dd0b5..bbc1d9da 100644 --- a/api-admin/src/main/java/com/example/apiadmin/store/dto/StoreImageUploadResponse.java +++ b/api-admin/src/main/java/com/example/apiadmin/store/dto/StoreImageUploadResponse.java @@ -10,13 +10,11 @@ public class StoreImageUploadResponse { private final Long id; private final String imageUrl; - private final String type; public static StoreImageUploadResponse fromEntity(StoreImage storeImage) { return StoreImageUploadResponse.builder() .id(storeImage.getId()) .imageUrl(storeImage.getImageUrl()) - .type(storeImage.getType()) .build(); } } diff --git a/api-admin/src/main/java/com/example/apiadmin/store/dto/StoreReadResponse.java b/api-admin/src/main/java/com/example/apiadmin/store/dto/StoreReadResponse.java deleted file mode 100644 index 5e5d0ebb..00000000 --- a/api-admin/src/main/java/com/example/apiadmin/store/dto/StoreReadResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.apiadmin.store.dto; - -import java.util.List; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@AllArgsConstructor -@Builder -public class StoreReadResponse { - - private List storeReadDtos; - private boolean hasNext; - - public static StoreReadResponse of(List storeReadDtos, boolean hasNext) { - return StoreReadResponse.builder() - .storeReadDtos(storeReadDtos) - .hasNext(hasNext) - .build(); - } -} diff --git a/api-admin/src/main/java/com/example/apiadmin/store/dto/StoreUpdateRequest.java b/api-admin/src/main/java/com/example/apiadmin/store/dto/StoreUpdateRequest.java index cd104115..bbe0dfdc 100644 --- a/api-admin/src/main/java/com/example/apiadmin/store/dto/StoreUpdateRequest.java +++ b/api-admin/src/main/java/com/example/apiadmin/store/dto/StoreUpdateRequest.java @@ -13,5 +13,4 @@ public class StoreUpdateRequest { private String name; private String location; private String description; - private Boolean isActive; } diff --git a/api-admin/src/main/java/com/example/apiadmin/store/service/StoreImageService.java b/api-admin/src/main/java/com/example/apiadmin/store/service/StoreImageService.java index 330f0f9c..1c7bafb4 100644 --- a/api-admin/src/main/java/com/example/apiadmin/store/service/StoreImageService.java +++ b/api-admin/src/main/java/com/example/apiadmin/store/service/StoreImageService.java @@ -28,10 +28,7 @@ public class StoreImageService { private final S3Service s3Service; @Transactional - public List saveAll(Long storeId, List files, List types) { - if (files.size() != types.size()) { - throw new IllegalArgumentException("파일과 타입의 개수가 일치해야 합니다."); - } + public List saveAll(Long storeId, List files) { String type = "store"; Store store = storeRepository.findById(storeId) @@ -61,7 +58,6 @@ public List saveAll(Long storeId, List .store(store) .imageUrl(uploadResult.url()) .fileKey(uploadResult.key()) - .type(types.get(i)) .build(); storeImageRepository.save(storeImage); diff --git a/api-admin/src/main/java/com/example/apiadmin/store/service/StoreService.java b/api-admin/src/main/java/com/example/apiadmin/store/service/StoreService.java index 00ee1e4a..6b230d4b 100644 --- a/api-admin/src/main/java/com/example/apiadmin/store/service/StoreService.java +++ b/api-admin/src/main/java/com/example/apiadmin/store/service/StoreService.java @@ -3,19 +3,17 @@ import com.example.apiadmin.store.dto.StoreCreateRequest; import com.example.apiadmin.store.dto.StoreCreateResponse; import com.example.apiadmin.store.dto.StoreReadDto; -import com.example.apiadmin.store.dto.StoreReadResponse; import com.example.apiadmin.store.dto.StoreUpdateRequest; public interface StoreService { StoreCreateResponse createStore(StoreCreateRequest request); - StoreReadResponse getAllStores(); - StoreReadDto getStoreByStoreId(Long storeId); StoreReadDto updateStore(Long storeId, StoreUpdateRequest request); String deleteStore(Long storeId); + Boolean toggleActive(Long storeId); } diff --git a/api-admin/src/main/java/com/example/apiadmin/store/service/StoreServiceImpl.java b/api-admin/src/main/java/com/example/apiadmin/store/service/StoreServiceImpl.java index fa04162e..ee7be676 100644 --- a/api-admin/src/main/java/com/example/apiadmin/store/service/StoreServiceImpl.java +++ b/api-admin/src/main/java/com/example/apiadmin/store/service/StoreServiceImpl.java @@ -9,7 +9,6 @@ import com.example.apiadmin.store.dto.StoreCreateResponse; import com.example.apiadmin.store.dto.StoreImageUploadResponse; import com.example.apiadmin.store.dto.StoreReadDto; -import com.example.apiadmin.store.dto.StoreReadResponse; import com.example.apiadmin.store.dto.StoreUpdateRequest; import com.example.domainstore.entity.Store; import com.example.domainstore.entity.StoreImage; @@ -36,26 +35,6 @@ public StoreCreateResponse createStore(StoreCreateRequest request) { return StoreCreateResponse.fromEntity(saved); } - @Override - @Transactional(readOnly = true) - public StoreReadResponse getAllStores() { - List stores = storeRepository.findAllByDeletedFalse(); - - List storeRead = stores.stream() - .map(store -> { - List images = storeImageRepository.findByStore(store); - List imageDto = images.stream() - .map(StoreImageUploadResponse::fromEntity) - .toList(); - return StoreReadDto.fromEntity(store, imageDto); - }) - .toList(); - - boolean hasNext = false; - - return StoreReadResponse.of(storeRead, hasNext); - } - @Override @Transactional(readOnly = true) public StoreReadDto getStoreByStoreId(Long storeId) { @@ -103,4 +82,13 @@ public String deleteStore(Long storeId) { return "Store ID " + storeId + " 삭제되었습니다."; } + + @Transactional + public Boolean toggleActive(Long storeId) { + Store store = storeRepository.findById(storeId) + .orElseThrow(() -> new IllegalArgumentException("해당 스토어가 존재하지 않습니다.")); + + store.toggleActive(); + return store.getIsActive(); + } } diff --git a/api-user/src/main/java/com/example/apiuser/menu/controller/MenuController.java b/api-user/src/main/java/com/example/apiuser/menu/controller/MenuController.java index d3fb6d02..d1270ccb 100644 --- a/api-user/src/main/java/com/example/apiuser/menu/controller/MenuController.java +++ b/api-user/src/main/java/com/example/apiuser/menu/controller/MenuController.java @@ -25,7 +25,21 @@ public ResponseEntity getMenusByStoreId(@PathVariable Long storeId) { .status(HttpStatus.OK) .body( ApiUtils.success( - menuService.getMenusByStoreId(storeId) + menuService.getAllMenusByStoreId(storeId) + ) + ); + } + + @GetMapping("/{storeId}/{menuId}") + public ResponseEntity getMenuById( + @PathVariable Long storeId, + @PathVariable Long menuId + ) { + return ResponseEntity + .status(HttpStatus.OK) + .body( + ApiUtils.success( + menuService.getMenuById(storeId, menuId) ) ); } diff --git a/api-user/src/main/java/com/example/apiuser/menu/dto/MenuReadDto.java b/api-user/src/main/java/com/example/apiuser/menu/dto/MenuReadDto.java index 98dda1f2..1206b870 100644 --- a/api-user/src/main/java/com/example/apiuser/menu/dto/MenuReadDto.java +++ b/api-user/src/main/java/com/example/apiuser/menu/dto/MenuReadDto.java @@ -17,6 +17,8 @@ public class MenuReadDto { private String name; private String description; private Integer price; + private Boolean isSoldOut; + private Boolean deleted; private List images; public static MenuReadDto fromEntity(Menu menu, List images) { @@ -26,6 +28,8 @@ public static MenuReadDto fromEntity(Menu menu, List im .name(menu.getName()) .description(menu.getDescription()) .price(menu.getPrice()) + .isSoldOut(menu.getIsSoldOut()) + .deleted(menu.getDeleted()) .images(images) .build(); } diff --git a/api-user/src/main/java/com/example/apiuser/menu/service/MenuService.java b/api-user/src/main/java/com/example/apiuser/menu/service/MenuService.java index 64b9e0b9..8763f270 100644 --- a/api-user/src/main/java/com/example/apiuser/menu/service/MenuService.java +++ b/api-user/src/main/java/com/example/apiuser/menu/service/MenuService.java @@ -24,8 +24,8 @@ public class MenuService { @Transactional(readOnly = true) - public MenuReadResponse getMenusByStoreId(Long storeId) { - List menus = menuRepository.findAllByStoreId(storeId); + public MenuReadResponse getAllMenusByStoreId(Long storeId) { + List menus = menuRepository.findAllByStoreIdAndDeletedFalse(storeId); List menuReadResponse = menus.stream() .map(menu -> { @@ -39,4 +39,17 @@ public MenuReadResponse getMenusByStoreId(Long storeId) { return MenuReadResponse.of(menuReadResponse); } + + @Transactional(readOnly = true) + public MenuReadDto getMenuById(Long storeId, Long menuId) { + Menu menu = menuRepository.findByStoreIdAndIdAndDeletedFalse(storeId, menuId) + .orElseThrow(() -> new IllegalArgumentException("Menu not found with id: " + menuId)); + + List images = menuImageRepository.findByMenu(menu); + List imageDto = images.stream() + .map(MenuImageUploadResponse::fromEntity) + .toList(); + + return MenuReadDto.fromEntity(menu, imageDto); + } } diff --git a/api-user/src/main/java/com/example/apiuser/store/controller/StoreController.java b/api-user/src/main/java/com/example/apiuser/store/controller/StoreController.java index 510b19d7..6a3cba2e 100644 --- a/api-user/src/main/java/com/example/apiuser/store/controller/StoreController.java +++ b/api-user/src/main/java/com/example/apiuser/store/controller/StoreController.java @@ -1,5 +1,6 @@ package com.example.apiuser.store.controller; +import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -32,6 +33,13 @@ public ResponseEntity getAllStores() { ); } + @GetMapping("/all-stores/infinite-scroll") + public ResponseEntity getAllStores(Pageable pageable) { + return ResponseEntity + .ok() + .body(ApiUtils.success(storeService.getAllStoresByPage(pageable))); + } + @GetMapping("/{storeId}") public ResponseEntity getStoreById(@PathVariable Long storeId) { return ResponseEntity diff --git a/api-user/src/main/java/com/example/apiuser/store/dto/StoreImageUploadResponse.java b/api-user/src/main/java/com/example/apiuser/store/dto/StoreImageUploadResponse.java index 40cb984d..23a1b224 100644 --- a/api-user/src/main/java/com/example/apiuser/store/dto/StoreImageUploadResponse.java +++ b/api-user/src/main/java/com/example/apiuser/store/dto/StoreImageUploadResponse.java @@ -10,13 +10,11 @@ public class StoreImageUploadResponse { private final Long id; private final String imageUrl; - private final String type; public static StoreImageUploadResponse fromEntity(StoreImage storeImage) { return StoreImageUploadResponse.builder() .id(storeImage.getId()) .imageUrl(storeImage.getImageUrl()) - .type(storeImage.getType()) .build(); } } diff --git a/api-user/src/main/java/com/example/apiuser/store/service/StoreService.java b/api-user/src/main/java/com/example/apiuser/store/service/StoreService.java index fd90de2a..83ea3467 100644 --- a/api-user/src/main/java/com/example/apiuser/store/service/StoreService.java +++ b/api-user/src/main/java/com/example/apiuser/store/service/StoreService.java @@ -2,6 +2,8 @@ import java.util.List; +import org.springframework.data.domain.Pageable; + import com.example.apiuser.store.dto.StoreReadDto; import com.example.apiuser.store.dto.StoreReadResponse; @@ -9,6 +11,8 @@ public interface StoreService { StoreReadResponse getAllStores(); + public StoreReadResponse getAllStoresByPage(Pageable pageable); + StoreReadDto getStoreByStoreId(Long storeId); List searchStoresByName(String name); diff --git a/api-user/src/main/java/com/example/apiuser/store/service/StoreServiceImpl.java b/api-user/src/main/java/com/example/apiuser/store/service/StoreServiceImpl.java index d641f03e..c68657f9 100644 --- a/api-user/src/main/java/com/example/apiuser/store/service/StoreServiceImpl.java +++ b/api-user/src/main/java/com/example/apiuser/store/service/StoreServiceImpl.java @@ -2,6 +2,8 @@ import java.util.List; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.example.apiuser.store.dto.StoreImageUploadResponse; @@ -43,6 +45,25 @@ public StoreReadResponse getAllStores() { return StoreReadResponse.of(storeRead, hasNext); } + @Transactional(readOnly = true) + public StoreReadResponse getAllStoresByPage(Pageable pageable) { + Slice stores = storeRepository.findAllByDeletedFalseOrderByStoreIdDesc(pageable); + + List storeRead = stores.getContent().stream() + .map(store -> { + List images = storeImageRepository.findByStore(store); + List imageDto = images.stream() + .map(StoreImageUploadResponse::fromEntity) + .toList(); + return StoreReadDto.fromEntity(store, imageDto); + }) + .toList(); + + boolean hasNext = stores.hasNext(); + + return StoreReadResponse.of(storeRead, hasNext); + } + @Override @Transactional(readOnly = true) public StoreReadDto getStoreByStoreId(Long storeId) { diff --git a/domain-menu/src/main/java/com/example/menu/entity/Menu.java b/domain-menu/src/main/java/com/example/menu/entity/Menu.java index 5ac6ceef..711bc779 100644 --- a/domain-menu/src/main/java/com/example/menu/entity/Menu.java +++ b/domain-menu/src/main/java/com/example/menu/entity/Menu.java @@ -29,13 +29,28 @@ public class Menu extends BaseTimeEntity { private String name; private String description; private Integer price; + private Boolean isSoldOut; + private Boolean deleted; - public Menu(LocalDateTime createdAt, Long id, Long storeId, String name, String description, Integer price) { + + public Menu(LocalDateTime createdAt, Long id, Long storeId, String name, String description, Integer price, Boolean isSoldOut, Boolean deleted) { super(createdAt); this.Id = id; this.storeId = storeId; this.name = name; this.description = description; this.price = price; + this.isSoldOut = isSoldOut != null ? isSoldOut : false; + this.deleted = deleted != null ? deleted : false; + } + + public void updateInfo(String name, String description, Integer price) { + if (name != null) this.name = name; + if (description != null) this.description = description; + if (price != null) this.price = price; } + + public void markAsDeleted() { this.deleted = true; } + + public void toggleSoldOut() { this.isSoldOut = !this.isSoldOut; } } diff --git a/domain-menu/src/main/java/com/example/menu/repository/MenuRepository.java b/domain-menu/src/main/java/com/example/menu/repository/MenuRepository.java index 4bdde11d..ca15d517 100644 --- a/domain-menu/src/main/java/com/example/menu/repository/MenuRepository.java +++ b/domain-menu/src/main/java/com/example/menu/repository/MenuRepository.java @@ -1,6 +1,7 @@ package com.example.menu.repository; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -9,5 +10,7 @@ @Repository public interface MenuRepository extends JpaRepository { - List findAllByStoreId(Long storeId); + List findAllByStoreIdAndDeletedFalse(Long storeId); + Optional findByStoreIdAndIdAndDeletedFalse(Long storeId, Long menuId); + Optional findByIdAndDeletedFalse(Long menuId); } diff --git a/domain-store/src/main/java/com/example/domainstore/entity/Store.java b/domain-store/src/main/java/com/example/domainstore/entity/Store.java index 47166005..17464734 100644 --- a/domain-store/src/main/java/com/example/domainstore/entity/Store.java +++ b/domain-store/src/main/java/com/example/domainstore/entity/Store.java @@ -58,20 +58,16 @@ public Store(LocalDateTime createdAt, Long storeId, Long departmentId, String na } public void updateInfo(String name, String location, String description) { - this.name = name; - this.location = location; - this.description = description; + if (name != null) this.name = name; + if (location != null) this.location = location; + if (description != null) this.description = description; } public void markAsDeleted() { this.deleted = true; } - public void activate() { - this.isActive = true; - } - - public void deactivate() { - this.isActive = false; + public void toggleActive() { + this.isActive = !this.isActive; } } diff --git a/domain-store/src/main/java/com/example/domainstore/entity/StoreImage.java b/domain-store/src/main/java/com/example/domainstore/entity/StoreImage.java index 0ced904e..41f0896f 100644 --- a/domain-store/src/main/java/com/example/domainstore/entity/StoreImage.java +++ b/domain-store/src/main/java/com/example/domainstore/entity/StoreImage.java @@ -36,7 +36,4 @@ public class StoreImage extends BaseTimeEntity { @Column(nullable = false, length = 500) private String fileKey; - - @Column(length = 20) - private String type; } diff --git a/domain-store/src/main/java/com/example/domainstore/repository/StoreRepository.java b/domain-store/src/main/java/com/example/domainstore/repository/StoreRepository.java index 81a08ac2..1d817652 100644 --- a/domain-store/src/main/java/com/example/domainstore/repository/StoreRepository.java +++ b/domain-store/src/main/java/com/example/domainstore/repository/StoreRepository.java @@ -3,6 +3,8 @@ import java.util.List; import java.util.Optional; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -16,4 +18,6 @@ public interface StoreRepository extends JpaRepository { Optional findByStoreIdAndDeletedFalse(Long storeId); List findByNameContainingIgnoreCaseAndDeletedFalse(String name); + + Slice findAllByDeletedFalseOrderByStoreIdDesc(Pageable pageable); }