diff --git a/application/app-api/src/main/java/core/startup/mealtoktok/api/dishstore/response/DishResponse.java b/application/app-api/src/main/java/core/startup/mealtoktok/api/dishstore/response/DishResponse.java index 98100d8..44238b9 100644 --- a/application/app-api/src/main/java/core/startup/mealtoktok/api/dishstore/response/DishResponse.java +++ b/application/app-api/src/main/java/core/startup/mealtoktok/api/dishstore/response/DishResponse.java @@ -1,8 +1,8 @@ package core.startup.mealtoktok.api.dishstore.response; import core.startup.mealtoktok.common.dto.Money; +import core.startup.mealtoktok.domain.dishstore.Dish; import core.startup.mealtoktok.domain.dishstore.DishState; -import core.startup.mealtoktok.domain.dishstore.DishWithImage; public record DishResponse( Long dishId, @@ -12,13 +12,13 @@ public record DishResponse( int dishQuantity, DishState dishState) { - public static DishResponse from(DishWithImage dishWithImage) { + public static DishResponse from(Dish dish) { return new DishResponse( - dishWithImage.dish().getDishId(), - dishWithImage.dish().getDishName(), - dishWithImage.dish().getDishPrice(), - dishWithImage.image().getImageUrl(), - dishWithImage.dish().getDishQuantity(), - dishWithImage.dish().getDishState()); + dish.getDishId(), + dish.getDishName(), + dish.getDishPrice(), + dish.getDishImage().getImageUrl(), + dish.getDishQuantity(), + dish.getDishState()); } } diff --git a/application/app-api/src/main/java/core/startup/mealtoktok/api/global/exception/GlobalErrorCode.java b/application/app-api/src/main/java/core/startup/mealtoktok/api/global/exception/GlobalErrorCode.java new file mode 100644 index 0000000..f5d4399 --- /dev/null +++ b/application/app-api/src/main/java/core/startup/mealtoktok/api/global/exception/GlobalErrorCode.java @@ -0,0 +1,20 @@ +package core.startup.mealtoktok.api.global.exception; + +import lombok.RequiredArgsConstructor; + +import core.startup.mealtoktok.common.exception.BaseErrorCode; +import core.startup.mealtoktok.common.exception.ErrorReason; + +@RequiredArgsConstructor +public enum GlobalErrorCode implements BaseErrorCode { + PERMISSION_DENIED(403, "PERMISSION_DENIED", "해당 API 권한이 없습니다"); + + private final Integer status; + private final String errorCode; + private final String message; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.of(status, errorCode, message); + } +} diff --git a/application/app-api/src/main/java/core/startup/mealtoktok/api/global/exception/NoPermissionException.java b/application/app-api/src/main/java/core/startup/mealtoktok/api/global/exception/NoPermissionException.java new file mode 100644 index 0000000..c5e200b --- /dev/null +++ b/application/app-api/src/main/java/core/startup/mealtoktok/api/global/exception/NoPermissionException.java @@ -0,0 +1,12 @@ +package core.startup.mealtoktok.api.global.exception; + +import core.startup.mealtoktok.common.exception.WebException; + +public class NoPermissionException extends WebException { + + public static final NoPermissionException EXCEPTION = new NoPermissionException(); + + private NoPermissionException() { + super(GlobalErrorCode.PERMISSION_DENIED); + } +} diff --git a/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/CustomAccessDeniedHandler.java b/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/CustomAccessDeniedHandler.java new file mode 100644 index 0000000..55efdd6 --- /dev/null +++ b/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/CustomAccessDeniedHandler.java @@ -0,0 +1,34 @@ +package core.startup.mealtoktok.api.global.security; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerExceptionResolver; + +import lombok.extern.slf4j.Slf4j; + +import core.startup.mealtoktok.api.global.exception.NoPermissionException; + +@Component +@Slf4j +public class CustomAccessDeniedHandler implements AccessDeniedHandler { + + private final HandlerExceptionResolver resolver; + + public CustomAccessDeniedHandler( + @Qualifier("handlerExceptionResolver") HandlerExceptionResolver resolver) { + this.resolver = resolver; + } + + @Override + public void handle( + HttpServletRequest request, + HttpServletResponse response, + AccessDeniedException accessDeniedException) { + resolver.resolveException(request, response, null, NoPermissionException.EXCEPTION); + } +} diff --git a/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/JwtTokenFilter.java b/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/JwtTokenFilter.java index a021eaf..c5145cb 100644 --- a/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/JwtTokenFilter.java +++ b/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/JwtTokenFilter.java @@ -1,6 +1,8 @@ package core.startup.mealtoktok.api.global.security; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; import jakarta.servlet.FilterChain; @@ -9,6 +11,8 @@ import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @@ -76,8 +80,14 @@ private void reIssueToken(UserId userId, HttpServletResponse response) { private void saveAuthentication(User user) { UsernamePasswordAuthenticationToken authentication = - new UsernamePasswordAuthenticationToken(user, null, null); + new UsernamePasswordAuthenticationToken(user, null, getAuthorities(user)); SecurityContextHolder.getContext().setAuthentication(authentication); log.info("{} 유저 인증 성공", user.getUserProfile().getNickname()); } + + private List getAuthorities(User user) { + List authorities = new ArrayList<>(); + authorities.add(new SimpleGrantedAuthority("ROLE_" + user.getUserRole().name())); + return authorities; + } } diff --git a/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/SecurityConfig.java b/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/SecurityConfig.java index a746614..b78d0b4 100644 --- a/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/SecurityConfig.java +++ b/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/SecurityConfig.java @@ -4,6 +4,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; @@ -17,10 +18,12 @@ @Configuration @RequiredArgsConstructor @EnableWebSecurity +@EnableMethodSecurity public class SecurityConfig { private final JwtTokenFilter jwtTokenFilter; private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; + private final CustomAccessDeniedHandler customAccessDeniedHandler; @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { @@ -34,20 +37,26 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .authorizeHttpRequests( authorizationManagerRequestMatcherRegistry -> authorizationManagerRequestMatcherRegistry - .requestMatchers(PERMIT_SYSTEM_URIS) + .requestMatchers(SYSTEM_URIS) .permitAll() - .requestMatchers(PERMIT_SERVICE_URIS) + .requestMatchers(SERVICE_URIS) .permitAll() - .requestMatchers(PERMIT_SWAGGER_URIS) + .requestMatchers(SWAGGER_URIS) .permitAll() .requestMatchers(CorsUtils::isPreFlightRequest) .permitAll() + .requestMatchers("/api/v1/user/my") + .hasRole("ADMIN") .anyRequest() .authenticated()) .exceptionHandling( httpSecurityExceptionHandlingConfigurer -> httpSecurityExceptionHandlingConfigurer.authenticationEntryPoint( - jwtAuthenticationEntryPoint)); + jwtAuthenticationEntryPoint)) + .exceptionHandling( + httpSecurityExceptionHandlingConfigurer -> + httpSecurityExceptionHandlingConfigurer.accessDeniedHandler( + customAccessDeniedHandler)); http.addFilterBefore(jwtTokenFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); diff --git a/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/SecurityConstant.java b/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/SecurityConstant.java index 88315f7..ce8f6a6 100644 --- a/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/SecurityConstant.java +++ b/application/app-api/src/main/java/core/startup/mealtoktok/api/global/security/SecurityConstant.java @@ -1,7 +1,8 @@ package core.startup.mealtoktok.api.global.security; public class SecurityConstant { - public static final String[] PERMIT_SWAGGER_URIS = { + + public static final String[] SWAGGER_URIS = { /* swagger v2 */ "/v2/api-docs", "/swagger-resources", @@ -15,7 +16,7 @@ public class SecurityConstant { "/swagger-ui/**" }; - public static final String[] PERMIT_SERVICE_URIS = { + public static final String[] SERVICE_URIS = { "/", "/health", "/api/v1/auth/oauth/can-sign-up", @@ -25,7 +26,7 @@ public class SecurityConstant { "/api/v1/auth/login/oauth2/code/kakao" }; - public static final String[] PERMIT_SYSTEM_URIS = { + public static final String[] SYSTEM_URIS = { "/error", "/error/**", "/css/**", "/images/**", "/js/**", "/favicon.ico", "/h2-console/**" }; } diff --git a/application/app-api/src/main/java/core/startup/mealtoktok/api/user/UserApi.java b/application/app-api/src/main/java/core/startup/mealtoktok/api/user/UserApi.java index 930c0e5..3426b64 100644 --- a/application/app-api/src/main/java/core/startup/mealtoktok/api/user/UserApi.java +++ b/application/app-api/src/main/java/core/startup/mealtoktok/api/user/UserApi.java @@ -2,6 +2,7 @@ import java.util.List; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -30,8 +31,14 @@ public class UserApi implements UserApiDocs { private final UserService userService; + @GetMapping("/{userId}") + public Response getUser(@PathVariable Long userId) { + return Response.success(UserResponse.from(userService.getUser(userId))); + } + + @PreAuthorize("hasRole('ADMIN')") @GetMapping("/my") - public Response getUser(@AuthenticationPrincipal User currentUser) { + public Response getMyInfo(@AuthenticationPrincipal User currentUser) { return Response.success(UserResponse.from(currentUser)); } diff --git a/application/app-api/src/main/java/core/startup/mealtoktok/api/user/UserApiDocs.java b/application/app-api/src/main/java/core/startup/mealtoktok/api/user/UserApiDocs.java index 4c13767..608c869 100644 --- a/application/app-api/src/main/java/core/startup/mealtoktok/api/user/UserApiDocs.java +++ b/application/app-api/src/main/java/core/startup/mealtoktok/api/user/UserApiDocs.java @@ -18,8 +18,11 @@ @Tag(name = "회원 API") public interface UserApiDocs { - @Operation(summary = "유저 정보 조회") - Response getUser(User currentUser); + @Operation + Response getUser(Long userId); + + @Operation(summary = "내 정보 조회") + Response getMyInfo(User currentUser); @Operation(summary = "닉네임 중복 확인") Response checkNicknameDuplicate(String nickname); diff --git a/application/app-api/src/main/resources/application.yml b/application/app-api/src/main/resources/application.yml index 114c706..3d67dcb 100644 --- a/application/app-api/src/main/resources/application.yml +++ b/application/app-api/src/main/resources/application.yml @@ -17,7 +17,6 @@ springdoc: server: shutdown: graceful -tomcat.util.http.parser.HttpParser.requestTargetAllow: '|{}' jwt: secret-key: ${JWT_SECRET_KEY} diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/Dish.java b/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/Dish.java index a4babd5..74e5a3b 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/Dish.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/Dish.java @@ -3,6 +3,7 @@ import lombok.Builder; import lombok.Getter; +import core.startup.mealtoktok.common.dto.Image; import core.startup.mealtoktok.common.dto.Money; @Getter @@ -10,15 +11,27 @@ public class Dish { private Long dishId; + private Long dishStoreId; + private Long dishCategoryId; private String dishName; private Money dishPrice; - private DishState dishState; private int dishQuantity; - private Long dishStoreId; - private Long dishCategoryId; - private DishImage dishImage; + private DishState dishState; + private Image dishImage; + + public void reduceQuantity() { + dishQuantity--; + if (dishQuantity == 0) { + dishState = DishState.SOLD_OUT; + } + } + + public void increaseQuantity() { + dishQuantity++; + } - public void addDishImage(DishImage dishImage) { - this.dishImage = dishImage; + public void updateDishInfo(String dishName, Money dishPrice) { + this.dishName = dishName; + this.dishPrice = dishPrice; } } diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishRemover.java b/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishRemover.java index 57cb73a..7993440 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishRemover.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishRemover.java @@ -19,7 +19,7 @@ public class DishRemover { public void remove(Dish dish) { dishRepository.deleteDish(dish); - Image image = imageReader.read(TargetImage.from(dish.getDishImage().imageId())); + Image image = imageReader.read(TargetImage.from(dish.getDishImage().getId())); imageRemover.remove(image); } } diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishService.java b/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishService.java index cef78b8..296619f 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishService.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishService.java @@ -19,7 +19,6 @@ public class DishService { private final DishUpdater dishUpdater; private final DishStoreReader dishStoreReader; private final DishCategoryReader dishCategoryReader; - private final DishWithImageFinder dishWithImageFinder; @Transactional public void createDish( @@ -45,11 +44,12 @@ public void updateDish(TargetDish targetDish, File uploadImage, DishContent dish dishUpdater.update(dishStore, dish, uploadImage, dishContent); } - public List readDishes(TargetDishCategory targetDishCategory) { - return dishWithImageFinder.find(targetDishCategory); + public List readDishes(TargetDishCategory targetDishCategory) { + DishCategory dishCategory = dishCategoryReader.read(targetDishCategory); + return dishReader.readAll(dishCategory); } - public List searchDishes(String keyword) { - return dishWithImageFinder.find(keyword); + public List searchDishes(String keyword) { + return dishReader.search(keyword); } } diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishUpdater.java b/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishUpdater.java index 3831288..65b764a 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishUpdater.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishUpdater.java @@ -26,7 +26,7 @@ public class DishUpdater { public void update(DishStore dishStore, Dish dish, File uploadImage, DishContent dishContent) { dishValidator.validateName(dishStore, dish, dishContent.dishName()); Image image = fileUploader.upload(uploadImage); - Image existingImage = imageReader.read(TargetImage.from(dish.getDishImage().imageId())); + Image existingImage = imageReader.read(TargetImage.from(dish.getDishImage().getId())); Image updatedImage = imageUpdater.update(existingImage, image); dishRepository.updateDish(dish, dishContent, updatedImage); } diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishWithImageFinder.java b/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishWithImageFinder.java index 30daa1e..4ec1b58 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishWithImageFinder.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/dishstore/DishWithImageFinder.java @@ -35,7 +35,7 @@ public List find(String keyword) { } private DishWithImage wrap(Dish dish) { - Image image = imageReader.read(TargetImage.from(dish.getDishImage().imageId())); + Image image = imageReader.read(TargetImage.from(dish.getDishImage().getId())); return DishWithImage.of(dish, image); } } diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/fulldining/FullDining.java b/domain/src/main/java/core/startup/mealtoktok/domain/fulldining/FullDining.java index 7c7fbc7..8d8c945 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/fulldining/FullDining.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/fulldining/FullDining.java @@ -8,8 +8,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import core.startup.mealtoktok.domain.mealdelivery.MealDelivery; import core.startup.mealtoktok.domain.mealdelivery.MealDeliveryId; -import core.startup.mealtoktok.domain.order.FullDiningInfo; @Getter @Builder @@ -22,12 +22,9 @@ public class FullDining { private CollectingState collectState; private LocalDateTime collectedDateTime; - public static FullDining create(FullDiningInfo fullDiningInfo) { + public static FullDining create(MealDelivery mealDelivery) { return new FullDining( - null, - MealDeliveryId.from(fullDiningInfo.mealDeliveryId()), - CollectingState.NOT_COLLECTED, - null); + null, mealDelivery.getMealDeliveryId(), CollectingState.NOT_COLLECTED, null); } public void collectRequest() { diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/fulldining/FullDiningManager.java b/domain/src/main/java/core/startup/mealtoktok/domain/fulldining/FullDiningManager.java index 108f849..36e7549 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/fulldining/FullDiningManager.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/fulldining/FullDiningManager.java @@ -8,9 +8,9 @@ import lombok.RequiredArgsConstructor; import core.startup.mealtoktok.domain.mealdelivery.DeliveryState; +import core.startup.mealtoktok.domain.mealdelivery.FullDiningReserver; +import core.startup.mealtoktok.domain.mealdelivery.MealDelivery; import core.startup.mealtoktok.domain.mealdelivery.Recipient; -import core.startup.mealtoktok.domain.order.FullDiningInfo; -import core.startup.mealtoktok.domain.order.FullDiningReserver; @Component @RequiredArgsConstructor @@ -18,10 +18,10 @@ public class FullDiningManager implements FullDiningReserver { private final FullDiningRepository fullDiningRepository; - public void reserve(List fullDiningInfos) { + public void reserve(List mealDeliveries) { List fullDinings = - fullDiningInfos.stream() - .filter(FullDiningInfo::hasFullDiningOption) + mealDeliveries.stream() + .filter(MealDelivery::hasFullDiningOption) .map(FullDining::create) .toList(); fullDiningRepository.saveAll(fullDinings); diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/meal/MealWithDishes.java b/domain/src/main/java/core/startup/mealtoktok/domain/meal/MealWithDishes.java index fb28c10..9959b85 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/meal/MealWithDishes.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/meal/MealWithDishes.java @@ -2,11 +2,11 @@ import java.util.List; -import core.startup.mealtoktok.domain.dishstore.DishWithImage; +import core.startup.mealtoktok.domain.dishstore.Dish; -public record MealWithDishes(Meal meal, List dishes) { +public record MealWithDishes(Meal meal, List dishes) { - public static MealWithDishes of(Meal meal, List dishes) { + public static MealWithDishes of(Meal meal, List dishes) { return new MealWithDishes(meal, dishes); } } diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/meal/MealWithDishesFinder.java b/domain/src/main/java/core/startup/mealtoktok/domain/meal/MealWithDishesFinder.java index 9dd4451..cdbbde0 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/meal/MealWithDishesFinder.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/meal/MealWithDishesFinder.java @@ -6,8 +6,8 @@ import lombok.RequiredArgsConstructor; -import core.startup.mealtoktok.domain.dishstore.DishWithImage; -import core.startup.mealtoktok.domain.dishstore.DishWithImageFinder; +import core.startup.mealtoktok.domain.dishstore.Dish; +import core.startup.mealtoktok.domain.dishstore.DishReader; import core.startup.mealtoktok.domain.dishstore.TargetDish; @Component @@ -15,15 +15,13 @@ public class MealWithDishesFinder { private final MealDishReader mealDishReader; - private final DishWithImageFinder dishWithImageFinder; + private final DishReader dishReader; public MealWithDishes find(Meal meal) { - List dishes = + + List dishes = mealDishReader.read(TargetMeal.from(meal.getMealId())).stream() - .map( - mealDish -> - dishWithImageFinder.find( - TargetDish.from(mealDish.dishId()))) + .map(mealDish -> dishReader.read(TargetDish.from(mealDish.dishId()))) .toList(); return MealWithDishes.of(meal, dishes); diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/FullDiningReserver.java b/domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/FullDiningReserver.java new file mode 100644 index 0000000..e2190a6 --- /dev/null +++ b/domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/FullDiningReserver.java @@ -0,0 +1,8 @@ +package core.startup.mealtoktok.domain.mealdelivery; + +import java.util.List; + +public interface FullDiningReserver { + + void reserve(List mealDeliveries); +} diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/MealDeliveryManager.java b/domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/MealDeliveryManager.java index 9104301..974e09c 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/MealDeliveryManager.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/MealDeliveryManager.java @@ -6,7 +6,6 @@ import lombok.RequiredArgsConstructor; -import core.startup.mealtoktok.domain.order.FullDiningInfo; import core.startup.mealtoktok.domain.order.MealDeliveryReservationInfo; import core.startup.mealtoktok.domain.order.MealDeliveryReserver; import core.startup.mealtoktok.domain.order.Order; @@ -20,14 +19,15 @@ public class MealDeliveryManager implements MealDeliveryReserver { private final MealDeliveryRepository mealDeliveryRepository; private final OrderReader orderReader; private final OrderManager orderManager; + private final FullDiningReserver fullDiningReserver; @Override - public List reserve(List reservationInfos) { + public void reserve(List reservationInfos) { List mealDeliveries = reservationInfos.stream().map(MealDelivery::create).toList(); - List saved = mealDeliveryRepository.saveAll(mealDeliveries); - return toMealDeliveryInfos(saved); + List reservedDeliveries = mealDeliveryRepository.saveAll(mealDeliveries); + fullDiningReserver.reserve(reservedDeliveries); } public void requestDelivery(MealDelivery mealDelivery) { @@ -48,14 +48,4 @@ public void completeDelivery(MealDelivery mealDelivery) { orderManager.reduceRemainDeliveryCount(order); mealDeliveryRepository.update(mealDelivery); } - - private static List toMealDeliveryInfos(List mealDeliveries) { - return mealDeliveries.stream() - .map( - mealDelivery -> - FullDiningInfo.of( - mealDelivery.getMealDeliveryId().getValue(), - mealDelivery.hasFullDiningOption())) - .toList(); - } } diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/exception/MealDeliveryErrorCode.java b/domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/exception/MealDeliveryErrorCode.java index f1e88e1..9f46598 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/exception/MealDeliveryErrorCode.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/mealdelivery/exception/MealDeliveryErrorCode.java @@ -20,7 +20,6 @@ public enum MealDeliveryErrorCode implements BaseErrorCode { private final Integer status; private final String errorCode; - private String message; public BaseErrorCode setMessage(String message) { diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/order/FullDiningInfo.java b/domain/src/main/java/core/startup/mealtoktok/domain/order/FullDiningInfo.java deleted file mode 100644 index 63d21bc..0000000 --- a/domain/src/main/java/core/startup/mealtoktok/domain/order/FullDiningInfo.java +++ /dev/null @@ -1,8 +0,0 @@ -package core.startup.mealtoktok.domain.order; - -public record FullDiningInfo(Long mealDeliveryId, boolean hasFullDiningOption) { - - public static FullDiningInfo of(Long mealDeliveryId, boolean hasFullDiningOption) { - return new FullDiningInfo(mealDeliveryId, hasFullDiningOption); - } -} diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/order/FullDiningReserver.java b/domain/src/main/java/core/startup/mealtoktok/domain/order/FullDiningReserver.java deleted file mode 100644 index 559b243..0000000 --- a/domain/src/main/java/core/startup/mealtoktok/domain/order/FullDiningReserver.java +++ /dev/null @@ -1,8 +0,0 @@ -package core.startup.mealtoktok.domain.order; - -import java.util.List; - -public interface FullDiningReserver { - - void reserve(List fullDiningInfos); -} diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/order/MealDeliveryReserver.java b/domain/src/main/java/core/startup/mealtoktok/domain/order/MealDeliveryReserver.java index 3f0a1e2..84d790b 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/order/MealDeliveryReserver.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/order/MealDeliveryReserver.java @@ -4,5 +4,5 @@ public interface MealDeliveryReserver { - List reserve(List reserveInfo); + void reserve(List reserveInfo); } diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/order/OrderService.java b/domain/src/main/java/core/startup/mealtoktok/domain/order/OrderService.java index baf76fc..53f154e 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/order/OrderService.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/order/OrderService.java @@ -3,7 +3,6 @@ import static core.startup.mealtoktok.common.consts.MealTokTokConstant.VALID_DATE_TIME; import java.time.LocalDateTime; -import java.util.List; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,16 +23,13 @@ public class OrderService { private final MealDeliveryReserver mealDeliveryReserver; private final OrderManager orderManager; private final PaymentCanceler paymentCanceler; - private final FullDiningReserver fullDiningReserver; @Transactional public OrderId orderMeals( Orderer orderer, OrderContent orderContent, DeliveryAddress deliveryAddress) { orderValidator.validate(orderContent); OrderId orderId = orderAppender.append(orderer, orderContent, deliveryAddress); - List fullDiningInfos = - mealDeliveryReserver.reserve(orderContent.toReservationInfos(orderId)); - fullDiningReserver.reserve(fullDiningInfos); + mealDeliveryReserver.reserve(orderContent.toReservationInfos(orderId)); return orderId; } diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/user/UserRole.java b/domain/src/main/java/core/startup/mealtoktok/domain/user/UserRole.java index 7038f96..0ffb2d3 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/user/UserRole.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/user/UserRole.java @@ -2,5 +2,7 @@ public enum UserRole { USER, - ADMIN + ADMIN, + STORE_OWNER, + DELIVERYMAN } diff --git a/domain/src/main/java/core/startup/mealtoktok/domain/user/UserService.java b/domain/src/main/java/core/startup/mealtoktok/domain/user/UserService.java index f9aca67..76cf3b0 100644 --- a/domain/src/main/java/core/startup/mealtoktok/domain/user/UserService.java +++ b/domain/src/main/java/core/startup/mealtoktok/domain/user/UserService.java @@ -11,6 +11,7 @@ public class UserService { private final UserUpdater userUpdater; private final userRemover userRemover; private final UserValidator userValidator; + private final UserReader userReader; public UserId addDefaultDeliveryAddress( User currentUser, AddressWithCoordinate addressWithCoordinate) { @@ -49,4 +50,8 @@ public UserId configureDeliveryAddress( User currentUser, TargetDeliveryAddress targetDeliveryAddress) { return userUpdater.configureDeliveryAddress(currentUser, targetDeliveryAddress); } + + public User getUser(Long userId) { + return userReader.read(UserId.from(userId)); + } } diff --git a/infra/src/main/java/core/startup/mealtoktok/infra/dishstore/entity/DishEntity.java b/infra/src/main/java/core/startup/mealtoktok/infra/dishstore/entity/DishEntity.java index d2c084e..4ab4351 100644 --- a/infra/src/main/java/core/startup/mealtoktok/infra/dishstore/entity/DishEntity.java +++ b/infra/src/main/java/core/startup/mealtoktok/infra/dishstore/entity/DishEntity.java @@ -8,6 +8,7 @@ import core.startup.mealtoktok.domain.dishstore.Dish; import core.startup.mealtoktok.domain.dishstore.DishContent; import core.startup.mealtoktok.domain.dishstore.DishState; +import core.startup.mealtoktok.infra.jpa.entity.ImageEntity; import core.startup.mealtoktok.infra.order.entity.MoneyConverter; @Entity @@ -50,7 +51,7 @@ public static DishEntity of(Long dishStoreId, Long dishCategoryId, DishContent d .build(); } - public Dish toDomain() { + public Dish toDomain(ImageEntity image) { return Dish.builder() .dishId(dishId) .dishName(dishName) @@ -59,6 +60,7 @@ public Dish toDomain() { .dishQuantity(dishQuantity) .dishStoreId(dishStoreId) .dishCategoryId(dishCategoryId) + .dishImage(image.toDomain()) .build(); } diff --git a/infra/src/main/java/core/startup/mealtoktok/infra/dishstore/repository/CoreDishRepository.java b/infra/src/main/java/core/startup/mealtoktok/infra/dishstore/repository/CoreDishRepository.java index 67b78dc..2a2f76c 100644 --- a/infra/src/main/java/core/startup/mealtoktok/infra/dishstore/repository/CoreDishRepository.java +++ b/infra/src/main/java/core/startup/mealtoktok/infra/dishstore/repository/CoreDishRepository.java @@ -16,6 +16,7 @@ import core.startup.mealtoktok.infra.dishstore.exception.DishNotFoundException; import core.startup.mealtoktok.infra.global.exception.ImageNotFoundException; import core.startup.mealtoktok.infra.global.repository.JpaImageRepository; +import core.startup.mealtoktok.infra.jpa.entity.ImageEntity; @Repository @Transactional @@ -62,7 +63,7 @@ public void updateDish(Dish dish, DishContent dishContent, Image image) { jpaDishRepository.getReferenceById(dish.getDishId()).update(dishContent); if (image != null) { - jpaDishImageRepository.deleteByDishId(dish.getDishImage().dishId()); + jpaDishImageRepository.deleteByDishId(dish.getDishId()); jpaDishImageRepository.save(DishImageEntity.of(dish.getDishId(), image.getId())); } } @@ -152,15 +153,17 @@ public Dish findDishById(TargetDish targetDish) { } private Dish toDishWithImage(DishEntity dishEntity) { - Dish dish = dishEntity.toDomain(); - DishImage dishImage = + DishImageEntity dishImageEntity = jpaDishImageRepository - .findByDishId(dish.getDishId()) - .map(DishImageEntity::toDomain) + .findByDishId(dishEntity.getDishId()) .orElseThrow(() -> ImageNotFoundException.EXCEPTION); - dish.addDishImage(dishImage); - return dish; + ImageEntity imageEntity = + jpaImageRepository + .findById(dishImageEntity.getDishImageId().getImageId()) + .orElseThrow(() -> ImageNotFoundException.EXCEPTION); + + return dishEntity.toDomain(imageEntity); } } diff --git a/infra/src/main/java/core/startup/mealtoktok/infra/user/cache/RedisUserRepository.java b/infra/src/main/java/core/startup/mealtoktok/infra/user/cache/RedisUserRepository.java index e9b4631..6a4dde7 100644 --- a/infra/src/main/java/core/startup/mealtoktok/infra/user/cache/RedisUserRepository.java +++ b/infra/src/main/java/core/startup/mealtoktok/infra/user/cache/RedisUserRepository.java @@ -34,7 +34,7 @@ public Optional getUser(UserId userId) { log.info( "Get User from Cache - {} : {}", key, - u.getUserProfile().getUsername()), + u.getUserProfile().getNickname()), () -> log.info("No User Cache - {}", key)); return user; } diff --git a/infra/src/main/resources/application-infra.yml b/infra/src/main/resources/application-infra.yml index 05c8d58..acd20f9 100644 --- a/infra/src/main/resources/application-infra.yml +++ b/infra/src/main/resources/application-infra.yml @@ -29,7 +29,7 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: - ddl-auto: create + ddl-auto: update properties: hibernate: show-sql: true