Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature/96] 마이페이지 follow api 제작 #125

Merged
merged 3 commits into from
Dec 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.example.betteriter.fo_domain.follow.controller;

import com.example.betteriter.fo_domain.follow.converter.FollowResponseConverter;
import com.example.betteriter.fo_domain.follow.domain.Follow;
import com.example.betteriter.fo_domain.follow.dto.FollowRequest;
import com.example.betteriter.fo_domain.follow.dto.FollowResponse;
import com.example.betteriter.fo_domain.follow.service.FollowService;
import com.example.betteriter.global.common.response.ResponseDto;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "FollowController", description = "Follow API")
@Slf4j
@RequiredArgsConstructor
@RequestMapping("/follow")
@RestController
public class FollowController {

private final FollowService followService;

/**
* 1. 팔로우
* - /follow/following
*
* @param followingRequestDto : 팔로우 요청 DTO
* @return followingResponseDto : 팔로우 응답 DTO
*/
@PostMapping("/following")
public ResponseDto<FollowResponse.FollowingDto> following(
@RequestBody FollowRequest.FollowingDto followingRequestDto
) {
Follow follow = this.followService.following(followingRequestDto);
return ResponseDto.onSuccess(FollowResponseConverter.toFollowingDto(follow));
}

/**
* 2. 언팔로우
* - /follow/unfollowing
*
* @param unfollowingRequestDto : 언팔로우 요청 DTO
* @return unfollowingResponseDto : 언팔로우 응답 DTO
*/
@PostMapping("/unfollowing")
public ResponseDto<FollowResponse.UnfollowingDto> unfollowing(
@RequestBody FollowRequest.UnfollowingDto unfollowingRequestDto
) {
this.followService.unfollowing(unfollowingRequestDto);
return ResponseDto.onSuccess(FollowResponseConverter.toUnfollowingDto());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.example.betteriter.fo_domain.follow.converter;

import com.example.betteriter.fo_domain.follow.domain.Follow;
import com.example.betteriter.fo_domain.user.domain.Users;

public class FollowConverter {

public static Follow toFollowing(Users user, Users targetUser) {
return Follow.builder()
.followee(user)
.follower(targetUser)
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.example.betteriter.fo_domain.follow.converter;

import com.example.betteriter.fo_domain.follow.domain.Follow;
import com.example.betteriter.fo_domain.follow.dto.FollowResponse;

public class FollowResponseConverter {

public static FollowResponse.FollowingDto toFollowingDto(Follow follow) {
String message = follow.getFollowee().getUsername() + " 님을 팔로우 하였습니다.";

return FollowResponse.FollowingDto.builder()
.email(follow.getFollowee().getEmail())
.message(message)
.build();
}

public static FollowResponse.UnfollowingDto toUnfollowingDto() {
return FollowResponse.UnfollowingDto.builder()
.message("팔로우를 취소하였습니다.")
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.example.betteriter.fo_domain.user.domain;
package com.example.betteriter.fo_domain.follow.domain;


import com.example.betteriter.fo_domain.user.domain.Users;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.example.betteriter.fo_domain.follow.dto;

import lombok.Builder;
import lombok.Getter;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;

public class FollowRequest {

@Getter
@Builder
public static class FollowingDto {

@Email(message = "이메일 형식이 아닙니다.")
@NotEmpty(message = "이메일은 필수 입력 값입니다.")
private String email;
}

@Getter
@Builder
public static class UnfollowingDto {

@Email(message = "이메일 형식이 아닙니다.")
@NotEmpty(message = "이메일은 필수 입력 값입니다.")
private String email;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.example.betteriter.fo_domain.follow.dto;

import lombok.Builder;
import lombok.Getter;

public class FollowResponse {

@Getter
@Builder
public static class FollowingDto {
private String email;
private String message;
}

@Getter
@Builder
public static class UnfollowingDto {
private String email;
private String message;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.betteriter.fo_domain.follow.exception;

import com.example.betteriter.global.common.code.status.ErrorStatus;
import com.example.betteriter.global.common.exception.GeneralException;

public class FollowHandler extends GeneralException {

public FollowHandler(ErrorStatus errorStatus) {
super(errorStatus);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.example.betteriter.fo_domain.follow.repository;

import com.example.betteriter.fo_domain.follow.domain.Follow;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface FollowReadRepository extends JpaRepository<Follow, Long> {

Follow findByFolloweeIdAndFollowerId(Long followeeId, Long followerId);

List<Follow> findByFolloweeId(Long followeeId); // 팔로위(나를 팔로우하는 사람) 목록 조회

List<Follow> findByFollowerId(Long followerId); // 팔로워(내가 팔로우하는 사람) 목록 조회
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.example.betteriter.fo_domain.follow.repository;

import com.example.betteriter.fo_domain.follow.domain.Follow;
import org.springframework.data.jpa.repository.JpaRepository;

public interface FollowWriteRepository extends JpaRepository<Follow, Long> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.example.betteriter.fo_domain.follow.service;

import com.example.betteriter.fo_domain.follow.converter.FollowConverter;
import com.example.betteriter.fo_domain.follow.domain.Follow;
import com.example.betteriter.fo_domain.follow.dto.FollowRequest;
import com.example.betteriter.fo_domain.follow.exception.FollowHandler;
import com.example.betteriter.fo_domain.follow.repository.FollowReadRepository;
import com.example.betteriter.fo_domain.follow.repository.FollowWriteRepository;
import com.example.betteriter.fo_domain.user.domain.Users;
import com.example.betteriter.fo_domain.user.service.UserService;
import com.example.betteriter.global.common.code.status.ErrorStatus;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@RequiredArgsConstructor
@Service
public class FollowService {

private final UserService userService;
private final FollowWriteRepository followWriteRepository;
private final FollowReadRepository followReadRepository;

@Transactional
public Follow following(FollowRequest.FollowingDto followingRequestDto) {
Users user = userService.getCurrentUser();
Users targetUser = userService.getUserByEmail(followingRequestDto.getEmail());
Follow follow = FollowConverter.toFollowing(user, targetUser);

return followWriteRepository.save(follow);
}

@Transactional
public void unfollowing(FollowRequest.UnfollowingDto unfollowingRequestDto) {
Users user = userService.getCurrentUser();
Users targetUser = userService.getUserByEmail(unfollowingRequestDto.getEmail());

Follow follow = findFollowData(user, targetUser);

followWriteRepository.delete(follow);
}

private Follow findFollowData(Users user, Users targetUser) {
Follow follow = followReadRepository.findByFolloweeIdAndFollowerId(user.getId(), targetUser.getId());
if (follow == null) throw new FollowHandler(ErrorStatus._FOLLOW_NOT_FOUND);

return follow;
}

@Transactional(readOnly = true)
public List<Users> getFollowerList(Users user) {
List<Follow> followers = followReadRepository.findByFollowerId(user.getId());

return followers.stream()
.map(Follow::getFollowee)
.collect(Collectors.toList());
}

@Transactional(readOnly = true)
public List<Users> getFolloweeList(Users user) {
List<Follow> followees = followReadRepository.findByFolloweeId(user.getId());

return followees.stream()
.map(Follow::getFollower)
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,12 @@
import com.example.betteriter.fo_domain.mypage.dto.MypageResponse;
import com.example.betteriter.fo_domain.mypage.service.MypageService;
import com.example.betteriter.fo_domain.review.domain.Review;
import com.example.betteriter.fo_domain.user.domain.Users;
import com.example.betteriter.global.common.response.ResponseDto;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.Email;
import java.util.ArrayList;
Expand All @@ -28,30 +26,76 @@ public class MypageController {

private final MypageService mypageService;

@GetMapping("/review?email={email}")
/**
* 내가 쓴 리뷰 조회
*
* @param id 사용자 id
* @return List<MypageResponse.MyReviewDto>
*/
@GetMapping("/review/{id}")
public ResponseDto<List<MypageResponse.MyReviewDto>> getReview(
@RequestParam(value = "email", required = false) @Email String email
@PathVariable Long id
) {
List<Review> reviewList;
if (mypageService.checkUserSelf(email)) reviewList = mypageService.getMyReviewList();
else reviewList = mypageService.getTargetReviewList(email);
if (mypageService.checkUserSelf(id)) reviewList = mypageService.getMyReviewList();
else reviewList = mypageService.getTargetReviewList(id);

return ResponseDto.onSuccess(MypageResponseConverter.toMyReviewDtoList(reviewList));
}

@GetMapping("/review/scrap?user_id={user_id}")
/**
* 내가 쓴 리뷰 조회
*
* @param id 사용자 id
* @return List<MypageResponse.MyReviewDto>
*/
@GetMapping("/review/scrap/{id}")
public ResponseDto<List<MypageResponse.MyReviewDto>> getScrapReview(
@RequestParam(value = "email", required = false) @Email String email
@PathVariable Long id
) {
List<Review> reviewList = mypageService.getScrapReviewList(email);
List<Review> reviewList = mypageService.getScrapReviewList(id);
return ResponseDto.onSuccess(MypageResponseConverter.toMyReviewDtoList(reviewList));
}

@GetMapping("/review/like?email={email}")
/**
* 내가 쓴 리뷰 조회
*
* @param id 사용자 id
* @return List<MypageResponse.MyReviewDto>
*/
@GetMapping("/review/like/{id}")
public ResponseDto<List<MypageResponse.MyReviewDto>> getLikeReview(
@RequestParam(value = "email", required = false) @Email String email
@PathVariable Long id
) {
List<Review> reviewList = mypageService.getLikeReviewList(email);
List<Review> reviewList = mypageService.getLikeReviewList(id);
return ResponseDto.onSuccess(MypageResponseConverter.toMyReviewDtoList(reviewList));
}

/**
* 팔로워 조회 (내가 팔로우한 사람)
*
* @param id 사용자 id
* @return List<MypageResponse.FollowerDto>
*/
@GetMapping("/follower/{id}")
public ResponseDto<List<MypageResponse.FollowerDto>> getFollower(
@PathVariable Long id
) {
List<Users> followerList = mypageService.getFollowerList(id);
return ResponseDto.onSuccess(MypageResponseConverter.toFollowerDtoList(followerList));
}

/**
* 팔로잉 조회 (나를 팔로우한 사람)
*
* @param id 사용자 id
* @return List<MypageResponse.FollowerDto>
*/
@GetMapping("/followee/{id}")
public ResponseDto<List<MypageResponse.FollowerDto>> getFollowee(
@PathVariable Long id
) {
List<Users> followeeList = mypageService.getFolloweeList(id);
return ResponseDto.onSuccess(MypageResponseConverter.toFollowerDtoList(followeeList));
}
}
Loading
Loading