Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
…rver into feature/crud-meal
  • Loading branch information
somln committed Aug 26, 2024
2 parents 81961ce + a4e0638 commit 94edccd
Show file tree
Hide file tree
Showing 99 changed files with 1,889 additions and 437 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package core.startup.mealtoktok.api.fulldining;

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.fulldining.dto.FullDiningResponse;
import core.startup.mealtoktok.common.dto.Response;
import core.startup.mealtoktok.domain.fulldining.FullDining;
import core.startup.mealtoktok.domain.fulldining.FullDiningService;
import core.startup.mealtoktok.domain.fulldining.TargetFullDining;
import core.startup.mealtoktok.domain.mealdelivery.CollectingState;
import core.startup.mealtoktok.domain.mealdelivery.Recipient;
import core.startup.mealtoktok.domain.user.User;

@RequestMapping("/api/v1/full-dinings")
@RestController
@RequiredArgsConstructor
public class FullDingingApi implements FullDiningApiDocs {

private final FullDiningService fullDiningService;

@PatchMapping("/full-dinings/{fullDiningId}/{collectingState}")
public Response<Void> changeCollectingState(
@PathVariable Long fullDiningId, @PathVariable CollectingState collectingState) {
fullDiningService.changeCollectingState(
TargetFullDining.from(fullDiningId), collectingState);
return Response.success("수거 상태 변경 성공");
}

@GetMapping("/full-dinings/collect-requested/count")
public Response<Integer> countCollectRequestContainers(
@AuthenticationPrincipal User currentUser) {
return Response.success(
fullDiningService.countCollectRequestContainers(Recipient.from(currentUser)));
}

@GetMapping("/full-dinings")
public Response<List<FullDiningResponse>> fullDinings(
@AuthenticationPrincipal User currentUser) {
List<FullDining> fullDinings =
fullDiningService.getFullDinings(Recipient.from(currentUser));
return Response.success(
fullDinings.parallelStream().map(FullDiningResponse::from).toList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package core.startup.mealtoktok.api.fulldining;

import java.util.List;

import core.startup.mealtoktok.api.fulldining.dto.FullDiningResponse;
import core.startup.mealtoktok.common.dto.Response;
import core.startup.mealtoktok.domain.mealdelivery.CollectingState;
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 FullDiningApiDocs {

@Operation(summary = "풀대접 서비스 수거 상태 변경")
Response<Void> changeCollectingState(Long fullDiningId, CollectingState collectingState);

@Operation(summary = "풀대접 서비스 수거 요청된 다회용기 갯수 조회")
Response<Integer> countCollectRequestContainers(User currentUser);

@Operation(summary = "풀대접 서비스 7일 이내의 다회용기 납부 목록 조회")
Response<List<FullDiningResponse>> fullDinings(User currentUser);
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package core.startup.mealtoktok.api.mealdelivery.dto;
package core.startup.mealtoktok.api.fulldining.dto;

import java.time.LocalDateTime;

import core.startup.mealtoktok.domain.fulldining.FullDining;
import core.startup.mealtoktok.domain.mealdelivery.CollectingState;
import core.startup.mealtoktok.domain.mealdelivery.FullDining;

public record FullDiningResponse(
Long fullDiningId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import core.startup.mealtoktok.domain.user.User;
import core.startup.mealtoktok.domain.user.UserCacheManager;

@Aspect
Expand Down Expand Up @@ -84,6 +85,13 @@ public Object loggingBefore(ProceedingJoinPoint joinPoint) throws Throwable {
return result;
}

@Around("execution(* core.startup.mealtoktok.domain.user..*Updater.*(..)) && args(user, ..)")
public Object cacheUpdate(ProceedingJoinPoint joinPoint, User user) throws Throwable {
Object result = joinPoint.proceed();
userCacheManager.delete(user);
return result;
}

private static JSONObject getParams(HttpServletRequest request) throws JSONException {
JSONObject jsonObject = new JSONObject();
Enumeration<String> params = request.getParameterNames();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package core.startup.mealtoktok.api.global.util;

import java.util.Collections;
import java.util.List;

import org.springframework.web.multipart.MultipartFile;

import core.startup.mealtoktok.common.dto.File;

public class FileMapper {

public static List<File> toFiles(List<MultipartFile> files) {
if (files == null) {
return Collections.emptyList();
}

return files.stream().map(File::from).toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package core.startup.mealtoktok.api.global.web;

import java.util.ArrayList;
import java.util.List;

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import core.startup.mealtoktok.common.annotation.CursorDefault;
import core.startup.mealtoktok.common.dto.Cursor;
import core.startup.mealtoktok.common.dto.SortDirection;
import core.startup.mealtoktok.common.dto.SortOrder;

public class CursorArgumentResolver implements HandlerMethodArgumentResolver {

@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterType().equals(Cursor.class)
&& parameter.hasParameterAnnotation(CursorDefault.class);
}

@Override
public Object resolveArgument(
MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) {
CursorDefault cursorDefault = parameter.getParameterAnnotation(CursorDefault.class);

String pageParam = webRequest.getParameter("page");
int page = (pageParam != null) ? Integer.parseInt(pageParam) : cursorDefault.page();

String sizeParam = webRequest.getParameter("size");
int size = (sizeParam != null) ? Integer.parseInt(sizeParam) : cursorDefault.size();

List<SortOrder> sortOrders = new ArrayList<>();
String sortFieldsParam = webRequest.getParameter("sortFields");
String sortDirectionsParam = webRequest.getParameter("sortDirections");

String[] fields =
(sortFieldsParam != null)
? sortFieldsParam.split(",")
: cursorDefault.sortFields().split(",");
String[] directions =
(sortDirectionsParam != null)
? sortDirectionsParam.split(",")
: cursorDefault.sortDirections().split(",");

for (int i = 0; i < Math.min(fields.length, directions.length); i++) {
SortDirection direction = SortDirection.valueOf(directions[i].trim().toUpperCase());
sortOrders.add(new SortOrder(fields[i].trim(), direction));
}

return new Cursor(page, size, sortOrders);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package core.startup.mealtoktok.api.global.web;

import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

Expand All @@ -14,6 +15,54 @@
@Configuration
public class SwaggerConfig {

@Bean
public GroupedOpenApi dishStore() {
return GroupedOpenApi.builder()
.group("반찬가게")
.packagesToScan("core.startup.mealtoktok.api.dishstore")
.build();
}

@Bean
public GroupedOpenApi auth() {
return GroupedOpenApi.builder()
.group("인증")
.packagesToScan("core.startup.mealtoktok.api.auth")
.build();
}

@Bean
public GroupedOpenApi user() {
return GroupedOpenApi.builder()
.group("회원")
.packagesToScan("core.startup.mealtoktok.api.user")
.build();
}

@Bean
public GroupedOpenApi fullDining() {
return GroupedOpenApi.builder()
.group("풀대접")
.packagesToScan("core.startup.mealtoktok.api.fulldining")
.build();
}

@Bean
public GroupedOpenApi order() {
return GroupedOpenApi.builder()
.group("주문")
.packagesToScan("core.startup.mealtoktok.api.order")
.build();
}

@Bean
public GroupedOpenApi mealDelivery() {
return GroupedOpenApi.builder()
.group("도시락 배송")
.packagesToScan("core.startup.mealtoktok.api.mealdelivery")
.build();
}

@Bean
public OpenAPI openAPI() {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package core.startup.mealtoktok.api.global.web;

import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

Expand Down Expand Up @@ -29,4 +32,9 @@ public void addCorsMappings(CorsRegistry registry) {
.allowCredentials(true)
.maxAge(3600);
}

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new CursorArgumentResolver());
}
}
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
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.RequestParam;
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.annotation.CursorDefault;
import core.startup.mealtoktok.common.dto.Cursor;
import core.startup.mealtoktok.common.dto.Response;
import core.startup.mealtoktok.domain.mealdelivery.CollectingState;
import core.startup.mealtoktok.common.dto.SliceResult;
import core.startup.mealtoktok.domain.mealdelivery.DeliveryState;
import core.startup.mealtoktok.domain.mealdelivery.FullDining;
import core.startup.mealtoktok.domain.mealdelivery.MealDeliverySearchCond;
import core.startup.mealtoktok.domain.mealdelivery.MealDeliveryService;
import core.startup.mealtoktok.domain.mealdelivery.TargetFullDining;
import core.startup.mealtoktok.domain.mealdelivery.Recipient;
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")
Expand All @@ -35,7 +34,18 @@ public Response<MealDeliveryResponse> deliveringMeal(
@AuthenticationPrincipal User currentUser) {
return Response.success(
MealDeliveryResponse.from(
mealDeliveryService.getDeliveringMeal(Orderer.from(currentUser))));
mealDeliveryService.getDeliveringMeal(Recipient.from(currentUser))));
}

@GetMapping
public Response<SliceResult<MealDeliveryResponse>> searchMealDeliveries(
@AuthenticationPrincipal User currentUser,
MealDeliverySearchCond cond,
@CursorDefault Cursor cursor) {
return Response.success(
mealDeliveryService
.searchMealDeliveries(Recipient.from(currentUser), cond, cursor)
.map(MealDeliveryResponse::from));
}

@GetMapping("/{mealDeliveryId}")
Expand All @@ -46,43 +56,43 @@ public Response<MealDeliveryResponse> mealDelivery(@PathVariable Long mealDelive
TargetMealDelivery.from(mealDeliveryId))));
}

@GetMapping("/count")
public Response<Integer> countByDeliveryState(
@AuthenticationPrincipal User currentUser, DeliveryState deliveryState) {
return Response.success(
mealDeliveryService.countByDeliveryState(
Recipient.from(currentUser), deliveryState));
}

@GetMapping("/delivered")
public Response<MealDeliveryResponse> recentDeliveredMeal(
@AuthenticationPrincipal User currentUser) {
return Response.success(
MealDeliveryResponse.from(
mealDeliveryService.getRecentDeliveredMeal(Orderer.from(currentUser))));
mealDeliveryService.getRecentDeliveredMeal(Recipient.from(currentUser))));
}

@GetMapping("/next-delivery")
public Response<MealDeliveryResponse> nextDeliveryMeal(@RequestParam Long orderId) {
return Response.success(
MealDeliveryResponse.from(mealDeliveryService.getNextDeliveryMeal(orderId)));
}

@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)));
}
switch (deliveryState) {
case DELIVERY_REQUESTED ->
mealDeliveryService.reserveMealDelivery(
TargetMealDelivery.from(mealDeliveryId));
case DELIVERING ->
mealDeliveryService.startMealDelivery(TargetMealDelivery.from(mealDeliveryId));
case DELIVERED ->
mealDeliveryService.completeMealDelivery(
TargetMealDelivery.from(mealDeliveryId));
}

@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());
return Response.success("배송 상태 변경 성공");
}
}
Loading

0 comments on commit 94edccd

Please sign in to comment.