Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
.DS_Store

.*env
.env*
HELP.md
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package kr.co.knuserver.application.pubMenu;

import java.util.List;
import kr.co.knuserver.domain.pubMenu.entity.PubMenu;
import kr.co.knuserver.domain.pubMenu.repository.PubMenuRepository;
import kr.co.knuserver.global.exception.BusinessErrorCode;
Expand All @@ -20,4 +21,8 @@ public PubMenu findPubMenuById(Long id) {
return pubMenuRepository.findById(id)
.orElseThrow(() -> new BusinessException(BusinessErrorCode.PUB_MENU_NOT_FOUND));
}

public List<PubMenu> findAllPubMenuByIds(List<Long> ids) {
return pubMenuRepository.findAllById(ids);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package kr.co.knuserver.application.pubOrder;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import kr.co.knuserver.application.pubMenu.PubMenuQueryService;
import kr.co.knuserver.application.pubTableSession.PubTableSessionQueryService;
import kr.co.knuserver.domain.pubMenu.entity.PubMenu;
import kr.co.knuserver.domain.pubOrder.entity.PubOrder;
import kr.co.knuserver.domain.pubOrder.repository.PubOrderRepository;
import kr.co.knuserver.domain.pubTableSession.entity.PubTableSession;
import kr.co.knuserver.global.exception.BusinessErrorCode;
import kr.co.knuserver.global.exception.BusinessException;
import kr.co.knuserver.presentation.pubOrder.dto.OrderMenus;
import kr.co.knuserver.presentation.pubOrder.dto.OrderedMenus;
import kr.co.knuserver.presentation.pubOrder.dto.PubOrderRequestDto;
import kr.co.knuserver.presentation.pubOrder.dto.PubOrderResponseDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional
public class PubOrderCommandService {

private final PubOrderRepository pubOrderRepository;
private final PubOrderQueryService pubOrderQueryService;
private final PubTableSessionQueryService pubTableSessionQueryService;
private final PubMenuQueryService pubMenuQueryService;

public PubOrderResponseDto createOrder(PubOrderRequestDto request) {
PubTableSession pubTableSession = pubTableSessionQueryService.getPubTableSessionById(request.pubTableSessionId());

List<Long> menuIds = request.orderMenus().stream()
.map(OrderMenus::menuId)
.distinct()
.toList();
List<PubMenu> foundMenus = pubMenuQueryService.findAllPubMenuByIds(menuIds);

if (foundMenus.size() != menuIds.size()) {
throw new BusinessException(BusinessErrorCode.PUB_MENU_NOT_FOUND);
}

Map<Long, PubMenu> pubMenuMap = foundMenus.stream()
.collect(Collectors.toMap(PubMenu::getId, Function.identity()));

List<PubOrder> pubOrders = new ArrayList<>();
for (OrderMenus orderMenus : request.orderMenus()) {
pubOrders.add(PubOrder.createPubOrder(pubTableSession.getId(), orderMenus.menuId(), orderMenus.quantity()));
}
List<PubOrder> savedPubOrders = pubOrderRepository.saveAll(pubOrders);

List<OrderedMenus> orderedMenus = savedPubOrders.stream().map((pubOrder -> {
PubMenu pubMenu = pubMenuMap.get(pubOrder.getPubMenuId());
return OrderedMenus.fromEntity(pubOrder, pubMenu);
})).toList();
return PubOrderResponseDto.fromEntity(request.pubTableSessionId(), orderedMenus);
}

public void deleteOrder(Long pubOrderId) {
PubOrder pubOrder = pubOrderQueryService.findByOrderId(pubOrderId);
pubOrderRepository.delete(pubOrder);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package kr.co.knuserver.application.pubOrder;

import java.util.List;
import kr.co.knuserver.application.pubMenu.PubMenuQueryService;
import kr.co.knuserver.domain.pubMenu.entity.PubMenu;
import kr.co.knuserver.domain.pubOrder.entity.PubOrder;
import kr.co.knuserver.domain.pubOrder.repository.PubOrderRepository;
import kr.co.knuserver.global.exception.BusinessErrorCode;
import kr.co.knuserver.global.exception.BusinessException;
import kr.co.knuserver.presentation.pubOrder.dto.OrderedMenus;
import kr.co.knuserver.presentation.pubOrder.dto.PubOrderResponseDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public class PubOrderQueryService {

private final PubOrderRepository pubOrderRepository;
private final PubMenuQueryService pubMenuQueryService;

public PubOrder findByOrderId(Long orderId) {
return pubOrderRepository.findById(orderId).orElseThrow(() -> new BusinessException(BusinessErrorCode.PUB_ORDER_NOT_FOUND));
}

public PubOrderResponseDto getAllByPubTableSessionId(Long pubTableSessionId) {
List<PubOrder> pubOrderList = pubOrderRepository.findAllByPubTableSessionId(pubTableSessionId);
List<OrderedMenus> orderedMenus = pubOrderList.stream().map((pubOrder -> {
PubMenu pubMenu = pubMenuQueryService.findPubMenuById(pubOrder.getPubMenuId());
return OrderedMenus.fromEntity(pubOrder, pubMenu);
})).toList();
return PubOrderResponseDto.fromEntity(pubTableSessionId, orderedMenus);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package kr.co.knuserver.domain.pubTableSession.entity;
package kr.co.knuserver.domain.pubOrder.entity;

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 kr.co.knuserver.global.exception.BusinessErrorCode;
import kr.co.knuserver.global.exception.BusinessException;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand All @@ -21,7 +23,7 @@
public class PubOrder {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "pub_table_id")
@Column(name = "pub_order_id")
private Long id;

@Column(name = "pub_table_session_id", nullable = false)
Expand All @@ -30,10 +32,18 @@ public class PubOrder {
@Column(name = "pub_menu_id", nullable = false)
private Long pubMenuId;

public static PubOrder createPubOrder(Long pubSessionId, Long pubMenuId) {
@Column(name = "quantity", nullable = false)
private Integer quantity;

public static PubOrder createPubOrder(Long pubSessionId, Long pubMenuId, Integer quantity) {
if (quantity == null || quantity <= 0) {
throw new BusinessException("주문 수량은 양수만 입력 가능합니다.", BusinessErrorCode.INVALID_INPUT_VALUE);
}

return PubOrder.builder()
.pubTableSessionId(pubSessionId)
.pubMenuId(pubMenuId)
.quantity(quantity)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kr.co.knuserver.domain.pubOrder.repository;

import java.util.List;
import kr.co.knuserver.domain.pubOrder.entity.PubOrder;
import org.springframework.data.jpa.repository.JpaRepository;

public interface PubOrderRepository extends JpaRepository<PubOrder, Long> {
List<PubOrder> findAllByPubTableSessionId(Long pubTableSessionId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public enum BusinessErrorCode implements ErrorCode {
*/
PUB_BOOTH_NOT_FOUND(HttpStatus.NOT_FOUND, "C301", "해당 주점을 찾을 수 없습니다."),
PUB_MENU_NOT_FOUND(HttpStatus.NOT_FOUND, "C302", "해당 주점 메뉴를 찾을 수 없습니다."),
PUB_ORDER_NOT_FOUND(HttpStatus.NOT_FOUND, "C206", "해당 주문을 찾을 수 없습니다."),

/*
* 405 METHOD_NOT_ALLOWED: 허용되지 않은 Request Method 호출
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package kr.co.knuserver.presentation.pubOrder.controller;

import jakarta.validation.Valid;
import kr.co.knuserver.application.pubOrder.PubOrderCommandService;
import kr.co.knuserver.presentation.pubOrder.dto.PubOrderRequestDto;
import kr.co.knuserver.presentation.pubOrder.dto.PubOrderResponseDto;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
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
@RequestMapping("/admin/v1/pubOrder")
@RequiredArgsConstructor
public class PubOrderCommandController {

private final PubOrderCommandService pubOrderCommandService;

@PostMapping
public ResponseEntity<PubOrderResponseDto> createOrder(@Valid @RequestBody PubOrderRequestDto request) {
return ResponseEntity.ok().body(pubOrderCommandService.createOrder(request));
}

@DeleteMapping("/{pubOrderId}")
public ResponseEntity<Void> deleteOrder(@PathVariable("pubOrderId") Long pubOrderId) {
pubOrderCommandService.deleteOrder(pubOrderId);
return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package kr.co.knuserver.presentation.pubOrder.controller;

import kr.co.knuserver.application.pubOrder.PubOrderQueryService;
import kr.co.knuserver.presentation.pubOrder.dto.PubOrderResponseDto;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/admin/v1/pubOrder")
@RequiredArgsConstructor
public class PubOrderQueryController {

private final PubOrderQueryService pubOrderQueryService;

@GetMapping("/{pubTableSessionId}")
public ResponseEntity<PubOrderResponseDto> getAllByPubTableSessionId(@PathVariable("pubTableSessionId") Long pubTableSessionId) {
return ResponseEntity.ok(pubOrderQueryService.getAllByPubTableSessionId(pubTableSessionId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kr.co.knuserver.presentation.pubOrder.dto;

import jakarta.validation.constraints.NotNull;

public record OrderMenus(
@NotNull Long menuId,
@NotNull Integer quantity
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package kr.co.knuserver.presentation.pubOrder.dto;

import kr.co.knuserver.domain.pubMenu.entity.PubMenu;
import kr.co.knuserver.domain.pubOrder.entity.PubOrder;
import lombok.Builder;

@Builder
public record OrderedMenus(
Long orderId,
Long menuId,
String name,
int price,
Integer quantity
) {
public static OrderedMenus fromEntity(PubOrder pubOrder, PubMenu pubMenu) {
return OrderedMenus.builder()
.orderId(pubOrder.getId())
.menuId(pubMenu.getId())
.name(pubMenu.getName())
.price(pubMenu.getPrice())
.quantity(pubOrder.getQuantity())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package kr.co.knuserver.presentation.pubOrder.dto;

import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import java.util.List;

public record PubOrderRequestDto(
@NotNull Long pubTableSessionId,
@NotEmpty List<@Valid OrderMenus> orderMenus
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package kr.co.knuserver.presentation.pubOrder.dto;

import jakarta.validation.constraints.NotNull;
import java.util.List;
import kr.co.knuserver.domain.pubOrder.entity.PubOrder;
import lombok.Builder;

@Builder
public record PubOrderResponseDto(
@NotNull Long pubTableSessionId,
@NotNull List<OrderedMenus> orderedMenus
) {
public static PubOrderResponseDto fromEntity(Long pubTableSessionId, List<OrderedMenus> orderedMenus) {
return PubOrderResponseDto.builder()
.pubTableSessionId(pubTableSessionId)
.orderedMenus(orderedMenus)
.build();
}
}
Loading