Skip to content

Commit a709adc

Browse files
committed
feat: 기관의 자신에게 온 쪽지 조회 쿼리 구현
- Note 레포지토리 인터페이스 생성 - 레포지토리 구현체 생성 - QueryDSL을 통한 조회 메서드 구현 - 테스트 코드 작성및 검증 완료
1 parent 2db63d5 commit a709adc

File tree

4 files changed

+143
-1
lines changed

4 files changed

+143
-1
lines changed
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package com.somemore.note.repository;
22

33
import com.somemore.note.domain.Note;
4+
import com.somemore.note.repository.mapper.NoteReceiverViewForCenter;
5+
import org.springframework.data.domain.Page;
6+
import org.springframework.data.domain.Pageable;
47

5-
public interface NoteRepository {
8+
import java.util.UUID;
69

10+
public interface NoteRepository {
711
Note save(Note note);
12+
Page<NoteReceiverViewForCenter> findNotesByReceiverIsCenter(UUID centerId, Pageable pageable);
813
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,66 @@
11
package com.somemore.note.repository;
22

3+
import com.querydsl.core.types.Projections;
4+
import com.querydsl.core.types.dsl.BooleanExpression;
5+
import com.querydsl.jpa.impl.JPAQuery;
6+
import com.querydsl.jpa.impl.JPAQueryFactory;
37
import com.somemore.note.domain.Note;
8+
import com.somemore.note.domain.QNote;
9+
import com.somemore.note.repository.mapper.NoteReceiverViewForCenter;
10+
import com.somemore.volunteer.domain.QVolunteer;
411
import lombok.RequiredArgsConstructor;
12+
import org.springframework.data.domain.Page;
13+
import org.springframework.data.domain.Pageable;
14+
import org.springframework.data.support.PageableExecutionUtils;
515
import org.springframework.stereotype.Repository;
616

17+
import java.util.List;
18+
import java.util.UUID;
19+
720
@RequiredArgsConstructor
821
@Repository
922
public class NoteRepositoryImpl implements NoteRepository {
1023

24+
private final JPAQueryFactory queryFactory;
1125
private final NoteJpaRepository noteJpaRepository;
1226

27+
private static final QNote note = QNote.note;
28+
private static final QVolunteer volunteer = QVolunteer.volunteer;
29+
1330
@Override
1431
public Note save(Note note) {
1532
return noteJpaRepository.save(note);
1633
}
1734

35+
@Override
36+
public Page<NoteReceiverViewForCenter> findNotesByReceiverIsCenter(UUID centerId, Pageable pageable) {
37+
38+
BooleanExpression activeVolunteer = volunteer.deleted.eq(false);
39+
BooleanExpression condition = note.receiverId.eq(centerId)
40+
.and(note.deleted.eq(false));
41+
42+
List<NoteReceiverViewForCenter> results = queryFactory
43+
.select(Projections.constructor(
44+
NoteReceiverViewForCenter.class,
45+
note.id,
46+
note.title,
47+
volunteer.nickname.as("senderName"),
48+
note.isRead
49+
))
50+
.from(note)
51+
.join(volunteer).on(note.senderId.eq(volunteer.id).and(activeVolunteer))
52+
.where(condition)
53+
.offset(pageable.getOffset())
54+
.limit(pageable.getPageSize())
55+
.orderBy(note.createdAt.desc())
56+
.fetch();
57+
58+
JPAQuery<Long> count = queryFactory
59+
.select(note.count())
60+
.from(note)
61+
.where(condition);
62+
63+
return PageableExecutionUtils.getPage(results, pageable, count::fetchOne);
64+
}
65+
1866
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.somemore.note.repository.mapper;
2+
3+
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
4+
import com.fasterxml.jackson.databind.annotation.JsonNaming;
5+
import io.swagger.v3.oas.annotations.media.Schema;
6+
import lombok.Builder;
7+
8+
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
9+
@Builder
10+
public record NoteReceiverViewForCenter(
11+
@Schema(description = "쪽지 ID", example = "1111")
12+
Long id,
13+
@Schema(description = "쪽지 제목", example = "문의 드립니다.")
14+
String title,
15+
@Schema(description = "송신 봉사자 닉네임", example = "봉사왕")
16+
String senderName,
17+
@Schema(description = "읽음 여부", example = "true = 읽음, false = 안읽음")
18+
boolean isRead
19+
) {
20+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.somemore.note.repository;
2+
3+
import com.somemore.IntegrationTestSupport;
4+
import com.somemore.note.domain.Note;
5+
import com.somemore.note.repository.mapper.NoteReceiverViewForCenter;
6+
import com.somemore.volunteer.domain.Volunteer;
7+
import com.somemore.volunteer.repository.VolunteerJpaRepository;
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.DisplayName;
10+
import org.junit.jupiter.api.Test;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.data.domain.Page;
13+
import org.springframework.data.domain.PageRequest;
14+
import org.springframework.data.domain.Pageable;
15+
import org.springframework.transaction.annotation.Transactional;
16+
17+
import java.util.UUID;
18+
19+
import static com.somemore.auth.oauth.OAuthProvider.NAVER;
20+
import static org.assertj.core.api.Assertions.assertThat;
21+
22+
@Transactional
23+
class NoteRepositoryImplTest extends IntegrationTestSupport {
24+
25+
@Autowired
26+
private NoteRepository noteRepository;
27+
28+
@Autowired
29+
private VolunteerJpaRepository volunteerJpaRepository;
30+
31+
private UUID centerId;
32+
33+
@BeforeEach
34+
void setUp() {
35+
centerId = UUID.randomUUID();
36+
createTestNotes(centerId);
37+
}
38+
39+
@DisplayName("기관은 자신에게 수신된 쪽지를 페이지로 확인할 수 있다. (Repository)")
40+
@Test
41+
void findNotesByReceiverIsCenter() {
42+
//given
43+
Pageable pageable = PageRequest.of(1, 6);
44+
45+
//when
46+
Page<NoteReceiverViewForCenter> result = noteRepository.findNotesByReceiverIsCenter(centerId, pageable);
47+
48+
//then
49+
assertThat(result).isNotNull();
50+
assertThat(result.getContent()).hasSize(6);
51+
assertThat(result.getTotalElements()).isEqualTo(15);
52+
assertThat(result.getContent().getFirst().title()).isEqualTo("Note 9");
53+
}
54+
55+
private void createTestNotes(UUID centerId) {
56+
for (int i = 1; i <= 15; i++) {
57+
Volunteer volunteer = createVolunteer();
58+
volunteerJpaRepository.save(volunteer);
59+
60+
Note note = Note.create(volunteer.getId(), centerId, "Note " + i, "내용");
61+
noteRepository.save(note);
62+
}
63+
}
64+
65+
private Volunteer createVolunteer() {
66+
Volunteer volunteer = Volunteer.createDefault(NAVER, UUID.randomUUID().toString());
67+
return volunteerJpaRepository.save(volunteer);
68+
}
69+
}

0 commit comments

Comments
 (0)