자 어제는 친구 쪽 api 설계와 erd 부분했고, 저 부분을 보면서 친구 쪽 코드를 짰다.
매우 머리 아팠다..
엔티티는 2개를 만들어줬다.
첫 번째는 친구 관계를 나타내는 엔티티 (FrendShip)
두 번째는 친구 관계를 나타내기 위한 친구 요청 엔티티! (RequestFriend)
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table("friendship")
public class Friendship extends TimeStamp {
@Id
@Column("id")
private Long id;
@Column("user_id")
private Long userId;
@Column("friend_id")
private Long friendId;
@Builder
public Friendship(Long userId, Long friendId) {
this.userId = userId;
this.friendId = friendId;
}
}
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table("request_friend")
public class RequestFriend extends TimeStamp {
@Id
@Column("id")
private Long id;
@Column("from_user_id")
private Long fromUserId;
@Column("to_user_id")
private Long toUserId;
@Column("status")
private Status status;
public enum Status {
PENDING, ACCEPTED, REJECTED
}
@Builder
public RequestFriend(Long fromUserId, Long toUserId, Status status) {
this.fromUserId = fromUserId;
this.toUserId = toUserId;
this.status = status;
}
public RequestFriend changeStatus(Status newStatus) {
return RequestFriend.builder()
.fromUserId(this.fromUserId)
.toUserId(this.toUserId)
.status(newStatus)
.build();
}
}
dto도 만들어 줬다. ResponseDto 2개이다.
@Getter
@Builder
public class FriendshipResponseDto {
private Long userId;
private Long friendId;
private String friendNickname;
private String friendEmail;
private String friendIntro;
}
@Getter
@Builder
public class RequestFriendResponseDto {
private Long fromUserId;
private Long toUserId;
private String status;
}
Repository도 각각 만들어줬다.
친구관계 조회, 존재 여부, 삭제 그리고 특정 상태를 가진 요청 조회이다
@Repository
public interface FriendshipRepository extends ReactiveCrudRepository<Friendship, Long> {
@Query("SELECT * FROM friendship WHERE user_id = :userId")
Flux<Friendship> findAllByUserId(Long userId);
Mono<Boolean> existsByUserIdAndFriendId(Long userId, Long friendId);
Mono<Void> deleteByUserIdAndFriendId(Long userId, Long friendId);
}
@Repository
public interface RequestFriendRepository extends ReactiveCrudRepository<RequestFriend, Long> {
Flux<RequestFriend> findAllByToUserIdAndStatus(Long toUserId, RequestFriend.Status status);
}
userprincipal에 get id를 추가해 줬다.
@RequiredArgsConstructor
public class UserPrincipal implements UserDetails {
private final User user;
public User getUser() {
return user;
}
public Long getId() {
return user.getId();
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return List.of();
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getEmail();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
컨트롤러 & 파사드 & 서비스 & 에러코드는 다음 TIL에서!
'TIL' 카테고리의 다른 글
TIL - 2024/08/06 (0) | 2024.08.15 |
---|---|
TIL - 2024/08/05 (0) | 2024.08.12 |
TIL - 2024/08/01 (0) | 2024.08.10 |
TIL - 2024/07/31 (0) | 2024.08.05 |
TIL - 2024/07/30 (0) | 2024.08.05 |