diff --git a/src/main/java/devkor/com/teamcback/domain/ble/controller/BLEController.java b/src/main/java/devkor/com/teamcback/domain/ble/controller/BLEController.java index 70572a37..a4f5e902 100644 --- a/src/main/java/devkor/com/teamcback/domain/ble/controller/BLEController.java +++ b/src/main/java/devkor/com/teamcback/domain/ble/controller/BLEController.java @@ -1,6 +1,7 @@ package devkor.com.teamcback.domain.ble.controller; import devkor.com.teamcback.domain.ble.dto.request.UpdateBLEReq; +import devkor.com.teamcback.domain.ble.dto.response.BLEDeviceListRes; import devkor.com.teamcback.domain.ble.dto.response.BLETimePatternRes; import devkor.com.teamcback.domain.ble.dto.response.GetBLERes; import devkor.com.teamcback.domain.ble.dto.response.UpdateBLERes; @@ -16,6 +17,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequiredArgsConstructor @RequestMapping("/api/ble") @@ -63,4 +66,14 @@ public CommonResponse getBLETimePattern( return CommonResponse.success(bleService.getBLETimePattern(placeId)); } + @GetMapping("/list") + @Operation(summary = "BLE 가능 place 목록 조회", + description = "ble_device 테이블에 등록된 BLE 장비 목록(id, deviceName, placeId, capacity)을 반환") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "정상 처리 되었습니다.") + }) + public CommonResponse> getBLEDeviceList() { + return CommonResponse.success(bleService.getBLEDeviceList()); + } + } diff --git a/src/main/java/devkor/com/teamcback/domain/ble/dto/response/BLEDeviceListRes.java b/src/main/java/devkor/com/teamcback/domain/ble/dto/response/BLEDeviceListRes.java new file mode 100644 index 00000000..67b68d35 --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/ble/dto/response/BLEDeviceListRes.java @@ -0,0 +1,21 @@ +package devkor.com.teamcback.domain.ble.dto.response; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class BLEDeviceListRes { + + private Long id; + private String deviceName; + private Long placeId; + private Integer capacity; + + public BLEDeviceListRes(Long id, String deviceName, Long placeId, int capacity) { + this.id = id; + this.deviceName = deviceName; + this.placeId = placeId; + this.capacity = capacity; + } +} \ No newline at end of file diff --git a/src/main/java/devkor/com/teamcback/domain/ble/dto/response/BLETimePatternRes.java b/src/main/java/devkor/com/teamcback/domain/ble/dto/response/BLETimePatternRes.java index 6cfab7c2..6b7cf287 100644 --- a/src/main/java/devkor/com/teamcback/domain/ble/dto/response/BLETimePatternRes.java +++ b/src/main/java/devkor/com/teamcback/domain/ble/dto/response/BLETimePatternRes.java @@ -6,10 +6,10 @@ public class BLETimePatternRes { private Long placeId; // 요청 placeId private int[] hours; // {7,10,13,16,19,21,24} - private int[] dayOfWeeks; // {1,2,3,4,5,6,7} (java.time.DayOfWeek 값) + private String[] dayOfWeeks; // {1,2,3,4,5,6,7} (java.time.DayOfWeek 값) private int[][] averages; // [dayIndex][timeIndex] 형태, 각 원소는 반올림된 int - public BLETimePatternRes(Long placeId, int[] timeSlots, int[] dayOfWeeks, int[][] averages) { + public BLETimePatternRes(Long placeId, int[] timeSlots, String[] dayOfWeeks, int[][] averages) { this.placeId = placeId; this.hours = timeSlots; this.dayOfWeeks = dayOfWeeks; diff --git a/src/main/java/devkor/com/teamcback/domain/ble/service/BLEService.java b/src/main/java/devkor/com/teamcback/domain/ble/service/BLEService.java index 98104f22..9df6c4eb 100644 --- a/src/main/java/devkor/com/teamcback/domain/ble/service/BLEService.java +++ b/src/main/java/devkor/com/teamcback/domain/ble/service/BLEService.java @@ -2,6 +2,7 @@ import devkor.com.teamcback.domain.ble.dto.request.UpdateBLEReq; +import devkor.com.teamcback.domain.ble.dto.response.BLEDeviceListRes; import devkor.com.teamcback.domain.ble.dto.response.BLETimePatternRes; import devkor.com.teamcback.domain.ble.dto.response.GetBLERes; import devkor.com.teamcback.domain.ble.dto.response.UpdateBLERes; @@ -21,6 +22,7 @@ import java.time.Duration; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import static devkor.com.teamcback.global.response.ResultCode.NOT_FOUND_PLACE; @@ -37,6 +39,9 @@ public class BLEService { private static final int[] TIME_SLOTS = {7, 10, 13, 16, 19, 22}; //요일 라벨 (1=월요일, 7=일요일) private static final int[] DAY_OF_WEEKS = {1, 2, 3, 4, 5, 6, 7}; + private static final String[] DAY_OF_WEEK_LABELS = { + "mon", "tue", "wed", "thu", "fri", "sat", "sun" + }; @Transactional public UpdateBLERes updateBLE(UpdateBLEReq updateBLEReq) { @@ -83,9 +88,10 @@ public GetBLERes getBLE(Long placeId) { status = BLEstatus.FAILURE; } else status = latest.getLastStatus(); - // 사람 수를 예측 후 10의 배수로 리턴 + int people = getBlEPeople(latest.getLastCount(), device); - people = (int) Math.round(people / 10.0) * 10; + // 사람 수를 예측 후 10의 배수로 리턴: 이젠 필요 없음 + //people = (int) Math.round(people / 10.0) * 10; return new GetBLERes(device, latest, status, people); } @@ -157,9 +163,27 @@ public BLETimePatternRes getBLETimePattern(Long placeId) { return new BLETimePatternRes( placeId, TIME_SLOTS, - DAY_OF_WEEKS, + DAY_OF_WEEK_LABELS, averages ); } + @Transactional(readOnly = true) + public List getBLEDeviceList() { + List devices = bledeviceRepository.findAll(); + List result = new ArrayList<>(); + + for (BLEDevice device : devices) { + Long placeId = null; + if (device.getPlace() != null) { + placeId = device.getPlace().getId(); + } + + BLEDeviceListRes dto = new BLEDeviceListRes(device.getId(), device.getDeviceName(), placeId, device.getCapacity()); + + result.add(dto); + } + return result; + } + } diff --git a/src/main/java/devkor/com/teamcback/domain/common/entity/Weekday.java b/src/main/java/devkor/com/teamcback/domain/common/entity/Weekday.java new file mode 100644 index 00000000..dfee3b0f --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/common/entity/Weekday.java @@ -0,0 +1,5 @@ +package devkor.com.teamcback.domain.common.entity; + +public enum Weekday { + MON, TUE, WED, THU, FRI, SAT, SUN +} diff --git a/src/main/java/devkor/com/teamcback/domain/course/controller/CourseController.java b/src/main/java/devkor/com/teamcback/domain/course/controller/CourseController.java new file mode 100644 index 00000000..8691cd9d --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/course/controller/CourseController.java @@ -0,0 +1,35 @@ +package devkor.com.teamcback.domain.course.controller; + +import devkor.com.teamcback.domain.course.dto.response.GetCourseListRes; +import devkor.com.teamcback.domain.course.service.CourseService; +import devkor.com.teamcback.domain.place.dto.response.GetPlaceListRes; +import devkor.com.teamcback.global.response.CommonResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/places") +public class CourseController { + private final CourseService courseService; + + @GetMapping("/{placeId}/courses") + @Operation(summary = "장소 id로 강의 리스트 검색", + description = "강의 list 반환") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "정상 처리 되었습니다."), + @ApiResponse(responseCode = "404", description = "장소를 찾을 수 없습니다.", + content = @Content(schema = @Schema(implementation = CommonResponse.class))), + @ApiResponse(responseCode = "401", description = "권한이 없습니다.", + content = @Content(schema = @Schema(implementation = CommonResponse.class))), + }) + public CommonResponse getCourseList(@Parameter(name = "placeId", description = "장소 ID", example = "4424", required = true) @PathVariable Long placeId) { + return CommonResponse.success(courseService.getCourseList(placeId)); + } +} diff --git a/src/main/java/devkor/com/teamcback/domain/course/dto/response/GetCourseListRes.java b/src/main/java/devkor/com/teamcback/domain/course/dto/response/GetCourseListRes.java new file mode 100644 index 00000000..d94b381a --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/course/dto/response/GetCourseListRes.java @@ -0,0 +1,22 @@ +package devkor.com.teamcback.domain.course.dto.response; + +import devkor.com.teamcback.domain.common.entity.Weekday; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; + +import java.util.List; +import java.util.Map; + +@Schema(description = "강의 List 조회 응답 dto") +@Getter +public class GetCourseListRes { + private Long placeId; + private String placeName; + private Map> courses; + + public GetCourseListRes(Long placeId, String placeName, Map> courses) { + this.placeId = placeId; + this.placeName = placeName; + this.courses = courses; + } +} diff --git a/src/main/java/devkor/com/teamcback/domain/course/dto/response/GetCourseRes.java b/src/main/java/devkor/com/teamcback/domain/course/dto/response/GetCourseRes.java new file mode 100644 index 00000000..7033d4b6 --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/course/dto/response/GetCourseRes.java @@ -0,0 +1,37 @@ +package devkor.com.teamcback.domain.course.dto.response; + +import devkor.com.teamcback.domain.course.entity.Course; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; + +@Schema(description = "강의 응답 dto") +@Getter +public class GetCourseRes { + private Long courseId; + private int year; + private String term; + private String subject; + private int unit; + private String code; + private String section; + private String type; + private String department; + private String professor; + private String weekday; + private int classTime; + + public GetCourseRes(Course course, String weekday, int classTime) { + this.courseId = course.getId(); + this.year = course.getYear(); + this.term = course.getTerm().toString(); + this.subject = course.getSubject(); + this.unit = course.getUnit(); + this.code = course.getCode(); + this.section = course.getSection(); + this.type = course.getType(); + this.department = course.getDepartment(); + this.professor = course.getProfessor(); + this.weekday = weekday; + this.classTime = classTime; + } +} diff --git a/src/main/java/devkor/com/teamcback/domain/course/entity/Course.java b/src/main/java/devkor/com/teamcback/domain/course/entity/Course.java new file mode 100644 index 00000000..c55e764a --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/course/entity/Course.java @@ -0,0 +1,44 @@ +package devkor.com.teamcback.domain.course.entity; + +import devkor.com.teamcback.domain.common.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Table(name = "tb_course") +@NoArgsConstructor +public class Course extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private int year; + + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private Term term; + + @Column(nullable = false) + private String subject; + + @Column(nullable = false) + private int unit; + + @Column(nullable = false) + private String code; + + @Column(nullable = false) + private String section; + + @Column(nullable = false) + private String type; + + @Column(nullable = false) + private String department; + + @Column(nullable = false) + private String professor; +} diff --git a/src/main/java/devkor/com/teamcback/domain/course/entity/CourseDetail.java b/src/main/java/devkor/com/teamcback/domain/course/entity/CourseDetail.java new file mode 100644 index 00000000..238efe2c --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/course/entity/CourseDetail.java @@ -0,0 +1,42 @@ +package devkor.com.teamcback.domain.course.entity; + +import devkor.com.teamcback.domain.common.entity.BaseEntity; +import devkor.com.teamcback.domain.common.entity.Weekday; +import devkor.com.teamcback.domain.place.entity.Place; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@Getter +@Table(name = "tb_course_detail") +@NoArgsConstructor +public class CourseDetail extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column + @Enumerated(EnumType.STRING) + private Weekday weekday; + + @Column(nullable = false) + private int start; + + @Column(nullable = false) + private int end; + + @Column + private String placeName; + + @ManyToOne + @JoinColumn(name = "course_id") + private Course course; + + @Setter + @OneToOne + @JoinColumn(name = "place_id") + private Place place; + +} diff --git a/src/main/java/devkor/com/teamcback/domain/course/entity/Term.java b/src/main/java/devkor/com/teamcback/domain/course/entity/Term.java new file mode 100644 index 00000000..b9a0c2d8 --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/course/entity/Term.java @@ -0,0 +1,5 @@ +package devkor.com.teamcback.domain.course.entity; + +public enum Term { + SPRING, SUMMER, FALL, WINTER +} diff --git a/src/main/java/devkor/com/teamcback/domain/course/repository/CourseDetailRepository.java b/src/main/java/devkor/com/teamcback/domain/course/repository/CourseDetailRepository.java new file mode 100644 index 00000000..c5d3e262 --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/course/repository/CourseDetailRepository.java @@ -0,0 +1,14 @@ +package devkor.com.teamcback.domain.course.repository; + +import devkor.com.teamcback.domain.course.entity.CourseDetail; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +public interface CourseDetailRepository extends JpaRepository { + @Query(value = "SELECT c FROM CourseDetail c WHERE c.place IS NULL ORDER BY c.id asc LIMIT :count") + List findLimitByPlaceIdIsNull(int count); + + List findByPlaceId(Long placeId); +} diff --git a/src/main/java/devkor/com/teamcback/domain/course/repository/CourseRepository.java b/src/main/java/devkor/com/teamcback/domain/course/repository/CourseRepository.java new file mode 100644 index 00000000..890d0c0a --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/course/repository/CourseRepository.java @@ -0,0 +1,7 @@ +package devkor.com.teamcback.domain.course.repository; + +import devkor.com.teamcback.domain.course.entity.Course; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CourseRepository extends JpaRepository { +} diff --git a/src/main/java/devkor/com/teamcback/domain/course/scheduler/CourseScheduler.java b/src/main/java/devkor/com/teamcback/domain/course/scheduler/CourseScheduler.java new file mode 100644 index 00000000..f9cb4c86 --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/course/scheduler/CourseScheduler.java @@ -0,0 +1,54 @@ +package devkor.com.teamcback.domain.course.scheduler; + +import devkor.com.teamcback.domain.common.LocationType; +import devkor.com.teamcback.domain.course.entity.CourseDetail; +import devkor.com.teamcback.domain.course.repository.CourseDetailRepository; +import devkor.com.teamcback.domain.place.entity.Place; +import devkor.com.teamcback.domain.place.repository.PlaceRepository; +import devkor.com.teamcback.domain.search.dto.response.GlobalSearchListRes; +import devkor.com.teamcback.domain.search.service.SearchService; +import devkor.com.teamcback.global.redis.RedisLockUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Slf4j(topic = "Course Scheduler") +@Component +@RequiredArgsConstructor +public class CourseScheduler { + private final RedisLockUtil redisLockUtil; + private final CourseDetailRepository courseDetailRepository; + private final PlaceRepository placeRepository; + private final SearchService searchService; + + //@EventListener(ApplicationReadyEvent.class) + //@Transactional + public void updateCourseDetails() { + redisLockUtil.executeWithLock("course_lock", 1, 300, () -> { + + log.info("강의 장소 업데이트"); + + List courseDetails = courseDetailRepository.findLimitByPlaceIdIsNull(500); + + for (CourseDetail courseDetail : courseDetails) { + String placeName = courseDetail.getPlaceName(); + if(placeName.equals("장소정보없음")) continue; + + GlobalSearchListRes resList = searchService.globalSearch(placeName, null); + + if(!resList.getList().isEmpty() && resList.getList().get(0).getLocationType() == LocationType.PLACE) { + Place place = placeRepository.findById(resList.getList().get(0).getId()).orElseThrow(); + courseDetail.setPlace(place); + } + + } + return null; + }); + + } +} diff --git a/src/main/java/devkor/com/teamcback/domain/course/service/CourseService.java b/src/main/java/devkor/com/teamcback/domain/course/service/CourseService.java new file mode 100644 index 00000000..be1a18f0 --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/course/service/CourseService.java @@ -0,0 +1,65 @@ +package devkor.com.teamcback.domain.course.service; + +import devkor.com.teamcback.domain.common.entity.Weekday; +import devkor.com.teamcback.domain.course.dto.response.GetCourseListRes; +import devkor.com.teamcback.domain.course.dto.response.GetCourseRes; +import devkor.com.teamcback.domain.course.entity.CourseDetail; +import devkor.com.teamcback.domain.course.entity.Term; +import devkor.com.teamcback.domain.course.repository.CourseDetailRepository; +import devkor.com.teamcback.domain.course.repository.CourseRepository; +import devkor.com.teamcback.domain.place.entity.Place; +import devkor.com.teamcback.domain.place.repository.PlaceRepository; +import devkor.com.teamcback.domain.schoolcalendar.repository.SchoolCalendarRepository; +import devkor.com.teamcback.global.exception.exception.GlobalException; +import devkor.com.teamcback.global.response.ResultCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.Year; +import java.util.*; + +@Service +@RequiredArgsConstructor +public class CourseService { + + private final PlaceRepository placeRepository; + private final CourseRepository courseRepository; + private final CourseDetailRepository courseDetailRepository; + private final SchoolCalendarRepository schoolCalendarRepository; + + public GetCourseListRes getCourseList(Long placeId) { + + int year = Year.now().getValue(); + Term term = getTerm(); + + Place place = getPlaceById(placeId); + + List courseDetailList = courseDetailRepository.findByPlaceId(placeId); + + Map> map = new LinkedHashMap<>(); + for(Weekday weekday : Weekday.values()) { + map.put(weekday, new ArrayList<>()); + for(CourseDetail courseDetail : courseDetailList.stream().filter(courseDetail -> courseDetail.getWeekday() == weekday).sorted(Comparator.comparing(CourseDetail::getStart)).toList()) { + if(courseDetail.getCourse().getYear() == year && courseDetail.getCourse().getTerm() == term) { + for(int i = courseDetail.getStart(); i <= courseDetail.getEnd(); i++) { + map.get(weekday).add(new GetCourseRes(courseDetail.getCourse(), weekday.name(), i)); + } + } + } + } + + return new GetCourseListRes(placeId, place.getBuilding().getName() + " " + place.getName(), map); + } + + private Term getTerm() { + return schoolCalendarRepository.findById(3L).orElseThrow(() -> new GlobalException(ResultCode.NOT_FOUND_SCHOOL_CALENDAR)).getTerm(); + } + + private Place getPlaceById(Long id) { + return placeRepository.findById(id).orElseThrow(() -> new GlobalException(ResultCode.NOT_FOUND_PLACE)); + } + +/* private Course getCourseById(Long id) { + return courseRepository.findById(id).orElseThrow(() -> new GlobalException(ResultCode.NOT_FOUND_COURSE)); + }*/ +} diff --git a/src/main/java/devkor/com/teamcback/domain/place/entity/CafeteriaMenu.java b/src/main/java/devkor/com/teamcback/domain/place/entity/CafeteriaMenu.java index 1ad5fe4c..8f9f627f 100644 --- a/src/main/java/devkor/com/teamcback/domain/place/entity/CafeteriaMenu.java +++ b/src/main/java/devkor/com/teamcback/domain/place/entity/CafeteriaMenu.java @@ -25,6 +25,7 @@ public class CafeteriaMenu extends BaseEntity { private String kind; @Getter + @Setter @Column(nullable = false, length = 500) // 식단 내용 private String menu; diff --git a/src/main/java/devkor/com/teamcback/domain/place/service/CafeteriaMenuService.java b/src/main/java/devkor/com/teamcback/domain/place/service/CafeteriaMenuService.java index cee50ada..5f918a3b 100644 --- a/src/main/java/devkor/com/teamcback/domain/place/service/CafeteriaMenuService.java +++ b/src/main/java/devkor/com/teamcback/domain/place/service/CafeteriaMenuService.java @@ -190,12 +190,17 @@ else if(placeId == 2490) { // 메뉴가 존재하는 경우 if(!content.equals(NO_MENU_INFO)) { - // 메뉴가 변경된 경우 - if (savedMenu == null || !savedMenu.getMenu().equals(content)) { + // 메뉴가 추가된 경우 + if (savedMenu == null) { // 학식 메뉴 저장 cafeteriaMenuRepository.save(new CafeteriaMenu(date, kind, content, placeId)); } + // 메뉴가 변경된 경우 + else if(!savedMenu.getMenu().equals(content)) { + savedMenu.setMenu(content); + } + // 당일에 해당하는 경우 식당 설명 수정 if(date.equals(LocalDate.now())) { if(!updated) { diff --git a/src/main/java/devkor/com/teamcback/domain/schoolcalendar/controller/AdminSchoolCalendarController.java b/src/main/java/devkor/com/teamcback/domain/schoolcalendar/controller/AdminSchoolCalendarController.java index 51a13b8c..400ea043 100644 --- a/src/main/java/devkor/com/teamcback/domain/schoolcalendar/controller/AdminSchoolCalendarController.java +++ b/src/main/java/devkor/com/teamcback/domain/schoolcalendar/controller/AdminSchoolCalendarController.java @@ -1,5 +1,6 @@ package devkor.com.teamcback.domain.schoolcalendar.controller; +import devkor.com.teamcback.domain.schoolcalendar.dto.request.UpdateSchoolCalendarTermReq; import devkor.com.teamcback.domain.schoolcalendar.dto.response.UpdateSchoolCalendarRes; import devkor.com.teamcback.domain.schoolcalendar.service.SchoolCalendarService; import devkor.com.teamcback.global.response.CommonResponse; @@ -47,4 +48,18 @@ public CommonResponse updateKoyeonActive() { return CommonResponse.success(schoolCalendarService.updateKoyeonActive()); } + /*** + * 학기 수정 + */ + @PutMapping("/term") + @Operation(summary = "학기", description = "학기") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "정상 처리 되었습니다."), + @ApiResponse(responseCode = "404", description = "Not Found", + content = @Content(schema = @Schema(implementation = CommonResponse.class))), + }) + public CommonResponse updateTerm(UpdateSchoolCalendarTermReq req) { + return CommonResponse.success(schoolCalendarService.updateTerm(req)); + } + } diff --git a/src/main/java/devkor/com/teamcback/domain/schoolcalendar/controller/SchoolCalendarController.java b/src/main/java/devkor/com/teamcback/domain/schoolcalendar/controller/SchoolCalendarController.java index 409913bd..6e06dc44 100644 --- a/src/main/java/devkor/com/teamcback/domain/schoolcalendar/controller/SchoolCalendarController.java +++ b/src/main/java/devkor/com/teamcback/domain/schoolcalendar/controller/SchoolCalendarController.java @@ -1,6 +1,7 @@ package devkor.com.teamcback.domain.schoolcalendar.controller; import devkor.com.teamcback.domain.schoolcalendar.dto.response.GetSchoolCalendarRes; +import devkor.com.teamcback.domain.schoolcalendar.dto.response.GetSchoolCalendarTermRes; import devkor.com.teamcback.domain.schoolcalendar.service.SchoolCalendarService; import devkor.com.teamcback.global.response.CommonResponse; import io.swagger.v3.oas.annotations.Operation; @@ -47,4 +48,18 @@ public CommonResponse isKoyeon() { return CommonResponse.success(schoolCalendarService.isKoyeon()); } + /*** + * 학기 반환 + */ + @GetMapping("/term") + @Operation(summary = "현재 학기 반환", description = "1학기/여름계절/2학기/겨울계절") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "정상 처리 되었습니다."), + @ApiResponse(responseCode = "404", description = "Not Found", + content = @Content(schema = @Schema(implementation = CommonResponse.class))), + }) + public CommonResponse getTerm() { + return CommonResponse.success(schoolCalendarService.getTerm()); + } + } diff --git a/src/main/java/devkor/com/teamcback/domain/schoolcalendar/dto/request/UpdateSchoolCalendarTermReq.java b/src/main/java/devkor/com/teamcback/domain/schoolcalendar/dto/request/UpdateSchoolCalendarTermReq.java new file mode 100644 index 00000000..cf4c93c6 --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/schoolcalendar/dto/request/UpdateSchoolCalendarTermReq.java @@ -0,0 +1,15 @@ +package devkor.com.teamcback.domain.schoolcalendar.dto.request; + +import devkor.com.teamcback.domain.course.entity.Term; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; + +@Schema(description = "학기 업데이트") +@Getter +public class UpdateSchoolCalendarTermReq { + private Term term; + + public UpdateSchoolCalendarTermReq(Term term) { + this.term = term; + } +} diff --git a/src/main/java/devkor/com/teamcback/domain/schoolcalendar/dto/response/GetSchoolCalendarTermRes.java b/src/main/java/devkor/com/teamcback/domain/schoolcalendar/dto/response/GetSchoolCalendarTermRes.java new file mode 100644 index 00000000..535b664d --- /dev/null +++ b/src/main/java/devkor/com/teamcback/domain/schoolcalendar/dto/response/GetSchoolCalendarTermRes.java @@ -0,0 +1,17 @@ +package devkor.com.teamcback.domain.schoolcalendar.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; + +@Schema(description = "학기 응답 dto") +@Getter +public class GetSchoolCalendarTermRes { + + @Schema(description = "학기", example = "SPRING") + private String term; + + public GetSchoolCalendarTermRes(String term) { + this.term = term; + } + +} diff --git a/src/main/java/devkor/com/teamcback/domain/schoolcalendar/entity/SchoolCalendar.java b/src/main/java/devkor/com/teamcback/domain/schoolcalendar/entity/SchoolCalendar.java index 9bd3cdfd..1e8bf04f 100644 --- a/src/main/java/devkor/com/teamcback/domain/schoolcalendar/entity/SchoolCalendar.java +++ b/src/main/java/devkor/com/teamcback/domain/schoolcalendar/entity/SchoolCalendar.java @@ -1,6 +1,7 @@ package devkor.com.teamcback.domain.schoolcalendar.entity; import devkor.com.teamcback.domain.common.entity.BaseEntity; +import devkor.com.teamcback.domain.course.entity.Term; import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; @@ -19,6 +20,14 @@ public class SchoolCalendar extends BaseEntity { private String name; @Setter - @Column(nullable = false) + @Column private boolean isActive; + + @Column + @Enumerated(EnumType.STRING) + private Term term; + + public void updateTerm(Term term) { + this.term = term; + } } diff --git a/src/main/java/devkor/com/teamcback/domain/schoolcalendar/service/SchoolCalendarService.java b/src/main/java/devkor/com/teamcback/domain/schoolcalendar/service/SchoolCalendarService.java index 87a0e04d..edb0751a 100644 --- a/src/main/java/devkor/com/teamcback/domain/schoolcalendar/service/SchoolCalendarService.java +++ b/src/main/java/devkor/com/teamcback/domain/schoolcalendar/service/SchoolCalendarService.java @@ -1,6 +1,8 @@ package devkor.com.teamcback.domain.schoolcalendar.service; +import devkor.com.teamcback.domain.schoolcalendar.dto.request.UpdateSchoolCalendarTermReq; import devkor.com.teamcback.domain.schoolcalendar.dto.response.GetSchoolCalendarRes; +import devkor.com.teamcback.domain.schoolcalendar.dto.response.GetSchoolCalendarTermRes; import devkor.com.teamcback.domain.schoolcalendar.dto.response.UpdateSchoolCalendarRes; import devkor.com.teamcback.domain.schoolcalendar.entity.SchoolCalendar; import devkor.com.teamcback.domain.schoolcalendar.repository.SchoolCalendarRepository; @@ -30,6 +32,13 @@ public GetSchoolCalendarRes isKoyeon() { return new GetSchoolCalendarRes(findSchoolCalendar(2L)); } + /** + * 학기 반환 + */ + public GetSchoolCalendarTermRes getTerm() { + return new GetSchoolCalendarTermRes(findSchoolCalendar(3L).getTerm().toString()); + } + /** * 방학 여부 수정(토글) */ @@ -48,6 +57,16 @@ public UpdateSchoolCalendarRes updateKoyeonActive() { return new UpdateSchoolCalendarRes(); } + /** + * 학기 수정 + */ + @Transactional + public UpdateSchoolCalendarRes updateTerm(UpdateSchoolCalendarTermReq req) { + SchoolCalendar schoolCalendar = findSchoolCalendar(3L); + schoolCalendar.updateTerm(req.getTerm()); + return new UpdateSchoolCalendarRes(); + } + /** * 방학 여부 반환 */ diff --git a/src/main/java/devkor/com/teamcback/domain/search/dto/response/SearchPlaceRes.java b/src/main/java/devkor/com/teamcback/domain/search/dto/response/SearchPlaceRes.java index b9546750..54e7228f 100644 --- a/src/main/java/devkor/com/teamcback/domain/search/dto/response/SearchPlaceRes.java +++ b/src/main/java/devkor/com/teamcback/domain/search/dto/response/SearchPlaceRes.java @@ -58,8 +58,8 @@ public class SearchPlaceRes { public SearchPlaceRes(Place place, String imageUrl) { this.id = place.getId(); - this.buildingId = place.getBuilding().getId(); - this.buildingName = place.getBuilding().getName(); + this.buildingId = place.getBuilding() != null ? place.getBuilding().getId() : null; + this.buildingName = place.getBuilding() != null ? place.getBuilding().getName() : ""; this.name = place.getName(); this.imageUrl = imageUrl != null ? imageUrl : place.getImageUrl(); this.detail = place.getDetail(); @@ -67,14 +67,14 @@ public SearchPlaceRes(Place place, String imageUrl) { this.saturdayOperatingTime = place.getSaturdayOperatingTime(); this.sundayOperatingTime = place.getSundayOperatingTime(); this.isOperating = place.isOperating(); - this.needStudentCard = place.getBuilding().isNeedStudentCard(); + this.needStudentCard = place.getBuilding() != null ? place.getBuilding().isNeedStudentCard() : false; this.floor = place.getFloor(); - this.address = place.getBuilding().getAddress(); + this.address = place.getBuilding() != null ? place.getBuilding().getAddress() : ""; this.plugAvailability = place.isPlugAvailability(); - this.longitude = place.getNode().getLongitude(); - this.latitude = place.getNode().getLatitude(); - this.xCoord = place.getNode().getXCoord(); - this.yCoord = place.getNode().getYCoord(); + this.longitude = place.getNode() != null ? place.getNode().getLongitude() : null; + this.latitude = place.getNode() != null ? place.getNode().getLatitude() : null; + this.xCoord = place.getNode() != null ? place.getNode().getXCoord() : null; + this.yCoord = place.getNode() != null ? place.getNode().getYCoord() : null; this.locationType = LocationType.PLACE; this.placeType = place.getType(); this.description = place.getDescription(); diff --git a/src/main/java/devkor/com/teamcback/global/response/ResultCode.java b/src/main/java/devkor/com/teamcback/global/response/ResultCode.java index 319fa0e0..504d7e7b 100644 --- a/src/main/java/devkor/com/teamcback/global/response/ResultCode.java +++ b/src/main/java/devkor/com/teamcback/global/response/ResultCode.java @@ -88,7 +88,10 @@ public enum ResultCode { NOT_FOUND_DEVICE_NAME(HttpStatus.NOT_FOUND, 13001, "해당 device 이름이 없습니다."), EXISTING_DEVICE_NAME(HttpStatus.CONFLICT, 13002, "중복되는 device 이름입니다."), NO_DATA_FOR_DEVICE(HttpStatus.NOT_FOUND, 13003, "device에 해당하는 정보가 없습니다."), - EXISTING_PLACE_FOR_DEVICE(HttpStatus.CONFLICT, 13004, "중복되는 device placeId입니다.") + EXISTING_PLACE_FOR_DEVICE(HttpStatus.CONFLICT, 13004, "중복되는 device placeId입니다."), + + // 강의 14000번대 + NOT_FOUND_COURSE(HttpStatus.NOT_FOUND, 14000, "강의를 찾을 수 없습니다.") ; private final HttpStatus status;