Skip to content
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
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package danji.danjiapi.domain.market.controller;

import danji.danjiapi.domain.market.dto.request.MarketSearchCondition;
import danji.danjiapi.domain.market.dto.response.MarketSummary;
import danji.danjiapi.domain.market.dto.response.MarketDetail;
import danji.danjiapi.domain.market.service.MarketService;
import danji.danjiapi.domain.market.dto.response.ProductDetail;
import danji.danjiapi.global.response.ApiResponse;
Expand All @@ -21,8 +21,8 @@ public class MarketController {
private final MarketService marketService;

@GetMapping("")
@Operation(summary = "가게 목록 조회 및 검색", description = "회원이 모든 가게들의 목록을 조회하고, 키워드로 원하는 가게를 검색합니다.")
public ApiResponse<List<MarketSummary>> getMarkets(@ModelAttribute MarketSearchCondition searchCondition) {
@Operation(summary = "가게 목록 조회 및 검색", description = "고객이 모든 가게들의 목록을 조회하고, 키워드로 원하는 가게를 검색합니다.")
public ApiResponse<List<MarketDetail>> getMarkets(@ModelAttribute MarketSearchCondition searchCondition) {
return ApiResponse.success(marketService.searchMarkets(searchCondition));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

import danji.danjiapi.domain.market.entity.Market;

public record MarketSummary(
public record MarketDetail(
Long id,
String name,
String address,
String imageUrl
) {
public static MarketSummary from(Market market) {
return new MarketSummary(
public static MarketDetail from(Market market) {
return new MarketDetail(
market.getId(),
market.getName(),
market.getAddress(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ public class Market {
private User user;

@OneToMany(mappedBy = "market", cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
private List<Product> products = new ArrayList<>();

public static Market create(String name, String address, String imageUrl, User user) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import danji.danjiapi.domain.market.entity.Market;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
Expand All @@ -11,6 +12,9 @@ public interface MarketRepository extends JpaRepository<Market, Long> {

Optional<Market> findByUserId(Long id);

@Query("SELECT m FROM Market m JOIN FETCH m.user WHERE m.user.id IN :userIds")
List<Market> findAllByUserIdIn(@Param("userIds") Set<Long> userIds);

@Query("""
SELECT DISTINCT m FROM Market m
LEFT JOIN m.products p
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package danji.danjiapi.domain.market.service;

import danji.danjiapi.domain.market.dto.request.MarketSearchCondition;
import danji.danjiapi.domain.market.dto.response.MarketSummary;
import danji.danjiapi.domain.market.dto.response.MarketDetail;
import danji.danjiapi.domain.market.dto.response.ProductDetail;
import danji.danjiapi.domain.market.entity.Market;
import danji.danjiapi.domain.market.repository.MarketRepository;
Expand All @@ -22,7 +22,7 @@ public class MarketService {
private final ProductRepository productRepository;
private final CurrentUserResolver currentUserResolver;

public List<MarketSummary> searchMarkets(MarketSearchCondition searchCondition) {
public List<MarketDetail> searchMarkets(MarketSearchCondition searchCondition) {
List<Market> markets;

if (searchCondition == null || searchCondition.keyword() == null || searchCondition.keyword().trim().isEmpty()) {
Expand All @@ -32,7 +32,7 @@ public List<MarketSummary> searchMarkets(MarketSearchCondition searchCondition)
}

return markets.stream()
.map(MarketSummary::from)
.map(MarketDetail::from)
.toList();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package danji.danjiapi.domain.order.controller;

import danji.danjiapi.domain.order.dto.request.OrderCreateRequest;
import danji.danjiapi.domain.order.dto.request.OrderStatusUpdateRequest;
import danji.danjiapi.domain.order.dto.request.OrderUpdateRequest;
import danji.danjiapi.domain.order.dto.response.CustomerOrderDetail;
import danji.danjiapi.domain.order.dto.response.MerchantOrderDetail;
import danji.danjiapi.domain.order.dto.response.OrderCreateResponse;
import danji.danjiapi.domain.order.dto.response.OrderStatusUpdateResponse;
import danji.danjiapi.domain.order.service.OrderService;
import danji.danjiapi.global.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.Valid;
import java.util.List;
import lombok.RequiredArgsConstructor;
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;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class OrderController {
private final OrderService orderService;

@GetMapping("/customers/me/orders")
@Operation(summary = "고객의 주문 목록 조회", description = "고객이 모든 주문 목록을 조회합니다. 주문은 주문 항목들과 주문 상태를 포함합니다.")
public ApiResponse<List<CustomerOrderDetail>> getCustomerOrders() {
return ApiResponse.success(orderService.getCustomerOrders());
}

@GetMapping("/merchants/me/orders")
@Operation(summary = "사장님의 주문 목록 조회", description = "사장님이 모든 주문 목록을 조회합니다. 주문은 주문 항목들과 주문 상태를 포함합니다.")
public ApiResponse<List<MerchantOrderDetail>> getMerchantOrders() {
return ApiResponse.success(orderService.getMerchantOrders());
}

@PostMapping("/orders")
@Operation(summary = "고객의 주문 요청", description = "고객이 주문을 요청(생성)합니다. 요청은 PENDING 상태로 생성됩니다.")
public ApiResponse<OrderCreateResponse> create(@Valid @RequestBody OrderCreateRequest request) {
return ApiResponse.success(orderService.create(request));
}

@PatchMapping("/orders/{orderId}")
@Operation(summary = "사장님의 주문 수정", description = "사장님이 주문(주문 항목의 가격, 수량)을 수정합니다.")
public ApiResponse<Void> update(@PathVariable Long orderId,
@Valid @RequestBody OrderUpdateRequest request) {
orderService.update(orderId, request);
return ApiResponse.success(null, "주문 수정이 완료되었습니다.");
}

@PatchMapping("/orders/{orderId}/status")
@Operation(summary = "사장님의 주문 수락 및 거절", description = "사장님이 주문 상태를 수락 또는 거절로 변경합니다.")
public ApiResponse<OrderStatusUpdateResponse> updateStatus(@PathVariable Long orderId,
@Valid @RequestBody OrderStatusUpdateRequest request) {
return ApiResponse.success(orderService.updateStatus(orderId, request));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package danji.danjiapi.domain.order.dto.request;

import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.List;

public record OrderCreateRequest(
@NotNull(message = "가게 id가 누락되었습니다.")
Long marketId,
@NotNull(message = "배송 일자가 누락되었습니다.")
LocalDateTime date,
String deliveryAddress,
@NotNull(message = "주문 항목이 누락되었습니다.")
@NotEmpty(message = "주문 상품 목록은 비어있을 수 없습니다.")
List<OrderItemInfo> orderItems
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package danji.danjiapi.domain.order.dto.request;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;

public record OrderItemDetail(
@NotNull(message = "상품 id가 누락되었습니다.")
Long id,
@NotBlank(message = "상품명이 누락되었습니다.")
String name,
@NotNull(message = "상품 가격이 누락되었습니다.")
BigDecimal price,
@NotNull(message = "상품 수량이 누락되었습니다.")
Integer quantity
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package danji.danjiapi.domain.order.dto.request;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;

public record OrderItemInfo(
@NotBlank(message = "상품명이 누락되었습니다.")
String name,
@NotNull(message = "상품 가격이 누락되었습니다.")
BigDecimal price,
@NotNull(message = "상품 수량이 누락되었습니다.")
Integer quantity
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package danji.danjiapi.domain.order.dto.request;

import jakarta.validation.constraints.NotNull;

public record OrderStatusUpdateRequest(
@NotNull(message = "주문 상태가 누락되었습니다.")
String status
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package danji.danjiapi.domain.order.dto.request;

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

public record OrderUpdateRequest(
@NotNull(message = "주문 상품 목록이 누락되었습니다.")
@NotEmpty(message = "주문 상품 목록은 비어있을 수 없습니다.")
List<OrderItemDetail> orderItems
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package danji.danjiapi.domain.order.dto.response;

import danji.danjiapi.domain.market.entity.Market;
import danji.danjiapi.domain.order.entity.Order;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

public record CustomerOrderDetail(
Long orderId,
String orderStatus,
LocalDateTime date,
String deliveryAddress,
MarketSummary market,
List<OrderItemDetail> orderItems,
BigDecimal totalPrice
) {
public static CustomerOrderDetail from(Order order, Market market) {
List<OrderItemDetail> orderItemDetails = order.getOrderItems().stream()
.map(OrderItemDetail::from)
.toList();

BigDecimal totalPrice = orderItemDetails.stream()
.map(item -> item.price().multiply(BigDecimal.valueOf(item.quantity())))
.reduce(BigDecimal.ZERO, BigDecimal::add);

return new CustomerOrderDetail(
order.getId(),
order.getStatus().name(),
order.getDate(),
order.getDeliveryAddress(),
MarketSummary.from(market),
orderItemDetails,
totalPrice
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package danji.danjiapi.domain.order.dto.response;

import danji.danjiapi.domain.user.entity.User;

public record CustomerSummary(
Long id,
String name
) {
public static CustomerSummary from(User user) {
return new CustomerSummary(
user.getId(),
user.getName()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package danji.danjiapi.domain.order.dto.response;

import danji.danjiapi.domain.market.entity.Market;

public record MarketSummary(
Long id,
String name,
String address
) {
public static MarketSummary from(Market market) {
return new MarketSummary(
market.getId(),
market.getName(),
market.getAddress()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package danji.danjiapi.domain.order.dto.response;

import danji.danjiapi.domain.order.entity.Order;
import danji.danjiapi.domain.user.entity.User;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

public record MerchantOrderDetail(
Long orderId,
String orderStatus,
LocalDateTime date,
String deliveryAddress,
CustomerSummary customer,
List<OrderItemDetail> orderItems,
BigDecimal totalPrice
) {
public static MerchantOrderDetail from(Order order, User customer) {
List<OrderItemDetail> orderItemDetails = order.getOrderItems().stream()
.map(OrderItemDetail::from)
.toList();

BigDecimal totalPrice = orderItemDetails.stream()
.map(item -> item.price().multiply(BigDecimal.valueOf(item.quantity())))
.reduce(BigDecimal.ZERO, BigDecimal::add);

return new MerchantOrderDetail(
order.getId(),
order.getStatus().name(),
order.getDate(),
order.getDeliveryAddress(),
CustomerSummary.from(customer),
orderItemDetails,
totalPrice
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package danji.danjiapi.domain.order.dto.response;

import danji.danjiapi.domain.order.entity.Order;

public record OrderCreateResponse(
Long id
) {
public static OrderCreateResponse from(Order order) {
return new OrderCreateResponse(
order.getId()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package danji.danjiapi.domain.order.dto.response;

import danji.danjiapi.domain.order.entity.OrderItem;
import java.math.BigDecimal;

public record OrderItemDetail(
Long id,
String name,
Integer quantity,
BigDecimal price
) {
public static OrderItemDetail from(OrderItem orderItem) {
return new OrderItemDetail(
orderItem.getId(),
orderItem.getName(),
orderItem.getQuantity(),
orderItem.getPrice()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package danji.danjiapi.domain.order.dto.response;

import danji.danjiapi.domain.order.entity.Order;

public record OrderStatusUpdateResponse(
Long orderId,
String updatedStatus
) {
public static OrderStatusUpdateResponse from(Order order) {
return new OrderStatusUpdateResponse(order.getId(), order.getStatus().name());
}
}
Loading