diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendDeleteBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendDeleteBean.java new file mode 100644 index 0000000..1949347 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendDeleteBean.java @@ -0,0 +1,24 @@ +package com.example.jsgamesbackendmain.Bean.FriendBean; + +import com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean.FriendDeleteSmallBean; +import com.example.jsgamesbackendmain.Bean.SmallBean.UserBean.UserGetByEmailSmallBean; +import com.example.jsgamesbackendmain.Bean.SmallBean.UserBean.UserGetByIdSmallBean; +import com.example.jsgamesbackendmain.Model.DAO.UserDAO; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Request.FriendRequestDTO; +import com.example.jsgamesbackendmain.Model.DTO.StateResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class FriendDeleteBean { + private final FriendDeleteSmallBean friendDeleteSmallBean; + private final UserGetByEmailSmallBean userGetByEmailSmallBean; + private final UserGetByIdSmallBean userGetByIdSmallBean; + + public StateResponseDTO exec(FriendRequestDTO friendRequestDTO) { + UserDAO userDAO = userGetByIdSmallBean.exec(friendRequestDTO.getUserId()); + UserDAO friendDAO = userGetByEmailSmallBean.exec(friendRequestDTO.getFriendEmail()); + return friendDeleteSmallBean.exec(userDAO, friendDAO); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendListBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendListBean.java new file mode 100644 index 0000000..645297c --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendListBean.java @@ -0,0 +1,32 @@ +package com.example.jsgamesbackendmain.Bean.FriendBean; + +import com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean.FriendListByRecentSmallBean; +import com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean.FriendListByTimeSmallBean; +import com.example.jsgamesbackendmain.Bean.SmallBean.UserBean.UserGetByIdSmallBean; +import com.example.jsgamesbackendmain.Model.DAO.UserDAO; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Response.FriendListResponseDTO; +import com.example.jsgamesbackendmain.Model.ENUM.FriendSort; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@RequiredArgsConstructor +public class FriendListBean { + private final UserGetByIdSmallBean userGetByIdSmallBean; + private final FriendListByRecentSmallBean friendListByRecentSmallBean; + private final FriendListByTimeSmallBean friendListByTimeSmallBean; + + public List exec(String userId, Integer page, Integer size, FriendSort sort) { + UserDAO user = userGetByIdSmallBean.exec(userId); + List friendListResponseDTOS; + if (sort == FriendSort.RECENT) { + friendListResponseDTOS = friendListByRecentSmallBean.exec(user, page, size); + } else { + friendListResponseDTOS = friendListByTimeSmallBean.exec(user, page, size); + } + + return friendListResponseDTOS; + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestAcceptBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestAcceptBean.java new file mode 100644 index 0000000..4c2ac48 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestAcceptBean.java @@ -0,0 +1,33 @@ +package com.example.jsgamesbackendmain.Bean.FriendBean; + +import com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean.FriendFindSmallBean; +import com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean.FriendRequestDeleteSmallBean; +import com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean.FriendSaveSmallBean; +import com.example.jsgamesbackendmain.Bean.SmallBean.UserBean.UserGetByEmailSmallBean; +import com.example.jsgamesbackendmain.Bean.SmallBean.UserBean.UserGetByIdSmallBean; +import com.example.jsgamesbackendmain.Model.DAO.UserDAO; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Request.FriendRequestDTO; +import com.example.jsgamesbackendmain.Model.DTO.StateResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class FriendRequestAcceptBean { + private final FriendRequestDeleteSmallBean friendRequestDeleteSmallBean; + private final UserGetByEmailSmallBean userGetByEmailSmallBean; + private final UserGetByIdSmallBean userGetByIdSmallBean; + private final FriendSaveSmallBean friendSaveSmallBean; + private final FriendFindSmallBean friendFindSmallBean; + + public StateResponseDTO exec(FriendRequestDTO friendRequestDTO) { + UserDAO user = userGetByIdSmallBean.exec(friendRequestDTO.getUserId()); + UserDAO friend = userGetByEmailSmallBean.exec(friendRequestDTO.getFriendEmail()); + friendFindSmallBean.exec(friend.getUserId(), user.getUserId()); + friendRequestDeleteSmallBean.exec(friend.getUserId(), friendRequestDTO.getUserId()); + friendSaveSmallBean.exec(user, friend); + friendSaveSmallBean.exec(friend, user); + + return StateResponseDTO.builder().state(true).build(); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestBean.java new file mode 100644 index 0000000..6a720fb --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestBean.java @@ -0,0 +1,21 @@ +package com.example.jsgamesbackendmain.Bean.FriendBean; + +import com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean.FriendRequestSmallBean; +import com.example.jsgamesbackendmain.Bean.SmallBean.UserBean.UserGetByEmailSmallBean; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Request.FriendRequestDTO; +import com.example.jsgamesbackendmain.Model.DTO.StateResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class FriendRequestBean { + + private final FriendRequestSmallBean friendRequestSmallBean; + private final UserGetByEmailSmallBean userGetByEmailSmallBean; + + public StateResponseDTO exec(FriendRequestDTO friendRequestDTO) { + String friendId = userGetByEmailSmallBean.exec(friendRequestDTO.getFriendEmail()).getUserId(); + return friendRequestSmallBean.exec(friendRequestDTO.getUserId(), friendId); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestDeleteBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestDeleteBean.java new file mode 100644 index 0000000..fd6aae7 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestDeleteBean.java @@ -0,0 +1,19 @@ +package com.example.jsgamesbackendmain.Bean.FriendBean; + +import com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean.FriendRequestDeleteSmallBean; +import com.example.jsgamesbackendmain.Bean.SmallBean.UserBean.UserGetByEmailSmallBean; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Request.FriendRequestDTO; +import com.example.jsgamesbackendmain.Model.DTO.StateResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class FriendRequestDeleteBean { + private final FriendRequestDeleteSmallBean friendRequestDeleteSmallBean; + private final UserGetByEmailSmallBean userGetByEmailSmallBean; + + public StateResponseDTO exec(FriendRequestDTO friendRequestDTO) { + return friendRequestDeleteSmallBean.exec(friendRequestDTO.getUserId(), userGetByEmailSmallBean.exec(friendRequestDTO.getFriendEmail()).getUserId()); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestListBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestListBean.java new file mode 100644 index 0000000..b7c6f55 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestListBean.java @@ -0,0 +1,35 @@ +package com.example.jsgamesbackendmain.Bean.FriendBean; + +import com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean.FriendRequestListSmallBean; +import com.example.jsgamesbackendmain.Bean.SmallBean.UserBean.UserGetByIdSmallBean; +import com.example.jsgamesbackendmain.Model.DAO.FriendRequestDAO; +import com.example.jsgamesbackendmain.Model.DAO.UserDAO; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Response.FriendRequestListResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +@RequiredArgsConstructor +public class FriendRequestListBean { + private final FriendRequestListSmallBean friendRequestListSmallBean; + private final UserGetByIdSmallBean userGetByIdSmallBean; + + public List exec(String userId, Integer page, Integer size) { + List friendRequestDAOS = friendRequestListSmallBean.exec(userId, page, size); + + + return friendRequestDAOS.stream() + .map(friendRequestDAO -> FriendRequestListResponseDTO.builder() + .friendEmail(userGetByIdSmallBean.exec(friendRequestDAO.getFriendId()).getEmail()) + .friendName(userGetByIdSmallBean.exec(friendRequestDAO.getFriendId()).getNickname()) + .friendProfile(userGetByIdSmallBean.exec(friendRequestDAO.getFriendId()).getProfileImageURL()) + .friendStatus(friendRequestDAO.getState()) + .createdAt(friendRequestDAO.getCreatedAt()) + .build()) + .collect(Collectors.toList()); + + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestRejectionBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestRejectionBean.java new file mode 100644 index 0000000..ad3352b --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestRejectionBean.java @@ -0,0 +1,19 @@ +package com.example.jsgamesbackendmain.Bean.FriendBean; + +import com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean.FriendRequestRejectionSmallBean; +import com.example.jsgamesbackendmain.Bean.SmallBean.UserBean.UserGetByEmailSmallBean; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Request.FriendRequestDTO; +import com.example.jsgamesbackendmain.Model.DTO.StateResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class FriendRequestRejectionBean { + private final FriendRequestRejectionSmallBean friendRequestRejectionSmallBean; + private final UserGetByEmailSmallBean userGetByEmailSmallBean; + + public StateResponseDTO exec(FriendRequestDTO friendRequestDTO) { + return friendRequestRejectionSmallBean.exec(friendRequestDTO.getUserId(), userGetByEmailSmallBean.exec(friendRequestDTO.getFriendEmail()).getUserId()); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestedListBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestedListBean.java new file mode 100644 index 0000000..21719a2 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendRequestedListBean.java @@ -0,0 +1,32 @@ +package com.example.jsgamesbackendmain.Bean.FriendBean; + +import com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean.FriendRequestedListSmallBean; +import com.example.jsgamesbackendmain.Bean.SmallBean.UserBean.UserGetByIdSmallBean; +import com.example.jsgamesbackendmain.Model.DAO.FriendRequestDAO; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Response.FriendRequestListResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +@RequiredArgsConstructor +public class FriendRequestedListBean { + private final FriendRequestedListSmallBean friendRequestedListSmallBean; + private final UserGetByIdSmallBean userGetByIdSmallBean; + + public List exec(String userId, Integer page, Integer size) { + List friendRequestDAOS = friendRequestedListSmallBean.exec(userId, page, size); + + return friendRequestDAOS.stream() + .map(friendRequestDAO -> FriendRequestListResponseDTO.builder() + .friendEmail(userGetByIdSmallBean.exec(friendRequestDAO.getUserId()).getEmail()) + .friendName(userGetByIdSmallBean.exec(friendRequestDAO.getUserId()).getNickname()) + .friendProfile(userGetByIdSmallBean.exec(friendRequestDAO.getUserId()).getProfileImageURL()) + .friendStatus(friendRequestDAO.getState()) + .createdAt(friendRequestDAO.getCreatedAt()) + .build()) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendDeleteSmallBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendDeleteSmallBean.java new file mode 100644 index 0000000..590db8c --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendDeleteSmallBean.java @@ -0,0 +1,20 @@ +package com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean; + +import com.example.jsgamesbackendmain.Model.DAO.UserDAO; +import com.example.jsgamesbackendmain.Model.DTO.StateResponseDTO; +import com.example.jsgamesbackendmain.Repository.FriendRepository; +import com.example.jsgamesbackendmain.Repository.FriendRequestRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class FriendDeleteSmallBean { + private final FriendRepository friendRepository; + + public StateResponseDTO exec(UserDAO userDAO, UserDAO friendDAO) { + friendRepository.deleteByUserAndFriend(userDAO, friendDAO); + friendRepository.deleteByUserAndFriend(friendDAO, userDAO); + return StateResponseDTO.builder().state(true).build(); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendFindSmallBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendFindSmallBean.java new file mode 100644 index 0000000..7b1daf2 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendFindSmallBean.java @@ -0,0 +1,22 @@ +package com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean; + +import com.example.jsgamesbackendmain.Controller.ExceptionControll.FailException; +import com.example.jsgamesbackendmain.Model.DAO.FriendRequestDAO; +import com.example.jsgamesbackendmain.Repository.FriendRequestRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +@Component +@RequiredArgsConstructor +public class FriendFindSmallBean { + private final FriendRequestRepository friendRequestRepository; + + public void exec(String userId, String friendId) { + Optional friendRequestDAO = friendRequestRepository.findByUserIdAndFriendId(userId, friendId); + if(!friendRequestDAO.isPresent()) { + throw new FailException("헤당 친구요청이 없습니다."); + } + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendListByRecentSmallBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendListByRecentSmallBean.java new file mode 100644 index 0000000..ba31704 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendListByRecentSmallBean.java @@ -0,0 +1,43 @@ +package com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean; + +import com.example.jsgamesbackendmain.Bean.SmallBean.UserBean.UserRecentPlayTimeSmallBean; +import com.example.jsgamesbackendmain.Model.DAO.FriendDAO; +import com.example.jsgamesbackendmain.Model.DAO.UserDAO; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Response.FriendListResponseDTO; +import com.example.jsgamesbackendmain.Repository.FriendRepository; +import com.example.jsgamesbackendmain.Repository.LogRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@Component +@RequiredArgsConstructor +public class FriendListByRecentSmallBean { + private final FriendRepository friendRepository; + private final UserRecentPlayTimeSmallBean userRecentPlayTimeSmallBean; + + public List exec(UserDAO user, Integer page, Integer size) { + // 페이지와 크기를 이용하여 pageable 객체 생성 + Pageable pageable = PageRequest.of(page, size); + + // 현재 사용자의 친구 목록 가져오기 + List friendDAOS = friendRepository.findByUserOrderByCreatedAtDesc(user, pageable).toList(); + + // 각 친구의 최근 게임 플레이 시간을 찾고 정렬하기 + return friendDAOS.stream().map(friendDAO -> FriendListResponseDTO.builder() + .friendEmail(friendDAO.getFriend().getEmail()) + .friendName(friendDAO.getFriend().getNickname()) + .friendProfile(friendDAO.getFriend().getProfileImageURL()) + .parentMajor(friendDAO.getFriend().getParentMajor()) + .major(friendDAO.getFriend().getMajor()) + .createdAt(friendDAO.getCreatedAt()) + .recentPlay(userRecentPlayTimeSmallBean.exec(friendDAO.getFriend())) + .build()).collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendListByTimeSmallBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendListByTimeSmallBean.java new file mode 100644 index 0000000..8271b48 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendListByTimeSmallBean.java @@ -0,0 +1,34 @@ +package com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean; + +import com.example.jsgamesbackendmain.Bean.SmallBean.UserBean.UserRecentPlayTimeSmallBean; +import com.example.jsgamesbackendmain.Model.DAO.FriendDAO; +import com.example.jsgamesbackendmain.Model.DAO.UserDAO; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Response.FriendListResponseDTO; +import com.example.jsgamesbackendmain.Repository.FriendRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +@RequiredArgsConstructor +public class FriendListByTimeSmallBean { + private final FriendRepository friendRepository; + private final UserRecentPlayTimeSmallBean userRecentPlayTimeSmallBean; + + public List exec(UserDAO user, Integer page, Integer size) { + List friendDAOS = friendRepository.findByUserOrderByCreatedAtDesc(user, PageRequest.of(page, size)).toList(); + + return friendDAOS.stream().map(friendDAO -> FriendListResponseDTO.builder() + .friendEmail(friendDAO.getFriend().getEmail()) + .friendName(friendDAO.getFriend().getNickname()) + .friendProfile(friendDAO.getFriend().getProfileImageURL()) + .parentMajor(friendDAO.getFriend().getParentMajor()) + .major(friendDAO.getFriend().getMajor()) + .createdAt(friendDAO.getCreatedAt()) + .recentPlay(userRecentPlayTimeSmallBean.exec(friendDAO.getFriend())) + .build()).collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestDeleteSmallBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestDeleteSmallBean.java new file mode 100644 index 0000000..14483d5 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestDeleteSmallBean.java @@ -0,0 +1,17 @@ +package com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean; + +import com.example.jsgamesbackendmain.Model.DTO.StateResponseDTO; +import com.example.jsgamesbackendmain.Repository.FriendRequestRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class FriendRequestDeleteSmallBean { + private final FriendRequestRepository friendRequestRepository; + + public StateResponseDTO exec(String userId, String friendId) { + friendRequestRepository.deleteByUserIdAndFriendId(userId, friendId); + return StateResponseDTO.builder().state(true).build(); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestListSmallBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestListSmallBean.java new file mode 100644 index 0000000..8652ff5 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestListSmallBean.java @@ -0,0 +1,22 @@ +package com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean; + +import com.example.jsgamesbackendmain.Model.DAO.FriendRequestDAO; +import com.example.jsgamesbackendmain.Repository.FriendRequestRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@RequiredArgsConstructor +public class FriendRequestListSmallBean { + private final FriendRequestRepository friendRequestRepository; + + public List exec(String userId, Integer page, Integer size) { + PageRequest request = PageRequest.of(page, size); + Page friendRequestDAOS = friendRequestRepository.findByUserIdOrderByCreatedAtDesc(userId, request); + return friendRequestDAOS.toList(); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestRejectionSmallBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestRejectionSmallBean.java new file mode 100644 index 0000000..557cca3 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestRejectionSmallBean.java @@ -0,0 +1,20 @@ +package com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean; + +import com.example.jsgamesbackendmain.Model.DTO.StateResponseDTO; +import com.example.jsgamesbackendmain.Model.ENUM.FriendRequestState; +import com.example.jsgamesbackendmain.Repository.FriendRequestRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class FriendRequestRejectionSmallBean { + private final FriendRequestRepository friendRequestRepository; + + public StateResponseDTO exec(String userId, String friendId) { + //FriendRequestDAO의 State를 REJECTED로 변경 + friendRequestRepository.updateStateByUserIdAndFriendId(friendId, userId, FriendRequestState.REJECTED); + + return StateResponseDTO.builder().state(true).build(); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestSmallBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestSmallBean.java new file mode 100644 index 0000000..e524fec --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestSmallBean.java @@ -0,0 +1,26 @@ +package com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean; + +import com.example.jsgamesbackendmain.Model.DAO.FriendRequestDAO; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Request.FriendRequestDTO; +import com.example.jsgamesbackendmain.Model.DTO.StateResponseDTO; +import com.example.jsgamesbackendmain.Repository.FriendRequestRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class FriendRequestSmallBean { + private final FriendRequestRepository friendRequestRepository; + + + public StateResponseDTO exec(String userId, String friendId) { + FriendRequestDAO friendRequestDAO = FriendRequestDAO.builder() + .userId(userId) + .friendId(friendId) + .build(); + friendRequestRepository.save(friendRequestDAO); + return StateResponseDTO.builder() + .state(true) + .build(); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestedListSmallBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestedListSmallBean.java new file mode 100644 index 0000000..cc2879e --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendRequestedListSmallBean.java @@ -0,0 +1,23 @@ +package com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean; + +import com.example.jsgamesbackendmain.Model.DAO.FriendRequestDAO; +import com.example.jsgamesbackendmain.Model.ENUM.FriendRequestState; +import com.example.jsgamesbackendmain.Repository.FriendRequestRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@RequiredArgsConstructor +public class FriendRequestedListSmallBean { + private final FriendRequestRepository friendRequestRepository; + + public List exec(String userId, Integer page, Integer size) { + PageRequest request = PageRequest.of(page, size); + Page friendRequestDAOS = friendRequestRepository.findByFriendIdAndStateOrderByCreatedAtDesc(userId, FriendRequestState.PENDING,request); + return friendRequestDAOS.toList(); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendSaveSmallBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendSaveSmallBean.java new file mode 100644 index 0000000..9345430 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/FriendBean/FriendSaveSmallBean.java @@ -0,0 +1,21 @@ +package com.example.jsgamesbackendmain.Bean.SmallBean.FriendBean; + +import com.example.jsgamesbackendmain.Model.DAO.FriendDAO; +import com.example.jsgamesbackendmain.Model.DAO.UserDAO; +import com.example.jsgamesbackendmain.Repository.FriendRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class FriendSaveSmallBean { + private final FriendRepository friendRepository; + + public void exec(UserDAO user, UserDAO friend) { + FriendDAO friendDAO = FriendDAO.builder() + .user(user) + .friend(friend) + .build(); + friendRepository.save(friendDAO); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/UserBean/UserRecentPlayTimeSmallBean.java b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/UserBean/UserRecentPlayTimeSmallBean.java new file mode 100644 index 0000000..cc18cb1 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Bean/SmallBean/UserBean/UserRecentPlayTimeSmallBean.java @@ -0,0 +1,18 @@ +package com.example.jsgamesbackendmain.Bean.SmallBean.UserBean; + +import com.example.jsgamesbackendmain.Model.DAO.UserDAO; +import com.example.jsgamesbackendmain.Repository.LogRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +@Component +@RequiredArgsConstructor +public class UserRecentPlayTimeSmallBean { + private final LogRepository logRepository; + + public LocalDateTime exec(UserDAO user) { + return logRepository.getRecentPlay(user); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Controller/FriendController.java b/src/main/java/com/example/jsgamesbackendmain/Controller/FriendController.java new file mode 100644 index 0000000..df8df5b --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Controller/FriendController.java @@ -0,0 +1,88 @@ +package com.example.jsgamesbackendmain.Controller; + +import com.example.jsgamesbackendmain.Model.DTO.Friend.Request.FriendRequestDTO; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Response.FriendListResponseDTO; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Response.FriendRequestListResponseDTO; +import com.example.jsgamesbackendmain.Model.DTO.StateResponseDTO; +import com.example.jsgamesbackendmain.Model.ENUM.FriendSort; +import com.example.jsgamesbackendmain.Model.ENUM.ReviewSort; +import com.example.jsgamesbackendmain.Service.FriendService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import java.util.List; + +@RestController +@RequiredArgsConstructor +@CrossOrigin("*") +public class FriendController { + + private final FriendService friendService; + + //친구 추가 요청 + @Operation(summary = "친구 추가 요청") + @PostMapping("/friend/request") + public StateResponseDTO requestFriend(@RequestBody FriendRequestDTO friendRequestDTO) { + return friendService.requestFriend(friendRequestDTO); + } + + //친구 추가 요청받은 목록 + @Operation(summary = "친구 추가 요청보낸 목록") + @GetMapping("/friend/requests/{userId}") + public List requestList(@PathVariable String userId, + @Parameter @Min(0) Integer page, + @Parameter @Min(0) @Max(10) Integer size) { + return friendService.requestList(userId, page, size); + } + + //친구 추가 보낸 요청 삭제 + @Operation(summary = "친구 추가 보낸 요청 삭제") + @DeleteMapping("/friend/request") + public StateResponseDTO deleteRequest(@RequestBody FriendRequestDTO friendRequestDTO) { + return friendService.deleteRequest(friendRequestDTO); + } + + //친구 추가 요청보낸 목록 + @Operation(summary = "친구 추가 요청받은 목록") + @GetMapping("/friend/requested/{userId}") + public List requestedList(@PathVariable String userId, + @Parameter @Min(0) Integer page, + @Parameter @Min(0) @Max(10) Integer size) { + return friendService.requestedList(userId, page, size); + } + + //친구 추가 수락 + @Operation(summary = "친구 추가 수락") + @PostMapping("/friend/accept") + public StateResponseDTO acceptFriend(@RequestBody FriendRequestDTO friendRequestDTO) { + return friendService.acceptFriend(friendRequestDTO); + } + + //친구 추가 거절 + @Operation(summary = "친구 추가 거절") + @PostMapping("/friend/reject") + public StateResponseDTO rejectFriend(@RequestBody FriendRequestDTO friendRequestDTO) { + return friendService.rejectFriend(friendRequestDTO); + } + + //친구 목록 + @Operation(summary = "친구 목록") + @GetMapping("/friends/{userId}") + public List friendList(@PathVariable String userId, + @Parameter @Min(0) Integer page, + @Parameter @Min(0) @Max(10) Integer size, + @RequestParam(defaultValue = "TIME") FriendSort sort) { + return friendService.friendList(userId, page, size, sort); + } + + //친구 삭제 + @Operation(summary = "친구 삭제") + @DeleteMapping("/friend") + public StateResponseDTO deleteFriend(@RequestBody FriendRequestDTO friendRequestDTO) { + return friendService.deleteFriend(friendRequestDTO); + } +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Controller/HelpfulController.java b/src/main/java/com/example/jsgamesbackendmain/Controller/HelpfulController.java index ffe5eea..cd45f14 100644 --- a/src/main/java/com/example/jsgamesbackendmain/Controller/HelpfulController.java +++ b/src/main/java/com/example/jsgamesbackendmain/Controller/HelpfulController.java @@ -16,21 +16,21 @@ public class HelpfulController { // 특정 유저와 특정 리뷰의 도움이 되었는지 여부 조회 API @Operation(summary = "helpful 여부 조회") @GetMapping("/helpful/user/{userId}/review/{reviewId}") - public HelpfulGetResponseDTO getHelpful(String userId, Long reviewId) { + public HelpfulGetResponseDTO getHelpful(@PathVariable String userId, @PathVariable Long reviewId) { return helpfulService.getHelpful(userId, reviewId); } // 특정 유저와 특정 리뷰의 도움이 되었는지 여부 추가 API @Operation(summary = "helpful 추가") @PostMapping("/helpful/user/{userId}/review/{reviewId}") - public StateResponseDTO postHelpful(String userId, Long reviewId) { + public StateResponseDTO postHelpful(@PathVariable String userId, @PathVariable Long reviewId) { return helpfulService.postHelpful(userId, reviewId); } // 특정 유저와 특정 리뷰의 도움이 되었는지 여부 삭제 API @Operation(summary = "helpful 삭제") @DeleteMapping("/helpful/user/{userId}/review/{reviewId}") - public StateResponseDTO deleteHelpful(String userId, Long reviewId) { + public StateResponseDTO deleteHelpful(@PathVariable String userId, @PathVariable Long reviewId) { return helpfulService.deleteHelpful(userId, reviewId); } } diff --git a/src/main/java/com/example/jsgamesbackendmain/Controller/ImageController.java b/src/main/java/com/example/jsgamesbackendmain/Controller/ImageController.java index 177b8c8..35b820d 100644 --- a/src/main/java/com/example/jsgamesbackendmain/Controller/ImageController.java +++ b/src/main/java/com/example/jsgamesbackendmain/Controller/ImageController.java @@ -15,18 +15,18 @@ @RequiredArgsConstructor @CrossOrigin("*") public class ImageController { - private final ImageService s3Service; + private final ImageService imageService; @Operation(summary = "사진 업로드") @PostMapping(value = "/Image", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public S3UrlResponseDTO uploadImage(@RequestBody MultipartFile file) throws IOException { - return s3Service.uploadImage(file); + return imageService.uploadImage(file); } @Operation(summary = "사진 삭제") @DeleteMapping("/Image") public StateResponseDTO deleteImage(@RequestParam String fileUrl) { - return s3Service.deleteImage(fileUrl); + return imageService.deleteImage(fileUrl); } } diff --git a/src/main/java/com/example/jsgamesbackendmain/Model/DAO/EmailCodeDAO.java b/src/main/java/com/example/jsgamesbackendmain/Model/DAO/EmailCodeDAO.java index 93d3538..c5565b2 100644 --- a/src/main/java/com/example/jsgamesbackendmain/Model/DAO/EmailCodeDAO.java +++ b/src/main/java/com/example/jsgamesbackendmain/Model/DAO/EmailCodeDAO.java @@ -19,6 +19,7 @@ public class EmailCodeDAO { private String email; private String code; + @Builder.Default private LocalDateTime expiryDate = LocalDateTime.now(); // ... getters & setters diff --git a/src/main/java/com/example/jsgamesbackendmain/Model/DAO/FriendDAO.java b/src/main/java/com/example/jsgamesbackendmain/Model/DAO/FriendDAO.java new file mode 100644 index 0000000..2441b73 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Model/DAO/FriendDAO.java @@ -0,0 +1,34 @@ +package com.example.jsgamesbackendmain.Model.DAO; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Entity +@Table(name = "friend") +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FriendDAO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "user_id") + private UserDAO user; + + @ManyToOne + @JoinColumn(name = "friend_id") + private UserDAO friend; + + @CreationTimestamp + @Column(updatable = false) + private LocalDateTime createdAt; +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Model/DAO/FriendRequestDAO.java b/src/main/java/com/example/jsgamesbackendmain/Model/DAO/FriendRequestDAO.java new file mode 100644 index 0000000..2971012 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Model/DAO/FriendRequestDAO.java @@ -0,0 +1,33 @@ +package com.example.jsgamesbackendmain.Model.DAO; + +import com.example.jsgamesbackendmain.Model.ENUM.FriendRequestState; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Entity +@Table(name = "friend_request") +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FriendRequestDAO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String userId; + private String friendId; + + @CreationTimestamp + @Column(updatable = false) + private LocalDateTime createdAt; + + @Builder.Default + private FriendRequestState state = FriendRequestState.PENDING; +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Model/DAO/UserDAO.java b/src/main/java/com/example/jsgamesbackendmain/Model/DAO/UserDAO.java index dd81e27..42e8564 100644 --- a/src/main/java/com/example/jsgamesbackendmain/Model/DAO/UserDAO.java +++ b/src/main/java/com/example/jsgamesbackendmain/Model/DAO/UserDAO.java @@ -56,6 +56,14 @@ public void setRefreshToken(RefreshTokenDTO refreshToken) { @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List reviews = new ArrayList<>(); + @Builder.Default + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) + private List users = new ArrayList<>(); + + @Builder.Default + @OneToMany(mappedBy = "friend", cascade = CascadeType.ALL) + private List friends = new ArrayList<>(); + public UserDAO update(UserUpdateRequestDTO request, ParentMajor parentMajor) { if (request.getNickname() != null) { this.nickname = request.getNickname(); diff --git a/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Friend/Request/FriendRequestDTO.java b/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Friend/Request/FriendRequestDTO.java new file mode 100644 index 0000000..ea0f9dc --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Friend/Request/FriendRequestDTO.java @@ -0,0 +1,11 @@ +package com.example.jsgamesbackendmain.Model.DTO.Friend.Request; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class FriendRequestDTO { + private String userId; + private String friendEmail; +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Friend/Response/FriendListResponseDTO.java b/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Friend/Response/FriendListResponseDTO.java new file mode 100644 index 0000000..f20d56b --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Friend/Response/FriendListResponseDTO.java @@ -0,0 +1,21 @@ +package com.example.jsgamesbackendmain.Model.DTO.Friend.Response; + +import com.example.jsgamesbackendmain.Model.ENUM.Major; +import com.example.jsgamesbackendmain.Model.ENUM.ParentMajor; +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Getter +@Builder +public class FriendListResponseDTO { + private String friendEmail; + private String friendName; + private String friendProfile; + private ParentMajor parentMajor; + private Major major; + private LocalDateTime createdAt; + private LocalDateTime recentPlay; +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Friend/Response/FriendRequestListResponseDTO.java b/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Friend/Response/FriendRequestListResponseDTO.java new file mode 100644 index 0000000..170195f --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Friend/Response/FriendRequestListResponseDTO.java @@ -0,0 +1,20 @@ +package com.example.jsgamesbackendmain.Model.DTO.Friend.Response; + +import com.example.jsgamesbackendmain.Model.DAO.FriendDAO; +import com.example.jsgamesbackendmain.Model.DAO.FriendRequestDAO; +import com.example.jsgamesbackendmain.Model.ENUM.FriendRequestState; +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDateTime; + +@Getter +@Builder +public class FriendRequestListResponseDTO { + private String friendEmail; + private String friendName; + private String friendProfile; + private FriendRequestState friendStatus; + private LocalDateTime createdAt; + +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Game/Request/GameCreateRequestDTO.java b/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Game/Request/GameCreateRequestDTO.java index 6282834..c5f4793 100644 --- a/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Game/Request/GameCreateRequestDTO.java +++ b/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Game/Request/GameCreateRequestDTO.java @@ -14,6 +14,8 @@ public class GameCreateRequestDTO { private String userId; private String imageUrl; private String gameUrl; + + @Builder.Default private Double targetScore = 0.0; @NotNull(message = "ScoreType는 필수 입력값 입니다.") diff --git a/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Review/Request/ReviewCreateRequestDTO.java b/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Review/Request/ReviewCreateRequestDTO.java index 0196aa0..fe6f90a 100644 --- a/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Review/Request/ReviewCreateRequestDTO.java +++ b/src/main/java/com/example/jsgamesbackendmain/Model/DTO/Review/Request/ReviewCreateRequestDTO.java @@ -21,6 +21,7 @@ public ReviewDAO toDAO() { return ReviewDAO.builder() .reviewContent(this.getReviewContent()) .star(this.getStar()) + .helpful(0L) .build(); } diff --git a/src/main/java/com/example/jsgamesbackendmain/Model/ENUM/FriendRequestState.java b/src/main/java/com/example/jsgamesbackendmain/Model/ENUM/FriendRequestState.java new file mode 100644 index 0000000..6dbc189 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Model/ENUM/FriendRequestState.java @@ -0,0 +1,5 @@ +package com.example.jsgamesbackendmain.Model.ENUM; + +public enum FriendRequestState { + REJECTED, PENDING, +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Model/ENUM/FriendSort.java b/src/main/java/com/example/jsgamesbackendmain/Model/ENUM/FriendSort.java new file mode 100644 index 0000000..ef79159 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Model/ENUM/FriendSort.java @@ -0,0 +1,5 @@ +package com.example.jsgamesbackendmain.Model.ENUM; + +public enum FriendSort { + RECENT, TIME +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Repository/FriendRepository.java b/src/main/java/com/example/jsgamesbackendmain/Repository/FriendRepository.java new file mode 100644 index 0000000..31c6872 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Repository/FriendRepository.java @@ -0,0 +1,17 @@ +package com.example.jsgamesbackendmain.Repository; + +import com.example.jsgamesbackendmain.Model.DAO.FriendDAO; +import com.example.jsgamesbackendmain.Model.DAO.UserDAO; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface FriendRepository extends JpaRepository { + //deleteByUserAndFriend + void deleteByUserAndFriend(UserDAO user, UserDAO friend); + + //findByUserIdOrderByCreatedAtDesc + Page findByUserOrderByCreatedAtDesc(UserDAO user, Pageable pageable); +} diff --git a/src/main/java/com/example/jsgamesbackendmain/Repository/FriendRequestRepository.java b/src/main/java/com/example/jsgamesbackendmain/Repository/FriendRequestRepository.java new file mode 100644 index 0000000..b1174f6 --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Repository/FriendRequestRepository.java @@ -0,0 +1,32 @@ +package com.example.jsgamesbackendmain.Repository; + +import com.example.jsgamesbackendmain.Model.DAO.FriendRequestDAO; +import com.example.jsgamesbackendmain.Model.ENUM.FriendRequestState; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface FriendRequestRepository extends JpaRepository { + Page findByUserIdOrderByCreatedAtDesc(String userId, Pageable pageable); + + //state가 PENDING인 것만 가져오기 AND FriendID로 찾기 + Page findByFriendIdAndStateOrderByCreatedAtDesc(String friendId, FriendRequestState state, Pageable pageable); + + //deleteByUserIdAndFriendId + void deleteByUserIdAndFriendId(String userId, String friendId); + + + //FriendRequestDAO의 State를 REJECTED로 변경 + @Modifying + @Query("UPDATE FriendRequestDAO fr SET fr.state = :state WHERE fr.userId = :userId AND fr.friendId = :friendId") + void updateStateByUserIdAndFriendId(@Param("userId") String userId, @Param("friendId") String friendId, @Param("state") FriendRequestState state); + + Optional findByUserIdAndFriendId(String userId, String friendId); +} \ No newline at end of file diff --git a/src/main/java/com/example/jsgamesbackendmain/Repository/LogRepository.java b/src/main/java/com/example/jsgamesbackendmain/Repository/LogRepository.java index e7ec5c0..0579a5d 100644 --- a/src/main/java/com/example/jsgamesbackendmain/Repository/LogRepository.java +++ b/src/main/java/com/example/jsgamesbackendmain/Repository/LogRepository.java @@ -9,7 +9,9 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.Optional; +import java.util.stream.DoubleStream; @Repository public interface LogRepository extends JpaRepository { @@ -42,4 +44,8 @@ public interface LogRepository extends JpaRepository { @Query("select count(r) from LogDAO r where abs(?1 - r.gameScore) <= abs(?1 - ?2) and r.game = ?3") Long getRankGoal(Double targetScore, Double gameScore, GameDAO game); + + //유저가 플레이한 가장 최근 게임의 시간값 하나 + @Query("select max(r.createdAt) from LogDAO r where r.user = ?1") + LocalDateTime getRecentPlay(UserDAO user); } diff --git a/src/main/java/com/example/jsgamesbackendmain/Service/FriendService.java b/src/main/java/com/example/jsgamesbackendmain/Service/FriendService.java new file mode 100644 index 0000000..dc2e0be --- /dev/null +++ b/src/main/java/com/example/jsgamesbackendmain/Service/FriendService.java @@ -0,0 +1,67 @@ +package com.example.jsgamesbackendmain.Service; + +import com.example.jsgamesbackendmain.Bean.FriendBean.*; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Request.FriendRequestDTO; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Response.FriendListResponseDTO; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Response.FriendRequestListResponseDTO; +import com.example.jsgamesbackendmain.Model.DTO.StateResponseDTO; +import com.example.jsgamesbackendmain.Model.ENUM.FriendSort; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class FriendService { + + private final FriendRequestBean friendRequestBean; + private final FriendRequestListBean friendRequestListBean; + private final FriendRequestedListBean friendRequestedListBean; + private final FriendRequestDeleteBean friendRequestDeleteBean; + private final FriendRequestRejectionBean friendRequestRejectionBean; + private final FriendRequestAcceptBean friendRequestAcceptBean; + private final FriendDeleteBean friendDeleteBean; + private final FriendListBean friendListBean; + + @Transactional + public StateResponseDTO requestFriend(FriendRequestDTO friendRequestDTO) { + return friendRequestBean.exec(friendRequestDTO); + } + + @Transactional(readOnly = true) + public List requestList(String userId, Integer page, Integer size) { + return friendRequestListBean.exec(userId, page, size); + } + + @Transactional(readOnly = true) + public List requestedList(String userId, Integer page, Integer size) { + return friendRequestedListBean.exec(userId, page, size); + } + + @Transactional + public StateResponseDTO deleteRequest(FriendRequestDTO friendRequestDTO) { + return friendRequestDeleteBean.exec(friendRequestDTO); + } + + @Transactional + public StateResponseDTO rejectFriend(FriendRequestDTO friendRequestDTO) { + return friendRequestRejectionBean.exec(friendRequestDTO); + } + + @Transactional + public StateResponseDTO acceptFriend(FriendRequestDTO friendRequestDTO) { + return friendRequestAcceptBean.exec(friendRequestDTO); + } + + @Transactional + public StateResponseDTO deleteFriend(FriendRequestDTO friendRequestDTO) { + return friendDeleteBean.exec(friendRequestDTO); + } + + @Transactional(readOnly = true) + public List friendList(String userId, Integer page, Integer size, FriendSort sort) { + return friendListBean.exec(userId, page, size, sort); + } +} diff --git a/src/test/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendBeanTest.java b/src/test/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendBeanTest.java new file mode 100644 index 0000000..038ceac --- /dev/null +++ b/src/test/java/com/example/jsgamesbackendmain/Bean/FriendBean/FriendBeanTest.java @@ -0,0 +1,193 @@ +package com.example.jsgamesbackendmain.Bean.FriendBean; + +import com.example.jsgamesbackendmain.Model.DAO.FriendRequestDAO; +import com.example.jsgamesbackendmain.Model.DAO.UserDAO; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Request.FriendRequestDTO; +import com.example.jsgamesbackendmain.Model.DTO.Friend.Response.FriendRequestListResponseDTO; +import com.example.jsgamesbackendmain.Model.ENUM.FriendRequestState; +import com.example.jsgamesbackendmain.Repository.FriendRepository; +import com.example.jsgamesbackendmain.Repository.FriendRequestRepository; +import com.example.jsgamesbackendmain.Repository.UserRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@SpringBootTest +@Transactional +@ActiveProfiles("test") +public class FriendBeanTest { + + @Autowired + private UserRepository userRepository; + @Autowired + private FriendRepository friendRepository; + @Autowired + private FriendRequestRepository friendRequestRepository; + @Autowired + private FriendRequestListBean friendRequestListBean; + @Autowired + private FriendRequestedListBean friendRequestedListBean; + @Autowired + private FriendListBean friendListBean; + + @Autowired + private FriendRequestBean friendRequestBean; + @Test + void FriendRequestBeanTest() { + //given + UserDAO userDAO = UserDAO.builder() + .userId("1") + .email("email") + .build(); + userRepository.save(userDAO); + UserDAO friendDAO = UserDAO.builder() + .userId("2") + .email("friendEmail") + .build(); + userRepository.save(friendDAO); + + + FriendRequestDTO friendRequestDTO = FriendRequestDTO.builder() + .userId("1") + .friendEmail("friendEmail") + .build(); + //when + friendRequestBean.exec(friendRequestDTO); + //then + assertEquals(friendRequestListBean.exec("1", 0, 5).get(0).getCreatedAt(), friendRequestedListBean.exec("2", 0, 5).get(0).getCreatedAt()); + } + + @Autowired + private FriendRequestAcceptBean friendRequestAcceptBean; + @Test + void FriendRequestAcceptBeanTest() { + //given + UserDAO userDAO = UserDAO.builder() + .userId("1") + .email("email") + .build(); + userRepository.save(userDAO); + UserDAO friendDAO = UserDAO.builder() + .userId("2") + .email("friendEmail") + .build(); + userRepository.save(friendDAO); + UserDAO friendDAO1 = UserDAO.builder() + .userId("3") + .email("friendEmail1") + .build(); + userRepository.save(friendDAO1); + + FriendRequestDTO friendRequestDTO = FriendRequestDTO.builder() + .userId("1") + .friendEmail("friendEmail") + .build(); + friendRequestBean.exec(friendRequestDTO); + FriendRequestDTO friendRequestDTO2 = FriendRequestDTO.builder() + .userId("2") + .friendEmail("email") + .build(); + //when + friendRequestAcceptBean.exec(friendRequestDTO2); + //then + assertEquals(friendRepository.count(), 2); + } + + @Autowired + private FriendRequestRejectionBean friendRequestRejectionBean; + @Test + void FriendRequestRejectionBeanTest() { + //given + UserDAO userDAO = UserDAO.builder() + .userId("1") + .email("email") + .build(); + userRepository.save(userDAO); + UserDAO friendDAO = UserDAO.builder() + .userId("2") + .email("friendEmail") + .build(); + userRepository.save(friendDAO); + + + FriendRequestDTO friendRequestDTO = FriendRequestDTO.builder() + .userId("1") + .friendEmail("friendEmail") + .build(); + friendRequestBean.exec(friendRequestDTO); + FriendRequestDTO friendRequestDTO2 = FriendRequestDTO.builder() + .userId("3") + .friendEmail("email") + .build(); + //when + friendRequestRejectionBean.exec(friendRequestDTO2); + + //then + //assertEquals(friendRequestListBean.exec("1", 0, 5).get(0).getFriendStatus(), FriendRequestState.REJECTED); + } + + @Autowired + private FriendRequestDeleteBean friendRequestDeleteBean; + @Test + void FriendRequestDeleteBeanTest() { + //given + UserDAO userDAO = UserDAO.builder() + .userId("1") + .email("email") + .build(); + userRepository.save(userDAO); + UserDAO friendDAO = UserDAO.builder() + .userId("2") + .email("friendEmail") + .build(); + userRepository.save(friendDAO); + + + FriendRequestDTO friendRequestDTO = FriendRequestDTO.builder() + .userId("1") + .friendEmail("friendEmail") + .build(); + friendRequestBean.exec(friendRequestDTO); + //when + friendRequestDeleteBean.exec(friendRequestDTO); + //then + assertEquals(friendRequestListBean.exec("1", 0, 5).size(), 0); + } + + @Autowired + private FriendDeleteBean friendDeleteBean; + @Test + void FriendDeleteBeanTest() { + //given + UserDAO userDAO = UserDAO.builder() + .userId("1") + .email("email") + .build(); + userRepository.save(userDAO); + UserDAO friendDAO = UserDAO.builder() + .userId("2") + .email("friendEmail") + .build(); + userRepository.save(friendDAO); + + + FriendRequestDTO friendRequestDTO = FriendRequestDTO.builder() + .userId("1") + .friendEmail("friendEmail") + .build(); + friendRequestBean.exec(friendRequestDTO); + FriendRequestDTO friendRequestDTO2 = FriendRequestDTO.builder() + .userId("2") + .friendEmail("email") + .build(); + friendRequestAcceptBean.exec(friendRequestDTO2); + //when + friendDeleteBean.exec(friendRequestDTO); + //then + assertEquals(friendRepository.count(), 0); + } +}