Skip to content

Commit fa61cac

Browse files
authored
refactor: 쪽지 리팩토링 (#366)
* refactor(note): 쪽지 커맨드 기능 리팩토링 * test(note): 쪽지 커맨드 기능 리팩토링 테스트 * refactor(note): 쪽지 조회기능 리팩토링 * test(note): 쪽지 조회기능 리팩토링 테스트 * refactor(note): 쪽지 페이징 조회 카운트 쿼리 조건 추가
1 parent 422b29c commit fa61cac

18 files changed

+352
-264
lines changed

src/main/java/com/somemore/domains/note/controller/NoteCommandApiController.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,19 @@
44
import com.somemore.domains.note.dto.SendNoteToVolunteerRequestDto;
55
import com.somemore.domains.note.usecase.SendNoteToCenterUseCase;
66
import com.somemore.domains.note.usecase.SendNoteToVolunteerUseCase;
7-
import com.somemore.global.auth.annotation.CurrentUser;
7+
import com.somemore.global.auth.annotation.RoleId;
88
import com.somemore.global.common.response.ApiResponse;
99
import io.swagger.v3.oas.annotations.Operation;
1010
import io.swagger.v3.oas.annotations.tags.Tag;
1111
import jakarta.validation.Valid;
12+
import java.util.UUID;
1213
import lombok.RequiredArgsConstructor;
1314
import org.springframework.security.access.annotation.Secured;
1415
import org.springframework.web.bind.annotation.PostMapping;
1516
import org.springframework.web.bind.annotation.RequestBody;
1617
import org.springframework.web.bind.annotation.RequestMapping;
1718
import org.springframework.web.bind.annotation.RestController;
1819

19-
import java.util.UUID;
20-
2120
@Tag(name = "Note Command API", description = "쪽지 송신 삭제 API")
2221
@RequiredArgsConstructor
2322
@RequestMapping("/api/note")
@@ -30,7 +29,10 @@ public class NoteCommandApiController {
3029
@Secured("ROLE_VOLUNTEER")
3130
@Operation(summary = "봉사자 to 기관 쪽지 송신")
3231
@PostMapping("/volunteer-to-center")
33-
public ApiResponse<Long> sendNoteToCenter(@CurrentUser UUID volunteerId, @Valid @RequestBody SendNoteToCenterRequestDto requestDto) {
32+
public ApiResponse<Long> sendNoteToCenter(
33+
@RoleId UUID volunteerId,
34+
@Valid @RequestBody SendNoteToCenterRequestDto requestDto
35+
) {
3436

3537
Long noteId = sendNoteToCenterUseCase.sendNoteToCenter(volunteerId, requestDto);
3638

@@ -40,7 +42,10 @@ public ApiResponse<Long> sendNoteToCenter(@CurrentUser UUID volunteerId, @Valid
4042
@Secured("ROLE_CENTER")
4143
@Operation(summary = "기관 to 봉사자 쪽지 송신")
4244
@PostMapping("/center-to-volunteer")
43-
public ApiResponse<Long> sendNoteToCenter(@CurrentUser UUID centerId, @Valid @RequestBody SendNoteToVolunteerRequestDto requestDto) {
45+
public ApiResponse<Long> sendNoteToCenter(
46+
@RoleId UUID centerId,
47+
@Valid @RequestBody SendNoteToVolunteerRequestDto requestDto
48+
) {
4449

4550
Long noteId = sendNoteToVolunteerUseCase.sendNoteToVolunteer(centerId, requestDto);
4651

src/main/java/com/somemore/domains/note/controller/NoteQueryApiController.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
import com.somemore.domains.note.repository.mapper.NoteReceiverViewForCenter;
66
import com.somemore.domains.note.repository.mapper.NoteReceiverViewForVolunteer;
77
import com.somemore.domains.note.usecase.NoteQueryUseCase;
8-
import com.somemore.global.auth.annotation.CurrentUser;
8+
import com.somemore.global.auth.annotation.RoleId;
99
import com.somemore.global.common.response.ApiResponse;
1010
import io.swagger.v3.oas.annotations.Operation;
1111
import io.swagger.v3.oas.annotations.tags.Tag;
12+
import java.util.UUID;
1213
import lombok.RequiredArgsConstructor;
1314
import org.springframework.data.domain.Page;
1415
import org.springframework.data.domain.Pageable;
@@ -18,8 +19,6 @@
1819
import org.springframework.web.bind.annotation.RequestMapping;
1920
import org.springframework.web.bind.annotation.RestController;
2021

21-
import java.util.UUID;
22-
2322
@Tag(name = "Note Query API", description = "쪽지 조회 API")
2423
@RequiredArgsConstructor
2524
@RequestMapping("/api/note")
@@ -31,19 +30,26 @@ public class NoteQueryApiController {
3130
@Secured("ROLE_CENTER")
3231
@Operation(summary = "기관의 자신에게 온 쪽지 조회")
3332
@GetMapping("/center")
34-
public ApiResponse<Page<NoteReceiverViewForCenter>> getNotesByCenterId(@CurrentUser UUID centerId, Pageable pageable) {
33+
public ApiResponse<Page<NoteReceiverViewForCenter>> getNotesByCenterId(
34+
@RoleId UUID centerId,
35+
Pageable pageable) {
3536

36-
Page<NoteReceiverViewForCenter> response = noteQueryUseCase.getNotesForCenter(centerId, pageable);
37+
Page<NoteReceiverViewForCenter> response = noteQueryUseCase.getNotesForCenter(centerId,
38+
pageable);
3739

3840
return ApiResponse.ok(200, response, "내 쪽지 조회 성공");
3941
}
4042

4143
@Secured("ROLE_VOLUNTEER")
4244
@Operation(summary = "봉사자의 자신에게 온 쪽지 조회")
4345
@GetMapping("/volunteer")
44-
public ApiResponse<Page<NoteReceiverViewForVolunteer>> getNotesByVolunteerId(@CurrentUser UUID volunteerId, Pageable pageable) {
46+
public ApiResponse<Page<NoteReceiverViewForVolunteer>> getNotesByVolunteerId(
47+
@RoleId UUID volunteerId,
48+
Pageable pageable
49+
) {
4550

46-
Page<NoteReceiverViewForVolunteer> response = noteQueryUseCase.getNotesForVolunteer(volunteerId, pageable);
51+
Page<NoteReceiverViewForVolunteer> response = noteQueryUseCase.getNotesForVolunteer(
52+
volunteerId, pageable);
4753

4854
return ApiResponse.ok(200, response, "내 쪽지 조회 성공");
4955
}
@@ -61,7 +67,8 @@ public ApiResponse<NoteDetailViewForCenter> getNoteDetailForCenter(@PathVariable
6167
@Secured("ROLE_VOLUNTEER")
6268
@Operation(summary = "봉사자의 자신에게 온 쪽지 상세 조회")
6369
@GetMapping("/volunteer/{noteId}")
64-
public ApiResponse<NoteDetailViewForVolunteer> getNoteDetailForVolunteer(@PathVariable Long noteId) {
70+
public ApiResponse<NoteDetailViewForVolunteer> getNoteDetailForVolunteer(
71+
@PathVariable Long noteId) {
6572

6673
NoteDetailViewForVolunteer response = noteQueryUseCase.getNoteDetailForVolunteer(noteId);
6774

src/main/java/com/somemore/domains/note/repository/NoteRepositoryImpl.java

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,24 @@
44
import com.querydsl.core.types.dsl.BooleanExpression;
55
import com.querydsl.jpa.impl.JPAQuery;
66
import com.querydsl.jpa.impl.JPAQueryFactory;
7-
import com.somemore.domains.center.domain.QCenter;
7+
import com.somemore.center.domain.QNEWCenter;
88
import com.somemore.domains.note.domain.Note;
99
import com.somemore.domains.note.domain.QNote;
1010
import com.somemore.domains.note.repository.mapper.NoteDetailViewForCenter;
1111
import com.somemore.domains.note.repository.mapper.NoteDetailViewForVolunteer;
1212
import com.somemore.domains.note.repository.mapper.NoteReceiverViewForCenter;
1313
import com.somemore.domains.note.repository.mapper.NoteReceiverViewForVolunteer;
14-
import com.somemore.domains.volunteer.domain.QVolunteer;
14+
import com.somemore.user.domain.QUserCommonAttribute;
15+
import com.somemore.volunteer.domain.QNEWVolunteer;
16+
import java.util.List;
17+
import java.util.Optional;
18+
import java.util.UUID;
1519
import lombok.RequiredArgsConstructor;
1620
import org.springframework.data.domain.Page;
1721
import org.springframework.data.domain.Pageable;
1822
import org.springframework.data.support.PageableExecutionUtils;
1923
import org.springframework.stereotype.Repository;
2024

21-
import java.util.List;
22-
import java.util.Optional;
23-
import java.util.UUID;
24-
2525
@RequiredArgsConstructor
2626
@Repository
2727
public class NoteRepositoryImpl implements NoteRepository {
@@ -30,8 +30,9 @@ public class NoteRepositoryImpl implements NoteRepository {
3030
private final NoteJpaRepository noteJpaRepository;
3131

3232
private static final QNote note = QNote.note;
33-
private static final QVolunteer volunteer = QVolunteer.volunteer;
34-
private static final QCenter center = QCenter.center;
33+
private static final QNEWVolunteer volunteer = QNEWVolunteer.nEWVolunteer;
34+
private static final QNEWCenter center = QNEWCenter.nEWCenter;
35+
private static final QUserCommonAttribute userCommonAttribute = QUserCommonAttribute.userCommonAttribute;
3536

3637
private static final String SENDER_ID = "senderId";
3738
private static final String SENDER_NAME = "senderName";
@@ -48,7 +49,8 @@ public Optional<Note> findById(Long noteId) {
4849
}
4950

5051
@Override
51-
public Page<NoteReceiverViewForCenter> findNotesByReceiverIsCenter(UUID centerId, Pageable pageable) {
52+
public Page<NoteReceiverViewForCenter> findNotesByReceiverIsCenter(UUID centerId,
53+
Pageable pageable) {
5254

5355
BooleanExpression activeVolunteer = isActiveVolunteer();
5456
BooleanExpression condition = isReceiver(centerId);
@@ -73,13 +75,15 @@ public Page<NoteReceiverViewForCenter> findNotesByReceiverIsCenter(UUID centerId
7375
JPAQuery<Long> count = queryFactory
7476
.select(note.count())
7577
.from(note)
78+
.join(volunteer).on(note.senderId.eq(volunteer.id).and(activeVolunteer))
7679
.where(condition);
7780

7881
return PageableExecutionUtils.getPage(results, pageable, count::fetchOne);
7982
}
8083

8184
@Override
82-
public Page<NoteReceiverViewForVolunteer> findNotesByReceiverIsVolunteer(UUID volunteerId, Pageable pageable) {
85+
public Page<NoteReceiverViewForVolunteer> findNotesByReceiverIsVolunteer(UUID volunteerId,
86+
Pageable pageable) {
8387
BooleanExpression activeCenter = isActiveCenter();
8488
BooleanExpression condition = isReceiver(volunteerId);
8589

@@ -89,11 +93,12 @@ public Page<NoteReceiverViewForVolunteer> findNotesByReceiverIsVolunteer(UUID vo
8993
note.id,
9094
note.title,
9195
center.id.as(SENDER_ID),
92-
center.name.as(SENDER_NAME),
96+
userCommonAttribute.name.as(SENDER_NAME),
9397
note.isRead
9498
))
9599
.from(note)
96100
.join(center).on(note.senderId.eq(center.id).and(activeCenter))
101+
.join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId))
97102
.where(condition)
98103
.offset(pageable.getOffset())
99104
.limit(pageable.getPageSize())
@@ -103,6 +108,8 @@ public Page<NoteReceiverViewForVolunteer> findNotesByReceiverIsVolunteer(UUID vo
103108
JPAQuery<Long> count = queryFactory
104109
.select(note.count())
105110
.from(note)
111+
.join(center).on(note.senderId.eq(center.id).and(activeCenter))
112+
.join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId))
106113
.where(condition);
107114

108115
return PageableExecutionUtils.getPage(results, pageable, count::fetchOne);
@@ -121,11 +128,12 @@ public Optional<NoteDetailViewForCenter> findNoteDetailViewReceiverIsCenter(Long
121128
note.content,
122129
volunteer.id.as(SENDER_ID),
123130
volunteer.nickname.as(SENDER_NAME),
124-
volunteer.imgUrl.as(SENDER_PROFILE_IMG_LINK),
131+
userCommonAttribute.imgUrl.as(SENDER_PROFILE_IMG_LINK),
125132
note.createdAt
126133
))
127134
.from(note)
128135
.join(volunteer).on(note.senderId.eq(volunteer.id).and(activeVolunteer))
136+
.join(userCommonAttribute).on(volunteer.userId.eq(userCommonAttribute.userId))
129137
.where(note.id.eq(noteId).and(note.deleted.eq(false)))
130138
.fetchOne();
131139

@@ -144,12 +152,13 @@ public Optional<NoteDetailViewForVolunteer> findNoteDetailViewReceiverIsVoluntee
144152
note.title,
145153
note.content,
146154
center.id.as(SENDER_ID),
147-
center.name.as(SENDER_NAME),
148-
center.imgUrl.as(SENDER_PROFILE_IMG_LINK),
155+
userCommonAttribute.name.as(SENDER_NAME),
156+
userCommonAttribute.imgUrl.as(SENDER_PROFILE_IMG_LINK),
149157
note.createdAt
150158
))
151159
.from(note)
152160
.join(center).on(note.senderId.eq(center.id).and(activeCenter))
161+
.join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId))
153162
.where(note.id.eq(noteId).and(note.deleted.eq(false)))
154163
.fetchOne();
155164

src/main/java/com/somemore/domains/note/service/NoteMarkAsReadService.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.somemore.domains.note.service;
22

3+
import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_NOTE;
4+
35
import com.somemore.domains.note.domain.Note;
46
import com.somemore.domains.note.repository.NoteRepository;
57
import com.somemore.domains.note.usecase.NoteMarkAsReadUseCase;
@@ -8,8 +10,6 @@
810
import org.springframework.stereotype.Service;
911
import org.springframework.transaction.annotation.Transactional;
1012

11-
import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_NOTE;
12-
1313
@RequiredArgsConstructor
1414
@Service
1515
@Transactional
@@ -21,7 +21,6 @@ public class NoteMarkAsReadService implements NoteMarkAsReadUseCase {
2121
public void noteMarkAsRead(Long noteId) {
2222
Note note = getNote(noteId);
2323
note.markAsRead();
24-
noteRepository.save(note);
2524
}
2625

2726
private Note getNote(Long noteId) {

src/main/java/com/somemore/domains/note/service/SendNoteToCenterService.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
11
package com.somemore.domains.note.service;
22

3-
import com.somemore.domains.center.usecase.query.CenterQueryUseCase;
3+
import com.somemore.center.usecase.NEWCenterQueryUseCase;
44
import com.somemore.domains.note.domain.Note;
55
import com.somemore.domains.note.dto.SendNoteToCenterRequestDto;
66
import com.somemore.domains.note.repository.NoteRepository;
77
import com.somemore.domains.note.usecase.SendNoteToCenterUseCase;
8+
import java.util.UUID;
89
import lombok.RequiredArgsConstructor;
910
import org.springframework.stereotype.Service;
1011
import org.springframework.transaction.annotation.Transactional;
1112

12-
import java.util.UUID;
13-
1413
@RequiredArgsConstructor
1514
@Service
1615
@Transactional
1716
public class SendNoteToCenterService implements SendNoteToCenterUseCase {
1817

19-
private final CenterQueryUseCase centerQueryUseCase;
18+
private final NEWCenterQueryUseCase centerQueryUseCase;
2019
private final NoteRepository noteRepository;
2120

2221
@Override

src/main/java/com/somemore/domains/note/service/SendNoteToVolunteerService.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,24 @@
44
import com.somemore.domains.note.dto.SendNoteToVolunteerRequestDto;
55
import com.somemore.domains.note.repository.NoteRepository;
66
import com.somemore.domains.note.usecase.SendNoteToVolunteerUseCase;
7-
import com.somemore.domains.volunteer.usecase.VolunteerQueryUseCase;
7+
import com.somemore.volunteer.usecase.NEWVolunteerQueryUseCase;
8+
import java.util.UUID;
89
import lombok.RequiredArgsConstructor;
910
import org.springframework.stereotype.Service;
1011
import org.springframework.transaction.annotation.Transactional;
1112

12-
import java.util.UUID;
13-
1413

1514
@RequiredArgsConstructor
1615
@Service
1716
@Transactional
1817
public class SendNoteToVolunteerService implements SendNoteToVolunteerUseCase {
1918

20-
private final VolunteerQueryUseCase volunteerQueryUseCase;
19+
private final NEWVolunteerQueryUseCase volunteerQueryUseCase;
2120
private final NoteRepository noteRepository;
2221

2322
@Override
2423
public Long sendNoteToVolunteer(UUID senderId, SendNoteToVolunteerRequestDto requestDto) {
25-
volunteerQueryUseCase.validateVolunteerExists(senderId);
24+
volunteerQueryUseCase.validateExistsById(requestDto.receiverId());
2625

2726
Note note = requestDto.toEntity(senderId);
2827
noteRepository.save(note);

src/main/java/com/somemore/volunteer/repository/NEWVolunteerRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,9 @@ public interface NEWVolunteerRepository {
2121

2222
List<VolunteerNicknameAndId> findVolunteerNicknameAndIdsByIds(List<UUID> ids);
2323

24+
boolean existsById(UUID id);
25+
26+
default boolean doesNotExistById(UUID id) {
27+
return !existsById(id);
28+
}
2429
}

src/main/java/com/somemore/volunteer/repository/NEWVolunteerRepositoryImpl.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@
77
import com.somemore.volunteer.domain.QNEWVolunteer;
88
import com.somemore.volunteer.repository.record.VolunteerNickname;
99
import com.somemore.volunteer.repository.record.VolunteerNicknameAndId;
10-
import lombok.RequiredArgsConstructor;
11-
import org.springframework.stereotype.Repository;
12-
1310
import java.util.List;
1411
import java.util.Optional;
1512
import java.util.UUID;
13+
import lombok.RequiredArgsConstructor;
14+
import org.springframework.stereotype.Repository;
1615

1716
@Repository("newVolunteerRepository")
1817
@RequiredArgsConstructor
@@ -33,7 +32,7 @@ public Optional<NEWVolunteer> findById(UUID id) {
3332
return Optional.ofNullable(
3433
queryFactory.selectFrom(volunteer)
3534
.where(
36-
volunteer.id.eq(id),
35+
idEq(id),
3736
isNotDeleted()
3837
)
3938
.fetchOne()
@@ -58,7 +57,7 @@ public Optional<String> findNicknameById(UUID id) {
5857
queryFactory.select(volunteer.nickname)
5958
.from(volunteer)
6059
.where(
61-
volunteer.id.eq(id),
60+
idEq(id),
6261
isNotDeleted()
6362
)
6463
.fetchOne()
@@ -95,6 +94,21 @@ public List<VolunteerNicknameAndId> findVolunteerNicknameAndIdsByIds(List<UUID>
9594
.fetch();
9695
}
9796

97+
public boolean existsById(UUID id) {
98+
return queryFactory
99+
.selectOne()
100+
.from(volunteer)
101+
.where(
102+
idEq(id),
103+
isNotDeleted()
104+
)
105+
.fetchFirst() != null;
106+
}
107+
108+
private static BooleanExpression idEq(UUID id) {
109+
return volunteer.id.eq(id);
110+
}
111+
98112
private static BooleanExpression isNotDeleted() {
99113
return volunteer.deleted.eq(false);
100114
}

0 commit comments

Comments
 (0)