Skip to content

Commit 0539a42

Browse files
committed
feat(recruit-board): recruitBoard 서비스 인터페이스, Dto, 구현체 작성
1 parent 9f38ffc commit 0539a42

File tree

6 files changed

+183
-0
lines changed

6 files changed

+183
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.somemore.recruitboard.dto.command;
2+
3+
import com.somemore.recruitboard.domain.RecruitBoard;
4+
import com.somemore.recruitboard.domain.VolunteerType;
5+
import java.time.LocalDateTime;
6+
import lombok.Builder;
7+
8+
@Builder
9+
public record RecruitBoardCreateCommandRequestDto(
10+
Long centerId,
11+
Long locationId,
12+
String imgUrl,
13+
String title,
14+
String content,
15+
LocalDateTime volunteerDate,
16+
VolunteerType volunteerType,
17+
Integer volunteerHours,
18+
Boolean admitted
19+
) {
20+
21+
public RecruitBoard toEntity() {
22+
return RecruitBoard.builder()
23+
.locationId(locationId)
24+
.centerId(centerId)
25+
.title(title)
26+
.content(content)
27+
.imgUrl(imgUrl)
28+
.volunteerDate(volunteerDate)
29+
.volunteerType(volunteerType)
30+
.admitted(admitted)
31+
.build();
32+
}
33+
34+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.somemore.recruitboard.dto.request;
2+
3+
import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy;
4+
import com.fasterxml.jackson.databind.annotation.JsonNaming;
5+
import com.somemore.location.dto.request.LocationCreateRequestDto;
6+
import com.somemore.recruitboard.domain.RecruitBoard;
7+
import com.somemore.recruitboard.domain.VolunteerType;
8+
import com.somemore.recruitboard.dto.command.RecruitBoardCreateCommandRequestDto;
9+
import io.swagger.v3.oas.annotations.media.Schema;
10+
import jakarta.validation.constraints.NotBlank;
11+
import jakarta.validation.constraints.NotNull;
12+
import jakarta.validation.constraints.Positive;
13+
import java.time.LocalDateTime;
14+
import lombok.Builder;
15+
16+
@JsonNaming(SnakeCaseStrategy.class)
17+
@Builder
18+
public record RecruitCreateRequestDto(
19+
@Schema(description = "봉사 모집글 제목", example = "서울 청계천 환경 미화 봉사 모집")
20+
@NotBlank(message = "모집글 제목은 필수 값입니다.")
21+
String title,
22+
@Schema(description = "봉사 모집글 내용", example = "서울 청계천 주변 환경 미화 봉사 모집합니다. <br>")
23+
@NotBlank(message = "모집글 내용은 필수 값입니다.")
24+
String content,
25+
@Schema(description = "봉사 일시", example = "2024-11-20T10:00:00")
26+
@NotNull(message = "봉사 일시는 필수 값입니다.")
27+
LocalDateTime volunteerDate,
28+
@Schema(description = "봉사 활동 유형", example = "ENVIRONMENTAL_PROTECTION")
29+
@NotNull(message = "봉사 활동 유형은 필수 값입니다.")
30+
VolunteerType volunteerType,
31+
@Schema(description = "봉사 시간", example = "4")
32+
@Positive(message = "봉사 시간은 1이상 이어야 합니다.")
33+
Integer volunteerHours,
34+
@Schema(description = "봉사 시간 인정 여부", example = "true")
35+
@NotNull(message = "시간 인정 여부는 필수 값입니다.")
36+
Boolean admitted,
37+
@NotNull(message = "위치 정보는 필수 값입니다.")
38+
LocationCreateRequestDto location
39+
) {
40+
41+
public RecruitBoard toEntity(Long locationId, Long centerId, String imgUrl) {
42+
return RecruitBoard.builder()
43+
.locationId(locationId)
44+
.centerId(centerId)
45+
.title(title)
46+
.content(content)
47+
.imgUrl(imgUrl)
48+
.volunteerDate(volunteerDate)
49+
.volunteerType(volunteerType)
50+
.admitted(admitted)
51+
.build();
52+
}
53+
54+
public RecruitBoardCreateCommandRequestDto toCommandRequest(
55+
Long centerId,
56+
Long locationId,
57+
String imgUrl
58+
) {
59+
return RecruitBoardCreateCommandRequestDto.builder()
60+
.centerId(centerId)
61+
.locationId(locationId)
62+
.imgUrl(imgUrl)
63+
.title(title)
64+
.content(content)
65+
.volunteerDate(volunteerDate)
66+
.volunteerType(volunteerType)
67+
.volunteerHours(volunteerHours)
68+
.admitted(admitted)
69+
.build();
70+
71+
}
72+
73+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.somemore.recruitboard.service;
2+
3+
import com.somemore.recruitboard.dto.command.RecruitBoardCreateCommandRequestDto;
4+
5+
public interface RecruitBoardCommandService {
6+
7+
public Long create(RecruitBoardCreateCommandRequestDto dto);
8+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.somemore.recruitboard.service;
2+
3+
import com.somemore.recruitboard.domain.RecruitBoard;
4+
import com.somemore.recruitboard.repository.RecruitBoardRepository;
5+
import com.somemore.recruitboard.dto.command.RecruitBoardCreateCommandRequestDto;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.stereotype.Service;
8+
import org.springframework.transaction.annotation.Transactional;
9+
10+
@RequiredArgsConstructor
11+
@Transactional
12+
@Service
13+
public class RecruitBoardCommander implements RecruitBoardCommandService {
14+
15+
private final RecruitBoardRepository recruitBoardRepository;
16+
17+
@Override
18+
public Long create(RecruitBoardCreateCommandRequestDto dto) {
19+
RecruitBoard recruitBoard = dto.toEntity();
20+
recruitBoardRepository.save(recruitBoard);
21+
22+
return recruitBoard.getId();
23+
}
24+
25+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.somemore.recruitboard.service;
2+
3+
import com.somemore.location.service.LocationCommandService;
4+
import com.somemore.recruitboard.dto.request.RecruitCreateRequestDto;
5+
import java.util.Optional;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.stereotype.Service;
8+
import org.springframework.transaction.annotation.Transactional;
9+
10+
@RequiredArgsConstructor
11+
@Transactional
12+
@Service
13+
public class RecruitBoardUseCase implements RecruitBoardUseCaseService {
14+
15+
private final RecruitBoardCommandService recruitBoardCommandService;
16+
private final LocationCommandService locationCommandService;
17+
18+
@Override
19+
public Long createRecruitBoard(
20+
RecruitCreateRequestDto requestDto,
21+
Long centerId,
22+
Optional<String> imgUrl) {
23+
24+
Long locationId = locationCommandService.createLocation(requestDto.location());
25+
26+
return recruitBoardCommandService.create(
27+
requestDto.toCommandRequest(centerId, locationId, imgUrl.orElse("")));
28+
29+
}
30+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.somemore.recruitboard.service;
2+
3+
import com.somemore.recruitboard.dto.request.RecruitCreateRequestDto;
4+
import java.util.Optional;
5+
6+
public interface RecruitBoardUseCaseService {
7+
8+
public Long createRecruitBoard(
9+
RecruitCreateRequestDto requestDto,
10+
Long centerId,
11+
Optional<String> imgUrl);
12+
13+
}

0 commit comments

Comments
 (0)