diff --git a/src/main/java/com/codeit/todo/repository/FollowRepository.java b/src/main/java/com/codeit/todo/repository/FollowRepository.java new file mode 100644 index 0000000..d4c429e --- /dev/null +++ b/src/main/java/com/codeit/todo/repository/FollowRepository.java @@ -0,0 +1,21 @@ +package com.codeit.todo.repository; + +import com.codeit.todo.domain.Follow; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface FollowRepository extends JpaRepository { + + @Query( + "SELECT COUNT(f) > 0 " + + "from Follow f " + + "WHERE f.followee.userId = :userId " + + "AND f.follower.userId = :targetUserId " + ) + boolean existsByFollower_FollowerIdAndFollowee_FolloweeId(@Param("userId")int userId, @Param("targetUserId")int targetUserId); + +} + diff --git a/src/main/java/com/codeit/todo/service/user/UserService.java b/src/main/java/com/codeit/todo/service/user/UserService.java index 3be3aac..aadfece 100644 --- a/src/main/java/com/codeit/todo/service/user/UserService.java +++ b/src/main/java/com/codeit/todo/service/user/UserService.java @@ -4,10 +4,7 @@ import com.codeit.todo.web.dto.request.auth.SignUpRequest; import com.codeit.todo.web.dto.request.auth.UpdatePasswordRequest; import com.codeit.todo.web.dto.request.auth.UpdatePictureRequest; -import com.codeit.todo.web.dto.response.auth.ReadUserResponse; -import com.codeit.todo.web.dto.response.auth.SignUpResponse; -import com.codeit.todo.web.dto.response.auth.UpdatePasswordResponse; -import com.codeit.todo.web.dto.response.auth.UpdatePictureResponse; +import com.codeit.todo.web.dto.response.auth.*; public interface UserService { @@ -20,4 +17,6 @@ public interface UserService { UpdatePictureResponse updateProfilePicture(int userId, UpdatePictureRequest pictureRequest); UpdatePasswordResponse updatePassword(int userId, UpdatePasswordRequest passwordRequest); + + ReadTargetUserResponse findTargetUserProfile(int userId, int targetUserId); } diff --git a/src/main/java/com/codeit/todo/service/user/impl/UserServiceImpl.java b/src/main/java/com/codeit/todo/service/user/impl/UserServiceImpl.java index 277cc40..e9b8c73 100644 --- a/src/main/java/com/codeit/todo/service/user/impl/UserServiceImpl.java +++ b/src/main/java/com/codeit/todo/service/user/impl/UserServiceImpl.java @@ -6,7 +6,12 @@ import com.codeit.todo.common.exception.user.SignUpException; import com.codeit.todo.common.exception.user.UpdatePasswordException; import com.codeit.todo.common.exception.user.UserNotFoundException; +import com.codeit.todo.domain.Complete; +import com.codeit.todo.domain.Todo; import com.codeit.todo.domain.User; +import com.codeit.todo.repository.CompleteRepository; +import com.codeit.todo.repository.FollowRepository; +import com.codeit.todo.repository.GoalRepository; import com.codeit.todo.repository.UserRepository; import com.codeit.todo.service.storage.StorageService; import com.codeit.todo.service.user.UserService; @@ -14,10 +19,8 @@ import com.codeit.todo.web.dto.request.auth.SignUpRequest; import com.codeit.todo.web.dto.request.auth.UpdatePasswordRequest; import com.codeit.todo.web.dto.request.auth.UpdatePictureRequest; -import com.codeit.todo.web.dto.response.auth.ReadUserResponse; -import com.codeit.todo.web.dto.response.auth.SignUpResponse; -import com.codeit.todo.web.dto.response.auth.UpdatePasswordResponse; -import com.codeit.todo.web.dto.response.auth.UpdatePictureResponse; +import com.codeit.todo.web.dto.response.auth.*; +import com.codeit.todo.web.dto.response.complete.ReadTargetUserCompleteResponse; import lombok.RequiredArgsConstructor; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -29,12 +32,15 @@ import java.security.SignatureException; import java.time.LocalDateTime; +import java.util.List; import java.util.Objects; @Service @RequiredArgsConstructor public class UserServiceImpl implements UserService { private final UserRepository userRepository; + private final GoalRepository goalRepository; + private final FollowRepository followRepository; private final AuthenticationManager authenticationManager; private final JwtTokenProvider jwtTokenProvider; private final PasswordEncoder passwordEncoder; @@ -135,6 +141,23 @@ public UpdatePasswordResponse updatePassword(int userId, UpdatePasswordRequest p return new UpdatePasswordResponse(userId); } + @Transactional(readOnly = true) + @Override + public ReadTargetUserResponse findTargetUserProfile(int userId, int targetUserId) { + User targetUser = getUser(targetUserId); + + boolean isFollow = followRepository.existsByFollower_FollowerIdAndFollowee_FolloweeId(userId, targetUserId); + + List responses = goalRepository.findByUser_UserId(targetUserId).stream() + .flatMap(goal -> goal.getTodos().stream()) + .flatMap(todo -> todo.getCompletes().stream()) + .map(ReadTargetUserCompleteResponse::from) + .toList(); + + return ReadTargetUserResponse.from(targetUser, isFollow, responses); + + } + private User getUser(int userId){ User user = userRepository.findById(userId) .orElseThrow(()-> new UserNotFoundException(String.valueOf(userId), "User")); diff --git a/src/main/java/com/codeit/todo/web/controller/AuthController.java b/src/main/java/com/codeit/todo/web/controller/AuthController.java index e0367ba..531f0f0 100644 --- a/src/main/java/com/codeit/todo/web/controller/AuthController.java +++ b/src/main/java/com/codeit/todo/web/controller/AuthController.java @@ -1,6 +1,5 @@ package com.codeit.todo.web.controller; -import com.codeit.todo.common.config.JwtTokenProvider; import com.codeit.todo.repository.CustomUserDetails; import com.codeit.todo.service.user.UserService; import com.codeit.todo.web.dto.request.auth.LoginRequest; @@ -8,6 +7,7 @@ import com.codeit.todo.web.dto.request.auth.UpdatePasswordRequest; import com.codeit.todo.web.dto.request.auth.UpdatePictureRequest; import com.codeit.todo.web.dto.response.Response; +import com.codeit.todo.web.dto.response.auth.ReadTargetUserResponse; import com.codeit.todo.web.dto.response.auth.UpdatePasswordResponse; import com.codeit.todo.web.dto.response.auth.UpdatePictureResponse; import io.swagger.v3.oas.annotations.Operation; @@ -90,4 +90,17 @@ public Response updateUserPassword( int userId = userDetails.getUserId(); return Response.ok(userService.updatePassword(userId, passwordRequest)); } + + @Operation(summary = "다른 유저의 프로필 가져오기", description = "다른 유저의 이름, 이메일, 팔로우 여부, 인증 사진 가져오기") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공") + }) + @GetMapping(value = "/profile/{targetUserId}") + public Response getTargetUserProfile( + @AuthenticationPrincipal CustomUserDetails customUserDetails, + @PathVariable int targetUserId + ){ + int userId = customUserDetails.getUserId(); + return Response.ok( userService.findTargetUserProfile(userId, targetUserId) ); + } } diff --git a/src/main/java/com/codeit/todo/web/dto/response/auth/ReadTargetUserResponse.java b/src/main/java/com/codeit/todo/web/dto/response/auth/ReadTargetUserResponse.java new file mode 100644 index 0000000..7c2827e --- /dev/null +++ b/src/main/java/com/codeit/todo/web/dto/response/auth/ReadTargetUserResponse.java @@ -0,0 +1,24 @@ +package com.codeit.todo.web.dto.response.auth; + +import com.codeit.todo.domain.User; +import com.codeit.todo.web.dto.response.complete.ReadTargetUserCompleteResponse; +import lombok.Builder; + +import java.util.List; + +@Builder +public record ReadTargetUserResponse( + String name, + String profilePic, + boolean isFollow, + List completeResponses +) { + public static ReadTargetUserResponse from(User user, boolean isFollow, List completeResponses){ + return ReadTargetUserResponse.builder() + .name(user.getName()) + .profilePic(user.getProfilePic()) + .isFollow(isFollow) + .completeResponses(completeResponses) + .build(); + } +} diff --git a/src/main/java/com/codeit/todo/web/dto/response/complete/ReadTargetUserCompleteResponse.java b/src/main/java/com/codeit/todo/web/dto/response/complete/ReadTargetUserCompleteResponse.java new file mode 100644 index 0000000..3a9ce0a --- /dev/null +++ b/src/main/java/com/codeit/todo/web/dto/response/complete/ReadTargetUserCompleteResponse.java @@ -0,0 +1,20 @@ +package com.codeit.todo.web.dto.response.complete; + +import com.codeit.todo.domain.Complete; +import lombok.Builder; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Builder +public record ReadTargetUserCompleteResponse( + int completeId, + String completePic +) { + public static ReadTargetUserCompleteResponse from(Complete complete) { + return ReadTargetUserCompleteResponse.builder() + .completeId(complete.getCompleteId()) + .completePic(complete.getCompletePic()) + .build(); + } +}