From eaa7702dd97b6ce24461fb36412dbecdb8dc42a7 Mon Sep 17 00:00:00 2001 From: parkha Date: Sun, 21 Jul 2024 18:07:45 +0900 Subject: [PATCH 01/10] =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/beginnerfitbe/friend/domain/Friend.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/main/java/com/example/beginnerfitbe/friend/domain/Friend.java diff --git a/src/main/java/com/example/beginnerfitbe/friend/domain/Friend.java b/src/main/java/com/example/beginnerfitbe/friend/domain/Friend.java new file mode 100644 index 0000000..4e88055 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/friend/domain/Friend.java @@ -0,0 +1,2 @@ +package com.example.beginnerfitbe.friend.domain;public class Friend { +} From 088dd04007833b3baca03df75f59954d1861560f Mon Sep 17 00:00:00 2001 From: "ugauga19892556@gmail.com" Date: Sun, 21 Jul 2024 23:00:23 +0900 Subject: [PATCH 02/10] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=EB=B3=B4=EB=82=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../friend/controller/FriendController.java | 30 ++++++++++ .../beginnerfitbe/friend/domain/Friend.java | 56 ++++++++++++++++++- .../beginnerfitbe/friend/dto/FriendDTO.java | 31 ++++++++++ .../friend/dto/FriendRequestDTO.java | 12 ++++ .../friend/repository/FriendRepository.java | 15 +++++ .../friend/service/FriendService.java | 40 +++++++++++++ 6 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java create mode 100644 src/main/java/com/example/beginnerfitbe/friend/dto/FriendDTO.java create mode 100644 src/main/java/com/example/beginnerfitbe/friend/dto/FriendRequestDTO.java create mode 100644 src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java create mode 100644 src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java diff --git a/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java b/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java new file mode 100644 index 0000000..948d8f1 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java @@ -0,0 +1,30 @@ +package com.example.beginnerfitbe.friend.controller; + +import com.example.beginnerfitbe.friend.dto.FriendDTO; +import com.example.beginnerfitbe.friend.dto.FriendRequestDTO; +import com.example.beginnerfitbe.friend.service.FriendService; +import com.example.beginnerfitbe.jwt.util.JwtUtil; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/friends") +@RequiredArgsConstructor +public class FriendController { + + private final FriendService friendService; + private final JwtUtil jwtUtil; + + @PostMapping("/request") + public ResponseEntity sendFriendRequest(HttpServletRequest request, @RequestBody FriendRequestDTO friendRequestDTO) { + String token = jwtUtil.resolveToken(request); + System.out.println("Resolved Token: " + token); + + Long senderId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7)); + System.out.println("Sender ID: " + senderId); + FriendDTO friendDTO = friendService.sendFriendRequest(senderId, friendRequestDTO.getReceiverEmail()); + return ResponseEntity.ok(friendDTO); + } +} diff --git a/src/main/java/com/example/beginnerfitbe/friend/domain/Friend.java b/src/main/java/com/example/beginnerfitbe/friend/domain/Friend.java index 4e88055..9517820 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/domain/Friend.java +++ b/src/main/java/com/example/beginnerfitbe/friend/domain/Friend.java @@ -1,2 +1,56 @@ -package com.example.beginnerfitbe.friend.domain;public class Friend { +package com.example.beginnerfitbe.friend.domain; + +import com.example.beginnerfitbe.user.domain.User; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Friend { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long friendId; + + @Column(nullable = false) + private boolean isAccepted; + + @Column(nullable = false) + private LocalDateTime createdAt; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "receiverId") + private User receiver; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "senderId") + private User sender; + + @Builder + public Friend(User sender, User receiver, boolean isAccepted, LocalDateTime createdAt) { + this.sender = sender; + this.receiver = receiver; + this.isAccepted = isAccepted; + this.createdAt = LocalDateTime.now(); + } + + public void accept() { + this.isAccepted = true; + } + + public void reject() { + this.isAccepted = false; + } + + + + } + diff --git a/src/main/java/com/example/beginnerfitbe/friend/dto/FriendDTO.java b/src/main/java/com/example/beginnerfitbe/friend/dto/FriendDTO.java new file mode 100644 index 0000000..7493f0f --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/friend/dto/FriendDTO.java @@ -0,0 +1,31 @@ +package com.example.beginnerfitbe.friend.dto; + +import com.example.beginnerfitbe.friend.domain.Friend; +import lombok.*; + +import java.time.LocalDateTime; + + + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class FriendDTO { + private Long friendId; + private Long senderId; + private Long receiverId; + private boolean isAccepted; + private LocalDateTime createdAt; + + public static FriendDTO fromEntity(Friend friend) { + return FriendDTO.builder() + .friendId(friend.getFriendId()) + .senderId(friend.getSender().getId()) + .receiverId(friend.getReceiver().getId()) + .isAccepted(friend.isAccepted()) + .createdAt(friend.getCreatedAt()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/beginnerfitbe/friend/dto/FriendRequestDTO.java b/src/main/java/com/example/beginnerfitbe/friend/dto/FriendRequestDTO.java new file mode 100644 index 0000000..321cb0d --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/friend/dto/FriendRequestDTO.java @@ -0,0 +1,12 @@ +package com.example.beginnerfitbe.friend.dto; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class FriendRequestDTO { + private String receiverEmail; +} \ No newline at end of file diff --git a/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java b/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java new file mode 100644 index 0000000..411ac7e --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java @@ -0,0 +1,15 @@ +package com.example.beginnerfitbe.friend.repository; + +import com.example.beginnerfitbe.friend.domain.Friend; +import com.example.beginnerfitbe.user.domain.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface FriendRepository extends JpaRepository { + + Optional findBySenderAndReceiver(User sender, User receiver); + +} diff --git a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java new file mode 100644 index 0000000..362bc2b --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java @@ -0,0 +1,40 @@ +package com.example.beginnerfitbe.friend.service; + +import com.example.beginnerfitbe.friend.domain.Friend; +import com.example.beginnerfitbe.friend.dto.FriendDTO; +import com.example.beginnerfitbe.friend.repository.FriendRepository; +import com.example.beginnerfitbe.user.domain.User; +import com.example.beginnerfitbe.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +@Service +@Transactional +@RequiredArgsConstructor +public class FriendService { + + private final FriendRepository friendRepository; + private final UserRepository userRepository; + + + public FriendDTO sendFriendRequest(Long senderId, String receiverEmail) { + User sender = userRepository.findById(senderId) + .orElseThrow(() -> new RuntimeException("Sender user not found")); + User receiver = userRepository.findByEmail(receiverEmail) + .orElseThrow(() -> new RuntimeException("Receiver user not found")); + + Friend friend = Friend.builder() + .sender(sender) + .receiver(receiver) + .isAccepted(false) + .createdAt(LocalDateTime.now()) + .build(); + + Friend savedFriend = friendRepository.save(friend); + return FriendDTO.fromEntity(savedFriend); + } + +} From 01100d0a17c4aa4444efbcead6249442a23fe2b7 Mon Sep 17 00:00:00 2001 From: "ugauga19892556@gmail.com" Date: Mon, 22 Jul 2024 00:37:21 +0900 Subject: [PATCH 03/10] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=20=EB=8C=80=EA=B8=B0,=20=EC=B9=9C=EA=B5=AC=EC=88=98=EB=9D=BD/?= =?UTF-8?q?=EA=B1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../friend/controller/FriendController.java | 32 ++++++++++++++++ .../friend/repository/FriendRepository.java | 6 +-- .../friend/service/FriendService.java | 37 +++++++++++++++++++ .../beginnerfitbe/user/dto/OtherUserDto.java | 30 +++++++++++++++ 4 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/example/beginnerfitbe/user/dto/OtherUserDto.java diff --git a/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java b/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java index 948d8f1..82feddf 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java +++ b/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java @@ -4,11 +4,14 @@ import com.example.beginnerfitbe.friend.dto.FriendRequestDTO; import com.example.beginnerfitbe.friend.service.FriendService; import com.example.beginnerfitbe.jwt.util.JwtUtil; +import com.example.beginnerfitbe.user.dto.OtherUserDto; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequestMapping("/friends") @RequiredArgsConstructor @@ -27,4 +30,33 @@ public ResponseEntity sendFriendRequest(HttpServletRequest request, @ FriendDTO friendDTO = friendService.sendFriendRequest(senderId, friendRequestDTO.getReceiverEmail()); return ResponseEntity.ok(friendDTO); } + + @GetMapping + public ResponseEntity> getPendingFriendRequests(HttpServletRequest request) { + String token = jwtUtil.resolveToken(request); + Long userId = jwtUtil.getUserId(token.substring(7)); + + List pendingFriendRequests = friendService.getPendingFriendRequests(userId); + return ResponseEntity.ok(pendingFriendRequests); + } + + @PostMapping("/accept/{senderId}") + public ResponseEntity acceptFriendRequest(HttpServletRequest request, @PathVariable Long senderId) { + String token = jwtUtil.resolveToken(request); + Long receiverId = jwtUtil.getUserId(token.substring(7)); + + + friendService.acceptFriendRequest(senderId, receiverId); + return ResponseEntity.ok().build(); + } + + @PostMapping("/reject/{senderId}") + public ResponseEntity rejectFriendRequest(HttpServletRequest request, @PathVariable Long senderId) { + String token = jwtUtil.resolveToken(request); + Long receiverId = jwtUtil.getUserId(token.substring(7)); + + + friendService.rejectFriendRequest(senderId, receiverId); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java b/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java index 411ac7e..b752b82 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java +++ b/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java @@ -1,15 +1,15 @@ package com.example.beginnerfitbe.friend.repository; import com.example.beginnerfitbe.friend.domain.Friend; -import com.example.beginnerfitbe.user.domain.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository public interface FriendRepository extends JpaRepository { - Optional findBySenderAndReceiver(User sender, User receiver); - + List findByReceiverIdAndIsAcceptedFalse(Long receiverId); + Optional findBySenderIdAndReceiverId(Long senderId, Long receiverId); } diff --git a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java index 362bc2b..624f954 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java +++ b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java @@ -4,12 +4,15 @@ import com.example.beginnerfitbe.friend.dto.FriendDTO; import com.example.beginnerfitbe.friend.repository.FriendRepository; import com.example.beginnerfitbe.user.domain.User; +import com.example.beginnerfitbe.user.dto.OtherUserDto; import com.example.beginnerfitbe.user.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; @Service @Transactional @@ -37,4 +40,38 @@ public FriendDTO sendFriendRequest(Long senderId, String receiverEmail) { return FriendDTO.fromEntity(savedFriend); } + public List getPendingFriendRequests(Long userId) { + List pendingFriendRequests = friendRepository.findByReceiverIdAndIsAcceptedFalse(userId); + + return pendingFriendRequests.stream() + .map(friend -> { + User sender = friend.getSender(); + return new OtherUserDto( + sender.getId(), + sender.getEmail(), + sender.getName(), + sender.getExercisePurpose(), + sender.getExercisePart(), + sender.getExerciseTime(), + sender.getExerciseIntensity() + ); + }) + .collect(Collectors.toList()); + } + + public void acceptFriendRequest(Long senderId, Long receiverId) { + Friend friend = friendRepository.findBySenderIdAndReceiverId(senderId, receiverId) + .orElseThrow(() -> new RuntimeException("Friend request not found")); + + friend.accept(); + friendRepository.save(friend); + } + + public void rejectFriendRequest(Long senderId, Long receiverId) { + Friend friend = friendRepository.findBySenderIdAndReceiverId(senderId, receiverId) + .orElseThrow(() -> new RuntimeException("Friend request not found")); + + friendRepository.delete(friend); + } + } diff --git a/src/main/java/com/example/beginnerfitbe/user/dto/OtherUserDto.java b/src/main/java/com/example/beginnerfitbe/user/dto/OtherUserDto.java new file mode 100644 index 0000000..4a8a9b1 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/user/dto/OtherUserDto.java @@ -0,0 +1,30 @@ +package com.example.beginnerfitbe.user.dto; + +import com.example.beginnerfitbe.user.domain.User; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class OtherUserDto { + + private Long id; + private String email; + private String name; + private int exercisePurpose; + private int exercisePart; + private int exerciseTime; + private int exerciseIntensity; + + public User toEntity() { + return User.builder() + + .email(email) + .name(name) + .exercisePurpose(exercisePurpose) + .exercisePart(exercisePart) + .exerciseTime(exerciseTime) + .exerciseIntensity(exerciseIntensity) + .build(); + } +} From 5c8a58dc93030544aa1b9396fe814ad8698c381a Mon Sep 17 00:00:00 2001 From: parkha Date: Mon, 22 Jul 2024 16:55:48 +0900 Subject: [PATCH 04/10] =?UTF-8?q?=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../error/GlobalExceptionHandler.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/main/java/com/example/beginnerfitbe/error/GlobalExceptionHandler.java diff --git a/src/main/java/com/example/beginnerfitbe/error/GlobalExceptionHandler.java b/src/main/java/com/example/beginnerfitbe/error/GlobalExceptionHandler.java new file mode 100644 index 0000000..8fff5d0 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/error/GlobalExceptionHandler.java @@ -0,0 +1,36 @@ +package com.example.beginnerfitbe.error; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + + +@ControllerAdvice +public class GlobalExceptionHandler { + + + @ExceptionHandler(RuntimeException.class) + public ResponseEntity handleRuntimeException(RuntimeException ex) { + ErrorResponse errorResponse = new ErrorResponse(HttpStatus.BAD_REQUEST.value(), ex.getMessage()); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse); + } + + private static class ErrorResponse { + private int status; + private String message; + + public ErrorResponse(int status, String message) { + this.status = status; + this.message = message; + } + + public int getStatus() { + return status; + } + + public String getMessage() { + return message; + } + } +} \ No newline at end of file From 6cba8946ea070e8f8fb842b583ec535f356b583d Mon Sep 17 00:00:00 2001 From: parkha Date: Mon, 22 Jul 2024 17:58:38 +0900 Subject: [PATCH 05/10] =?UTF-8?q?=EC=98=A4=EB=A5=98=EB=A9=94=EC=84=B8?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../friend/repository/FriendRepository.java | 1 + .../friend/service/FriendService.java | 42 +++++++++++++++---- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java b/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java index b752b82..b3988e2 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java +++ b/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java @@ -12,4 +12,5 @@ public interface FriendRepository extends JpaRepository { List findByReceiverIdAndIsAcceptedFalse(Long receiverId); Optional findBySenderIdAndReceiverId(Long senderId, Long receiverId); + List findByReceiverIdAndIsAcceptedTrue(Long receiverId); } diff --git a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java index 624f954..c131788 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java +++ b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java @@ -12,6 +12,7 @@ import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; @Service @@ -27,17 +28,40 @@ public FriendDTO sendFriendRequest(Long senderId, String receiverEmail) { User sender = userRepository.findById(senderId) .orElseThrow(() -> new RuntimeException("Sender user not found")); User receiver = userRepository.findByEmail(receiverEmail) - .orElseThrow(() -> new RuntimeException("Receiver user not found")); + .orElseThrow(() -> new RuntimeException("요청을 보낼 사용자가 존재하지 않습니다.")); - Friend friend = Friend.builder() - .sender(sender) - .receiver(receiver) - .isAccepted(false) - .createdAt(LocalDateTime.now()) - .build(); + // 이미 친구인지 확인 + Optional existingFriend = friendRepository.findBySenderIdAndReceiverId(senderId, receiver.getId()); + Optional reexistingFriend = friendRepository.findBySenderIdAndReceiverId( receiver.getId(), senderId); + if (existingFriend.isPresent() && existingFriend.get().isAccepted()) { + throw new RuntimeException("이미 친구입니다."); + } + + else if (existingFriend.isPresent() ) { + // 친구 요청이 이미 존재하지만 승인되지 않은 경우 + throw new RuntimeException("친구 요청 목록을 확인해주세요."); + } + + else if (reexistingFriend.isPresent()) { + if(reexistingFriend.get().isAccepted()){ + throw new RuntimeException("이미 친구입니다."); + } + throw new RuntimeException("이미 친구 요청이 온 사용자입니다. 친구 요청을 수락해주세요."); + } + + + else { + Friend friend = Friend.builder() + .sender(sender) + .receiver(receiver) + .isAccepted(false) + .createdAt(LocalDateTime.now()) + .build(); + + Friend savedFriend = friendRepository.save(friend); + return FriendDTO.fromEntity(savedFriend); + } - Friend savedFriend = friendRepository.save(friend); - return FriendDTO.fromEntity(savedFriend); } public List getPendingFriendRequests(Long userId) { From d8580ec25dc1fa4b1f9afe43c36f2a08d76de07b Mon Sep 17 00:00:00 2001 From: parkha Date: Tue, 23 Jul 2024 09:20:55 +0900 Subject: [PATCH 06/10] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../friend/controller/FriendController.java | 11 ++++++++++- .../friend/service/FriendService.java | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java b/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java index 82feddf..399ac91 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java +++ b/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java @@ -31,7 +31,7 @@ public ResponseEntity sendFriendRequest(HttpServletRequest request, @ return ResponseEntity.ok(friendDTO); } - @GetMapping + @GetMapping("/pending") public ResponseEntity> getPendingFriendRequests(HttpServletRequest request) { String token = jwtUtil.resolveToken(request); Long userId = jwtUtil.getUserId(token.substring(7)); @@ -40,6 +40,15 @@ public ResponseEntity> getPendingFriendRequests(HttpServletRe return ResponseEntity.ok(pendingFriendRequests); } + @GetMapping("/accepted") + public ResponseEntity> getAcceptedFriendRequests(HttpServletRequest request) { + String token = jwtUtil.resolveToken(request); + Long userId = jwtUtil.getUserId(token.substring(7)); + + List acceptedFriendRequests = friendService.getAcceptedFriendRequests(userId); + return ResponseEntity.ok(acceptedFriendRequests); + } + @PostMapping("/accept/{senderId}") public ResponseEntity acceptFriendRequest(HttpServletRequest request, @PathVariable Long senderId) { String token = jwtUtil.resolveToken(request); diff --git a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java index c131788..9e8b1cf 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java +++ b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java @@ -83,6 +83,25 @@ public List getPendingFriendRequests(Long userId) { .collect(Collectors.toList()); } + public List getAcceptedFriendRequests(Long userId) { + List acceptedFriendRequests = friendRepository.findByReceiverIdAndIsAcceptedTrue(userId); + + return acceptedFriendRequests.stream() + .map(friend -> { + User sender = friend.getSender(); + return new OtherUserDto( + sender.getId(), + sender.getEmail(), + sender.getName(), + sender.getExercisePurpose(), + sender.getExercisePart(), + sender.getExerciseTime(), + sender.getExerciseIntensity() + ); + }) + .collect(Collectors.toList()); + } + public void acceptFriendRequest(Long senderId, Long receiverId) { Friend friend = friendRepository.findBySenderIdAndReceiverId(senderId, receiverId) .orElseThrow(() -> new RuntimeException("Friend request not found")); From 606b894af7433d963404fa1a93356f930d6fb5b2 Mon Sep 17 00:00:00 2001 From: parkha Date: Tue, 23 Jul 2024 09:56:37 +0900 Subject: [PATCH 07/10] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../friend/controller/FriendController.java | 2 ++ .../friend/repository/FriendRepository.java | 3 +++ .../friend/service/FriendService.java | 19 ++++++++++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java b/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java index 399ac91..b885c55 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java +++ b/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java @@ -68,4 +68,6 @@ public ResponseEntity rejectFriendRequest(HttpServletRequest request, @Pat friendService.rejectFriendRequest(senderId, receiverId); return ResponseEntity.ok().build(); } + + } diff --git a/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java b/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java index b3988e2..5559376 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java +++ b/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java @@ -2,6 +2,7 @@ import com.example.beginnerfitbe.friend.domain.Friend; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.util.List; @@ -13,4 +14,6 @@ public interface FriendRepository extends JpaRepository { List findByReceiverIdAndIsAcceptedFalse(Long receiverId); Optional findBySenderIdAndReceiverId(Long senderId, Long receiverId); List findByReceiverIdAndIsAcceptedTrue(Long receiverId); + @Query("SELECT f.receiver.id FROM Friend f WHERE f.sender.id = :senderId") + List findReceiverIdsBySenderId(Long senderId); } diff --git a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java index 9e8b1cf..943eb18 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java +++ b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java @@ -84,9 +84,12 @@ public List getPendingFriendRequests(Long userId) { } public List getAcceptedFriendRequests(Long userId) { + // 수신자로서 수락된 친구 요청 목록을 가져옵니다. List acceptedFriendRequests = friendRepository.findByReceiverIdAndIsAcceptedTrue(userId); + List receiverIds = friendRepository.findReceiverIdsBySenderId(userId); + List receivers = userRepository.findAllById(receiverIds); - return acceptedFriendRequests.stream() + List acceptedRequestsDtos = acceptedFriendRequests.stream() .map(friend -> { User sender = friend.getSender(); return new OtherUserDto( @@ -100,6 +103,20 @@ public List getAcceptedFriendRequests(Long userId) { ); }) .collect(Collectors.toList()); + + for (User receiver : receivers) { + acceptedRequestsDtos.add(new OtherUserDto( + receiver.getId(), + receiver.getEmail(), + receiver.getName(), + receiver.getExercisePurpose(), + receiver.getExercisePart(), + receiver.getExerciseTime(), + receiver.getExerciseIntensity() + )); + } + + return acceptedRequestsDtos; } public void acceptFriendRequest(Long senderId, Long receiverId) { From b411d22b5cb0c2e31ef8fbb465fea1cd7ac0c6a8 Mon Sep 17 00:00:00 2001 From: parkha Date: Tue, 23 Jul 2024 10:28:49 +0900 Subject: [PATCH 08/10] =?UTF-8?q?=EB=82=B4=EA=B0=80=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=EC=A4=91=EC=9D=B8=20=EC=B9=9C=EA=B5=AC=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../friend/controller/FriendController.java | 9 +++++++++ .../friend/repository/FriendRepository.java | 5 ++++- .../friend/service/FriendService.java | 19 +++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java b/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java index b885c55..dc9f6c4 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java +++ b/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java @@ -40,6 +40,15 @@ public ResponseEntity> getPendingFriendRequests(HttpServletRe return ResponseEntity.ok(pendingFriendRequests); } + @GetMapping("/waiting") + public ResponseEntity> getFriendWaitingService(HttpServletRequest request) { + String token = jwtUtil.resolveToken(request); + Long userId = jwtUtil.getUserId(token.substring(7)); + + List friendWaitingService = friendService.getFriendWaitingService(userId); + return ResponseEntity.ok(friendWaitingService); + } + @GetMapping("/accepted") public ResponseEntity> getAcceptedFriendRequests(HttpServletRequest request) { String token = jwtUtil.resolveToken(request); diff --git a/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java b/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java index 5559376..060bd1d 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java +++ b/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java @@ -14,6 +14,9 @@ public interface FriendRepository extends JpaRepository { List findByReceiverIdAndIsAcceptedFalse(Long receiverId); Optional findBySenderIdAndReceiverId(Long senderId, Long receiverId); List findByReceiverIdAndIsAcceptedTrue(Long receiverId); - @Query("SELECT f.receiver.id FROM Friend f WHERE f.sender.id = :senderId") + + @Query("SELECT f.receiver.id FROM Friend f WHERE f.sender.id = :senderId AND f.isAccepted = true") List findReceiverIdsBySenderId(Long senderId); + List findBySenderIdAndIsAcceptedFalse(Long senderId); + } diff --git a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java index 943eb18..4d54afb 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java +++ b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java @@ -83,6 +83,25 @@ public List getPendingFriendRequests(Long userId) { .collect(Collectors.toList()); } + public List getFriendWaitingService(Long userId) { + List FriendWaitingService = friendRepository.findBySenderIdAndIsAcceptedFalse(userId); + + return FriendWaitingService.stream() + .map(friend -> { + User receiver = friend.getReceiver(); + return new OtherUserDto( + receiver.getId(), + receiver.getEmail(), + receiver.getName(), + receiver.getExercisePurpose(), + receiver.getExercisePart(), + receiver.getExerciseTime(), + receiver.getExerciseIntensity() + ); + }) + .collect(Collectors.toList()); + } + public List getAcceptedFriendRequests(Long userId) { // 수신자로서 수락된 친구 요청 목록을 가져옵니다. List acceptedFriendRequests = friendRepository.findByReceiverIdAndIsAcceptedTrue(userId); From 4085a4f392ddbb5c010cabb870653b1f9cd5082d Mon Sep 17 00:00:00 2001 From: parkha Date: Tue, 23 Jul 2024 11:33:17 +0900 Subject: [PATCH 09/10] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=20=EA=B2=80=EC=83=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../friend/controller/FriendController.java | 14 ++++++++--- .../beginnerfitbe/friend/domain/Friend.java | 3 --- .../friend/repository/FriendRepository.java | 3 +++ .../friend/service/FriendService.java | 25 +++++++++++++++++++ 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java b/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java index dc9f6c4..806e6f5 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java +++ b/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java @@ -23,10 +23,7 @@ public class FriendController { @PostMapping("/request") public ResponseEntity sendFriendRequest(HttpServletRequest request, @RequestBody FriendRequestDTO friendRequestDTO) { String token = jwtUtil.resolveToken(request); - System.out.println("Resolved Token: " + token); - Long senderId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7)); - System.out.println("Sender ID: " + senderId); FriendDTO friendDTO = friendService.sendFriendRequest(senderId, friendRequestDTO.getReceiverEmail()); return ResponseEntity.ok(friendDTO); } @@ -78,5 +75,16 @@ public ResponseEntity rejectFriendRequest(HttpServletRequest request, @Pat return ResponseEntity.ok().build(); } + @GetMapping ("/info") + public ResponseEntity getFriendInfo(HttpServletRequest request, @RequestBody FriendRequestDTO friendRequestDTO) { + String token = jwtUtil.resolveToken(request); + Long senderId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7)); + + OtherUserDto friendInfo = friendService.getFriendInfo(senderId, friendRequestDTO.getReceiverEmail()); + return ResponseEntity.ok(friendInfo ); + } + + + } diff --git a/src/main/java/com/example/beginnerfitbe/friend/domain/Friend.java b/src/main/java/com/example/beginnerfitbe/friend/domain/Friend.java index 9517820..8b72b72 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/domain/Friend.java +++ b/src/main/java/com/example/beginnerfitbe/friend/domain/Friend.java @@ -49,8 +49,5 @@ public void reject() { this.isAccepted = false; } - - - } diff --git a/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java b/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java index 060bd1d..3832bd9 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java +++ b/src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java @@ -19,4 +19,7 @@ public interface FriendRepository extends JpaRepository { List findReceiverIdsBySenderId(Long senderId); List findBySenderIdAndIsAcceptedFalse(Long senderId); + + boolean existsByReceiverIdAndSenderIdAndIsAcceptedTrue(Long userId, Long id); + } diff --git a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java index 4d54afb..598fd4c 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java +++ b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java @@ -153,4 +153,29 @@ public void rejectFriendRequest(Long senderId, Long receiverId) { friendRepository.delete(friend); } + public OtherUserDto getFriendInfo(Long senderId, String receiverEmail) { + // 이메일로 User 찾기 + User friend = userRepository.findByEmail(receiverEmail) + .orElseThrow(() -> new RuntimeException("해당 친구가 존재하지 않습니다.")); + + // 친구 목록에 있는지 확인 + boolean isFriend = friendRepository.existsByReceiverIdAndSenderIdAndIsAcceptedTrue(senderId, friend.getId()) + || friendRepository.existsByReceiverIdAndSenderIdAndIsAcceptedTrue(friend.getId(), senderId); + + if (!isFriend) { + throw new RuntimeException("해당 친구가 존재하지 않습니다."); + } + + // OtherUserDto로 변환 + return new OtherUserDto( + friend.getId(), + friend.getEmail(), + friend.getName(), + friend.getExercisePurpose(), + friend.getExercisePart(), + friend.getExerciseTime(), + friend.getExerciseIntensity() + ); + } + } From 47e7611b697be413002fbb3b0482b4bfd1ff9d81 Mon Sep 17 00:00:00 2001 From: parkha Date: Tue, 23 Jul 2024 14:16:08 +0900 Subject: [PATCH 10/10] =?UTF-8?q?path=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../friend/controller/FriendController.java | 16 ++++++++++++---- .../user/controller/UserController.java | 3 ++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java b/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java index 806e6f5..7f6335c 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java +++ b/src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java @@ -5,6 +5,7 @@ import com.example.beginnerfitbe.friend.service.FriendService; import com.example.beginnerfitbe.jwt.util.JwtUtil; import com.example.beginnerfitbe.user.dto.OtherUserDto; +import io.swagger.v3.oas.annotations.Operation; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -21,6 +22,7 @@ public class FriendController { private final JwtUtil jwtUtil; @PostMapping("/request") + @Operation(summary = "친구 요청 메서드", description = "친구를 맺고싶은 유저의 이메일을 입력하여 친구 요청을 합니다.") public ResponseEntity sendFriendRequest(HttpServletRequest request, @RequestBody FriendRequestDTO friendRequestDTO) { String token = jwtUtil.resolveToken(request); Long senderId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7)); @@ -29,6 +31,7 @@ public ResponseEntity sendFriendRequest(HttpServletRequest request, @ } @GetMapping("/pending") + @Operation(summary = "친구 요청 대기 목록 조회 메서드", description = "나에게 친구 요청이 온 사용자들의 목록을 조회합니다.") public ResponseEntity> getPendingFriendRequests(HttpServletRequest request) { String token = jwtUtil.resolveToken(request); Long userId = jwtUtil.getUserId(token.substring(7)); @@ -38,6 +41,7 @@ public ResponseEntity> getPendingFriendRequests(HttpServletRe } @GetMapping("/waiting") + @Operation(summary = "요청중인 친구 목록 조회 메서드", description = "내가 보낸 친구 요청 중 아직 수락되지 않은 목록을 조회합니다.") public ResponseEntity> getFriendWaitingService(HttpServletRequest request) { String token = jwtUtil.resolveToken(request); Long userId = jwtUtil.getUserId(token.substring(7)); @@ -46,7 +50,8 @@ public ResponseEntity> getFriendWaitingService(HttpServletReq return ResponseEntity.ok(friendWaitingService); } - @GetMapping("/accepted") + @GetMapping("") + @Operation(summary = "친구 목록 조회 메서드", description = "친구로 맺어진 사용자들의 목록을 조회합니다.") public ResponseEntity> getAcceptedFriendRequests(HttpServletRequest request) { String token = jwtUtil.resolveToken(request); Long userId = jwtUtil.getUserId(token.substring(7)); @@ -55,7 +60,8 @@ public ResponseEntity> getAcceptedFriendRequests(HttpServletR return ResponseEntity.ok(acceptedFriendRequests); } - @PostMapping("/accept/{senderId}") + @PutMapping("/accept/{senderId}") + @Operation(summary = "친구 수락 메서드", description = "친구 요청을 수락합니다.") public ResponseEntity acceptFriendRequest(HttpServletRequest request, @PathVariable Long senderId) { String token = jwtUtil.resolveToken(request); Long receiverId = jwtUtil.getUserId(token.substring(7)); @@ -65,7 +71,8 @@ public ResponseEntity acceptFriendRequest(HttpServletRequest request, @Pat return ResponseEntity.ok().build(); } - @PostMapping("/reject/{senderId}") + @DeleteMapping("/{senderId}") + @Operation(summary = "친구 삭제 및 친구 거절 메서드", description = "친구를 삭제 및 친구요청을 거절합니다.") public ResponseEntity rejectFriendRequest(HttpServletRequest request, @PathVariable Long senderId) { String token = jwtUtil.resolveToken(request); Long receiverId = jwtUtil.getUserId(token.substring(7)); @@ -75,7 +82,8 @@ public ResponseEntity rejectFriendRequest(HttpServletRequest request, @Pat return ResponseEntity.ok().build(); } - @GetMapping ("/info") + @GetMapping ("/search") + @Operation(summary = "친구 검색 메서드", description = "친구목록 리스트에서 이메일을 입력하여 원하는 사용자를 찾습니다.") public ResponseEntity getFriendInfo(HttpServletRequest request, @RequestBody FriendRequestDTO friendRequestDTO) { String token = jwtUtil.resolveToken(request); Long senderId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7)); diff --git a/src/main/java/com/example/beginnerfitbe/user/controller/UserController.java b/src/main/java/com/example/beginnerfitbe/user/controller/UserController.java index 7a4b8c2..c4b7962 100644 --- a/src/main/java/com/example/beginnerfitbe/user/controller/UserController.java +++ b/src/main/java/com/example/beginnerfitbe/user/controller/UserController.java @@ -2,7 +2,6 @@ import com.example.beginnerfitbe.error.StateResponse; import com.example.beginnerfitbe.jwt.util.JwtUtil; -import com.example.beginnerfitbe.user.dto.SignUpResDto; import com.example.beginnerfitbe.user.dto.UserUpdateDto; import com.example.beginnerfitbe.user.service.UserService; import io.swagger.v3.oas.annotations.Operation; @@ -26,6 +25,8 @@ public class UserController{ public ResponseEntity list() { return ResponseEntity.ok(userService.list()); } + + @GetMapping("/{id}") @Operation(summary = "사용자 상세 조회 메서드", description = "사용자 상세 정보를 조회합니다.") public ResponseEntity read(HttpServletRequest request, @PathVariable Long id) {