Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/customer #24

Merged
merged 9 commits into from
Aug 5, 2024
Merged
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: 1 addition & 1 deletion .github/workflows/cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Backend CD # actions ์ด๋ฆ„

on:
push:
branches: [ feat/toss-payment ]
branches: [ feat/customer ]

jobs:
deploy:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,24 @@ public String saveMyCart(String accessToken, CartSaveReq saveReq) {
if (findMyCartCount(user.getUserId(), menu.getId()) >= 1) {

Cart cart = cartQueryService.findCartByUserIdAndMenuId(user.getUserId(), menu.getId());
cart.setCartQuantity(saveReq.quantity());
cart.setCartQuantity(saveReq.quantity() + cart.getQuantity());
cartQueryService.saveCart(cart);

return "์ถ”๊ฐ€";
} else {
final Cart cart = Cart.builder().user(user).menu(menu).quantity(saveReq.quantity()).build();

final Cart cart = Cart.builder()
.user(user)
.menu(menu)
.quantity(saveReq.quantity())
.build();
cartQueryService.saveCart(cart);

return "์‹ ๊ทœ";
}
}


public void updateMyCart(String accessToken, List<CartUpdateReq> updateReqs) {

String email = jwtUtil.getEmail(accessToken);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package com.likelion.apimodule.customer.application;

import com.likelion.apimodule.customer.dto.TotalOrder;
import com.likelion.apimodule.order.dto.MenuOrder;
import com.likelion.coremodule.VisitList.domain.VisitList;
import com.likelion.coremodule.VisitList.service.VisitListQueryService;
import com.likelion.coremodule.customer.service.CustomerQueryService;
import com.likelion.coremodule.menu.domain.Menu;
import com.likelion.coremodule.menu.service.MenuQueryService;
import com.likelion.coremodule.order.domain.Order;
import com.likelion.coremodule.order.domain.OrderItem;
import com.likelion.coremodule.order.service.OrderQueryService;
import com.likelion.coremodule.user.application.UserQueryService;
import com.likelion.coremodule.user.domain.User;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class CustomerFIndUseCase {

private final CustomerQueryService customerQueryService;
private final MenuQueryService menuQueryService;
private final OrderQueryService orderQueryService;
private final UserQueryService userQueryService;
private final VisitListQueryService visitListQueryService;

public List<TotalOrder> getTotalOrder(Long storeId) {

List<Menu> menus = menuQueryService.findMenusByStoreId(storeId);
List<OrderItem> items = new ArrayList<>();
for (Menu menu : menus) {
List<OrderItem> item = orderQueryService.findOrderItemsByMenuId(menu.getId());
items.addAll(item);
}

Map<Long, List<OrderItem>> groupedItems = new HashMap<>();
for (OrderItem item : items) {
groupedItems.computeIfAbsent(item.getOrder().getId(), k -> new ArrayList<>()).add(item);
}

List<TotalOrder> totalOrders = new ArrayList<>();

for (Map.Entry<Long, List<OrderItem>> entry : groupedItems.entrySet()) {

List<OrderItem> orderItems = entry.getValue();
Order order = orderQueryService.findOrderById(orderItems.get(0).getOrder().getId());
User user = userQueryService.findById(order.getUser().getUserId());
VisitList visitList = visitListQueryService.findVisitListByStoreIdAndUserId(storeId, user.getUserId());

List<MenuOrder> menuOrders = orderItems.stream()
.map(item -> {

Menu menu = menuQueryService.findMenuById(item.getMenu().getId());

return new MenuOrder(
menu.getName(),
menu.getImageUrl(),
item.getQuantity(),
menu.getPrice() * item.getQuantity()
);
})
.collect(Collectors.toList());

Integer totalPrice = menuOrders.stream()
.mapToInt(MenuOrder::totalPrice)
.sum();

TotalOrder totalOrder = new TotalOrder(
order.getPickUpRoute(),
order.getVisitHour().toString(),
order.getVisitMin().toString(),
user.getName(),
visitList.getVisit_status(),
order.getCreatedAt(),
order.getOrderNum(),
menuOrders,
totalPrice
);

totalOrders.add(totalOrder);
}

return totalOrders;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.likelion.apimodule.customer.application;

import com.likelion.apimodule.customer.dto.AddMenu;
import com.likelion.commonmodule.image.service.AwsS3Service;
import com.likelion.coremodule.VisitList.domain.VisitList;
import com.likelion.coremodule.VisitList.service.VisitListQueryService;
import com.likelion.coremodule.menu.domain.Menu;
import com.likelion.coremodule.menu.service.MenuQueryService;
import com.likelion.coremodule.order.domain.Order;
import com.likelion.coremodule.order.service.OrderQueryService;
import com.likelion.coremodule.store.domain.Store;
import com.likelion.coremodule.store.service.StoreQueryService;
import com.likelion.coremodule.user.application.UserQueryService;
import com.likelion.coremodule.user.domain.User;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

@Service
@RequiredArgsConstructor
@Transactional
public class CustomerSaveUseCase {

private final VisitListQueryService visitListQueryService;
private final OrderQueryService orderQueryService;
private final UserQueryService userQueryService;
private final StoreQueryService storeQueryService;
private final AwsS3Service awsS3Service;
private final MenuQueryService menuQueryService;

public void changeToPreparing(Long storeId, Long orderId) {

Order order = orderQueryService.findOrderById(orderId);
User user = userQueryService.findById(order.getUser().getUserId());

VisitList visitList = visitListQueryService.findVisitListByStoreIdAndUserId(storeId, user.getUserId());
visitList.updateToPreparing();
}

public void changeToPrepared(Long storeId, Long orderId) {

Order order = orderQueryService.findOrderById(orderId);
User user = userQueryService.findById(order.getUser().getUserId());

VisitList visitList = visitListQueryService.findVisitListByStoreIdAndUserId(storeId, user.getUserId());
visitList.updateToPrepared();
}

public void addMenuInfo(Long storeId, AddMenu addMenu, MultipartFile multipartFile) {

Store store = storeQueryService.findStoreById(storeId);
String imageUrl = awsS3Service.uploadFile(multipartFile);

final Menu menu = Menu.builder().store(store).name(addMenu.name()).content(addMenu.content()).
imageUrl(imageUrl).price(addMenu.price()).build();
menuQueryService.saveMenu(menu);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.likelion.apimodule.customer.dto;

public record AddMenu(
String name,
Integer price,
String content
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.likelion.apimodule.customer.dto;

public record OrderMenu(
Long menuId,
String menuName
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.likelion.apimodule.customer.dto;

import com.likelion.apimodule.order.dto.MenuOrder;
import com.likelion.coremodule.VisitList.domain.VisitStatus;

import java.time.LocalDateTime;
import java.util.List;

public record TotalOrder(
String pickUpRoute,
String visitHour,
String visitMin,
String userName,
VisitStatus orderStatus,
LocalDateTime createdAt,
String orderNum,
List<MenuOrder> menu,
Integer totalPrice
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package com.likelion.apimodule.customer.presentation;

import com.likelion.apimodule.customer.application.CustomerFIndUseCase;
import com.likelion.apimodule.customer.application.CustomerSaveUseCase;
import com.likelion.apimodule.customer.dto.AddMenu;
import com.likelion.apimodule.customer.dto.TotalOrder;
import com.likelion.commonmodule.exception.common.ApplicationResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@RequiredArgsConstructor
@RestController
@RequestMapping("/v1/customer")
@Validated
@Tag(name = "Customer", description = "Customer ๊ด€๋ จ API")
public class CustomerController {

private final CustomerFIndUseCase customerFIndUseCase;
private final CustomerSaveUseCase customerSaveUseCase;

// ์ฃผ๋ฌธ ์ „์ฒด ์กฐํšŒ (์ •ํ›„)
@GetMapping("/{storeId}")
@ApiResponses(
value = {
@ApiResponse(
responseCode = "200",
description = "์ฃผ๋ฌธ ์ „์ฒด ์กฐํšŒ",
useReturnTypeSchema = true
)
}
)
@Operation(summary = "์ฃผ๋ฌธ ์ „์ฒด ์กฐํšŒ API", description = "์ฃผ๋ฌธ ์ „์ฒด ์กฐํšŒ API ์ž…๋‹ˆ๋‹ค.")
public ApplicationResponse<List<TotalOrder>> getTotalOrder(
@PathVariable Long storeId
) {

List<TotalOrder> orders = customerFIndUseCase.getTotalOrder(storeId);
return ApplicationResponse.ok(orders);
}

// ์ ‘์ˆ˜ํ•˜๋Š” API (์ •ํ›„)
@PostMapping("/{storeId}/{orderId}/preparing")
@ApiResponses(
value = {
@ApiResponse(
responseCode = "200",
description = "์ฃผ๋ฌธ ์ ‘์ˆ™ํ•˜๊ธฐ",
useReturnTypeSchema = true
)
}
)
@Operation(summary = "์ฃผ๋ฌธ ์ ‘์ˆ˜ API", description = "์ฃผ๋ฌธ ์ ‘์ˆ˜ API ์ž…๋‹ˆ๋‹ค.")
public ApplicationResponse<String> changeToPreparing(
@PathVariable Long storeId,
@PathVariable Long orderId
) {

customerSaveUseCase.changeToPreparing(storeId, orderId);
return ApplicationResponse.ok("์ฃผ๋ฌธ์„ ์ ‘์ˆ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.");
}

// ์ค€๋น„ ์™„๋ฃŒ ์‹œํ‚ค๋Š” API (์ •ํ›„)
@PostMapping("/{storeId}/{orderId}/prepared")
@ApiResponses(
value = {
@ApiResponse(
responseCode = "200",
description = "์ฃผ๋ฌธ ์ค€๋น„ ์™„๋ฃŒ",
useReturnTypeSchema = true
)
}
)
@Operation(summary = "์ฃผ๋ฌธ ์ค€๋น„ ์™„๋ฃŒ API", description = "์ฃผ๋ฌธ ์ค€๋น„ ์™„๋ฃŒ API ์ž…๋‹ˆ๋‹ค.")
public ApplicationResponse<String> changeToPrepared(
@PathVariable Long storeId,
@PathVariable Long orderId
) {

customerSaveUseCase.changeToPrepared(storeId, orderId);
return ApplicationResponse.ok("์ฃผ๋ฌธ์„ ์ค€๋น„ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค.");
}

// ๋ฉ”๋‰ด ์ถ”๊ฐ€ API
@PostMapping("/{storeId}/addmenu")
@ApiResponses(
value = {
@ApiResponse(
responseCode = "200",
description = "๋ฉ”๋‰ด ์ถ”๊ฐ€ ์™„๋ฃŒ",
useReturnTypeSchema = true
)
}
)
@Operation(summary = "๋ฉ”๋‰ด ์ถ”๊ฐ€ ์™„๋ฃŒ API", description = "๋ฉ”๋‰ด ์ถ”๊ฐ€ ์™„๋ฃŒ API ์ž…๋‹ˆ๋‹ค.")
public ApplicationResponse<String> addMenuInfo(
@PathVariable Long storeId,
@RequestPart(value = "dto") AddMenu addMenu,
@RequestPart(value = "file") MultipartFile multipartFile) {

customerSaveUseCase.addMenuInfo(storeId, addMenu, multipartFile);
return ApplicationResponse.ok("๋ฉ”๋‰ด ์ถ”๊ฐ€๊ฐ€ ์™„๋ฃŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import com.likelion.apimodule.order.dto.OrderDetail;
import com.likelion.apimodule.order.dto.OrderInfo;
import com.likelion.apimodule.payment.dto.request.ApprovalRequest;
import com.likelion.apimodule.payment.dto.response.ApprovalResponse;
import com.likelion.apimodule.payment.service.PaymentService;
import com.likelion.commonmodule.exception.common.ApplicationResponse;
import com.likelion.commonmodule.security.util.AuthConsts;
Expand Down Expand Up @@ -104,13 +103,13 @@ public ApplicationResponse<OrderDetail> findMyOrderDetail(
}
)
@Operation(summary = "์ฃผ๋ฌธํ•˜๊ธฐ(๋ฐฉ๋ฌธ๋ฆฌ์ŠคํŠธ ์ค€๋น„์ค‘ ์ถ”๊ฐ€) + ํ† ์Šค ๊ฒฐ์ œ API", description = "์ฃผ๋ฌธํ•˜๊ธฐ(๋ฐฉ๋ฌธ๋ฆฌ์ŠคํŠธ ์ค€๋น„์ค‘ ์ถ”๊ฐ€) + ํ† ์Šค ๊ฒฐ์ œ API ์ž…๋‹ˆ๋‹ค.")
public ApplicationResponse<ApprovalResponse> tossPayment(
public ApplicationResponse<String> tossPayment(
@RequestHeader(AuthConsts.ACCESS_TOKEN_HEADER) String accessToken,
@RequestBody ApprovalRequest request
) {

final ApprovalResponse approval = paymentService.approval(accessToken, request);
return ApplicationResponse.ok(approval);
paymentService.approval(accessToken, request);
return ApplicationResponse.ok("์ฃผ๋ฌธ ์™„๋ฃŒ");
}

// ์ฃผ๋ฌธ ์‚ญ์ œ
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import java.util.List;

public record ApprovalRequest(
List<Long> menuIds,
List<Long> cartIds,
String orderNum,
String paymentKey,
Integer amount,
Expand Down
Loading
Loading