Skip to content

Commit 0bbed94

Browse files
authored
Merge pull request #67 from 5-mo/feat/#65-patch-schedule
[FEAT] AI로 일정 추가하기 API
2 parents 4921add + f74e8c2 commit 0bbed94

6 files changed

Lines changed: 95 additions & 5 deletions

File tree

src/main/java/com/example/ohmobackend/apiPayload/code/status/ErrorStatus.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public enum ErrorStatus implements BaseErrorCode {
4040
SCHEDULE_NOT_TO_DO_TYPE(HttpStatus.BAD_REQUEST, "SCHEDULE4004", "일정이 투두가 아닙니다."),
4141
SCHEDULE_INVALID_ALARM_TIME(HttpStatus.BAD_REQUEST, "SCHEDULE4005", "알람 시간 등록이 불가능한 일정입니다."),
4242
SCHEDULE_NOT_GROUP_TYPE(HttpStatus.BAD_REQUEST, "SCHEDULE4006", "그룹 일정이 아닙니다."),
43+
NLP_PARSE_FAILED(HttpStatus.BAD_REQUEST, "SCHEDULE4007", "텍스트 파싱 실패"),
4344

4445
// 질문 관련
4546
QUESTION_NOT_FOUND(HttpStatus.BAD_REQUEST, "QUESTION4001", "등록된 질문이 없습니다."),

src/main/java/com/example/ohmobackend/converter/ScheduleConverter.java

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010

1111
import java.time.DayOfWeek;
1212
import java.time.LocalDate;
13+
import java.time.LocalTime;
1314
import java.util.HashSet;
1415
import java.util.List;
16+
import java.util.Map;
1517
import java.util.Optional;
1618
import java.util.stream.Collectors;
1719

@@ -20,16 +22,50 @@ public class ScheduleConverter {
2022
static public Schedule toEntity(
2123
ScheduleRequestDto.AddRequestDto requestDto,
2224
MemberCategory memberCategory) {
23-
return Schedule.builder()
25+
Schedule.ScheduleBuilder builder = Schedule.builder()
2426
.date(requestDto.getDate())
2527
.time(requestDto.getTime())
2628
.alarmTime(requestDto.getAlarmTime())
2729
.content(requestDto.getContent())
2830
.scheduleType(memberCategory.getScheduleType())
29-
.memberCategory(memberCategory)
30-
.repeatWeek(new HashSet<>())
31-
.build();
31+
.memberCategory(memberCategory);
32+
33+
if (memberCategory.getScheduleType() == ScheduleType.ROUTINE) {
34+
builder.repeatWeek(new HashSet<>(requestDto.getRoutineWeek()));
35+
}
36+
37+
return builder.build();
38+
}
39+
40+
static public Schedule parsedResultToEntity(
41+
Map<String, Object> parsedResult,
42+
MemberCategory memberCategory) {
43+
44+
LocalDate date = parseDate(parsedResult.get("date"));
45+
LocalTime time = parseTime(parsedResult.get("time"));
46+
LocalTime alarmTime = parseTime(parsedResult.get("alarm_time"));
47+
48+
return Schedule.builder()
49+
.date(date)
50+
.time(time)
51+
.alarmTime(alarmTime)
52+
.content((String) parsedResult.get("content"))
53+
.scheduleType(memberCategory.getScheduleType())
54+
.memberCategory(memberCategory).build();
55+
}
56+
57+
private static LocalDate parseDate(Object obj) {
58+
if (obj instanceof String str && !str.isEmpty()) {
59+
return LocalDate.parse(str);
60+
}
61+
return null;
62+
}
3263

64+
private static LocalTime parseTime(Object obj) {
65+
if (obj instanceof String str && !str.isEmpty()) {
66+
return LocalTime.parse(str);
67+
}
68+
return null;
3369
}
3470

3571
static public Schedule groupScheduleToEntity(

src/main/java/com/example/ohmobackend/service/scheduleService/ScheduleCommandService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ public interface ScheduleCommandService {
1616

1717
public TodoResponseDto.TodoDto addTodo(ScheduleRequestDto.AddRequestDto requestDto, Member member);
1818

19+
public TodoResponseDto.TodoDto nlpAddTodo(ScheduleRequestDto.NlpAddRequestDto requestDto, Member member);
20+
1921
public TodoResponseDto.TodoDto updateTodo(Long scheduleId, ScheduleRequestDto.AddRequestDto requestDto, Member member);
2022

2123
public ScheduleResponseDto.ScheduleTodoDto updateScheduleDate(ScheduleRequestDto.UpdateTodoDateRequestDto requestDto, Member member);

src/main/java/com/example/ohmobackend/service/scheduleService/ScheduleCommandServiceImpl.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,18 @@
1515
import com.example.ohmobackend.web.dto.scheduleDto.ScheduleResponseDto;
1616
import com.example.ohmobackend.web.dto.todoDto.TodoResponseDto;
1717
import lombok.RequiredArgsConstructor;
18+
import org.springframework.http.HttpEntity;
19+
import org.springframework.http.HttpHeaders;
20+
import org.springframework.http.MediaType;
21+
import org.springframework.http.ResponseEntity;
1822
import org.springframework.stereotype.Service;
1923
import org.springframework.transaction.annotation.Transactional;
24+
import org.springframework.web.client.RestTemplate;
2025

2126
import java.time.LocalDate;
2227
import java.util.HashSet;
2328
import java.util.List;
29+
import java.util.Map;
2430
import java.util.Set;
2531
import java.util.function.Consumer;
2632
import java.util.stream.Collectors;
@@ -71,7 +77,6 @@ public List<RoutineResponseDto.RoutineDto> addRoutine(
7177
}
7278

7379
@Override
74-
@Transactional
7580
public List<RoutineResponseDto.RoutineDto> updateRoutine(
7681
Long scheduleId,
7782
ScheduleRequestDto.AddRequestDto requestDto,
@@ -100,6 +105,19 @@ public TodoResponseDto.TodoDto addTodo(ScheduleRequestDto.AddRequestDto requestD
100105
return TodoConverter.toTodoDto(todo);
101106
}
102107

108+
@Override
109+
public TodoResponseDto.TodoDto nlpAddTodo(ScheduleRequestDto.NlpAddRequestDto requestDto, Member member) {
110+
Map<String, Object> parsedResult = callNlpApi(requestDto.getText());
111+
MemberCategory memberCategory = memberCategoryRepository.findByMemberAndCategoryNameAndScheduleType(
112+
member, "default", ScheduleType.TO_DO)
113+
.orElseThrow(() -> new MemberCategoryHandler(ErrorStatus.MEMBER_CATEGORY_NOT_FOUND));
114+
115+
Schedule schedule = ScheduleConverter.parsedResultToEntity(parsedResult, memberCategory);
116+
scheduleRepository.save(schedule);
117+
Todo todo = todoRepository.save(TodoConverter.toEntity(schedule));
118+
return TodoConverter.toTodoDto(todo);
119+
}
120+
103121
@Override
104122
public TodoResponseDto.TodoDto updateTodo(Long scheduleId, ScheduleRequestDto.AddRequestDto requestDto, Member member) {
105123
Schedule schedule = scheduleRepository.findById(scheduleId)
@@ -251,4 +269,21 @@ private List<RoutineResponseDto.RoutineDto> findRoutineDtos(Schedule schedule) {
251269
.toList();
252270
}
253271

272+
private Map<String, Object> callNlpApi(String text) {
273+
RestTemplate restTemplate = new RestTemplate();
274+
HttpHeaders headers = new HttpHeaders();
275+
headers.setContentType(MediaType.TEXT_PLAIN);
276+
HttpEntity<String> entity = new HttpEntity<>(text, headers);
277+
278+
String apiUrl = "http://localhost:8000/nlp/extract-text";
279+
ResponseEntity<Map> response = restTemplate.postForEntity(apiUrl, entity, Map.class);
280+
281+
if (!response.getStatusCode().is2xxSuccessful() || response.getBody() == null) {
282+
throw new ScheduleHandler(ErrorStatus.NLP_PARSE_FAILED);
283+
}
284+
285+
return (Map<String, Object>) response.getBody().get("result");
286+
}
287+
288+
254289
}

src/main/java/com/example/ohmobackend/web/controller/ScheduleController.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,17 @@ public ApiResponse<TodoResponseDto.TodoDto> updateTodo(
6868
return ApiResponse.onSuccess(SuccessStatus.TODO_UPDATE_OK, todoDto);
6969
}
7070

71+
@PatchMapping("/nlp/todo")
72+
@Operation(summary = "투두 AI 일정 등록 API",
73+
description = "투두 AI 일정 등록 API입니다. " +
74+
"입력 필수 요소: text")
75+
public ApiResponse<TodoResponseDto.TodoDto> nlpAddTodo(
76+
@Valid @RequestBody ScheduleRequestDto.NlpAddRequestDto request,
77+
@AuthUser Member member) {
78+
TodoResponseDto.TodoDto todoDto = scheduleCommandService.nlpAddTodo(request, member);
79+
return ApiResponse.onSuccess(SuccessStatus.ROUTINE_UPDATE_OK, todoDto);
80+
}
81+
7182
@PatchMapping ("/alarm")
7283
@Operation(summary = "알람 시간 등록 API", description = "알람 시간 등록 API 입니다.")
7384
public ApiResponse<Object> updateScheduleAlarmTime(@RequestBody ScheduleRequestDto.UpdateScheduleAlarmTimeDto request, @AuthUser Member member) {

src/main/java/com/example/ohmobackend/web/dto/scheduleDto/ScheduleRequestDto.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,9 @@ public static class UpdateScheduleAlarmTimeDto {
4242
private Long scheduleId;
4343
private LocalTime alarmTime;
4444
}
45+
46+
@Getter
47+
public static class NlpAddRequestDto {
48+
private String text;
49+
}
4550
}

0 commit comments

Comments
 (0)