-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
…iend Feat/#11—follow friend
- Loading branch information
Showing
9 changed files
with
468 additions
and
0 deletions.
There are no files selected for viewing
36 changes: 36 additions & 0 deletions
36
src/main/java/com/example/beginnerfitbe/error/GlobalExceptionHandler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<ErrorResponse> 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; | ||
} | ||
} | ||
} |
98 changes: 98 additions & 0 deletions
98
src/main/java/com/example/beginnerfitbe/friend/controller/FriendController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
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 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; | ||
import org.springframework.web.bind.annotation.*; | ||
|
||
import java.util.List; | ||
|
||
@RestController | ||
@RequestMapping("/friends") | ||
@RequiredArgsConstructor | ||
public class FriendController { | ||
|
||
private final FriendService friendService; | ||
private final JwtUtil jwtUtil; | ||
|
||
@PostMapping("/request") | ||
@Operation(summary = "친구 요청 메서드", description = "친구를 맺고싶은 유저의 이메일을 입력하여 친구 요청을 합니다.") | ||
public ResponseEntity<FriendDTO> sendFriendRequest(HttpServletRequest request, @RequestBody FriendRequestDTO friendRequestDTO) { | ||
String token = jwtUtil.resolveToken(request); | ||
Long senderId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7)); | ||
FriendDTO friendDTO = friendService.sendFriendRequest(senderId, friendRequestDTO.getReceiverEmail()); | ||
return ResponseEntity.ok(friendDTO); | ||
} | ||
|
||
@GetMapping("/pending") | ||
@Operation(summary = "친구 요청 대기 목록 조회 메서드", description = "나에게 친구 요청이 온 사용자들의 목록을 조회합니다.") | ||
public ResponseEntity<List<OtherUserDto>> getPendingFriendRequests(HttpServletRequest request) { | ||
String token = jwtUtil.resolveToken(request); | ||
Long userId = jwtUtil.getUserId(token.substring(7)); | ||
|
||
List<OtherUserDto> pendingFriendRequests = friendService.getPendingFriendRequests(userId); | ||
return ResponseEntity.ok(pendingFriendRequests); | ||
} | ||
|
||
@GetMapping("/waiting") | ||
@Operation(summary = "요청중인 친구 목록 조회 메서드", description = "내가 보낸 친구 요청 중 아직 수락되지 않은 목록을 조회합니다.") | ||
public ResponseEntity<List<OtherUserDto>> getFriendWaitingService(HttpServletRequest request) { | ||
String token = jwtUtil.resolveToken(request); | ||
Long userId = jwtUtil.getUserId(token.substring(7)); | ||
|
||
List<OtherUserDto> friendWaitingService = friendService.getFriendWaitingService(userId); | ||
return ResponseEntity.ok(friendWaitingService); | ||
} | ||
|
||
@GetMapping("") | ||
@Operation(summary = "친구 목록 조회 메서드", description = "친구로 맺어진 사용자들의 목록을 조회합니다.") | ||
public ResponseEntity<List<OtherUserDto>> getAcceptedFriendRequests(HttpServletRequest request) { | ||
String token = jwtUtil.resolveToken(request); | ||
Long userId = jwtUtil.getUserId(token.substring(7)); | ||
|
||
List<OtherUserDto> acceptedFriendRequests = friendService.getAcceptedFriendRequests(userId); | ||
return ResponseEntity.ok(acceptedFriendRequests); | ||
} | ||
|
||
@PutMapping("/accept/{senderId}") | ||
@Operation(summary = "친구 수락 메서드", description = "친구 요청을 수락합니다.") | ||
public ResponseEntity<Void> 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(); | ||
} | ||
|
||
@DeleteMapping("/{senderId}") | ||
@Operation(summary = "친구 삭제 및 친구 거절 메서드", description = "친구를 삭제 및 친구요청을 거절합니다.") | ||
public ResponseEntity<Void> 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(); | ||
} | ||
|
||
@GetMapping ("/search") | ||
@Operation(summary = "친구 검색 메서드", description = "친구목록 리스트에서 이메일을 입력하여 원하는 사용자를 찾습니다.") | ||
public ResponseEntity<OtherUserDto> 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 ); | ||
} | ||
|
||
|
||
|
||
|
||
} |
53 changes: 53 additions & 0 deletions
53
src/main/java/com/example/beginnerfitbe/friend/domain/Friend.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
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; | ||
} | ||
|
||
} | ||
|
31 changes: 31 additions & 0 deletions
31
src/main/java/com/example/beginnerfitbe/friend/dto/FriendDTO.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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(); | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
src/main/java/com/example/beginnerfitbe/friend/dto/FriendRequestDTO.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package com.example.beginnerfitbe.friend.dto; | ||
|
||
import lombok.*; | ||
|
||
@Getter | ||
@Setter | ||
@NoArgsConstructor | ||
@AllArgsConstructor | ||
@Builder | ||
public class FriendRequestDTO { | ||
private String receiverEmail; | ||
} |
25 changes: 25 additions & 0 deletions
25
src/main/java/com/example/beginnerfitbe/friend/repository/FriendRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package com.example.beginnerfitbe.friend.repository; | ||
|
||
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; | ||
import java.util.Optional; | ||
|
||
@Repository | ||
public interface FriendRepository extends JpaRepository<Friend, Long> { | ||
|
||
List<Friend> findByReceiverIdAndIsAcceptedFalse(Long receiverId); | ||
Optional<Friend> findBySenderIdAndReceiverId(Long senderId, Long receiverId); | ||
List<Friend> findByReceiverIdAndIsAcceptedTrue(Long receiverId); | ||
|
||
@Query("SELECT f.receiver.id FROM Friend f WHERE f.sender.id = :senderId AND f.isAccepted = true") | ||
List<Long> findReceiverIdsBySenderId(Long senderId); | ||
List<Friend> findBySenderIdAndIsAcceptedFalse(Long senderId); | ||
|
||
|
||
boolean existsByReceiverIdAndSenderIdAndIsAcceptedTrue(Long userId, Long id); | ||
|
||
} |
Oops, something went wrong.