Skip to content

Commit

Permalink
feat: 장바구니 비우기 기능 구현 (#171)
Browse files Browse the repository at this point in the history
* feat: 장바구니 추가 기능 구현

* feat: 장바구니 조회 기능 구현

* feat: 상품 주문과 식권 사용 기능 구현

* style: 포인트트랜잭션 레포지토리명 변경

* deploy: 재배포

* deploy: 재배포2

* deploy: 로그인 로직 수정에 따른 재배포

* deploy: 로그인 로직 수정에 따른 재배포2

* feat: 식권 사용 기능 구현

* feat: yml 수정 사항 반영

* feat: 식권 사용 로직 수정

* feat: 주문 로직 수정 완료

* fix: 장바구니에 아무것도 없을 때 주문 시 active 되는 현상 수정

* feat: 주문 완료 시 리턴 값 수정

* feat: 내 그룹 조회 기능 구현

* feat: 기본 프로필 이미지 url 추가

* feat: 그룹 멤버 전체 조회 기능 구현

* feat: 1인당 사용 가능 금액 설정 컬럼 추가

* feat: 내 지갑 조회 기능 구현

* feat: 선결제 기능 구현

* feat: 유저 홈 화면 조회 기능 구현

* feat: 그룹 상세 조회 기능 구현

* feat: 가게 상세 조회 쿼리 수정

* deploy: 변경사항 반영을 위한 커밋

* deploy: 수정 사항 반영 재배포

* deploy: rds 교체로 인한 재배포

* deploy: rds 교체로 인한 재배포2

* feat: 홈 화면 소속팀 조회 쿼리 제대로 안되던 현상 해결, 대표이미지 반환 추가

* feat: 그룹 상세 조회 응답 컬럼명 변경

* feat: memberLimit 컬럼 삭제

* feat: 선결제 시 기존 결제 내역과 멱등성 문제 해결

* fix: 팀 상세 조회 시 이미지 쿼리가 의미 없이 join 되던 쿼리 수정

* feat: 가게 검색 기능 대폭 수정

* feat: 프론트 요구사 반영

* feat: searchcondition 삭제

* feat: 팀타입 desription 리턴 하도록 수정

* feat: 카테고리별 팀 조회 시 팀 생성일 컬럼 추가

* feat: 매장찾기_상세 페이지 조회 기능 구현

* feat: 비밀 코드 조회 기능 엔드 포인트 수정

* fix: conflict fix

* hotfix: 서버 복구

* hotfix: 서버 복구2

* feat: Barobill api 연동

* fix: 홈 화면에 같은 데이터가 중복되는 현상 수정

* infra: ElastiCache 연결을 위한 docker-compose 설정

* infra: cicd script 수정

* infra: cicd script ec2 주소 설정

* infra: cicd script 수정2

* infra: cicd script 수정3

* infra: cicd script 수정4

* infra: cicd script 수정5

* infra: cicd script 수정6

* infra: cicd script 수정7

* infra: cicd script 수정7

* infra: cicd script 수정8

* infra: cicd script 수정9

* infra: cicd script 수정10

* infra: cicd script 수정11

* infra: cicd script 수정12

* infra: cicd script 수정13

* infra: cicd script 수정14

* infra: cicd script 수정15

* infra: cicd script 수정16

* infra: cicd script 수정17

* infra: cicd script 수정18

* infra: cicd script 수정19

* infra: cicd script 수정20

* infra: cicd script 수정21

* infra: cicd script 수정22

* fix: 보유금액이 선결제 금액보다 작을 경우 상태값 변경(200->400)

* feat: 홈화면 가게 별 선결제 디데이 추가, 쿼리문 조정

* feat: 주문하기 로직 정상화

* feat: 장바구니에 다른 가게 물건이 있는지 검증 구현

* feat: 장바구니 비우기 기능 구현
  • Loading branch information
LEEJaeHyeok97 authored Nov 28, 2024
1 parent 0d0d7b4 commit e28ee3e
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ public Message addCart(String userProviderId, AddCartRequest addCartRequest) {
Menu menu = menuRepository.findById(addCartRequest.menuId())
.orElseThrow(() -> new IllegalArgumentException("등록된 메뉴를 찾을 수 없습니다. "));

List<Cart> allByUserAndStatus = cartRepository.findAllByUserAndStatus(user, Status.ACTIVE);
Cart.validateHasAnotherStoreItem(user, addCartRequest, allByUserAndStatus);

Optional<Cart> optionalCart = cartRepository.findByUserIdAndMenuIdAndStatus(user.getUserId(), menu.getId(),
Status.ACTIVE);

Expand Down Expand Up @@ -126,16 +129,6 @@ public OrderResponse order(String userProviderId, OrderRequest orderRequest) {
Team team = teamRepository.findById(orderRequest.teamId())
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 그룹 id 입니다."));

List<Cart> existingCarts = cartRepository.findAllByUserAndStoreAndStatus(user, store, Status.ACTIVE);

List<Cart> mergedCarts = mergeCarts(existingCarts, orderRequest.items(), user, store);

Orders orders = saveOrder(user, store, team, orderRequest);

associateCartsWithOrder(mergedCarts, orders);

cartRepository.saveAll(mergedCarts);

List<Long> menuIds = orderRequest.items()
.stream()
.map(item -> item.menuId())
Expand Down Expand Up @@ -169,73 +162,70 @@ public OrderResponse order(String userProviderId, OrderRequest orderRequest) {
.store(store)
.build();

System.out.println("totalAmount = " + totalAmount);

pointTransactionRepository.save(pointTransaction);

StoreTeam storeTeam = storeTeamRepository.findByStoreIdAndTeamId(store.getId(), team.getId())
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 가게 id와 팀 id 입니다."));

storeTeam.useRemainPoint(totalAmount);

return ordersRepository.findTicket(orders.getId());
}
Orders orders = saveOrder(user, store, team, orderRequest);

private List<Cart> mergeCarts(List<Cart> existingCarts, List<OrderRequest.OrderItemRequest> items, User user,
Store store) {
if (existingCarts.isEmpty()) {
for (OrderRequest.OrderItemRequest item : items) {
Cart newCartAfterOrder = createNewCartAfterOrder(item, user, store);
existingCarts.add(newCartAfterOrder);
}
return existingCarts;
}
List<Cart> allByUserAndStatus = cartRepository.findAllByUserAndStatus(user, Status.ACTIVE);
System.out.println("allByUserAndStatus = " + allByUserAndStatus);

for (OrderRequest.OrderItemRequest item : items) {
Optional<Cart> existingCart = findCartByMenuId(existingCarts, item.menuId());
if (existingCart.isPresent()) {
existingCart.get().updateQuantity(item.quantity());
existingCart.get().updateStatus(Status.INACTIVE);
continue;
}
Cart newCart = createNewCart(item, user, store);
existingCarts.add(newCart);
}
return existingCarts;
}
syncCart(orderRequest, allByUserAndStatus, orders, user);
OrderResponse ticket = ordersRepository.findTicket(orders.getId());

private Optional<Cart> findCartByMenuId(List<Cart> carts, Long menuId) {
return carts.stream()
.filter(cart -> cart.getMenu().getId().equals(menuId))
.findFirst();
}
List<Cart> cartsForStatusManage = cartRepository.findAllByUserAndStatus(user, Status.ACTIVE);

private Cart createNewCart(OrderRequest.OrderItemRequest item, User user, Store store) {
Menu menu = menuRepository.findById(item.menuId())
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 메뉴 ID입니다."));
return Cart.builder()
.quantity(item.quantity())
.menu(menu)
.user(user)
.store(store)
.orders(null)
.build();
}
cartsForStatusManage.stream()
.forEach(cart -> cart.updateStatus(Status.INACTIVE));

private Cart createNewCartAfterOrder(OrderRequest.OrderItemRequest item, User user, Store store) {
Menu menu = menuRepository.findById(item.menuId())
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 메뉴 ID입니다."));
Cart cart = Cart.builder()
.quantity(item.quantity())
.menu(menu)
.user(user)
.store(store)
.orders(null)
.build();
return ticket;
}

cart.updateStatus(Status.INACTIVE);
private void syncCart(OrderRequest orderRequest, List<Cart> carts, Orders orders, User user) {
if (carts.isEmpty()) {
for (OrderRequest.OrderItemRequest orderItemRequest : orderRequest.items()) {
Menu menu = menuRepository.findById(orderItemRequest.menuId())
.orElseThrow(() -> new IllegalArgumentException("해당 메뉴를 찾을 수 없습니다."));

Cart newCart = Cart.builder()
.quantity(orderItemRequest.quantity())
.orders(orders)
.menu(menu)
.user(user)
.store(orders.getStore())
.build();

cartRepository.save(newCart);
cartRepository.flush();
}
} else {
for (Cart cart : carts) {
for (OrderRequest.OrderItemRequest orderItemRequest : orderRequest.items()) {
if (orderItemRequest.menuId().equals(cart.getMenu().getId())) {
cart.updateQuantity(orderItemRequest.quantity());
cart.updateOrders(orders);
} else {
Menu menu = menuRepository.findById(orderItemRequest.menuId())
.orElseThrow(() -> new IllegalArgumentException("해당 메뉴를 찾을 수 없습니다."));

Cart newCart = Cart.builder()
.quantity(orderItemRequest.quantity())
.orders(orders)
.menu(menu)
.user(user)
.store(cart.getStore())
.build();

cartRepository.save(newCart);
}
}

return cart;
}
}
}

private Orders saveOrder(User user, Store store, Team team, OrderRequest orderRequest) {
Expand All @@ -248,10 +238,6 @@ private Orders saveOrder(User user, Store store, Team team, OrderRequest orderRe
return ordersRepository.save(orders);
}

private void associateCartsWithOrder(List<Cart> carts, Orders orders) {
carts.forEach(cart -> cart.updateOrders(orders));
}

@Transactional
public Message useMealTicket(String userProviderId, Long orderId) {
User user = userRepository.findByProviderId(userProviderId)
Expand Down Expand Up @@ -279,4 +265,18 @@ public Message useMealTicket(String userProviderId, Long orderId) {
.message("식권을 사용했습니다.")
.build();
}

@Transactional
public Message removeCart(String userProviderId) {
User user = userRepository.findByProviderId(userProviderId)
.orElseThrow(() -> new NullPointerException());

List<Cart> allByUserAndStatus = cartRepository.findAllByUserAndStatus(user, Status.ACTIVE);

cartRepository.deleteAll(allByUserAndStatus);

return Message.builder()
.message("장바구니를 비웠습니다.")
.build();
}
}
10 changes: 10 additions & 0 deletions src/main/java/com/jangburich/domain/order/domain/Cart.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.jangburich.domain.common.BaseEntity;
import com.jangburich.domain.menu.domain.Menu;
import com.jangburich.domain.order.dto.request.AddCartRequest;
import com.jangburich.domain.store.domain.Store;
import com.jangburich.domain.user.domain.User;
import jakarta.persistence.Column;
Expand Down Expand Up @@ -57,6 +58,15 @@ public Cart(Integer quantity, Orders orders, Menu menu, User user, Store store)
this.store = store;
}

public static void validateHasAnotherStoreItem(User user, AddCartRequest addCartRequest,
List<Cart> allByUserAndStatus) {
for (Cart cart : allByUserAndStatus) {
if (!cart.getStore().getId().equals(addCartRequest.storeId())) {
throw new IllegalArgumentException("서로 다른 가게의 물건을 장바구니에 함께 담을 수 없습니다.");
}
}
}

public void updateQuantity(int quantity) {
this.quantity = quantity;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,7 @@ public interface CartRepository extends JpaRepository<Cart, Long> {
List<Cart> findAllByUserAndStoreAndStatus(User user, Store store, Status status);

List<Cart> findAllByOrders(Orders orders);

Optional<List<Cart>> findByUser(User user);

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import static com.jangburich.domain.order.domain.QCart.cart;
import static com.jangburich.domain.order.domain.QOrders.orders;

import com.jangburich.domain.common.Status;
import com.jangburich.domain.order.dto.response.OrderItemResponse;
import com.jangburich.domain.order.dto.response.OrderResponse;
import com.jangburich.domain.order.dto.response.QOrderItemResponse;
Expand All @@ -30,7 +31,8 @@ public OrderResponse findTicket(Long ordersId) {
.from(cart)
.leftJoin(orders).on(cart.orders.id.eq(ordersId))
.leftJoin(menu).on(cart.menu.id.eq(menu.id))
.where((cart.orders.id.eq(ordersId)))
.where((cart.orders.id.eq(ordersId)),
cart.status.eq(Status.ACTIVE))
.fetch();

int totalPrice = orderItemResponses.stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
Expand All @@ -36,6 +37,14 @@ public ResponseCustom<Message> addCart(
return ResponseCustom.OK(orderService.addCart(AuthenticationParser.parseUserId(authentication), addCartRequest));
}

@Operation(summary = "장바구니 비우기", description = "장바구니를 완전히 비웁니다.")
@DeleteMapping
public ResponseCustom<Message> removeCart(
Authentication authentication
) {
return ResponseCustom.OK(orderService.removeCart(AuthenticationParser.parseUserId(authentication)));
}

@Operation(summary = "장바구니 조회", description = "장바구니에 담은 상품을 조회합니다.")
@GetMapping("/carts")
public ResponseCustom<CartResponse> getCartItems(
Expand Down

0 comments on commit e28ee3e

Please sign in to comment.