From 4fb68750cb9a8f7ee3c1aae57034f87378d4db3d Mon Sep 17 00:00:00 2001 From: SemiLee Date: Sun, 16 Jul 2023 20:38:16 +0900 Subject: [PATCH 1/6] [FEAT] add schedule api --- docker-compose.yml | 28 +++--- .../controller/ScheduleController.java | 33 +++++++ .../backend/schedule/entity/Schedule.java | 57 +++++++++++- .../repository/ScheduleRepository.java | 23 +++++ .../schedule/service/ScheduleService.java | 92 +++++++++++++++++++ .../schedule/service/SpringConfig.java | 19 ++++ src/main/resources/application-dev.yml | 22 ----- src/main/resources/application-prod.yml | 22 ----- .../repository/ScheduleRepositoryTest.java | 4 + .../ScheduleServiceIntegrationTest.java | 4 + .../schedule/service/ScheduleServiceTest.java | 60 ++++++++++++ 11 files changed, 301 insertions(+), 63 deletions(-) create mode 100644 src/main/java/com/haemil/backend/schedule/repository/ScheduleRepository.java create mode 100644 src/main/java/com/haemil/backend/schedule/service/ScheduleService.java create mode 100644 src/main/java/com/haemil/backend/schedule/service/SpringConfig.java delete mode 100644 src/main/resources/application-dev.yml delete mode 100644 src/main/resources/application-prod.yml create mode 100644 src/test/java/com/haemil/backend/schedule/repository/ScheduleRepositoryTest.java create mode 100644 src/test/java/com/haemil/backend/schedule/service/ScheduleServiceIntegrationTest.java create mode 100644 src/test/java/com/haemil/backend/schedule/service/ScheduleServiceTest.java diff --git a/docker-compose.yml b/docker-compose.yml index 73895c3..74dfb7a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,20 +10,20 @@ services: networks: - db_network - spring-boot: - container_name: server-haemil - build: - context: . - dockerfile: Dockerfile-dev - restart: always - environment: - - TZ=Asia/Seoul - ports: - - "8080:8080" - depends_on: - - redis - networks: - - db_network +/*# spring-boot: +# container_name: server-haemil +# build: +# context: . +# dockerfile: Dockerfile-dev +# restart: always +# environment: +# - TZ=Asia/Seoul +# ports: +# - "8080:8080" +# depends_on: +# - redis +# networks: +# - db_network*/ networks: db_network: diff --git a/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java b/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java index 5043b80..0fb2001 100644 --- a/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java +++ b/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java @@ -1,4 +1,37 @@ package com.haemil.backend.schedule.controller; +import com.haemil.backend.schedule.entity.Schedule; +import com.haemil.backend.schedule.repository.ScheduleRepository; +import com.haemil.backend.schedule.service.ScheduleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + + +@RestController +@RequestMapping("/schedules") public class ScheduleController { + + public final ScheduleService scheduleService; + + @Autowired + public ScheduleController(ScheduleService scheduleService){ + this.scheduleService = scheduleService; + } + + //클라이언트의 요청을 처리하는 컨트롤러 메서드 + @PostMapping //@PostMapping 애너테이션을 통해 HTTP POST 요청을 수신 + public Schedule saveSchedule(@RequestBody Schedule schedule){ + //@RequestBody 애너테이션을 사용하여 요청 본문에 있는 데이터를 Schedule 객체로 변환함 + return scheduleService.saveSchedule(schedule); + //scheduleService.saveSchedule(schedule)을 호출하여 일정을 저장하고, + //업데이트된 schedule 객체를 반환 + } + + + + + } diff --git a/src/main/java/com/haemil/backend/schedule/entity/Schedule.java b/src/main/java/com/haemil/backend/schedule/entity/Schedule.java index 30773c4..2c3431a 100644 --- a/src/main/java/com/haemil/backend/schedule/entity/Schedule.java +++ b/src/main/java/com/haemil/backend/schedule/entity/Schedule.java @@ -1,19 +1,66 @@ package com.haemil.backend.schedule.entity; -import javax.persistence.Column; -import javax.persistence.Id; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import net.bytebuddy.asm.Advice; + +import javax.persistence.*; import java.time.DayOfWeek; import java.time.LocalDate; +import java.time.LocalTime; +@Entity(name = "schedules") +@Setter +@Getter +@NoArgsConstructor public class Schedule { @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - //date는 생성과 수정 필요 - private LocalDate date; + //일정 생성(year, month, day) + @Column(name = "creationDate", nullable = false) + private LocalDate creationDate; + + //일정 수정(year, month, day) + @Column(name = "modificationDate", nullable = false) + private LocalDate modificationDate; + + //일정의 실제 날짜 정보(year, month, day) + @Column(nullable = false) + private LocalDate localDate; - private DayOfWeek week; + //요일 + @Column(nullable = false) + private DayOfWeek dayOfWeek; + //일정 시간(hour, minute, second, nano) + @Column(nullable = false) + private LocalTime time; + + //일정 내용 @Column(nullable = true, length = 100) private String content; + + //장소 + @Column(nullable = true, length = 50) + private String place; + + //중요 일정 + @Column(nullable = false) + private Boolean important_schedule; + + //고정 일정 + @Column(nullable = false) + private Boolean fixed_schedule; + + public Boolean isImportant(){ + return important_schedule; + } + public Boolean isFixed(){ + return fixed_schedule; + } + + } \ No newline at end of file diff --git a/src/main/java/com/haemil/backend/schedule/repository/ScheduleRepository.java b/src/main/java/com/haemil/backend/schedule/repository/ScheduleRepository.java new file mode 100644 index 0000000..bc97769 --- /dev/null +++ b/src/main/java/com/haemil/backend/schedule/repository/ScheduleRepository.java @@ -0,0 +1,23 @@ +package com.haemil.backend.schedule.repository; + +import com.haemil.backend.schedule.entity.Schedule; +import org.springframework.data.domain.Example; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import javax.persistence.Entity; +import javax.swing.text.html.Option; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; +import java.util.Optional; + +//JpaRepository를 상속받아서 데이터베이스와 상호작용하는 메서드들 제공 +public interface ScheduleRepository extends JpaRepository { + + //주어진 년, 월, 일에 해당하는 일정을 조회하는 메서드 + List findByLocalDate(LocalDate localDate); + + +} diff --git a/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java b/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java new file mode 100644 index 0000000..2f900b0 --- /dev/null +++ b/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java @@ -0,0 +1,92 @@ +package com.haemil.backend.schedule.service; + +import com.haemil.backend.schedule.entity.Schedule; +import com.haemil.backend.schedule.repository.ScheduleRepository; +//import com.haemil.backend.schedule.repository.SpringDataJpaScheduleRepository; +import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; +import java.util.Optional; + +//Schedule 객체를 저장하고 조회하는 기능을 구현 +//ScheduleRepository를 사용하여 데이터베이스와 상호작용 + +public class ScheduleService { + private final ScheduleRepository scheduleRepository; + + public ScheduleService(ScheduleRepository scheduleRepository){ + this.scheduleRepository = scheduleRepository; + } + //일정 생성 + public Schedule createSchedule(LocalDate createdDate, DayOfWeek dayOfWeek, + String content, boolean important_schedule, + boolean fixed_schedule, LocalTime time, String place) { + Schedule schedule = new Schedule(); + schedule.setCreationDate(createdDate); + schedule.setDayOfWeek(dayOfWeek); + schedule.setContent(content); + schedule.setImportant_schedule(important_schedule); + schedule.setFixed_schedule(fixed_schedule); + schedule.setTime(time); + schedule.setPlace(place); + + return scheduleRepository.save(schedule); + } + + //일정 저장 + public Schedule saveSchedule(Schedule schedule) { + return scheduleRepository.save(schedule); + } + + //주어진 날짜에 해당하는 일정 조회 + public List getScheduleByDate(LocalDate localDate, DayOfWeek dayOfWeek) { + return scheduleRepository.findByLocalDate(localDate); + } + + //일정 삭제 + @Transactional + public Long deleteSchedule(Long scheduleId) { + scheduleRepository.deleteById(scheduleId); + return scheduleId; + } + + //오늘에 해당하는 일정 조회 + public List getTodaySchedules(){ + LocalDate today = LocalDate.now(); + DayOfWeek dayOfWeek = today.getDayOfWeek(); + return scheduleRepository.findByLocalDate(today); + } + + //일정 수정 + @Transactional + public Long updateSchedule(Long scheduleId, LocalDate modificationDate, + DayOfWeek dayOfWeek, String content, boolean important_schedule, + boolean fixed_schedule, LocalTime time, String place){ + + Optional optionalSchedule = scheduleRepository.findById(scheduleId); + + if (((Optional) optionalSchedule).isPresent()){ + Schedule schedule = optionalSchedule.get(); + schedule.setModificationDate(modificationDate); + schedule.setDayOfWeek(dayOfWeek); + schedule.setContent(content); + schedule.setImportant_schedule(important_schedule); + schedule.setFixed_schedule(fixed_schedule); + schedule.setTime(time); + schedule.setPlace(place); + Schedule updatedSchedule = scheduleRepository.save(schedule); + return updatedSchedule.getId(); + + }else { + throw new IllegalArgumentException("Invalid schedule ID: " + scheduleId); + } + } + + +} diff --git a/src/main/java/com/haemil/backend/schedule/service/SpringConfig.java b/src/main/java/com/haemil/backend/schedule/service/SpringConfig.java new file mode 100644 index 0000000..a972ab3 --- /dev/null +++ b/src/main/java/com/haemil/backend/schedule/service/SpringConfig.java @@ -0,0 +1,19 @@ +package com.haemil.backend.schedule.service; + +import com.haemil.backend.schedule.repository.ScheduleRepository; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SpringConfig { + + private final ScheduleRepository scheduleRepository; + + public SpringConfig(ScheduleRepository scheduleRepository) {this.scheduleRepository = scheduleRepository;} + @Bean + public ScheduleService scheduleService(){ + return new ScheduleService(scheduleRepository); + } + + +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml deleted file mode 100644 index df14267..0000000 --- a/src/main/resources/application-dev.yml +++ /dev/null @@ -1,22 +0,0 @@ -# RDS Config -spring: - datasource: - url: jdbc:mysql://haemil-mysql-instance.c02to6wghrct.ap-northeast-2.rds.amazonaws.com:3306/haemildb?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 - username: admin - password: haemil4720! - driver-class-name: com.mysql.cj.jdbc.Driver - jpa: - database-platform: org.hibernate.dialect.MySQL5Dialect - show-sql: true - hibernate: - ddl-auto: none - output: - ansi: - enabled: always - -# Redis Config -redis: - host: redis - port: 6379 - -# Swagger Config \ No newline at end of file diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml deleted file mode 100644 index 5045d9e..0000000 --- a/src/main/resources/application-prod.yml +++ /dev/null @@ -1,22 +0,0 @@ -# RDS Config -spring: - datasource: - url: jdbc:mysql://haemil-mysql-instance.c02to6wghrct.ap-northeast-2.rds.amazonaws.com:3306/haemil-mysql-instance - username: admin - password: haemil4720! - driver-class-name: com.mysql.cj.jdbc.Driver - jpa: - database-platform: org.hibernate.dialect.MySQL5Dialect - show-sql: true - hibernate: - ddl-auto: none - output: - ansi: - enabled: always - -# Redis Config -redis: - host: redis - port: 6379 - -# Swagger Config \ No newline at end of file diff --git a/src/test/java/com/haemil/backend/schedule/repository/ScheduleRepositoryTest.java b/src/test/java/com/haemil/backend/schedule/repository/ScheduleRepositoryTest.java new file mode 100644 index 0000000..77a5d28 --- /dev/null +++ b/src/test/java/com/haemil/backend/schedule/repository/ScheduleRepositoryTest.java @@ -0,0 +1,4 @@ +package com.haemil.backend.schedule.repository; + +public class ScheduleRepositoryTest { +} diff --git a/src/test/java/com/haemil/backend/schedule/service/ScheduleServiceIntegrationTest.java b/src/test/java/com/haemil/backend/schedule/service/ScheduleServiceIntegrationTest.java new file mode 100644 index 0000000..c8a80bf --- /dev/null +++ b/src/test/java/com/haemil/backend/schedule/service/ScheduleServiceIntegrationTest.java @@ -0,0 +1,4 @@ +package com.haemil.backend.schedule.service; + +public class ScheduleServiceIntegrationTest { +} diff --git a/src/test/java/com/haemil/backend/schedule/service/ScheduleServiceTest.java b/src/test/java/com/haemil/backend/schedule/service/ScheduleServiceTest.java new file mode 100644 index 0000000..d3f37e1 --- /dev/null +++ b/src/test/java/com/haemil/backend/schedule/service/ScheduleServiceTest.java @@ -0,0 +1,60 @@ +package com.haemil.backend.schedule.service; + +import com.haemil.backend.schedule.entity.Schedule; +import com.haemil.backend.schedule.repository.ScheduleRepository; +import com.haemil.backend.schedule.repository.ScheduleRepositoryTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Example; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.repository.query.FluentQuery; + +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; +import java.util.Optional; +import java.util.function.Function; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@SpringBootTest +public class ScheduleServiceTest { + + @Autowired + ScheduleService scheduleService; + + @Autowired + ScheduleRepository scheduleRepository; + + @Test + void createSchedule(){ + //given + LocalDate creationDate = LocalDate.now(); + DayOfWeek dayOfWeek = creationDate.getDayOfWeek(); + String content = "Test Schedule"; + boolean important_schedule = true; + boolean fixed_schedule = false; + LocalTime time = LocalTime.of(5, 3); + String place = "Test Place"; + + //when + Schedule schedule = scheduleService.createSchedule(creationDate, dayOfWeek, content, important_schedule, fixed_schedule, time, place); + + //then + assertThat(schedule.getCreationDate()).isEqualTo(creationDate); + assertThat(schedule.getDayOfWeek()).isEqualTo(dayOfWeek); + assertThat(schedule.getContent()).isEqualTo(content); + assertThat(schedule.isImportant()).isEqualTo(important_schedule); + assertThat(schedule.isFixed()).isEqualTo(fixed_schedule); + assertThat(schedule.getTime()).isEqualTo(time); + assertThat(schedule.getPlace()).isEqualTo(place); + + } + + +} From 5bdc1cf97fd8e4c15f62792f24103e8ad2af5709 Mon Sep 17 00:00:00 2001 From: SemiLee Date: Wed, 9 Aug 2023 17:14:11 +0900 Subject: [PATCH 2/6] [FEAT] add schedule api --- Dockerfile-dev | 2 +- build.gradle | 1 - docker-compose.yml | 30 +++---- .../controller/ScheduleController.java | 66 ++++++++++++-- .../schedule/dto/ScheduleRequestDto.java | 35 ++++++++ .../schedule/dto/ScheduleResponseDto.java | 57 ++++++++++++ .../backend/schedule/entity/RepeatType.java | 9 ++ .../backend/schedule/entity/Schedule.java | 31 +++---- .../repository/ScheduleRepository.java | 4 +- .../schedule/service/ScheduleService.java | 88 ++++++++++--------- .../schedule/service/SpringConfig.java | 8 +- src/main/resources/application-secret.yml | 41 +++++++++ src/main/resources/application.properties | 1 - .../repository/ScheduleRepositoryTest.java | 4 - .../ScheduleServiceIntegrationTest.java | 4 - .../schedule/service/ScheduleServiceTest.java | 60 ------------- 16 files changed, 283 insertions(+), 158 deletions(-) create mode 100644 src/main/java/com/haemil/backend/schedule/dto/ScheduleRequestDto.java create mode 100644 src/main/java/com/haemil/backend/schedule/dto/ScheduleResponseDto.java create mode 100644 src/main/java/com/haemil/backend/schedule/entity/RepeatType.java create mode 100644 src/main/resources/application-secret.yml delete mode 100644 src/main/resources/application.properties delete mode 100644 src/test/java/com/haemil/backend/schedule/repository/ScheduleRepositoryTest.java delete mode 100644 src/test/java/com/haemil/backend/schedule/service/ScheduleServiceIntegrationTest.java delete mode 100644 src/test/java/com/haemil/backend/schedule/service/ScheduleServiceTest.java diff --git a/Dockerfile-dev b/Dockerfile-dev index fc9acdc..fea2ba0 100644 --- a/Dockerfile-dev +++ b/Dockerfile-dev @@ -1,6 +1,6 @@ FROM openjdk:11-jdk -ARG JAR_FILE=./build/libs/haemil-0.0.1-SNAPSHOT.jar +ARG JAR_FILE=./build/libs/Backend-0.0.1-SNAPSHOT.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=dev", "/app.jar"] \ No newline at end of file diff --git a/build.gradle b/build.gradle index 2a77ad6..2689cbc 100644 --- a/build.gradle +++ b/build.gradle @@ -30,7 +30,6 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.33' - implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'mysql:mysql-connector-java' } diff --git a/docker-compose.yml b/docker-compose.yml index 74dfb7a..643a6cd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,21 +10,21 @@ services: networks: - db_network -/*# spring-boot: -# container_name: server-haemil -# build: -# context: . -# dockerfile: Dockerfile-dev -# restart: always -# environment: -# - TZ=Asia/Seoul -# ports: -# - "8080:8080" -# depends_on: -# - redis -# networks: -# - db_network*/ + spring-boot: + container_name: server-haemil + build: + context: . + dockerfile: Dockerfile-dev + restart: always + environment: + - TZ=Asia/Seoul + ports: + - "8080:8080" + depends_on: + - redis + networks: + - db_network networks: db_network: - driver: bridge + driver: bridge \ No newline at end of file diff --git a/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java b/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java index 0fb2001..05c01e0 100644 --- a/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java +++ b/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java @@ -1,14 +1,29 @@ package com.haemil.backend.schedule.controller; +import com.fasterxml.jackson.databind.ser.Serializers; +import com.haemil.backend.global.config.BaseResponse; +import com.haemil.backend.global.config.ResponseStatus; +import com.haemil.backend.schedule.dto.ScheduleRequestDto; +import com.haemil.backend.schedule.dto.ScheduleResponseDto; import com.haemil.backend.schedule.entity.Schedule; import com.haemil.backend.schedule.repository.ScheduleRepository; import com.haemil.backend.schedule.service.ScheduleService; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import static com.haemil.backend.global.config.ResponseStatus.INTERNAL_SERVER_ERROR; + @RestController @RequestMapping("/schedules") @@ -21,17 +36,54 @@ public ScheduleController(ScheduleService scheduleService){ this.scheduleService = scheduleService; } - //클라이언트의 요청을 처리하는 컨트롤러 메서드 - @PostMapping //@PostMapping 애너테이션을 통해 HTTP POST 요청을 수신 - public Schedule saveSchedule(@RequestBody Schedule schedule){ - //@RequestBody 애너테이션을 사용하여 요청 본문에 있는 데이터를 Schedule 객체로 변환함 - return scheduleService.saveSchedule(schedule); - //scheduleService.saveSchedule(schedule)을 호출하여 일정을 저장하고, - //업데이트된 schedule 객체를 반환 + //일정 추가 API + @PostMapping("/schedule") + public ResponseEntity createSchedule(@RequestBody ScheduleRequestDto scheduleRequestDto) { + try { + ScheduleResponseDto createSchedule = scheduleService.createSchedule(scheduleRequestDto); + BaseResponse response = new BaseResponse<>(createSchedule); + return response.convert(); + } catch (Exception e){ + ResponseStatus responseStatus = INTERNAL_SERVER_ERROR; + BaseResponse errorResponse = new BaseResponse<>(responseStatus); + return errorResponse.convert(); + } + } + + //주어진 날짜에 해당하는 일정 조회 API + @GetMapping("/getSchedule") + public ResponseEntity> getSchedulesByDate(@RequestParam("localDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate localDate){ + List schedules = scheduleService.getSchedule(localDate); + return ResponseEntity.ok(schedules); } + //오늘 일정 조회 API + @GetMapping("/today") + public ResponseEntity> getTodaySchedules() { + List todaySchedules = scheduleService.getTodaySchedules(); + return ResponseEntity.ok(todaySchedules); + } + + //일정 삭제 API + @DeleteMapping("/schedule/{scheduleId}") + public Long deleteSchedule(@PathVariable Long scheduleId){ + return scheduleService.deleteSchedule(scheduleId); + } + + + //일정 수정 API + @PatchMapping("/schedule/{scheduleId}") + public ResponseEntity updateSchedule(@PathVariable Long scheduleId, @RequestBody ScheduleRequestDto requestDto) { + Schedule updatedSchedule = scheduleService.updateSchedule(scheduleId, requestDto); + + if (updatedSchedule != null) { + return ResponseEntity.ok(updatedSchedule); + } else { + return ResponseEntity.notFound().build(); + } + } } diff --git a/src/main/java/com/haemil/backend/schedule/dto/ScheduleRequestDto.java b/src/main/java/com/haemil/backend/schedule/dto/ScheduleRequestDto.java new file mode 100644 index 0000000..92d239b --- /dev/null +++ b/src/main/java/com/haemil/backend/schedule/dto/ScheduleRequestDto.java @@ -0,0 +1,35 @@ +package com.haemil.backend.schedule.dto; + +import com.haemil.backend.schedule.entity.RepeatType; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; + +//schedule에 데이터를 넣을 때의 입력 요청 값을 받음 +@NoArgsConstructor +@Getter +public class ScheduleRequestDto { + + private Long id; + + private LocalDate localDate; + + private DayOfWeek dayOfWeek; + + private LocalTime time; + + private String content; + + private Boolean done; + + private String place; + + private String medicine; + + private RepeatType repeatType; + + +} diff --git a/src/main/java/com/haemil/backend/schedule/dto/ScheduleResponseDto.java b/src/main/java/com/haemil/backend/schedule/dto/ScheduleResponseDto.java new file mode 100644 index 0000000..92bbf36 --- /dev/null +++ b/src/main/java/com/haemil/backend/schedule/dto/ScheduleResponseDto.java @@ -0,0 +1,57 @@ +package com.haemil.backend.schedule.dto; + +import com.haemil.backend.schedule.entity.RepeatType; +import com.haemil.backend.schedule.entity.Schedule; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; + +//schedule에서 값을 가져올 때 직접적인 entity 대신 앞에 써줌 +//클라이언트에게 응답할 때 필요한 속성들 추가 +@NoArgsConstructor +@Getter +public class ScheduleResponseDto { + + private Long id; + + private LocalDate localDate; + + private DayOfWeek dayOfWeek; + + private LocalTime time; + + private String content; + + private String place; + + private Boolean done; + + private String medicine; + + private RepeatType repeatType; + + + public ScheduleResponseDto(Schedule schedule){ + this.id = schedule.getId(); + + this.localDate = schedule.getLocalDate(); + + this.dayOfWeek = schedule.getDayOfWeek(); + + this.time = schedule.getTime(); + + this.content = schedule.getContent(); + + this.place = schedule.getPlace(); + + this.done = schedule.getDone(); + + this.medicine = schedule.getMedicine(); + + this.repeatType = schedule.getRepeatType(); + + } +} diff --git a/src/main/java/com/haemil/backend/schedule/entity/RepeatType.java b/src/main/java/com/haemil/backend/schedule/entity/RepeatType.java new file mode 100644 index 0000000..1c9177b --- /dev/null +++ b/src/main/java/com/haemil/backend/schedule/entity/RepeatType.java @@ -0,0 +1,9 @@ +package com.haemil.backend.schedule.entity; + + +public enum RepeatType { + DAILY, + WEEKLY, + MONTHLY, + NONE +} diff --git a/src/main/java/com/haemil/backend/schedule/entity/Schedule.java b/src/main/java/com/haemil/backend/schedule/entity/Schedule.java index 2c3431a..e14a98f 100644 --- a/src/main/java/com/haemil/backend/schedule/entity/Schedule.java +++ b/src/main/java/com/haemil/backend/schedule/entity/Schedule.java @@ -15,18 +15,11 @@ @Getter @NoArgsConstructor public class Schedule { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - //일정 생성(year, month, day) - @Column(name = "creationDate", nullable = false) - private LocalDate creationDate; - - //일정 수정(year, month, day) - @Column(name = "modificationDate", nullable = false) - private LocalDate modificationDate; - //일정의 실제 날짜 정보(year, month, day) @Column(nullable = false) private LocalDate localDate; @@ -43,24 +36,22 @@ public class Schedule { @Column(nullable = true, length = 100) private String content; + //일정 완료 여부 + @Column(nullable = false) + private Boolean done; + //장소 @Column(nullable = true, length = 50) private String place; - //중요 일정 - @Column(nullable = false) - private Boolean important_schedule; + //약 + @Column(nullable = true, length = 50) + private String medicine; - //고정 일정 + //반복 routine + @Enumerated(value = EnumType.STRING) @Column(nullable = false) - private Boolean fixed_schedule; - - public Boolean isImportant(){ - return important_schedule; - } - public Boolean isFixed(){ - return fixed_schedule; - } + private RepeatType repeatType; } \ No newline at end of file diff --git a/src/main/java/com/haemil/backend/schedule/repository/ScheduleRepository.java b/src/main/java/com/haemil/backend/schedule/repository/ScheduleRepository.java index bc97769..d3cf5cf 100644 --- a/src/main/java/com/haemil/backend/schedule/repository/ScheduleRepository.java +++ b/src/main/java/com/haemil/backend/schedule/repository/ScheduleRepository.java @@ -1,6 +1,7 @@ package com.haemil.backend.schedule.repository; import com.haemil.backend.schedule.entity.Schedule; +import org.springframework.context.annotation.Primary; import org.springframework.data.domain.Example; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -13,10 +14,11 @@ import java.util.List; import java.util.Optional; +@Primary //JpaRepository를 상속받아서 데이터베이스와 상호작용하는 메서드들 제공 public interface ScheduleRepository extends JpaRepository { - //주어진 년, 월, 일에 해당하는 일정을 조회하는 메서드 + //일정을 조회 List findByLocalDate(LocalDate localDate); diff --git a/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java b/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java index 2f900b0..133b00b 100644 --- a/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java +++ b/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java @@ -1,5 +1,8 @@ package com.haemil.backend.schedule.service; +import com.haemil.backend.schedule.dto.ScheduleRequestDto; +import com.haemil.backend.schedule.dto.ScheduleResponseDto; +import com.haemil.backend.schedule.entity.RepeatType; import com.haemil.backend.schedule.entity.Schedule; import com.haemil.backend.schedule.repository.ScheduleRepository; //import com.haemil.backend.schedule.repository.SpringDataJpaScheduleRepository; @@ -17,38 +20,54 @@ //Schedule 객체를 저장하고 조회하는 기능을 구현 //ScheduleRepository를 사용하여 데이터베이스와 상호작용 +@Transactional public class ScheduleService { private final ScheduleRepository scheduleRepository; - public ScheduleService(ScheduleRepository scheduleRepository){ + public ScheduleService(ScheduleRepository scheduleRepository) { this.scheduleRepository = scheduleRepository; } + //일정 생성 - public Schedule createSchedule(LocalDate createdDate, DayOfWeek dayOfWeek, - String content, boolean important_schedule, - boolean fixed_schedule, LocalTime time, String place) { + public ScheduleResponseDto createSchedule(ScheduleRequestDto scheduleRequestDto) { + + LocalDate localDate = scheduleRequestDto.getLocalDate(); + DayOfWeek dayOfWeek = scheduleRequestDto.getDayOfWeek(); + String content = scheduleRequestDto.getContent(); + Boolean done = scheduleRequestDto.getDone(); + LocalTime time = scheduleRequestDto.getTime(); + String place = scheduleRequestDto.getPlace(); + String medicine = scheduleRequestDto.getMedicine(); + RepeatType repeatType = scheduleRequestDto.getRepeatType(); + Schedule schedule = new Schedule(); - schedule.setCreationDate(createdDate); + + schedule.setLocalDate(localDate); schedule.setDayOfWeek(dayOfWeek); schedule.setContent(content); - schedule.setImportant_schedule(important_schedule); - schedule.setFixed_schedule(fixed_schedule); + schedule.setDone(done); schedule.setTime(time); schedule.setPlace(place); + schedule.setRepeatType(repeatType); + schedule.setMedicine(medicine); - return scheduleRepository.save(schedule); - } + Schedule createdSchedule = scheduleRepository.save(schedule); - //일정 저장 - public Schedule saveSchedule(Schedule schedule) { - return scheduleRepository.save(schedule); + return new ScheduleResponseDto(createdSchedule); } //주어진 날짜에 해당하는 일정 조회 - public List getScheduleByDate(LocalDate localDate, DayOfWeek dayOfWeek) { + public List getSchedule(LocalDate localDate) { return scheduleRepository.findByLocalDate(localDate); } + //오늘에 해당하는 일정 조회 + public List getTodaySchedules() { + LocalDate today = LocalDate.now(); + //DayOfWeek dayOfWeek = today.getDayOfWeek(); + return scheduleRepository.findByLocalDate(today); + } + //일정 삭제 @Transactional public Long deleteSchedule(Long scheduleId) { @@ -56,36 +75,25 @@ public Long deleteSchedule(Long scheduleId) { return scheduleId; } - //오늘에 해당하는 일정 조회 - public List getTodaySchedules(){ - LocalDate today = LocalDate.now(); - DayOfWeek dayOfWeek = today.getDayOfWeek(); - return scheduleRepository.findByLocalDate(today); - } - //일정 수정 @Transactional - public Long updateSchedule(Long scheduleId, LocalDate modificationDate, - DayOfWeek dayOfWeek, String content, boolean important_schedule, - boolean fixed_schedule, LocalTime time, String place){ - - Optional optionalSchedule = scheduleRepository.findById(scheduleId); - - if (((Optional) optionalSchedule).isPresent()){ - Schedule schedule = optionalSchedule.get(); - schedule.setModificationDate(modificationDate); - schedule.setDayOfWeek(dayOfWeek); - schedule.setContent(content); - schedule.setImportant_schedule(important_schedule); - schedule.setFixed_schedule(fixed_schedule); - schedule.setTime(time); - schedule.setPlace(place); - Schedule updatedSchedule = scheduleRepository.save(schedule); - return updatedSchedule.getId(); - - }else { - throw new IllegalArgumentException("Invalid schedule ID: " + scheduleId); + public Schedule updateSchedule(Long id, ScheduleRequestDto requestDto) { + Schedule schedule = scheduleRepository.findById(id).orElse(null); + + if (schedule == null) { + throw new IllegalArgumentException("해당 아이디가 존재하지 않습니다"); } + + schedule.setLocalDate(requestDto.getLocalDate()); + schedule.setDayOfWeek(requestDto.getDayOfWeek()); + schedule.setContent(requestDto.getContent()); + schedule.setDone(requestDto.getDone()); + schedule.setTime(requestDto.getTime()); + schedule.setPlace(requestDto.getPlace()); + schedule.setRepeatType(requestDto.getRepeatType()); + schedule.setMedicine(requestDto.getMedicine()); + + return scheduleRepository.save(schedule); } diff --git a/src/main/java/com/haemil/backend/schedule/service/SpringConfig.java b/src/main/java/com/haemil/backend/schedule/service/SpringConfig.java index a972ab3..5977ccf 100644 --- a/src/main/java/com/haemil/backend/schedule/service/SpringConfig.java +++ b/src/main/java/com/haemil/backend/schedule/service/SpringConfig.java @@ -6,14 +6,14 @@ @Configuration public class SpringConfig { - private final ScheduleRepository scheduleRepository; - public SpringConfig(ScheduleRepository scheduleRepository) {this.scheduleRepository = scheduleRepository;} + public SpringConfig(ScheduleRepository scheduleRepository){ + this.scheduleRepository = scheduleRepository; + } + @Bean public ScheduleService scheduleService(){ return new ScheduleService(scheduleRepository); } - - } diff --git a/src/main/resources/application-secret.yml b/src/main/resources/application-secret.yml new file mode 100644 index 0000000..058c996 --- /dev/null +++ b/src/main/resources/application-secret.yml @@ -0,0 +1,41 @@ +# AWS RDS +spring: + datasource: + url: jdbc:mysql://localhost:3306/haemil?serverTimezone=Asia/Seoul + username: root + password: smvb6600 + driver-class-name: com.mysql.cj.jdbc.Driver + jpa: + database: mysql + database-platform: org.hibernate.dialect.MySQL8Dialect + open-in-view: false + hibernate: + ddl-auto: update + generate-ddl: true + show-sql: true + properties: + hibernate: + format_sql: true + +# security config +jwt: + # secret-key + secret-key: + # refresh: 7일 + refresh-period: 604800000 + # access: 30분 + access-period: 1800000 +api: + secret-key: "%2FBPEf21bFPV0445%2BLOonhH%2FSRSeCQbynMAro8sHgomFg03OmuxifwF%2Bnl%2Fz7Nj%2FGXVpYydUdPSYwuywH0eErqw%3D%3D" + hj-secret-key: "Zj0sLbMrwO6sNx5VVTO1ExwsGaiiab7foNhOtvUgNrl/S2AeCLt1o2B4EzZEaYBg/OsM0vkFjuhttPUq3vbq6A==" + hj-kakao-key: "88102d82e2851449e4fc7757d6d0f9b6" +oauth: + kakao: + client-id: cf552915e52ec7012b72a272c81c1244 + client-secret: UUcKsBCD4WzSFLbL5Fgx2VhpBA1QgiDp + url: + auth: https://kauth.kakao.com + api: https://kapi.kakao.com + google: + client-id: + client-secret: \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/test/java/com/haemil/backend/schedule/repository/ScheduleRepositoryTest.java b/src/test/java/com/haemil/backend/schedule/repository/ScheduleRepositoryTest.java deleted file mode 100644 index 77a5d28..0000000 --- a/src/test/java/com/haemil/backend/schedule/repository/ScheduleRepositoryTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.haemil.backend.schedule.repository; - -public class ScheduleRepositoryTest { -} diff --git a/src/test/java/com/haemil/backend/schedule/service/ScheduleServiceIntegrationTest.java b/src/test/java/com/haemil/backend/schedule/service/ScheduleServiceIntegrationTest.java deleted file mode 100644 index c8a80bf..0000000 --- a/src/test/java/com/haemil/backend/schedule/service/ScheduleServiceIntegrationTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.haemil.backend.schedule.service; - -public class ScheduleServiceIntegrationTest { -} diff --git a/src/test/java/com/haemil/backend/schedule/service/ScheduleServiceTest.java b/src/test/java/com/haemil/backend/schedule/service/ScheduleServiceTest.java deleted file mode 100644 index d3f37e1..0000000 --- a/src/test/java/com/haemil/backend/schedule/service/ScheduleServiceTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.haemil.backend.schedule.service; - -import com.haemil.backend.schedule.entity.Schedule; -import com.haemil.backend.schedule.repository.ScheduleRepository; -import com.haemil.backend.schedule.repository.ScheduleRepositoryTest; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.domain.Example; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.data.repository.query.FluentQuery; - -import java.time.DayOfWeek; -import java.time.LocalDate; -import java.time.LocalTime; -import java.util.List; -import java.util.Optional; -import java.util.function.Function; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - -@SpringBootTest -public class ScheduleServiceTest { - - @Autowired - ScheduleService scheduleService; - - @Autowired - ScheduleRepository scheduleRepository; - - @Test - void createSchedule(){ - //given - LocalDate creationDate = LocalDate.now(); - DayOfWeek dayOfWeek = creationDate.getDayOfWeek(); - String content = "Test Schedule"; - boolean important_schedule = true; - boolean fixed_schedule = false; - LocalTime time = LocalTime.of(5, 3); - String place = "Test Place"; - - //when - Schedule schedule = scheduleService.createSchedule(creationDate, dayOfWeek, content, important_schedule, fixed_schedule, time, place); - - //then - assertThat(schedule.getCreationDate()).isEqualTo(creationDate); - assertThat(schedule.getDayOfWeek()).isEqualTo(dayOfWeek); - assertThat(schedule.getContent()).isEqualTo(content); - assertThat(schedule.isImportant()).isEqualTo(important_schedule); - assertThat(schedule.isFixed()).isEqualTo(fixed_schedule); - assertThat(schedule.getTime()).isEqualTo(time); - assertThat(schedule.getPlace()).isEqualTo(place); - - } - - -} From 39111167fa2e1ac7f8cff6fc4f9784ee436a7e65 Mon Sep 17 00:00:00 2001 From: SemiLee Date: Thu, 17 Aug 2023 21:11:39 +0900 Subject: [PATCH 3/6] [FEAT] add schedule api --- .../backend/global/config/BaseResponse.java | 3 + .../backend/global/config/ResponseStatus.java | 2 +- .../config}/SpringConfig.java | 3 +- .../global/exception/BaseException.java | 19 +++ .../MissingRequiredFieldException.java | 11 ++ .../controller/ScheduleController.java | 44 ++++-- .../backend/schedule/entity/Schedule.java | 2 +- .../schedule/service/ScheduleService.java | 133 +++++++++++++----- 8 files changed, 169 insertions(+), 48 deletions(-) rename src/main/java/com/haemil/backend/{schedule/service => global/config}/SpringConfig.java (83%) create mode 100644 src/main/java/com/haemil/backend/global/exception/BaseException.java create mode 100644 src/main/java/com/haemil/backend/global/exception/MissingRequiredFieldException.java diff --git a/src/main/java/com/haemil/backend/global/config/BaseResponse.java b/src/main/java/com/haemil/backend/global/config/BaseResponse.java index da07857..58e4aca 100644 --- a/src/main/java/com/haemil/backend/global/config/BaseResponse.java +++ b/src/main/java/com/haemil/backend/global/config/BaseResponse.java @@ -4,11 +4,13 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import lombok.Getter; +import lombok.Setter; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @Getter +@Setter @JsonPropertyOrder({"success", "message", "result"}) public class BaseResponse { @@ -35,6 +37,7 @@ public BaseResponse(ResponseStatus status) { } + public ResponseEntity convert() { HttpHeaders headers = new HttpHeaders(); headers.set("Content-Type", "application/json; charset=UTF-8"); diff --git a/src/main/java/com/haemil/backend/global/config/ResponseStatus.java b/src/main/java/com/haemil/backend/global/config/ResponseStatus.java index 94ed70e..53e3ba2 100644 --- a/src/main/java/com/haemil/backend/global/config/ResponseStatus.java +++ b/src/main/java/com/haemil/backend/global/config/ResponseStatus.java @@ -16,7 +16,7 @@ public enum ResponseStatus { CONFLICT(409,HttpStatus.Series.CLIENT_ERROR, "Conflict"), PAYLOAD_TOO_LARGE(413,HttpStatus.Series.CLIENT_ERROR, "Payload Too Large"), URI_TOO_LONG(414,HttpStatus.Series.CLIENT_ERROR, "URI Too Long"), - + MISSING_REQUIRED_FIELD(400, HttpStatus.Series.CLIENT_ERROR, "Required field(s) are missing"), // --- 5xx Server Error --- INTERNAL_SERVER_ERROR(500,HttpStatus.Series.SERVER_ERROR, "Internal Server Error"), BAD_GATEWAY(502,HttpStatus.Series.SERVER_ERROR, "Bad Gateway"), diff --git a/src/main/java/com/haemil/backend/schedule/service/SpringConfig.java b/src/main/java/com/haemil/backend/global/config/SpringConfig.java similarity index 83% rename from src/main/java/com/haemil/backend/schedule/service/SpringConfig.java rename to src/main/java/com/haemil/backend/global/config/SpringConfig.java index 5977ccf..01dbcde 100644 --- a/src/main/java/com/haemil/backend/schedule/service/SpringConfig.java +++ b/src/main/java/com/haemil/backend/global/config/SpringConfig.java @@ -1,6 +1,7 @@ -package com.haemil.backend.schedule.service; +package com.haemil.backend.global.config; import com.haemil.backend.schedule.repository.ScheduleRepository; +import com.haemil.backend.schedule.service.ScheduleService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/com/haemil/backend/global/exception/BaseException.java b/src/main/java/com/haemil/backend/global/exception/BaseException.java new file mode 100644 index 0000000..a98db54 --- /dev/null +++ b/src/main/java/com/haemil/backend/global/exception/BaseException.java @@ -0,0 +1,19 @@ +package com.haemil.backend.global.exception; + +import com.haemil.backend.global.config.ResponseStatus; + +public class BaseException extends RuntimeException { + + private final ResponseStatus status; + + + public BaseException(ResponseStatus status) { + super(status.getMessage()); + this.status = status; + } + + public ResponseStatus getStatus() { + return status; + } + +} \ No newline at end of file diff --git a/src/main/java/com/haemil/backend/global/exception/MissingRequiredFieldException.java b/src/main/java/com/haemil/backend/global/exception/MissingRequiredFieldException.java new file mode 100644 index 0000000..b764eed --- /dev/null +++ b/src/main/java/com/haemil/backend/global/exception/MissingRequiredFieldException.java @@ -0,0 +1,11 @@ +package com.haemil.backend.global.exception; + +import com.haemil.backend.global.config.ResponseStatus; + +public class MissingRequiredFieldException extends BaseException { + + public MissingRequiredFieldException(String s) { + super(ResponseStatus.MISSING_REQUIRED_FIELD); + } + +} diff --git a/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java b/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java index 05c01e0..b59bdc7 100644 --- a/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java +++ b/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.ser.Serializers; import com.haemil.backend.global.config.BaseResponse; import com.haemil.backend.global.config.ResponseStatus; +import com.haemil.backend.global.exception.BaseException; import com.haemil.backend.schedule.dto.ScheduleRequestDto; import com.haemil.backend.schedule.dto.ScheduleResponseDto; import com.haemil.backend.schedule.entity.Schedule; @@ -22,6 +23,7 @@ import java.util.Optional; import java.util.stream.Collectors; +import static com.haemil.backend.global.config.ResponseStatus.BAD_REQUEST; import static com.haemil.backend.global.config.ResponseStatus.INTERNAL_SERVER_ERROR; @@ -32,44 +34,60 @@ public class ScheduleController { public final ScheduleService scheduleService; @Autowired - public ScheduleController(ScheduleService scheduleService){ + public ScheduleController(ScheduleService scheduleService) { this.scheduleService = scheduleService; } //일정 추가 API @PostMapping("/schedule") public ResponseEntity createSchedule(@RequestBody ScheduleRequestDto scheduleRequestDto) { + try { ScheduleResponseDto createSchedule = scheduleService.createSchedule(scheduleRequestDto); BaseResponse response = new BaseResponse<>(createSchedule); return response.convert(); - } catch (Exception e){ - ResponseStatus responseStatus = INTERNAL_SERVER_ERROR; - BaseResponse errorResponse = new BaseResponse<>(responseStatus); - return errorResponse.convert(); + + } catch (BaseException e) { + return new BaseResponse<>(e.getStatus()).convert(); } + } //주어진 날짜에 해당하는 일정 조회 API @GetMapping("/getSchedule") - public ResponseEntity> getSchedulesByDate(@RequestParam("localDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate localDate){ - List schedules = scheduleService.getSchedule(localDate); - return ResponseEntity.ok(schedules); + public ResponseEntity getSchedulesByDate(@RequestParam("localDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate localDate){ + try { + List schedules = scheduleService.getSchedule(localDate); + return new BaseResponse<>(schedules).convert(); + }catch (BaseException e) { + return new BaseResponse<>(e.getStatus()).convert(); + } } //오늘 일정 조회 API @GetMapping("/today") - public ResponseEntity> getTodaySchedules() { - List todaySchedules = scheduleService.getTodaySchedules(); - return ResponseEntity.ok(todaySchedules); + public ResponseEntity getTodaySchedules() { + try { + List todaySchedules = scheduleService.getTodaySchedules(); + return new BaseResponse<>(todaySchedules).convert(); + + } catch(BaseException e) { + return new BaseResponse<>(e.getStatus()).convert(); + } } //일정 삭제 API @DeleteMapping("/schedule/{scheduleId}") - public Long deleteSchedule(@PathVariable Long scheduleId){ - return scheduleService.deleteSchedule(scheduleId); + public ResponseEntity deleteSchedule(@PathVariable Long scheduleId){ + try { + Long deletedId = scheduleService.deleteSchedule(scheduleId); + BaseResponse response = new BaseResponse<>(deletedId); + return response.convert(); + } catch (BaseException e) { + return new BaseResponse<>(e.getStatus()).convert(); + } } diff --git a/src/main/java/com/haemil/backend/schedule/entity/Schedule.java b/src/main/java/com/haemil/backend/schedule/entity/Schedule.java index e14a98f..3ceb895 100644 --- a/src/main/java/com/haemil/backend/schedule/entity/Schedule.java +++ b/src/main/java/com/haemil/backend/schedule/entity/Schedule.java @@ -33,7 +33,7 @@ public class Schedule { private LocalTime time; //일정 내용 - @Column(nullable = true, length = 100) + @Column(nullable = false, length = 100) private String content; //일정 완료 여부 diff --git a/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java b/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java index 133b00b..9dddf1f 100644 --- a/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java +++ b/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java @@ -1,5 +1,7 @@ package com.haemil.backend.schedule.service; +import com.haemil.backend.global.exception.BaseException; +import com.haemil.backend.global.exception.MissingRequiredFieldException; import com.haemil.backend.schedule.dto.ScheduleRequestDto; import com.haemil.backend.schedule.dto.ScheduleResponseDto; import com.haemil.backend.schedule.entity.RepeatType; @@ -7,9 +9,12 @@ import com.haemil.backend.schedule.repository.ScheduleRepository; //import com.haemil.backend.schedule.repository.SpringDataJpaScheduleRepository; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.haemil.backend.global.config.ResponseStatus; import java.time.DayOfWeek; import java.time.LocalDate; @@ -17,9 +22,11 @@ import java.util.List; import java.util.Optional; + + //Schedule 객체를 저장하고 조회하는 기능을 구현 //ScheduleRepository를 사용하여 데이터베이스와 상호작용 - +@Slf4j @Transactional public class ScheduleService { private final ScheduleRepository scheduleRepository; @@ -29,43 +36,105 @@ public ScheduleService(ScheduleRepository scheduleRepository) { } //일정 생성 - public ScheduleResponseDto createSchedule(ScheduleRequestDto scheduleRequestDto) { - - LocalDate localDate = scheduleRequestDto.getLocalDate(); - DayOfWeek dayOfWeek = scheduleRequestDto.getDayOfWeek(); - String content = scheduleRequestDto.getContent(); - Boolean done = scheduleRequestDto.getDone(); - LocalTime time = scheduleRequestDto.getTime(); - String place = scheduleRequestDto.getPlace(); - String medicine = scheduleRequestDto.getMedicine(); - RepeatType repeatType = scheduleRequestDto.getRepeatType(); - - Schedule schedule = new Schedule(); - - schedule.setLocalDate(localDate); - schedule.setDayOfWeek(dayOfWeek); - schedule.setContent(content); - schedule.setDone(done); - schedule.setTime(time); - schedule.setPlace(place); - schedule.setRepeatType(repeatType); - schedule.setMedicine(medicine); - - Schedule createdSchedule = scheduleRepository.save(schedule); - - return new ScheduleResponseDto(createdSchedule); + public ScheduleResponseDto createSchedule(ScheduleRequestDto scheduleRequestDto) throws BaseException{ + + //String responseBody; + + try { + LocalDate localDate = scheduleRequestDto.getLocalDate(); + DayOfWeek dayOfWeek = scheduleRequestDto.getDayOfWeek(); + String content = scheduleRequestDto.getContent(); + Boolean done = scheduleRequestDto.getDone(); + LocalTime time = scheduleRequestDto.getTime(); + String place = scheduleRequestDto.getPlace(); + String medicine = scheduleRequestDto.getMedicine(); + RepeatType repeatType = scheduleRequestDto.getRepeatType(); + + + Schedule schedule = new Schedule(); + + schedule.setLocalDate(localDate); + schedule.setDayOfWeek(dayOfWeek); + schedule.setContent(content); + schedule.setDone(done); + schedule.setTime(time); + schedule.setPlace(place); + schedule.setRepeatType(repeatType); + schedule.setMedicine(medicine); + + log.debug("Schedule fields set...."); + + // missing field 존재 여부 검사 + if (localDate == null || dayOfWeek == null || time == null || content == null || done == null || repeatType == null) { + throw new MissingRequiredFieldException("Required field(s) are missing"); + } + + // 여기서 중복 일정 검사를 수행하고 이미 존재하는 경우 예외를 던짐 + List existingSchedules = scheduleRepository.findByLocalDate(localDate); + for (Schedule existingSchedule : existingSchedules) { + if (existingSchedule.getDayOfWeek() == dayOfWeek && + existingSchedule.getTime().equals(time) && + existingSchedule.getContent().equals(content) && + existingSchedule.getDone().equals(done) && + existingSchedule.getRepeatType().equals(repeatType) && + existingSchedule.getPlace().equals(place) && + existingSchedule.getMedicine().equals(medicine)) { + throw new BaseException(ResponseStatus.CONFLICT); + } + } + + Schedule createdSchedule = scheduleRepository.save(schedule); + return new ScheduleResponseDto(createdSchedule); + + + } catch(MissingRequiredFieldException e) { + log.error("Missing required fields: ", e); + throw new BaseException(ResponseStatus.MISSING_REQUIRED_FIELD); + } catch (BaseException e) { + log.error("Same field is already exists.: ", e); + throw new BaseException(ResponseStatus.CONFLICT); + } + + } //주어진 날짜에 해당하는 일정 조회 - public List getSchedule(LocalDate localDate) { - return scheduleRepository.findByLocalDate(localDate); + public List getSchedule(LocalDate localDate) throws BaseException{ + try { + List schedules = scheduleRepository.findByLocalDate(localDate); + + log.debug("1"); + if (schedules.isEmpty()) { + throw new BaseException(ResponseStatus.NOT_FOUND); + } + + log.debug("2"); + + return schedules; + }catch(BaseException e){ + log.error("Error occurred while fetching schedules: " + e.getMessage()); + throw new BaseException(ResponseStatus.NOT_FOUND); // 현재의 예외를 다시 던져줍니다. + } + } + //오늘에 해당하는 일정 조회 - public List getTodaySchedules() { - LocalDate today = LocalDate.now(); - //DayOfWeek dayOfWeek = today.getDayOfWeek(); - return scheduleRepository.findByLocalDate(today); + public List getTodaySchedules() throws BaseException { + try { + LocalDate today = LocalDate.now(); + List todaySchedules = scheduleRepository.findByLocalDate(today); + + if (todaySchedules.isEmpty()) { + throw new BaseException(ResponseStatus.NOT_FOUND); + } + + return todaySchedules; + + } catch(BaseException e){ + log.error("Error occurred while fetching schedules: " + e.getMessage()); + throw new BaseException(ResponseStatus.NOT_FOUND); // 현재의 예외를 다시 던져줍니다. + } } //일정 삭제 From f79f9928537bca031e361d6610736c29e70c037f Mon Sep 17 00:00:00 2001 From: SemiLee Date: Sat, 26 Aug 2023 12:16:14 +0900 Subject: [PATCH 4/6] [CHORE] add schedule api --- .../backend/global/config/ResponseStatus.java | 2 +- .../controller/ScheduleController.java | 73 +++++++----- .../schedule/dto/ScheduleResponseDto.java | 4 + .../backend/schedule/entity/Schedule.java | 9 ++ .../schedule/service/ScheduleService.java | 104 +++++++++++------- src/main/resources/application.yml | 2 + 6 files changed, 123 insertions(+), 71 deletions(-) diff --git a/src/main/java/com/haemil/backend/global/config/ResponseStatus.java b/src/main/java/com/haemil/backend/global/config/ResponseStatus.java index ecafcb0..47afb0e 100644 --- a/src/main/java/com/haemil/backend/global/config/ResponseStatus.java +++ b/src/main/java/com/haemil/backend/global/config/ResponseStatus.java @@ -16,7 +16,7 @@ public enum ResponseStatus { CONFLICT(409,HttpStatus.Series.CLIENT_ERROR, "Conflict"), PAYLOAD_TOO_LARGE(413,HttpStatus.Series.CLIENT_ERROR, "Payload Too Large"), URI_TOO_LONG(414,HttpStatus.Series.CLIENT_ERROR, "URI Too Long"), - MISSING_REQUIRED_FIELD(400, HttpStatus.Series.CLIENT_ERROR, "Required field(s) are missing"), + MISSING_REQUIRED_FIELD(415, HttpStatus.Series.CLIENT_ERROR, "Required field(s) are missing"), // for mypage status NO_USER(false, 472, "존재하지 않는 유저입니다."), diff --git a/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java b/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java index b59bdc7..aae8d54 100644 --- a/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java +++ b/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java @@ -1,41 +1,34 @@ package com.haemil.backend.schedule.controller; -import com.fasterxml.jackson.databind.ser.Serializers; import com.haemil.backend.global.config.BaseResponse; -import com.haemil.backend.global.config.ResponseStatus; import com.haemil.backend.global.exception.BaseException; +import com.haemil.backend.map.service.MapService; import com.haemil.backend.schedule.dto.ScheduleRequestDto; import com.haemil.backend.schedule.dto.ScheduleResponseDto; import com.haemil.backend.schedule.entity.Schedule; -import com.haemil.backend.schedule.repository.ScheduleRepository; import com.haemil.backend.schedule.service.ScheduleService; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.format.annotation.DateTimeFormat; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; -import java.time.DayOfWeek; import java.time.LocalDate; import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import static com.haemil.backend.global.config.ResponseStatus.BAD_REQUEST; -import static com.haemil.backend.global.config.ResponseStatus.INTERNAL_SERVER_ERROR; @RestController @RequestMapping("/schedules") +@Slf4j public class ScheduleController { public final ScheduleService scheduleService; + public final MapService mapService; @Autowired - public ScheduleController(ScheduleService scheduleService) { + public ScheduleController(ScheduleService scheduleService, MapService mapService) { this.scheduleService = scheduleService; + this.mapService = mapService; } //일정 추가 API @@ -44,24 +37,33 @@ public ResponseEntity createSchedule(@RequestBody ScheduleRequestD try { ScheduleResponseDto createSchedule = scheduleService.createSchedule(scheduleRequestDto); + + // 맵 API 호출하여 맵 URL 얻어오는 부분 + String mapUrl = mapService.getMapUrl(scheduleRequestDto.getPlace()); + // 응답에 맵 URL을 포함하여 리턴 + createSchedule.setMapUrl(mapUrl); + BaseResponse response = new BaseResponse<>(createSchedule); return response.convert(); } catch (BaseException e) { return new BaseResponse<>(e.getStatus()).convert(); + } catch (com.haemil.backend.global.config.BaseException e) { + throw new RuntimeException(e); } } //주어진 날짜에 해당하는 일정 조회 API @GetMapping("/getSchedule") - public ResponseEntity getSchedulesByDate(@RequestParam("localDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate localDate){ - try { - List schedules = scheduleService.getSchedule(localDate); - return new BaseResponse<>(schedules).convert(); - }catch (BaseException e) { - return new BaseResponse<>(e.getStatus()).convert(); - } + public ResponseEntity getSchedulesByDate(@RequestParam("localDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate localDate) { + try { + List schedules = scheduleService.getSchedule(localDate); + return new BaseResponse<>(schedules).convert(); + + } catch (BaseException e) { + return new BaseResponse<>(e.getStatus()).convert(); + } } @@ -72,7 +74,7 @@ public ResponseEntity getTodaySchedules() { List todaySchedules = scheduleService.getTodaySchedules(); return new BaseResponse<>(todaySchedules).convert(); - } catch(BaseException e) { + } catch (BaseException e) { return new BaseResponse<>(e.getStatus()).convert(); } } @@ -80,7 +82,7 @@ public ResponseEntity getTodaySchedules() { //일정 삭제 API @DeleteMapping("/schedule/{scheduleId}") - public ResponseEntity deleteSchedule(@PathVariable Long scheduleId){ + public ResponseEntity deleteSchedule(@PathVariable Long scheduleId) { try { Long deletedId = scheduleService.deleteSchedule(scheduleId); BaseResponse response = new BaseResponse<>(deletedId); @@ -93,15 +95,26 @@ public ResponseEntity deleteSchedule(@PathVariable Long scheduleId //일정 수정 API @PatchMapping("/schedule/{scheduleId}") - public ResponseEntity updateSchedule(@PathVariable Long scheduleId, @RequestBody ScheduleRequestDto requestDto) { - Schedule updatedSchedule = scheduleService.updateSchedule(scheduleId, requestDto); + public ResponseEntity updateSchedule(@PathVariable Long scheduleId, @RequestBody ScheduleRequestDto requestDto) { + try { + Schedule updatedSchedule = scheduleService.updateSchedule(scheduleId, requestDto); - if (updatedSchedule != null) { - return ResponseEntity.ok(updatedSchedule); - } else { - return ResponseEntity.notFound().build(); - } - } + log.debug("requestDto.getPlace() = {}",requestDto.getPlace()); + // 맵 API 호출하여 맵 URL 얻어오는 부분 + String mapUrl = mapService.getMapUrl(requestDto.getPlace()); + System.out.println(mapUrl); + // 응답에 맵 URL을 포함하여 리턴 + updatedSchedule.setMapUrl(mapUrl); + ScheduleResponseDto responseDto = new ScheduleResponseDto(updatedSchedule); + BaseResponse response = new BaseResponse<>(responseDto); + return response.convert(); + } catch (BaseException e) { + return new BaseResponse<>(e.getStatus()).convert(); + + } catch (com.haemil.backend.global.config.BaseException e) { + throw new RuntimeException(e); + } + } } diff --git a/src/main/java/com/haemil/backend/schedule/dto/ScheduleResponseDto.java b/src/main/java/com/haemil/backend/schedule/dto/ScheduleResponseDto.java index 92bbf36..5a27034 100644 --- a/src/main/java/com/haemil/backend/schedule/dto/ScheduleResponseDto.java +++ b/src/main/java/com/haemil/backend/schedule/dto/ScheduleResponseDto.java @@ -4,6 +4,7 @@ import com.haemil.backend.schedule.entity.Schedule; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import java.time.DayOfWeek; import java.time.LocalDate; @@ -13,8 +14,11 @@ //클라이언트에게 응답할 때 필요한 속성들 추가 @NoArgsConstructor @Getter +@Setter public class ScheduleResponseDto { + private String mapUrl; + private Long id; private LocalDate localDate; diff --git a/src/main/java/com/haemil/backend/schedule/entity/Schedule.java b/src/main/java/com/haemil/backend/schedule/entity/Schedule.java index 3ceb895..d691f2c 100644 --- a/src/main/java/com/haemil/backend/schedule/entity/Schedule.java +++ b/src/main/java/com/haemil/backend/schedule/entity/Schedule.java @@ -53,5 +53,14 @@ public class Schedule { @Column(nullable = false) private RepeatType repeatType; + private String mapUrl; + + public String getMapUrl() { + return mapUrl; + } + + public void setMapUrl(String mapUrl) { + this.mapUrl = mapUrl; + } } \ No newline at end of file diff --git a/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java b/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java index 9dddf1f..faa7c49 100644 --- a/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java +++ b/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java @@ -19,6 +19,8 @@ import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.List; import java.util.Optional; @@ -36,10 +38,7 @@ public ScheduleService(ScheduleRepository scheduleRepository) { } //일정 생성 - public ScheduleResponseDto createSchedule(ScheduleRequestDto scheduleRequestDto) throws BaseException{ - - //String responseBody; - + public ScheduleResponseDto createSchedule(ScheduleRequestDto scheduleRequestDto) throws BaseException { try { LocalDate localDate = scheduleRequestDto.getLocalDate(); DayOfWeek dayOfWeek = scheduleRequestDto.getDayOfWeek(); @@ -50,7 +49,6 @@ public ScheduleResponseDto createSchedule(ScheduleRequestDto scheduleRequestDto) String medicine = scheduleRequestDto.getMedicine(); RepeatType repeatType = scheduleRequestDto.getRepeatType(); - Schedule schedule = new Schedule(); schedule.setLocalDate(localDate); @@ -62,7 +60,7 @@ public ScheduleResponseDto createSchedule(ScheduleRequestDto scheduleRequestDto) schedule.setRepeatType(repeatType); schedule.setMedicine(medicine); - log.debug("Schedule fields set...."); + //log.debug("Schedule fields set...."); // missing field 존재 여부 검사 if (localDate == null || dayOfWeek == null || time == null || content == null || done == null || repeatType == null) { @@ -85,13 +83,11 @@ public ScheduleResponseDto createSchedule(ScheduleRequestDto scheduleRequestDto) Schedule createdSchedule = scheduleRepository.save(schedule); return new ScheduleResponseDto(createdSchedule); - - - } catch(MissingRequiredFieldException e) { - log.error("Missing required fields: ", e); + } catch (MissingRequiredFieldException e) { + //log.error("Missing required fields: ", e); throw new BaseException(ResponseStatus.MISSING_REQUIRED_FIELD); } catch (BaseException e) { - log.error("Same field is already exists.: ", e); + //log.error("Same field is already exists.: ", e); throw new BaseException(ResponseStatus.CONFLICT); } @@ -99,20 +95,17 @@ public ScheduleResponseDto createSchedule(ScheduleRequestDto scheduleRequestDto) } //주어진 날짜에 해당하는 일정 조회 - public List getSchedule(LocalDate localDate) throws BaseException{ + public List getSchedule(LocalDate localDate) throws BaseException { try { + //log.debug("1"); List schedules = scheduleRepository.findByLocalDate(localDate); - - log.debug("1"); - if (schedules.isEmpty()) { - throw new BaseException(ResponseStatus.NOT_FOUND); - } - - log.debug("2"); - + //log.debug("2"); + if (schedules.isEmpty()) { + throw new BaseException(ResponseStatus.NOT_FOUND); + } return schedules; - }catch(BaseException e){ - log.error("Error occurred while fetching schedules: " + e.getMessage()); + } catch (BaseException e) { + //log.error("Error occurred while fetching schedules: " + e.getMessage()); throw new BaseException(ResponseStatus.NOT_FOUND); // 현재의 예외를 다시 던져줍니다. } @@ -131,8 +124,8 @@ public List getTodaySchedules() throws BaseException { return todaySchedules; - } catch(BaseException e){ - log.error("Error occurred while fetching schedules: " + e.getMessage()); + } catch (BaseException e) { + //log.error("Error occurred while fetching schedules: " + e.getMessage()); throw new BaseException(ResponseStatus.NOT_FOUND); // 현재의 예외를 다시 던져줍니다. } } @@ -140,30 +133,61 @@ public List getTodaySchedules() throws BaseException { //일정 삭제 @Transactional public Long deleteSchedule(Long scheduleId) { - scheduleRepository.deleteById(scheduleId); - return scheduleId; + try { + Optional optionalSchedule = scheduleRepository.findById(scheduleId); + + if (optionalSchedule.isEmpty()) { + throw new BaseException(ResponseStatus.NOT_FOUND); + } + scheduleRepository.deleteById(scheduleId); + return scheduleId; + } catch (BaseException e) { + //log.error("ID does not exist."); + throw new BaseException(ResponseStatus.NOT_FOUND); + } } //일정 수정 @Transactional public Schedule updateSchedule(Long id, ScheduleRequestDto requestDto) { - Schedule schedule = scheduleRepository.findById(id).orElse(null); - if (schedule == null) { - throw new IllegalArgumentException("해당 아이디가 존재하지 않습니다"); - } + try { + Schedule schedule = scheduleRepository.findById(id).orElse(null); + + if (schedule == null) { + throw new BaseException(ResponseStatus.NOT_FOUND); // 해당 아이디가 존재하지 않는 경우 + } + // Validate the updated schedule's fields + LocalDate newLocalDate = requestDto.getLocalDate(); + DayOfWeek newDayOfWeek = requestDto.getDayOfWeek(); + String newContent = requestDto.getContent(); + Boolean newDone = requestDto.getDone(); + LocalTime newTime = requestDto.getTime(); + String newPlace = requestDto.getPlace(); + String newMedicine = requestDto.getMedicine(); + RepeatType newRepeatType = requestDto.getRepeatType(); + + if (newLocalDate == null || newDayOfWeek == null || newTime == null || newContent == null || newDone == null || newRepeatType == null) { + throw new MissingRequiredFieldException("Required field(s) are missing in updated schedule"); + } - schedule.setLocalDate(requestDto.getLocalDate()); - schedule.setDayOfWeek(requestDto.getDayOfWeek()); - schedule.setContent(requestDto.getContent()); - schedule.setDone(requestDto.getDone()); - schedule.setTime(requestDto.getTime()); - schedule.setPlace(requestDto.getPlace()); - schedule.setRepeatType(requestDto.getRepeatType()); - schedule.setMedicine(requestDto.getMedicine()); + schedule.setLocalDate(newLocalDate); + schedule.setDayOfWeek(newDayOfWeek); + schedule.setContent(newContent); + schedule.setDone(newDone); + schedule.setTime(newTime); + schedule.setPlace(newPlace); + schedule.setRepeatType(newRepeatType); + schedule.setMedicine(newMedicine); - return scheduleRepository.save(schedule); - } + return scheduleRepository.save(schedule); + } catch (MissingRequiredFieldException e) { + //log.error("Missing required fields: ", e); + throw new BaseException(ResponseStatus.MISSING_REQUIRED_FIELD); + } catch (BaseException e) { + throw new BaseException(ResponseStatus.NOT_FOUND); + } + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 7aceaf8..8a1ccf7 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -11,6 +11,8 @@ redis: host: 127.0.0.1 port: 6379 +# Swagger Config + # logging logging: level: From 93173877152ed3c321644998842a605e21dc3fd4 Mon Sep 17 00:00:00 2001 From: SemiLee Date: Sun, 27 Aug 2023 13:08:29 +0900 Subject: [PATCH 5/6] [CHORE] add schedule api --- .../java/com/haemil/backend/global/config/ResponseStatus.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/haemil/backend/global/config/ResponseStatus.java b/src/main/java/com/haemil/backend/global/config/ResponseStatus.java index 47afb0e..f62cf3f 100644 --- a/src/main/java/com/haemil/backend/global/config/ResponseStatus.java +++ b/src/main/java/com/haemil/backend/global/config/ResponseStatus.java @@ -16,7 +16,7 @@ public enum ResponseStatus { CONFLICT(409,HttpStatus.Series.CLIENT_ERROR, "Conflict"), PAYLOAD_TOO_LARGE(413,HttpStatus.Series.CLIENT_ERROR, "Payload Too Large"), URI_TOO_LONG(414,HttpStatus.Series.CLIENT_ERROR, "URI Too Long"), - MISSING_REQUIRED_FIELD(415, HttpStatus.Series.CLIENT_ERROR, "Required field(s) are missing"), + MISSING_REQUIRED_FIELD(416, HttpStatus.Series.CLIENT_ERROR, "Required field(s) are missing"), // for mypage status NO_USER(false, 472, "존재하지 않는 유저입니다."), From 2f3f8a04046bbfaecc056325014412e5ea1050b9 Mon Sep 17 00:00:00 2001 From: SemiLee Date: Wed, 30 Aug 2023 13:59:54 +0900 Subject: [PATCH 6/6] [CHORE] schedule api --- .../backend/global/config/ResponseStatus.java | 1 + .../controller/ScheduleController.java | 11 +++--- .../schedule/dto/ScheduleResponseDto.java | 2 + .../schedule/service/ScheduleService.java | 39 ++++++++++--------- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/haemil/backend/global/config/ResponseStatus.java b/src/main/java/com/haemil/backend/global/config/ResponseStatus.java index f62cf3f..6b85e19 100644 --- a/src/main/java/com/haemil/backend/global/config/ResponseStatus.java +++ b/src/main/java/com/haemil/backend/global/config/ResponseStatus.java @@ -16,6 +16,7 @@ public enum ResponseStatus { CONFLICT(409,HttpStatus.Series.CLIENT_ERROR, "Conflict"), PAYLOAD_TOO_LARGE(413,HttpStatus.Series.CLIENT_ERROR, "Payload Too Large"), URI_TOO_LONG(414,HttpStatus.Series.CLIENT_ERROR, "URI Too Long"), + INVALID_DATA_FORMAT(415, HttpStatus.Series.CLIENT_ERROR, "Invalid Data Format"), MISSING_REQUIRED_FIELD(416, HttpStatus.Series.CLIENT_ERROR, "Required field(s) are missing"), // for mypage status diff --git a/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java b/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java index aae8d54..a2c35d9 100644 --- a/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java +++ b/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java @@ -97,16 +97,17 @@ public ResponseEntity deleteSchedule(@PathVariable Long scheduleId @PatchMapping("/schedule/{scheduleId}") public ResponseEntity updateSchedule(@PathVariable Long scheduleId, @RequestBody ScheduleRequestDto requestDto) { try { - Schedule updatedSchedule = scheduleService.updateSchedule(scheduleId, requestDto); - + Schedule updateSchedule = scheduleService.updateSchedule(scheduleId, requestDto); log.debug("requestDto.getPlace() = {}",requestDto.getPlace()); + // 맵 API 호출하여 맵 URL 얻어오는 부분 String mapUrl = mapService.getMapUrl(requestDto.getPlace()); - System.out.println(mapUrl); + // 응답에 맵 URL을 포함하여 리턴 - updatedSchedule.setMapUrl(mapUrl); + updateSchedule.setMapUrl(mapUrl); + System.out.println(mapUrl); - ScheduleResponseDto responseDto = new ScheduleResponseDto(updatedSchedule); + ScheduleResponseDto responseDto = new ScheduleResponseDto(updateSchedule); BaseResponse response = new BaseResponse<>(responseDto); return response.convert(); diff --git a/src/main/java/com/haemil/backend/schedule/dto/ScheduleResponseDto.java b/src/main/java/com/haemil/backend/schedule/dto/ScheduleResponseDto.java index 5a27034..5aabe09 100644 --- a/src/main/java/com/haemil/backend/schedule/dto/ScheduleResponseDto.java +++ b/src/main/java/com/haemil/backend/schedule/dto/ScheduleResponseDto.java @@ -39,6 +39,8 @@ public class ScheduleResponseDto { public ScheduleResponseDto(Schedule schedule){ + this.mapUrl = schedule.getMapUrl(); + this.id = schedule.getId(); this.localDate = schedule.getLocalDate(); diff --git a/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java b/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java index faa7c49..6efcfa8 100644 --- a/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java +++ b/src/main/java/com/haemil/backend/schedule/service/ScheduleService.java @@ -60,8 +60,6 @@ public ScheduleResponseDto createSchedule(ScheduleRequestDto scheduleRequestDto) schedule.setRepeatType(repeatType); schedule.setMedicine(medicine); - //log.debug("Schedule fields set...."); - // missing field 존재 여부 검사 if (localDate == null || dayOfWeek == null || time == null || content == null || done == null || repeatType == null) { throw new MissingRequiredFieldException("Required field(s) are missing"); @@ -84,10 +82,8 @@ public ScheduleResponseDto createSchedule(ScheduleRequestDto scheduleRequestDto) Schedule createdSchedule = scheduleRepository.save(schedule); return new ScheduleResponseDto(createdSchedule); } catch (MissingRequiredFieldException e) { - //log.error("Missing required fields: ", e); throw new BaseException(ResponseStatus.MISSING_REQUIRED_FIELD); } catch (BaseException e) { - //log.error("Same field is already exists.: ", e); throw new BaseException(ResponseStatus.CONFLICT); } @@ -97,15 +93,12 @@ public ScheduleResponseDto createSchedule(ScheduleRequestDto scheduleRequestDto) //주어진 날짜에 해당하는 일정 조회 public List getSchedule(LocalDate localDate) throws BaseException { try { - //log.debug("1"); List schedules = scheduleRepository.findByLocalDate(localDate); - //log.debug("2"); if (schedules.isEmpty()) { throw new BaseException(ResponseStatus.NOT_FOUND); } return schedules; } catch (BaseException e) { - //log.error("Error occurred while fetching schedules: " + e.getMessage()); throw new BaseException(ResponseStatus.NOT_FOUND); // 현재의 예외를 다시 던져줍니다. } @@ -125,14 +118,14 @@ public List getTodaySchedules() throws BaseException { return todaySchedules; } catch (BaseException e) { - //log.error("Error occurred while fetching schedules: " + e.getMessage()); + throw new BaseException(ResponseStatus.NOT_FOUND); // 현재의 예외를 다시 던져줍니다. } } //일정 삭제 @Transactional - public Long deleteSchedule(Long scheduleId) { + public Long deleteSchedule(Long scheduleId) throws BaseException { try { Optional optionalSchedule = scheduleRepository.findById(scheduleId); @@ -142,7 +135,7 @@ public Long deleteSchedule(Long scheduleId) { scheduleRepository.deleteById(scheduleId); return scheduleId; } catch (BaseException e) { - //log.error("ID does not exist."); + throw new BaseException(ResponseStatus.NOT_FOUND); } } @@ -154,10 +147,6 @@ public Schedule updateSchedule(Long id, ScheduleRequestDto requestDto) { try { Schedule schedule = scheduleRepository.findById(id).orElse(null); - if (schedule == null) { - throw new BaseException(ResponseStatus.NOT_FOUND); // 해당 아이디가 존재하지 않는 경우 - } - // Validate the updated schedule's fields LocalDate newLocalDate = requestDto.getLocalDate(); DayOfWeek newDayOfWeek = requestDto.getDayOfWeek(); String newContent = requestDto.getContent(); @@ -170,7 +159,21 @@ public Schedule updateSchedule(Long id, ScheduleRequestDto requestDto) { if (newLocalDate == null || newDayOfWeek == null || newTime == null || newContent == null || newDone == null || newRepeatType == null) { throw new MissingRequiredFieldException("Required field(s) are missing in updated schedule"); } - + // 여기서 중복 일정 검사를 수행하고 이미 존재하는 경우 예외를 던짐 + List existingSchedules = scheduleRepository.findByLocalDate(newLocalDate); + for (Schedule existingSchedule : existingSchedules) { + System.out.println("existingSchedule: " + existingSchedule); + if ( + existingSchedule.getDayOfWeek() == newDayOfWeek && + existingSchedule.getTime().equals(newTime) && + existingSchedule.getContent().equals(newContent) && + existingSchedule.getDone().equals(newDone) && + existingSchedule.getRepeatType().equals(newRepeatType) && + existingSchedule.getPlace().equals(newPlace) && + existingSchedule.getMedicine().equals(newMedicine)) { + throw new BaseException(ResponseStatus.CONFLICT); + } + } schedule.setLocalDate(newLocalDate); schedule.setDayOfWeek(newDayOfWeek); schedule.setContent(newContent); @@ -180,14 +183,14 @@ public Schedule updateSchedule(Long id, ScheduleRequestDto requestDto) { schedule.setRepeatType(newRepeatType); schedule.setMedicine(newMedicine); + log.debug("newContent = {}", newContent); + return scheduleRepository.save(schedule); } catch (MissingRequiredFieldException e) { - //log.error("Missing required fields: ", e); throw new BaseException(ResponseStatus.MISSING_REQUIRED_FIELD); } catch (BaseException e) { - - throw new BaseException(ResponseStatus.NOT_FOUND); + throw new BaseException(ResponseStatus.CONFLICT); } } }