From a29efd20bde096e442dbf5fd002192034de9e18e Mon Sep 17 00:00:00 2001
From: daeun084 <030804jk@naver.com>
Date: Mon, 29 Jul 2024 14:09:43 +0900
Subject: [PATCH] =?UTF-8?q?feat:=20=ED=99=88=20=ED=99=94=EB=A9=B4=20?=
 =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../dev/common/status/SuccessStatus.java      |  4 +-
 .../makar/dev/controller/UserController.java  | 11 +++++
 .../makar/dev/converter/RouteConverter.java   |  9 ++++
 .../makar/dev/converter/UserConverter.java    | 45 +++++++++++++++++++
 .../makar/dev/dto/response/RouteResponse.java | 10 +++++
 .../makar/dev/dto/response/UserResponse.java  | 23 ++++++++++
 .../java/makar/dev/service/UserService.java   | 37 ++++++++++++---
 7 files changed, 133 insertions(+), 6 deletions(-)

diff --git a/src/main/java/makar/dev/common/status/SuccessStatus.java b/src/main/java/makar/dev/common/status/SuccessStatus.java
index 4aa8b80..aca891d 100644
--- a/src/main/java/makar/dev/common/status/SuccessStatus.java
+++ b/src/main/java/makar/dev/common/status/SuccessStatus.java
@@ -29,8 +29,10 @@ public enum SuccessStatus {
     _MAKAR_NOTI_DELETE(HttpStatus.OK, 200, "막차 알림 삭제가 완료되었습니다."),
     _GETOFF_NOTI_POST(HttpStatus.OK, 200, "하차 알림 추가가 완료되었습니다."),
     _GETOFF_NOTI_DELETE(HttpStatus.OK, 200, "하차 알림 삭제가 완료되었습니다."),
-    _NOTI_LIST_GET(HttpStatus.OK, 200, "알림 리스트 조회가 완료되었습니다.");
+    _NOTI_LIST_GET(HttpStatus.OK, 200, "알림 리스트 조회가 완료되었습니다."),
 
+    // UserController
+    _HOME_GET(HttpStatus.OK, 200, "홈 화면 조회가 완료되었습니다.");
 
     private final HttpStatus httpStatus;
     private final int code;
diff --git a/src/main/java/makar/dev/controller/UserController.java b/src/main/java/makar/dev/controller/UserController.java
index 8467670..fe34543 100644
--- a/src/main/java/makar/dev/controller/UserController.java
+++ b/src/main/java/makar/dev/controller/UserController.java
@@ -3,8 +3,10 @@
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.RequiredArgsConstructor;
 import makar.dev.common.response.ApiResponse;
+import makar.dev.common.security.dto.TokenDto;
 import makar.dev.common.status.SuccessStatus;
 import makar.dev.service.UserService;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
 import org.springframework.web.bind.annotation.*;
 
 @RestController
@@ -23,4 +25,13 @@ public ApiResponse initStation(){
         return ApiResponse.SuccessResponse(SuccessStatus._OK);
     }
 
+    @Operation(
+            summary = "홈 화면 조회",
+            description = "홈 화면을 조회합니다."
+    )
+    @GetMapping("/home")
+    public ApiResponse getHome(@AuthenticationPrincipal TokenDto tokenDto){
+        return ApiResponse.SuccessResponse(SuccessStatus._HOME_GET, userService.getHome(tokenDto));
+    }
+
 }
diff --git a/src/main/java/makar/dev/converter/RouteConverter.java b/src/main/java/makar/dev/converter/RouteConverter.java
index f4fe686..7a131ac 100644
--- a/src/main/java/makar/dev/converter/RouteConverter.java
+++ b/src/main/java/makar/dev/converter/RouteConverter.java
@@ -57,6 +57,15 @@ public static RouteResponse.RouteDetailDto toRouteDetailDto(Route route) {
                 .build();
     }
 
