From 655d3ccc6e91cc3535b5de1116729acd71695dd8 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 26 Aug 2025 18:52:10 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20pathVariable=20publicCode=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/controller/MenuController.java | 12 +++---- .../order/controller/OrderController.java | 33 +++++++++++++++---- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/menu/controller/MenuController.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/menu/controller/MenuController.java index b9abf632..9c8b997a 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/menu/controller/MenuController.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/menu/controller/MenuController.java @@ -25,32 +25,32 @@ public class MenuController { private final MenuService menuService; - @GetMapping("/all-menus/stores/{storeId}") + @GetMapping("/all-menus/stores/{publicCode}") @Operation(summary = "가게의 모든 메뉴 조회", description = "특정 가게의 모든 메뉴를 조회합니다.") @ApiResponse(responseCode = "200", description = "모든 메뉴를 조회 성공") - public ResponseEntity getMenusByStoreId(@PathVariable Long storeId) { + public ResponseEntity getMenusByStoreId(@PathVariable String publicCode) { return ResponseEntity .status(HttpStatus.OK) .body( ApiUtils.success( - menuService.getAllMenusByStoreId(storeId) + menuService.getAllMenusByStoreId(publicCode) ) ); } - @GetMapping("/{storeId}/{menuId}") + @GetMapping("/{publicCode}/{menuId}") @Operation( summary = "메뉴 ID로 메뉴 조회", description = "특정 가게의 특정 메뉴를 ID로 조회합니다.") @ApiResponse(responseCode = "200", description = "메뉴 조회 성공") public ResponseEntity getMenuById( - @PathVariable Long storeId, + @PathVariable String publicCode, @PathVariable Long menuId ) { return ResponseEntity .status(HttpStatus.OK) .body( ApiUtils.success( - menuService.getMenuById(storeId, menuId) + menuService.getMenuById(publicCode, menuId) ) ); } diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/controller/OrderController.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/controller/OrderController.java index c814a800..76501d55 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/controller/OrderController.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/controller/OrderController.java @@ -32,17 +32,36 @@ public class OrderController { private final OrderService orderService; - @PostMapping("/create/{storeId}/{tableId}") + // @PostMapping("/create/{storeId}/{tableId}") + // @Operation(summary = "주문 생성", description = "특정 주점 - 특정 테이블에 대한 주문 생성") + // @ApiResponse(responseCode = "201", description = "주문 생성") + // public ResponseEntity createOrder( + // @PathVariable Long storeId, + // @PathVariable Long tableId, + // @RequestBody @Valid OrderCreateRequestDto orderCreateRequestDto, + // HttpSession session + // ) { + // String sessionId = session.getId(); + // OrderCreateResponseDto response = orderService.createOrder(storeId, tableId, orderCreateRequestDto, sessionId); + // return ResponseEntity + // .status(HttpStatus.CREATED) + // .body( + // ApiUtils.success(response) + // ); + // } + + @PostMapping("/create/{publicCode}/{tableId}") @Operation(summary = "주문 생성", description = "특정 주점 - 특정 테이블에 대한 주문 생성") @ApiResponse(responseCode = "201", description = "주문 생성") public ResponseEntity createOrder( - @PathVariable Long storeId, + @PathVariable String publicCode, @PathVariable Long tableId, @RequestBody @Valid OrderCreateRequestDto orderCreateRequestDto, HttpSession session - ) { + ) { String sessionId = session.getId(); - OrderCreateResponseDto response = orderService.createOrder(storeId,tableId,orderCreateRequestDto,sessionId); + OrderCreateResponseDto response = orderService.createOrder(publicCode, tableId, orderCreateRequestDto, + sessionId); return ResponseEntity .status(HttpStatus.CREATED) .body( @@ -50,11 +69,11 @@ public ResponseEntity createOrder( ); } - @GetMapping("/items/{storeId}/{tableId}") + @GetMapping("/items/{publicCode}/{tableId}") @Operation(summary = "테이블별 주문 아이템 조회", description = "비로그인(세션) 기준으로 테이블의 내 주문 목록만 조회") @ApiResponse(responseCode = "200", description = "주문 조회") public ResponseEntity getOrderItems( - @PathVariable Long storeId, + @PathVariable String publicCode, @PathVariable Long tableId, HttpServletRequest request ) { @@ -64,7 +83,7 @@ public ResponseEntity getOrderItems( return ResponseEntity.status(HttpStatus.OK).body(ApiUtils.success(List.of())); } String sessionId = session.getId(); - List orderItems = orderService.getOrderItemsGroupByOrderId(storeId, tableId, sessionId); + List orderItems = orderService.getOrderItemsGroupByOrderId(publicCode, tableId, sessionId); return ResponseEntity. status(HttpStatus.OK) .body( From 5bb4a39db1383146964903d19e9dc41442a66b80 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 26 Aug 2025 18:52:35 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20=EA=B8=B0=EC=A1=B4=20storeId=20publ?= =?UTF-8?q?icCode=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/service/MenuService.java | 15 ++++++++------- .../order/service/OrderService.java | 18 +++++++++--------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/menu/service/MenuService.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/menu/service/MenuService.java index 8becf9a6..45aa92e5 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/menu/service/MenuService.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/menu/service/MenuService.java @@ -30,15 +30,16 @@ public class MenuService { @Transactional(readOnly = true) - public MenuReadResponse getAllMenusByStoreId(Long storeId) { - if (storeId == null) { + public MenuReadResponse getAllMenusByStoreId(String publicCode) { + if (publicCode == null) { throw new MenuParamEmptyException(); } - Store store = storeRepository.findById(storeId) + Store store = storeRepository.findByPublicCodeAndDeletedFalse(publicCode) .orElseThrow(StoreNotFoundException::new); String storeName = store.getName(); + Long storeId = store.getStoreId(); List menus = menuRepository.findAllByStoreIdAndDeletedFalseOrderBySortOrder(storeId); List menuReadResponse = menus.stream() @@ -55,15 +56,15 @@ public MenuReadResponse getAllMenusByStoreId(Long storeId) { } @Transactional(readOnly = true) - public MenuReadDto getMenuById(Long storeId, Long menuId) { - if (storeId == null || menuId == null) { + public MenuReadDto getMenuById(String publicCode, Long menuId) { + if (publicCode == null || menuId == null) { throw new MenuParamEmptyException(); } - storeRepository.findById(storeId) + Store store = storeRepository.findByPublicCodeAndDeletedFalse(publicCode) .orElseThrow(StoreNotFoundException::new); - Menu menu = menuRepository.findByStoreIdAndIdAndDeletedFalse(storeId, menuId) + Menu menu = menuRepository.findByStoreIdAndIdAndDeletedFalse(store.getStoreId(), menuId) .orElseThrow(MenuNotFoundException::new); List images = menuImageRepository.findByMenu(menu); diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/service/OrderService.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/service/OrderService.java index 656f6846..5b317dcc 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/service/OrderService.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/service/OrderService.java @@ -39,16 +39,16 @@ public class OrderService { private final MenuRepository menuRepository; private final OrderItemRepository orderItemRepository; @Transactional - public OrderCreateResponseDto createOrder(Long storeId, Long tableId, + public OrderCreateResponseDto createOrder(String publicCode, Long tableId, OrderCreateRequestDto orderCreateRequestDto, String sessionId) { - parameterValidation(storeId, tableId, orderCreateRequestDto); + parameterValidation(publicCode, tableId, orderCreateRequestDto); // 💡 [중복 주문 방지] signature 생성 및 체크 - String signature = generateOrderSignature(storeId, tableId, orderCreateRequestDto.getItems()); + String signature = generateOrderSignature(publicCode, tableId, orderCreateRequestDto.getItems()); checkDuplicateOrderSignature(signature); // 1. Store 조회 - Store store = storeRepository.findById(storeId) + Store store = storeRepository.findByPublicCodeAndDeletedFalse(publicCode) .orElseThrow(() -> new IllegalArgumentException("store not found")); // 2. UserOrder 생성 및 signature 저장 @@ -95,9 +95,9 @@ public OrderCreateResponseDto createOrder(Long storeId, Long tableId, @Transactional(readOnly = true) public List getOrderItemsGroupByOrderId( - Long storeId, Long tableId, String sessionId) { + String publicCode, Long tableId, String sessionId) { - List userOrders = orderRepository.findByStore_StoreIdAndTableIdAndSessionId(storeId, tableId, sessionId); + List userOrders = orderRepository.findByStore_PublicCodeAndTableIdAndSessionId(publicCode, tableId, sessionId); // orderId 기준으로 바로 변환 return userOrders.stream() @@ -116,8 +116,8 @@ public List getOrderItemsGroupByOrderId( } - private static void parameterValidation(Long storeId, Long tableId, OrderCreateRequestDto orderCreateRequestDto) { - if (storeId == null || tableId == null || orderCreateRequestDto == null) { + private static void parameterValidation(String publicCode, Long tableId, OrderCreateRequestDto orderCreateRequestDto) { + if (publicCode == null || tableId == null || orderCreateRequestDto == null) { throw new OrderParameterEmptyException(); } if (orderCreateRequestDto.getItems() == null || orderCreateRequestDto.getItems().isEmpty()) { @@ -130,7 +130,7 @@ private static void parameterValidation(Long storeId, Long tableId, OrderCreateR throw new IllegalArgumentException("Depositor name is too long"); } } - private String generateOrderSignature(Long storeId, Long tableId, List items) { + private String generateOrderSignature(String storeId, Long tableId, List items) { String cartString = items.stream() .sorted((a, b) -> a.getMenuId().compareTo(b.getMenuId())) // 메뉴 ID 기준 정렬 .map(item -> item.getMenuId() + ":" + item.getQuantity()) From 844ec2df25d0c30f50d40f7951c751ab7c0c9211 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 26 Aug 2025 18:53:00 +0900 Subject: [PATCH 3/6] =?UTF-8?q?refactor:=20publicCode=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../applicationadmin/store/dto/StoreCreateRequest.java | 2 ++ .../applicationadmin/store/dto/StoreCreateResponse.java | 2 ++ .../com/nowait/domaincorerdb/store/entity/Store.java | 9 +++++++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreCreateRequest.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreCreateRequest.java index 7650a985..5eff72bb 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreCreateRequest.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreCreateRequest.java @@ -1,5 +1,6 @@ package com.nowait.applicationadmin.store.dto; +import com.nowait.common.token.TokenGenerator; import com.nowait.domaincorerdb.store.entity.Store; import jakarta.validation.constraints.NotBlank; @@ -25,6 +26,7 @@ public class StoreCreateRequest { public Store toEntity() { return Store.builder() + .publicCode(TokenGenerator.base62(12)) .departmentId(departmentId) .name(name) .location(location) diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreCreateResponse.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreCreateResponse.java index 725c3159..6dcaf79d 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreCreateResponse.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreCreateResponse.java @@ -14,6 +14,7 @@ public class StoreCreateResponse { private Long storeId; + private String publicCode; private Long departmentId; private String name; private String location; @@ -29,6 +30,7 @@ public static StoreCreateResponse fromEntity(Store store) { return StoreCreateResponse.builder() .createdAt(store.getCreatedAt()) .storeId(store.getStoreId()) + .publicCode(store.getPublicCode()) .departmentId(store.getDepartmentId()) .name(store.getName()) .location(store.getLocation()) diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/Store.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/Store.java index 5aa58b95..a635dab2 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/Store.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/Store.java @@ -28,6 +28,9 @@ public class Store extends BaseTimeEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long storeId; + @Column(nullable = false, unique = true, updatable = false, length = 12) + private String publicCode; + @Column(name = "department_id", nullable = false) private Long departmentId; @@ -56,7 +59,8 @@ public class Store extends BaseTimeEntity { private Boolean deleted; public Store(LocalDateTime createdAt, Long storeId, Long departmentId, String name, String location, - String description, String noticeTitle, String noticeContent, String openTime, Boolean isActive, Boolean deleted) { + String description, String noticeTitle, String noticeContent, String openTime, Boolean isActive, + Boolean deleted) { super(createdAt); this.storeId = storeId; this.departmentId = departmentId; @@ -70,7 +74,8 @@ public Store(LocalDateTime createdAt, Long storeId, Long departmentId, String na this.deleted = deleted; } - public void updateInfo(String name, String location, String description, String noticeTitle, String notice, String openTime) { + public void updateInfo(String name, String location, String description, String noticeTitle, String notice, + String openTime) { if (name != null) this.name = name; if (location != null) From 3bcfd65814df935274c21dc88710e8533a0dd05a Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 26 Aug 2025 18:53:16 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20findByPublicCodeAndDeletedFalse=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nowait/domaincorerdb/store/repository/StoreRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreRepository.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreRepository.java index 921a0ad2..83d7d324 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreRepository.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreRepository.java @@ -18,6 +18,8 @@ public interface StoreRepository extends JpaRepository, StoreCustom Optional findByStoreIdAndDeletedFalse(Long storeId); + Optional findByPublicCodeAndDeletedFalse(String publicCode); + Slice findAllByDeletedFalseOrderByStoreIdAsc(Pageable pageable); @Query(value = """ From 5f48a2a9c95f59fd2c36c0f8b75a64298e6da491 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 26 Aug 2025 18:53:30 +0900 Subject: [PATCH 5/6] =?UTF-8?q?refactor:=20findByStore=5FPublicCodeAndTabl?= =?UTF-8?q?eIdAndSessionId=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nowait/domaincorerdb/order/repository/OrderRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderRepository.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderRepository.java index b1a38e8e..d5bb6bf4 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderRepository.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderRepository.java @@ -13,7 +13,7 @@ public interface OrderRepository extends JpaRepository { boolean existsBySignatureAndCreatedAtAfter(String signature, LocalDateTime createdAt); - List findByStore_StoreIdAndTableIdAndSessionId(Long storeId, Long tableId, String sessionId); + List findByStore_PublicCodeAndTableIdAndSessionId(String publicCode, Long tableId, String sessionId); @EntityGraph(attributePaths = {"orderItems", "orderItems.menu"}) List findAllByStore_StoreIdAndCreatedAtBetween(Long storeId, LocalDateTime startDateTime, LocalDateTime endDateTime); From 3cfd5730dd7afde3d04f1d6220e03e9580c79357 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 26 Aug 2025 18:53:43 +0900 Subject: [PATCH 6/6] =?UTF-8?q?feat:=20=ED=86=A0=ED=81=B0=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EA=B8=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/nowait/common/token/TokenGenerator.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 nowait-common/src/main/java/com/nowait/common/token/TokenGenerator.java diff --git a/nowait-common/src/main/java/com/nowait/common/token/TokenGenerator.java b/nowait-common/src/main/java/com/nowait/common/token/TokenGenerator.java new file mode 100644 index 00000000..2b84840b --- /dev/null +++ b/nowait-common/src/main/java/com/nowait/common/token/TokenGenerator.java @@ -0,0 +1,17 @@ +package com.nowait.common.token; + +import java.security.SecureRandom; + +public final class TokenGenerator { + private static final SecureRandom RNG = new SecureRandom(); + private static final char[] ALPHABET = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray(); + + // 12~16 권장 + public static String base62(int len) { + char[] out = new char[len]; + for (int i = 0; i < len; i++) out[i] = ALPHABET[RNG.nextInt(ALPHABET.length)]; + return new String(out); + } + private TokenGenerator() {} +}