Skip to content

Commit

Permalink
Merge pull request #12 from Likelion-YeungNam-Univ/feat/#11—follow-fr…
Browse files Browse the repository at this point in the history
…iend

Feat/#11—follow friend
  • Loading branch information
HaHaPark authored Jul 24, 2024
2 parents e3b0f18 + 47e7611 commit fcf9fc0
Show file tree
Hide file tree
Showing 9 changed files with 468 additions and 0 deletions.
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;
}
}
}
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 src/main/java/com/example/beginnerfitbe/friend/domain/Friend.java
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 src/main/java/com/example/beginnerfitbe/friend/dto/FriendDTO.java
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();
}
}
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;
}
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);

}
Loading

0 comments on commit fcf9fc0

Please sign in to comment.