TIL

TIL - 2024/08/02

기석김 2024. 8. 10. 23:01

자 어제는 친구 쪽 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에서!