Skip to content

Commit 7d5e6f9

Browse files
committed
feat: 봉사자 to 기관 쪽지 송신 기능 서비스레이어 구현
- 유스케이스 생성 - 송신 클래스및 메서드 생성 - 요청 Dto 구현및 toEntity 변환 메서드 구
1 parent faf6625 commit 7d5e6f9

File tree

4 files changed

+166
-0
lines changed

4 files changed

+166
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.somemore.note.dto;
2+
3+
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
4+
import com.fasterxml.jackson.databind.annotation.JsonNaming;
5+
import com.somemore.note.domain.Note;
6+
import io.swagger.v3.oas.annotations.media.Schema;
7+
import jakarta.validation.constraints.NotNull;
8+
9+
import java.util.UUID;
10+
11+
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
12+
public record SendNoteToCenterRequestDto(
13+
14+
@Schema(description = "쪽지 수신 기관 아이디", example = "123e4567-e89b-12d3-a456-426614174000")
15+
@NotNull(message = "수신 기관 아이디는 필수 값입니다.")
16+
UUID receiverId,
17+
18+
@Schema(description = "쪽지 제목", example = "이번주 참여할 봉사자인데 문의 드릴게 있습니다.")
19+
@NotNull(message = "쪽지 제목은 필수 값입니다.")
20+
String title,
21+
22+
@Schema(description = "쪽지 내용", example = "정확히 어떤 일을 도와드리는건가요?")
23+
@NotNull(message = "쪽지 내용은 필수 값입니다.")
24+
String content
25+
) {
26+
public Note toEntity(UUID senderId){
27+
return Note.create(senderId, receiverId, title, content);
28+
}
29+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.somemore.note.service;
2+
3+
import com.somemore.center.usecase.query.CenterQueryUseCase;
4+
import com.somemore.note.domain.Note;
5+
import com.somemore.note.dto.SendNoteToCenterRequestDto;
6+
import com.somemore.note.repository.NoteRepository;
7+
import com.somemore.note.usecase.SendNoteToCenterUseCase;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.stereotype.Service;
10+
import org.springframework.transaction.annotation.Transactional;
11+
12+
import java.util.UUID;
13+
14+
@RequiredArgsConstructor
15+
@Service
16+
@Transactional
17+
public class SendNoteToCenterService implements SendNoteToCenterUseCase {
18+
19+
private final NoteRepository noteRepository;
20+
private final CenterQueryUseCase centerQueryUseCase;
21+
22+
@Override
23+
public Long sendNoteToCenter(UUID senderId, SendNoteToCenterRequestDto requestDto) {
24+
25+
centerQueryUseCase.validateCenterExists(requestDto.receiverId());
26+
27+
Note note = requestDto.toEntity(senderId);
28+
noteRepository.save(note);
29+
return note.getId();
30+
}
31+
32+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.somemore.note.usecase;
2+
3+
import com.somemore.note.dto.SendNoteToCenterRequestDto;
4+
5+
import java.util.UUID;
6+
7+
public interface SendNoteToCenterUseCase {
8+
Long sendNoteToCenter(UUID senderId, SendNoteToCenterRequestDto requestDto);
9+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package com.somemore.note.service;
2+
3+
import com.somemore.IntegrationTestSupport;
4+
import com.somemore.center.domain.Center;
5+
import com.somemore.center.repository.CenterRepository;
6+
import com.somemore.global.exception.BadRequestException;
7+
import com.somemore.note.domain.Note;
8+
import com.somemore.note.dto.SendNoteToCenterRequestDto;
9+
import com.somemore.note.repository.NoteJpaRepository;
10+
import org.junit.jupiter.api.DisplayName;
11+
import org.junit.jupiter.api.Test;
12+
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.transaction.annotation.Transactional;
14+
15+
import java.util.UUID;
16+
17+
import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_CENTER;
18+
import static org.junit.jupiter.api.Assertions.*;
19+
20+
@Transactional
21+
class SendNoteToCenterServiceTest extends IntegrationTestSupport {
22+
23+
@Autowired
24+
private SendNoteToCenterService sendNoteToCenterService;
25+
26+
@Autowired
27+
private NoteJpaRepository noteJpaRepository;
28+
29+
@Autowired
30+
private CenterRepository centerRepository;
31+
32+
33+
@DisplayName("봉사자는 기관에게 쪽지를 보낼 수 있다.")
34+
@Test
35+
void sendNoteToCenter() {
36+
// given
37+
Center center = createCenter();
38+
UUID senderId = UUID.randomUUID(); // 봉사자 ID
39+
UUID receiverId = center.getId(); // 기관 ID
40+
String title = "안녕하세요, 봉사 신청 관련 문의드립니다.";
41+
String content = "안녕하세요, 이번 주말 봉사 일정에 대해 문의드립니다.";
42+
SendNoteToCenterRequestDto requestDto = new SendNoteToCenterRequestDto(receiverId, title, content);
43+
44+
// when
45+
Long noteId = sendNoteToCenterService.sendNoteToCenter(senderId, requestDto);
46+
47+
// then
48+
Note savedNote = noteJpaRepository.findById(noteId).orElseThrow(() ->
49+
new IllegalStateException("쪽지가 저장되지 않았습니다."));
50+
assertEquals(senderId, savedNote.getSenderId(), "발신자가 올바르지 않습니다.");
51+
assertEquals(receiverId, savedNote.getReceiverId(), "수신자가 올바르지 않습니다.");
52+
assertEquals(title, savedNote.getTitle(), "쪽지 제목이 올바르지 않습니다.");
53+
assertEquals(content, savedNote.getContent(), "쪽지 내용이 올바르지 않습니다.");
54+
assertFalse(savedNote.getIsRead(), "새로 생성된 쪽지는 읽음 상태가 기본적으로 false여야 합니다.");
55+
}
56+
57+
@DisplayName("기관 아이디가 올바르지 않으면 예외를 반환한다.")
58+
@Test
59+
void sendNoteToNonexistentCenter_ThrowsBadRequestException() {
60+
// given
61+
UUID senderId = UUID.randomUUID(); // 봉사자 ID
62+
UUID nonexistentReceiverId = UUID.randomUUID(); // 존재하지 않는 기관 ID
63+
String title = "안녕하세요, 봉사 신청 관련 문의드립니다.";
64+
String content = "안녕하세요, 이번 주말 봉사 일정에 대해 문의드립니다.";
65+
SendNoteToCenterRequestDto requestDto = new SendNoteToCenterRequestDto(nonexistentReceiverId, title, content);
66+
67+
assertFalse(centerRepository.existsById(nonexistentReceiverId), "");
68+
69+
// when & then
70+
BadRequestException exception = assertThrows(BadRequestException.class,
71+
() -> sendNoteToCenterService.sendNoteToCenter(senderId, requestDto));
72+
73+
// 예외 메시지 검증
74+
assertEquals(NOT_EXISTS_CENTER.getMessage(), exception.getMessage(), "예외 메시지가 올바르지 않습니다.");
75+
}
76+
77+
78+
79+
80+
private Center createCenter() {
81+
Center center = Center.create(
82+
"기본 기관 이름",
83+
"010-1234-5678",
84+
"http://example.com/image.jpg",
85+
"기관 소개 내용",
86+
"http://example.com",
87+
"account123",
88+
"password123"
89+
);
90+
91+
centerRepository.save(center);
92+
93+
return center;
94+
}
95+
96+
}

0 commit comments

Comments
 (0)