Skip to content

Commit 8023816

Browse files
committed
feat/KD-48-api: schedule 조회 로직 구현
1 parent 4a9f36e commit 8023816

File tree

6 files changed

+223
-0
lines changed

6 files changed

+223
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package kgu.developers.api.schedule.application;
2+
3+
import kgu.developers.domain.schedule.application.command.ScheduleService;
4+
import kgu.developers.domain.schedule.application.query.ScheduleQueryService;
5+
import kgu.developers.domain.schedule.domain.Schedule;
6+
import kgu.developers.domain.schedule.domain.SubmissionType;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.stereotype.Component;
9+
import org.springframework.transaction.annotation.Transactional;
10+
11+
import java.util.List;
12+
13+
@Component
14+
@RequiredArgsConstructor
15+
@Transactional(readOnly = true)
16+
public class ScheduleFacade {
17+
private final ScheduleQueryService scheduleQueryService;
18+
19+
public List<Schedule> findAll() {
20+
return scheduleQueryService.getAllScheduleManagements();
21+
}
22+
public Schedule findBySubmissionType(SubmissionType submissionType) {
23+
return scheduleQueryService.getBySubmissionType(submissionType);
24+
}
25+
26+
public Schedule findById(Long id) {
27+
return scheduleQueryService.getScheduleManagement(id);
28+
}
29+
30+
31+
32+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package kgu.developers.api.schedule.presentation;
2+
3+
import io.swagger.v3.oas.annotations.Operation;
4+
import io.swagger.v3.oas.annotations.media.Content;
5+
import io.swagger.v3.oas.annotations.media.Schema;
6+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
7+
import io.swagger.v3.oas.annotations.tags.Tag;
8+
import kgu.developers.api.schedule.presentation.response.ScheduleListResponse;
9+
import kgu.developers.api.schedule.presentation.response.ScheduleSummaryResponse;
10+
import kgu.developers.api.schedule.presentation.response.ScheduleTypeContentResponse;
11+
import kgu.developers.domain.schedule.domain.SubmissionType;
12+
import org.springframework.http.ResponseEntity;
13+
14+
@Tag(name = "Schedule", description = "일정관리 API")
15+
public interface ScheduleController {
16+
17+
@Operation(summary = "전체 일정 조회 API", description = """
18+
- Description : 이 API는 모든 일정을 조회합니다.
19+
- Assignee : 주윤빈
20+
""")
21+
@ApiResponse(
22+
responseCode = "200",
23+
content = @Content(schema = @Schema(implementation = ScheduleListResponse.class)))
24+
ResponseEntity<ScheduleListResponse> getScheduleList();
25+
26+
@Operation(summary = "유형별 일정 본문 조회 API", description = """
27+
- Description : 이 API는 제출유형별 본문만 조회합니다.
28+
- Assignee : 주윤빈
29+
""")
30+
@ApiResponse(
31+
responseCode = "200",
32+
content = @Content(schema = @Schema(implementation = ScheduleTypeContentResponse.class)))
33+
ResponseEntity<ScheduleTypeContentResponse> getSchedulesByType(SubmissionType type);
34+
35+
@Operation(summary = "단일 일정 조회 API", description = """
36+
- Description : 이 API는 단일 일정을 조회합니다.
37+
- Assignee : 주윤빈
38+
""")
39+
@ApiResponse(
40+
responseCode = "200",
41+
content = @Content(schema = @Schema(implementation = ScheduleSummaryResponse.class)))
42+
ResponseEntity<ScheduleSummaryResponse> getScheduleById(Long id);
43+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package kgu.developers.api.schedule.presentation;
2+
3+
import kgu.developers.api.schedule.application.ScheduleFacade;
4+
import kgu.developers.api.schedule.presentation.response.ScheduleListResponse;
5+
import kgu.developers.api.schedule.presentation.response.ScheduleSummaryResponse;
6+
import kgu.developers.api.schedule.presentation.response.ScheduleTypeContentResponse;
7+
import kgu.developers.domain.schedule.domain.SubmissionType;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.http.ResponseEntity;
10+
import org.springframework.web.bind.annotation.GetMapping;
11+
import org.springframework.web.bind.annotation.PathVariable;
12+
import org.springframework.web.bind.annotation.RequestMapping;
13+
import org.springframework.web.bind.annotation.RestController;
14+
15+
import java.time.LocalDateTime;
16+
17+
18+
@RestController
19+
@RequiredArgsConstructor
20+
@RequestMapping("/api/v1/schedules")
21+
public class ScheduleControllerImpl implements ScheduleController {
22+
private final ScheduleFacade scheduleFacade;
23+
24+
@Override
25+
@GetMapping
26+
public ResponseEntity<ScheduleListResponse> getScheduleList() {
27+
LocalDateTime referenceTime = LocalDateTime.now();
28+
return ResponseEntity.ok(ScheduleListResponse.from(scheduleFacade.findAll(),referenceTime));
29+
}
30+
31+
@Override
32+
@GetMapping("/type/{type}")
33+
public ResponseEntity<ScheduleTypeContentResponse> getSchedulesByType(@PathVariable SubmissionType type){
34+
return ResponseEntity.ok(ScheduleTypeContentResponse.from(scheduleFacade.findBySubmissionType(type)));
35+
}
36+
37+
@Override
38+
@GetMapping("/{id}")
39+
public ResponseEntity<ScheduleSummaryResponse> getScheduleById(@PathVariable Long id){
40+
LocalDateTime referenceTime = LocalDateTime.now();
41+
return ResponseEntity.ok(ScheduleSummaryResponse.from(scheduleFacade.findById(id), referenceTime ));
42+
}
43+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package kgu.developers.api.schedule.presentation.response;
2+
3+
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
4+
5+
import io.swagger.v3.oas.annotations.media.Schema;
6+
import kgu.developers.domain.schedule.domain.Schedule;
7+
import lombok.Builder;
8+
9+
import java.time.LocalDateTime;
10+
import java.util.List;
11+
12+
@Builder
13+
public record ScheduleListResponse(
14+
@Schema(description = "일정 리스트",
15+
example = """
16+
[{
17+
"id": 1,
18+
"submissionType": "MIDTHESIS",
19+
"title": "중간논문 제출 안내",
20+
"startDate": "2025-05-01",
21+
"endDate": "2025-12-31",
22+
"status": "IN_PROGRESS"
23+
}]
24+
""",
25+
requiredMode = REQUIRED)
26+
List<ScheduleSummaryResponse> contents
27+
) {
28+
public static ScheduleListResponse from(List<Schedule> schedules,LocalDateTime referenceTime) {
29+
return ScheduleListResponse.builder()
30+
.contents(schedules.stream()
31+
.map(schedule -> ScheduleSummaryResponse.from(schedule,referenceTime))
32+
.toList())
33+
.build();
34+
}
35+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package kgu.developers.api.schedule.presentation.response;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import kgu.developers.domain.schedule.domain.Schedule;
5+
import lombok.Builder;
6+
import org.springframework.format.annotation.DateTimeFormat;
7+
8+
import java.time.LocalDateTime;
9+
import java.time.format.DateTimeFormatter;
10+
11+
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
12+
13+
@Builder
14+
public record ScheduleSummaryResponse(
15+
@Schema(description = "일정 id", example = "1", requiredMode = REQUIRED)
16+
Long id,
17+
18+
@Schema(description = "제출 유형", example = "MIDTHESIS", requiredMode = REQUIRED)
19+
String submissionType,
20+
21+
@Schema(description = "일정 제목", example = "중간논문 제출 안내", requiredMode = REQUIRED)
22+
String title,
23+
24+
@Schema(description = "시작일", example = "2025-05-01", requiredMode = REQUIRED)
25+
@DateTimeFormat(pattern = "yyyy-MM-dd")
26+
String startDate,
27+
28+
@Schema(description = "종료일", example = "2025-12-31", requiredMode = REQUIRED)
29+
@DateTimeFormat(pattern = "yyyy-MM-dd")
30+
String endDate,
31+
32+
@Schema(description = "상태(대기/진행/마감)", example = "IN_PROGRESS", requiredMode = REQUIRED)
33+
String status
34+
) {
35+
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
36+
37+
public static ScheduleSummaryResponse from(Schedule schedule, LocalDateTime referenceTime) {
38+
return ScheduleSummaryResponse.builder()
39+
.id(schedule.getId())
40+
.submissionType(schedule.getSubmissionType().name())
41+
.title(schedule.getTitle())
42+
.startDate(schedule.getStartDate().format(DATE_FORMATTER))
43+
.endDate(schedule.getEndDate().format(DATE_FORMATTER))
44+
.status(schedule.determineStatusAt(referenceTime).name())
45+
.build();
46+
}
47+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package kgu.developers.api.schedule.presentation.response;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import kgu.developers.domain.schedule.domain.Schedule;
5+
import lombok.Builder;
6+
7+
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
8+
9+
@Builder
10+
public record ScheduleTypeContentResponse(
11+
@Schema(description = "제출 유형", example = "MIDTHESIS", requiredMode = REQUIRED)
12+
String submissionType,
13+
14+
@Schema(description = "일정 본문 내용", example = "매학기 개강 후 2주 이내에 신청서를 작성하여 접수해야 합니다.",requiredMode = REQUIRED)
15+
String content
16+
) {
17+
public static ScheduleTypeContentResponse from(Schedule schedule) {
18+
return ScheduleTypeContentResponse.builder()
19+
.submissionType(schedule.getSubmissionType().name())
20+
.content(schedule.getContent())
21+
.build();
22+
}
23+
}

0 commit comments

Comments
 (0)