Igloo-Club / Igloo-Club-BE

1 stars 1 forks source link

[fix] 인연 프로필이 최소 1개 유지되도록 수정 #65

Closed clap-0 closed 7 months ago

clap-0 commented 7 months ago

🔥 Related Issues

💜 작업 내용

✅ PR Point

상태에 따라 눈길 조회 로직을 분리하였습니다.

@GetMapping("/nungils")
public ResponseEntity<Slice<NungilSliceResponse>> getNungilsByMemberAndStatus(Principal principal, @RequestParam NungilStatus status, @RequestParam int page, @RequestParam int size){
    Member member = getMember(principal);

    Slice<NungilSliceResponse> nungilPageResponses = null;
    if (NungilStatus.RECOMMENDED.equals(status)) {
        nungilPageResponses = nungilService.getRecommendedNungilSlice(member, page, size);
    } else {
        nungilPageResponses = nungilService.getNungilSliceByMemberAndStatus(member, status, page, size);
    }

    return ResponseEntity.ok(nungilPageResponses);
}

기존 눈길 조회 메서드에서는, 상태가 RECOMMENDED가 아닌 눈길들만을 담당합니다. Location을 사용하지 않기 때문에 null인지 확인하는 코드를 제외시켰습니다.

public Slice<NungilSliceResponse> getNungilSliceByMemberAndStatus(Member member, NungilStatus status, int page, int size) {
    PageRequest pageRequest = PageRequest.of(page, size,Sort.by("createdAt").descending());

    // Nungil 엔티티를 데이터베이스에서 조회
    Slice<Nungil> nungilSlice = nungilRepository.findAllByMemberAndStatus(pageRequest, member, status);

    // Nungil 엔티티를 NungilPageResponse DTO로 변환
    List<NungilSliceResponse> nungilResponses = nungilSlice.getContent().stream()
            .map(nungil -> NungilSliceResponse.create(nungil, nungil.getReceiver()))
            .collect(Collectors.toList());

    // 변환된 DTO 리스트와 함께 새로운 Slice 객체를 생성하여 반환
    return new SliceImpl<>(nungilResponses, pageRequest, nungilSlice.hasNext());
}

추천된 눈길 조회 시, 사용자의 drawCount가 0이라면 새로운 프로필을 자동으로 뽑습니다. 이후에는 기존 눈길 조회와 동일합니다.

@Transactional
public Slice<NungilSliceResponse> getRecommendedNungilSlice(Member member, int page, int size) {
    PageRequest pageRequest = PageRequest.of(page, size,Sort.by("createdAt").descending());

    // 사용자가 아직까지 프로필을 뽑지 않았다면, 자동으로 하나 뽑는다.
    if (member.getDrawCount() == 0) {
        this.recommendMember(member, new ProfileRecommendRequest(true));
    }

    // Nungil 엔티티를 데이터베이스에서 조회
    Slice<Nungil> nungilSlice = nungilRepository.findAllByMemberAndStatus(pageRequest, member, NungilStatus.RECOMMENDED);

    if (member.getLocation() == null || nungilSlice.getContent().stream()
            .anyMatch(nungil -> nungil.getReceiver().getLocation() == null)) {
        throw new GeneralException(MemberErrorResult.LOCATION_NOT_FOUND);
    }

    // Nungil 엔티티를 NungilPageResponse DTO로 변환
    List<NungilSliceResponse> nungilResponses = nungilSlice.getContent().stream()
            .filter(nungil -> member.getLocation().equals(nungil.getReceiver().getLocation()))
            .map(nungil -> NungilSliceResponse.create(nungil, nungil.getReceiver()))
            .collect(Collectors.toList());

    // 변환된 DTO 리스트와 함께 새로운 Slice 객체를 생성하여 반환
    return new SliceImpl<>(nungilResponses, pageRequest, nungilSlice.hasNext());
}