+    public static RouteResponse.BriefRouteDto toBriefRouteDto(Route route){
+        return RouteResponse.BriefRouteDto.builder()
+                .sourceStationName(route.getSourceStation().getStationName())
+                .sourceLineNum(route.getSourceStation().getLineNum())
+                .destinationStationName(route.getDestinationStation().getStationName())
+                .destinationLineNum(route.getDestinationStation().getLineNum())
+                .build();
+    }
+
     public static SubRoute toSubRoute(RouteSearchResponse.SubPath subPath) {
         RouteSearchResponse.Lane lane = subPath.getLane().get(0);
 
diff --git a/src/main/java/makar/dev/converter/UserConverter.java b/src/main/java/makar/dev/converter/UserConverter.java
index ee3cf72..a3b6894 100644
--- a/src/main/java/makar/dev/converter/UserConverter.java
+++ b/src/main/java/makar/dev/converter/UserConverter.java
@@ -1,4 +1,49 @@
 package makar.dev.converter;
 
+import makar.dev.domain.Noti;
+import makar.dev.domain.Route;
+import makar.dev.dto.response.NotiResponse;
+import makar.dev.dto.response.RouteResponse;
+import makar.dev.dto.response.UserResponse;
+
+import java.util.List;
+
 public class UserConverter {
+
+    public static UserResponse.HomeDto toHomeDto(boolean isRouteSet, List<Noti> notiList,
+                                                 List<Route> favoriteRouteList, List<Route> recentRouteList){
+        List<RouteResponse.BriefRouteDto> favoriteRouteDtoList = favoriteRouteList.stream()
+                .map(RouteConverter::toBriefRouteDto)
+                .toList();
+        List<RouteResponse.BriefRouteDto> recentRouteDtoList = recentRouteList.stream()
+                .map(RouteConverter::toBriefRouteDto)
+                .toList();
+
+        if (notiList.isEmpty())
+            return UserResponse.HomeDto.builder()
+                    .isRouteSet(isRouteSet)
+                    .sourceStationName(null)
+                    .destinationStationName(null)
+                    .makarTime(null)
+                    .getoffTime(null)
+                    .notiList(null)
+                    .favoriteRouteList(favoriteRouteDtoList)
+                    .recentRouteList(recentRouteDtoList)
+                    .build();
+
+        Route route = notiList.get(0).getRoute();
+        List<NotiResponse.NotiDto> notiDtoList = notiList.stream()
+                .map(NotiConverter::toNotiDto)
+                .toList();
+        return UserResponse.HomeDto.builder()
+                .isRouteSet(isRouteSet)
+                .sourceStationName(route.getSourceStation().getStationName())
+                .destinationStationName(route.getDestinationStation().getStationName())
+                .makarTime(route.getSchedule().getSourceTime())
+                .getoffTime(route.getSchedule().getDestinationTime())
+                .notiList(notiDtoList)
+                .favoriteRouteList(favoriteRouteDtoList)
+                .recentRouteList(recentRouteDtoList)
+                .build();
+    }
 }
diff --git a/src/main/java/makar/dev/dto/response/RouteResponse.java b/src/main/java/makar/dev/dto/response/RouteResponse.java
index deb2c45..9d7c84c 100644
--- a/src/main/java/makar/dev/dto/response/RouteResponse.java
+++ b/src/main/java/makar/dev/dto/response/RouteResponse.java
@@ -42,6 +42,16 @@ public static class RouteDetailDto {
         private List<SubRouteDetailDto> subRouteDtoList;
     }
 
+    @Data @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class BriefRouteDto {
+        private String sourceStationName;
+        private String sourceLineNum;
+        private String destinationStationName;
+        private String destinationLineNum;
+    }
+
     @Data
     @Builder
     @NoArgsConstructor
diff --git a/src/main/java/makar/dev/dto/response/UserResponse.java b/src/main/java/makar/dev/dto/response/UserResponse.java
index 418d459..1aae188 100644
--- a/src/main/java/makar/dev/dto/response/UserResponse.java
+++ b/src/main/java/makar/dev/dto/response/UserResponse.java
@@ -1,4 +1,27 @@
 package makar.dev.dto.response;
 
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import makar.dev.domain.Noti;
+
+import java.util.List;
+
 public class UserResponse {
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class HomeDto {
+        private boolean isRouteSet;
+        private String sourceStationName;
+        private String destinationStationName;
+        private String makarTime;
+        private String getoffTime;
+        private List<NotiResponse.NotiDto> notiList;
+        private List<RouteResponse.BriefRouteDto> favoriteRouteList;
+        private List<RouteResponse.BriefRouteDto> recentRouteList;
+    }
 }
diff --git a/src/main/java/makar/dev/service/UserService.java b/src/main/java/makar/dev/service/UserService.java
index 1d76e60..6771545 100644
--- a/src/main/java/makar/dev/service/UserService.java
+++ b/src/main/java/makar/dev/service/UserService.java
@@ -1,12 +1,20 @@
 package makar.dev.service;
 
 import lombok.RequiredArgsConstructor;
+import makar.dev.common.exception.GeneralException;
+import makar.dev.common.security.dto.TokenDto;
+import makar.dev.common.status.ErrorStatus;
+import makar.dev.converter.UserConverter;
+import makar.dev.domain.Noti;
+import makar.dev.domain.Route;
 import makar.dev.domain.User;
+import makar.dev.dto.response.UserResponse;
 import makar.dev.manager.DataManager;
 import makar.dev.repository.UserRepository;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
 import java.util.Optional;
 
 @Service
@@ -42,11 +50,6 @@ public void initDatabase(){
 //        dataManager.saveReverseTransferInfo();
     }
 
-    public void tmpCreateUser(String userName){
-        User user = new User(userName);
-        userRepository.save(user);
-    }
-
     public Optional<User> getOptionalUserById(String id) {
         return userRepository.findById(id);
     }
@@ -64,4 +67,28 @@ public User createUser(String id, String password, String email, String username
 
         return user;
     }
+
+
+    // 홈 화면 조회
+    public UserResponse.HomeDto getHome(TokenDto tokenDto) {
+        User user = findUserById(tokenDto.getUserId());
+        boolean isRouteSet = isRouteSet(user);
+
+        List<Route> favoriteRouteList = user.getFavoriteRouteList();
+        List<Route> recentRouteList = user.getRecentRouteList();
+
+        return UserConverter.toHomeDto(isRouteSet, user.getNotiList(), favoriteRouteList, recentRouteList);
+    }
+
+    private User findUserById(Long userId){
+        return userRepository.findById(userId)
+                .orElseThrow(() -> new GeneralException(ErrorStatus.NOT_FOUND_USER));
+    }
+
+    private boolean isRouteSet(User user){
+        List<Noti> notiList = user.getNotiList();
+        return !notiList.isEmpty();
+    }
+
+
 }