-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
3f31f13
commit b1b740d
Showing
27 changed files
with
963 additions
and
0 deletions.
There are no files selected for viewing
88 changes: 88 additions & 0 deletions
88
...ation/app-api/src/main/java/core/startup/mealtoktok/api/mealdelivery/MealDeliveryApi.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
package core.startup.mealtoktok.api.mealdelivery; | ||
|
||
import java.util.List; | ||
|
||
import org.springframework.security.core.annotation.AuthenticationPrincipal; | ||
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.RequestMapping; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
|
||
import core.startup.mealtoktok.api.mealdelivery.dto.FullDiningResponse; | ||
import core.startup.mealtoktok.api.mealdelivery.dto.MealDeliveryResponse; | ||
import core.startup.mealtoktok.common.dto.Response; | ||
import core.startup.mealtoktok.domain.mealdelivery.CollectingState; | ||
import core.startup.mealtoktok.domain.mealdelivery.DeliveryState; | ||
import core.startup.mealtoktok.domain.mealdelivery.FullDining; | ||
import core.startup.mealtoktok.domain.mealdelivery.MealDeliveryService; | ||
import core.startup.mealtoktok.domain.mealdelivery.TargetFullDining; | ||
import core.startup.mealtoktok.domain.mealdelivery.TargetMealDelivery; | ||
import core.startup.mealtoktok.domain.order.Orderer; | ||
import core.startup.mealtoktok.domain.user.User; | ||
|
||
@RequestMapping("/api/v1/meal-deliveries") | ||
@RestController | ||
@RequiredArgsConstructor | ||
public class MealDeliveryApi implements MealDeliveryApiDocs { | ||
|
||
private final MealDeliveryService mealDeliveryService; | ||
|
||
@GetMapping("/delivering") | ||
public Response<MealDeliveryResponse> deliveringMeal( | ||
@AuthenticationPrincipal User currentUser) { | ||
return Response.success( | ||
MealDeliveryResponse.from( | ||
mealDeliveryService.getDeliveringMeal(Orderer.from(currentUser)))); | ||
} | ||
|
||
@GetMapping("/{mealDeliveryId}") | ||
public Response<MealDeliveryResponse> mealDelivery(@PathVariable Long mealDeliveryId) { | ||
return Response.success( | ||
MealDeliveryResponse.from( | ||
mealDeliveryService.getMealDelivery( | ||
TargetMealDelivery.from(mealDeliveryId)))); | ||
} | ||
|
||
@GetMapping("/delivered") | ||
public Response<MealDeliveryResponse> recentDeliveredMeal( | ||
@AuthenticationPrincipal User currentUser) { | ||
return Response.success( | ||
MealDeliveryResponse.from( | ||
mealDeliveryService.getRecentDeliveredMeal(Orderer.from(currentUser)))); | ||
} | ||
|
||
@PatchMapping("/{mealDeliveryId}/{deliveryState}") | ||
public Response<Void> changeDeliveryState( | ||
@PathVariable Long mealDeliveryId, @PathVariable DeliveryState deliveryState) { | ||
mealDeliveryService.changeDeliveryState( | ||
TargetMealDelivery.from(mealDeliveryId), deliveryState); | ||
return Response.success("배송 상태 변경 성공"); | ||
} | ||
|
||
@PatchMapping("/full-dinings/{fullDiningId}/{collectingState}") | ||
public Response<Void> changeCollectingState( | ||
@PathVariable Long fullDiningId, @PathVariable CollectingState collectingState) { | ||
mealDeliveryService.changeCollectingState( | ||
TargetFullDining.from(fullDiningId), collectingState); | ||
return Response.success("수거 상태 변경 성공"); | ||
} | ||
|
||
@GetMapping("/full-dinings/collect-requested/count") | ||
public Response<Integer> countCollectRequestContainers( | ||
@AuthenticationPrincipal User currentUser) { | ||
return Response.success( | ||
mealDeliveryService.countCollectRequestContainers(Orderer.from(currentUser))); | ||
} | ||
|
||
@GetMapping("/full-dinings") | ||
public Response<List<FullDiningResponse>> fullDinings( | ||
@AuthenticationPrincipal User currentUser) { | ||
List<FullDining> fullDinings = | ||
mealDeliveryService.getFullDinings(Orderer.from(currentUser)); | ||
return Response.success( | ||
fullDinings.parallelStream().map(FullDiningResponse::from).toList()); | ||
} | ||
} |
38 changes: 38 additions & 0 deletions
38
...n/app-api/src/main/java/core/startup/mealtoktok/api/mealdelivery/MealDeliveryApiDocs.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package core.startup.mealtoktok.api.mealdelivery; | ||
|
||
import java.util.List; | ||
|
||
import core.startup.mealtoktok.api.mealdelivery.dto.FullDiningResponse; | ||
import core.startup.mealtoktok.api.mealdelivery.dto.MealDeliveryResponse; | ||
import core.startup.mealtoktok.common.dto.Response; | ||
import core.startup.mealtoktok.domain.mealdelivery.CollectingState; | ||
import core.startup.mealtoktok.domain.mealdelivery.DeliveryState; | ||
import core.startup.mealtoktok.domain.user.User; | ||
|
||
import io.swagger.v3.oas.annotations.Operation; | ||
import io.swagger.v3.oas.annotations.tags.Tag; | ||
|
||
@Tag(name = "도시락 배달 API") | ||
public interface MealDeliveryApiDocs { | ||
|
||
@Operation(summary = "배송 중인 도시락 조회") | ||
Response<MealDeliveryResponse> deliveringMeal(User currentUser); | ||
|
||
@Operation(summary = "도시락 배송 단건 조회") | ||
Response<MealDeliveryResponse> mealDelivery(Long mealDeliveryId); | ||
|
||
@Operation(summary = "최근 배송 완료된 도시락 조회") | ||
Response<MealDeliveryResponse> recentDeliveredMeal(User currentUser); | ||
|
||
@Operation(summary = "도시락 배송 상태 변경") | ||
Response<Void> changeDeliveryState(Long mealDeliveryId, DeliveryState deliveryState); | ||
|
||
@Operation(summary = "풀대접 서비스 수거 상태 변경") | ||
Response<Void> changeCollectingState(Long fullDiningId, CollectingState collectingState); | ||
|
||
@Operation(summary = "풀대접 서비스 수거 요청된 다회용기 갯수 조회") | ||
Response<Integer> countCollectRequestContainers(User currentUser); | ||
|
||
@Operation(summary = "풀대접 서비스 다회용기 납부 목록 조회") | ||
Response<List<FullDiningResponse>> fullDinings(User currentUser); | ||
} |
21 changes: 21 additions & 0 deletions
21
...pp-api/src/main/java/core/startup/mealtoktok/api/mealdelivery/dto/FullDiningResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package core.startup.mealtoktok.api.mealdelivery.dto; | ||
|
||
import java.time.LocalDateTime; | ||
|
||
import core.startup.mealtoktok.domain.mealdelivery.CollectingState; | ||
import core.startup.mealtoktok.domain.mealdelivery.FullDining; | ||
|
||
public record FullDiningResponse( | ||
Long fullDiningId, | ||
Long mealDeliveryId, | ||
CollectingState collectState, | ||
LocalDateTime collectedDateTime) { | ||
|
||
public static FullDiningResponse from(FullDining fullDining) { | ||
return new FullDiningResponse( | ||
fullDining.getFullDiningId(), | ||
fullDining.getMealDeliveryId(), | ||
fullDining.getCollectState(), | ||
fullDining.getCollectedDateTime()); | ||
} | ||
} |
28 changes: 28 additions & 0 deletions
28
...-api/src/main/java/core/startup/mealtoktok/api/mealdelivery/dto/MealDeliveryResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package core.startup.mealtoktok.api.mealdelivery.dto; | ||
|
||
import static com.fasterxml.jackson.annotation.JsonInclude.Include.*; | ||
|
||
import core.startup.mealtoktok.domain.mealdelivery.DeliveryDateTime; | ||
import core.startup.mealtoktok.domain.mealdelivery.DeliveryState; | ||
import core.startup.mealtoktok.domain.mealdelivery.MealDelivery; | ||
import core.startup.mealtoktok.domain.order.OrderedMeal; | ||
|
||
import com.fasterxml.jackson.annotation.JsonInclude; | ||
|
||
@JsonInclude(NON_NULL) | ||
public record MealDeliveryResponse( | ||
Long mealDeliveryId, | ||
Long orderId, | ||
OrderedMeal orderedMeal, | ||
DeliveryState deliveryState, | ||
DeliveryDateTime deliveryDateTime) { | ||
|
||
public static MealDeliveryResponse from(MealDelivery mealDelivery) { | ||
return new MealDeliveryResponse( | ||
mealDelivery.getMealDeliveryId(), | ||
mealDelivery.getTargetOrder().orderId(), | ||
mealDelivery.getOrderedMeal(), | ||
mealDelivery.getDeliveryState(), | ||
mealDelivery.getDeliveryDateTime()); | ||
} | ||
} |
7 changes: 7 additions & 0 deletions
7
domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/CollectingState.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package core.startup.mealtoktok.domain.mealdelivery; | ||
|
||
public enum CollectingState { | ||
NOT_COLLECTED, | ||
COLLECT_REQUESTED, | ||
COLLECTED | ||
} |
25 changes: 25 additions & 0 deletions
25
domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/DeliveryDateTime.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package core.startup.mealtoktok.domain.mealdelivery; | ||
|
||
import java.time.LocalDateTime; | ||
|
||
public record DeliveryDateTime( | ||
LocalDateTime deliveryStartTime, LocalDateTime deliveryCompleteTime) { | ||
|
||
public static DeliveryDateTime of( | ||
LocalDateTime deliveryStartTime, LocalDateTime deliveryCompleteTime) { | ||
return new DeliveryDateTime(deliveryStartTime, deliveryCompleteTime); | ||
} | ||
|
||
public static DeliveryDateTime start(LocalDateTime deliveryStartTime) { | ||
return new DeliveryDateTime(deliveryStartTime, null); | ||
} | ||
|
||
public static DeliveryDateTime complete( | ||
LocalDateTime deliveryStartTime, LocalDateTime deliveryCompleteTime) { | ||
return new DeliveryDateTime(deliveryStartTime, deliveryCompleteTime); | ||
} | ||
|
||
public static DeliveryDateTime init() { | ||
return new DeliveryDateTime(null, null); | ||
} | ||
} |
7 changes: 7 additions & 0 deletions
7
domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/DeliveryState.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package core.startup.mealtoktok.domain.mealdelivery; | ||
|
||
public enum DeliveryState { | ||
PENDING, | ||
DELIVERING, | ||
DELIVERED | ||
} |
35 changes: 35 additions & 0 deletions
35
domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/FullDining.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
package core.startup.mealtoktok.domain.mealdelivery; | ||
|
||
import java.time.LocalDateTime; | ||
|
||
import lombok.AccessLevel; | ||
import lombok.AllArgsConstructor; | ||
import lombok.Builder; | ||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
|
||
@Getter | ||
@Builder | ||
@NoArgsConstructor(access = AccessLevel.PROTECTED) | ||
@AllArgsConstructor(access = AccessLevel.PRIVATE) | ||
public class FullDining { | ||
|
||
private Long fullDiningId; | ||
private Long mealDeliveryId; | ||
private CollectingState collectState; | ||
private LocalDateTime collectedDateTime; | ||
|
||
public static FullDining create(MealDelivery mealDelivery) { | ||
return new FullDining( | ||
null, mealDelivery.getMealDeliveryId(), CollectingState.NOT_COLLECTED, null); | ||
} | ||
|
||
public void collectRequest() { | ||
this.collectState = CollectingState.COLLECT_REQUESTED; | ||
} | ||
|
||
public void collect() { | ||
this.collectState = CollectingState.COLLECTED; | ||
this.collectedDateTime = LocalDateTime.now(); | ||
} | ||
} |
44 changes: 44 additions & 0 deletions
44
domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/FullDiningManager.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
package core.startup.mealtoktok.domain.mealdelivery; | ||
|
||
import java.time.LocalDateTime; | ||
import java.util.List; | ||
|
||
import org.springframework.stereotype.Component; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
|
||
import core.startup.mealtoktok.domain.order.Orderer; | ||
|
||
@Component | ||
@RequiredArgsConstructor | ||
public class FullDiningManager { | ||
|
||
private final FullDiningRepository fullDiningRepository; | ||
|
||
public void reserve(List<MealDelivery> mealDeliveries) { | ||
List<FullDining> fullDinings = | ||
mealDeliveries.parallelStream() | ||
.filter(MealDelivery::hasFullDiningOption) | ||
.map(FullDining::create) | ||
.toList(); | ||
fullDiningRepository.saveAll(fullDinings); | ||
} | ||
|
||
public void collectRequest(TargetFullDining targetFullDining, CollectingState collectingState) { | ||
FullDining fullDining = fullDiningRepository.find(targetFullDining); | ||
switch (collectingState) { | ||
case COLLECT_REQUESTED -> fullDining.collectRequest(); | ||
case COLLECTED -> fullDining.collect(); | ||
} | ||
fullDiningRepository.update(fullDining); | ||
} | ||
|
||
public int countReturnableContainers(Orderer orderer, CollectingState collectingState) { | ||
return fullDiningRepository.countByCollectingState(orderer, collectingState); | ||
} | ||
|
||
public List<FullDining> getFullDinings( | ||
Orderer orderer, DeliveryState deliveryState, LocalDateTime validDateTime) { | ||
return fullDiningRepository.findAll(orderer, deliveryState, validDateTime); | ||
} | ||
} |
20 changes: 20 additions & 0 deletions
20
domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/FullDiningRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package core.startup.mealtoktok.domain.mealdelivery; | ||
|
||
import java.time.LocalDateTime; | ||
import java.util.List; | ||
|
||
import core.startup.mealtoktok.domain.order.Orderer; | ||
|
||
public interface FullDiningRepository { | ||
|
||
void saveAll(List<FullDining> fullDinings); | ||
|
||
void update(FullDining fullDining); | ||
|
||
FullDining find(TargetFullDining targetFullDining); | ||
|
||
List<FullDining> findAll( | ||
Orderer orderer, DeliveryState deliveryState, LocalDateTime validDateTime); | ||
|
||
int countByCollectingState(Orderer orderer, CollectingState collectingState); | ||
} |
43 changes: 43 additions & 0 deletions
43
domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/MealDelivery.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
package core.startup.mealtoktok.domain.mealdelivery; | ||
|
||
import java.time.LocalDateTime; | ||
|
||
import lombok.AccessLevel; | ||
import lombok.AllArgsConstructor; | ||
import lombok.Builder; | ||
import lombok.Getter; | ||
|
||
import core.startup.mealtoktok.domain.order.OrderedMeal; | ||
import core.startup.mealtoktok.domain.order.TargetOrder; | ||
|
||
@Getter | ||
@AllArgsConstructor(access = AccessLevel.PRIVATE) | ||
@Builder | ||
public class MealDelivery { | ||
|
||
private Long mealDeliveryId; | ||
private TargetOrder targetOrder; | ||
private OrderedMeal orderedMeal; | ||
private DeliveryState deliveryState; | ||
private DeliveryDateTime deliveryDateTime; | ||
|
||
public void startDelivery(LocalDateTime startDateTime) { | ||
this.deliveryDateTime = DeliveryDateTime.start(startDateTime); | ||
this.deliveryState = DeliveryState.DELIVERING; | ||
} | ||
|
||
public void completeDelivery(LocalDateTime completeDateTime) { | ||
this.deliveryDateTime = | ||
DeliveryDateTime.complete(deliveryDateTime.deliveryStartTime(), completeDateTime); | ||
this.deliveryState = DeliveryState.DELIVERED; | ||
} | ||
|
||
public static MealDelivery create(TargetOrder targetOrder, OrderedMeal orderedMeal) { | ||
return new MealDelivery( | ||
null, targetOrder, orderedMeal, DeliveryState.PENDING, DeliveryDateTime.init()); | ||
} | ||
|
||
public boolean hasFullDiningOption() { | ||
return orderedMeal.hasFullDiningOption(); | ||
} | ||
} |
Oops, something went wrong.