diff --git a/src/main/java/com/umc/networkingService/domain/schedule/controller/ScheduleController.java b/src/main/java/com/umc/networkingService/domain/schedule/controller/ScheduleController.java index 2e4b23a0..4019cd5b 100644 --- a/src/main/java/com/umc/networkingService/domain/schedule/controller/ScheduleController.java +++ b/src/main/java/com/umc/networkingService/domain/schedule/controller/ScheduleController.java @@ -31,9 +31,10 @@ public class ScheduleController { @ApiResponses(value = { @ApiResponse(responseCode = "COMMON200", description = "성공") }) - public BaseResponse getScheduleLists(@RequestParam LocalDate date) { + public BaseResponse getScheduleLists(@CurrentMember Member member, + @RequestParam LocalDate date) { - return BaseResponse.onSuccess((scheduleService.getScheduleLists(date))); + return BaseResponse.onSuccess((scheduleService.getScheduleLists(member, date))); } @Operation(summary = "일정 조회(상세조회)", description = "홈화면의 달력에서 일정을 상세조회하는 API입니다.") @@ -55,8 +56,9 @@ public BaseResponse getScheduleDetail(@CurrentMember Member memb @ApiResponses(value = { @ApiResponse(responseCode = "COMMON200", description = "성공") }) - public BaseResponse getSchedule(@RequestParam LocalDate date) { + public BaseResponse getSchedule(@CurrentMember Member member, + @RequestParam LocalDate date) { - return BaseResponse.onSuccess(scheduleService.getCalendarByMonth(date)); + return BaseResponse.onSuccess(scheduleService.getCalendarByMonth(member, date)); } } \ No newline at end of file diff --git a/src/main/java/com/umc/networkingService/domain/schedule/controller/StaffScheduleController.java b/src/main/java/com/umc/networkingService/domain/schedule/controller/StaffScheduleController.java index f4b514a8..0414d6a3 100644 --- a/src/main/java/com/umc/networkingService/domain/schedule/controller/StaffScheduleController.java +++ b/src/main/java/com/umc/networkingService/domain/schedule/controller/StaffScheduleController.java @@ -16,7 +16,7 @@ import java.util.UUID; -@Tag(name = "운영진 스케줄 API", description = "운영진 스케줄 관련 API") +@Tag(name = "운영진 일정 API", description = "운영진 일정 관련 API") @RestController @RequiredArgsConstructor @RequestMapping("/staff/schedules") diff --git a/src/main/java/com/umc/networkingService/domain/schedule/service/ScheduleService.java b/src/main/java/com/umc/networkingService/domain/schedule/service/ScheduleService.java index 2e6e0bfd..18870b6d 100644 --- a/src/main/java/com/umc/networkingService/domain/schedule/service/ScheduleService.java +++ b/src/main/java/com/umc/networkingService/domain/schedule/service/ScheduleService.java @@ -12,14 +12,11 @@ import java.util.UUID; public interface ScheduleService { - ScheduleInfoSummariesInCalendar getCalendarByMonth(LocalDate date); + ScheduleInfoSummariesInCalendar getCalendarByMonth(Member member, LocalDate date); ScheduleId createSchedule(Member member, CreateSchedule request); ScheduleId updateSchedule(Member member, UUID scheduleId, UpdateSchedule request); - ScheduleId deleteSchedule(Member member, UUID scheduleId); - - ScheduleInfoSummaryLists getScheduleLists(LocalDate date); - + ScheduleInfoSummaryLists getScheduleLists(Member member, LocalDate date); ScheduleDetail getScheduleDetail(Member member, UUID scheduleId); } \ No newline at end of file diff --git a/src/main/java/com/umc/networkingService/domain/schedule/service/ScheduleServiceImpl.java b/src/main/java/com/umc/networkingService/domain/schedule/service/ScheduleServiceImpl.java index 07706b94..f17335a4 100644 --- a/src/main/java/com/umc/networkingService/domain/schedule/service/ScheduleServiceImpl.java +++ b/src/main/java/com/umc/networkingService/domain/schedule/service/ScheduleServiceImpl.java @@ -2,6 +2,7 @@ import com.umc.networkingService.domain.board.entity.HostType; import com.umc.networkingService.domain.member.entity.Member; +import com.umc.networkingService.domain.member.service.MemberService; import com.umc.networkingService.domain.schedule.dto.request.ScheduleRequest.CreateSchedule; import com.umc.networkingService.domain.schedule.dto.request.ScheduleRequest.UpdateSchedule; import com.umc.networkingService.domain.schedule.dto.response.ScheduleResponse.*; @@ -25,19 +26,29 @@ public class ScheduleServiceImpl implements ScheduleService { private final ScheduleRepository scheduleRepository; private final ScheduleMapper scheduleMapper; + private final MemberService memberService; + @Override - public ScheduleInfoSummariesInCalendar getCalendarByMonth(LocalDate date) { + public ScheduleInfoSummariesInCalendar getCalendarByMonth(Member loginMember, LocalDate date) { + + Member member = memberService.loadEntity(loginMember.getId()); + + List schedulesLists = validateSchedules(member, + scheduleRepository.findSchedulesByYearAndMonth(date)); return scheduleMapper.toScheduleInfoSummariesInCalendar( - scheduleRepository.findSchedulesByYearAndMonth(date).stream() - .map(schedule -> scheduleMapper.toScheduleInfoSummaryInCalendar(schedule)) + schedulesLists.stream() + .map(scheduleMapper::toScheduleInfoSummaryInCalendar) .toList()); } @Override - public ScheduleInfoSummaryLists getScheduleLists(LocalDate date) { + public ScheduleInfoSummaryLists getScheduleLists(Member loginMember, LocalDate date) { + + Member member = memberService.loadEntity(loginMember.getId()); - List schedulesLists = scheduleRepository.findSchedulesByYearAndMonth(date); + List schedulesLists = validateSchedules(member, + scheduleRepository.findSchedulesByYearAndMonth(date)); List campusSchedules = filterSchedulesByHostType(schedulesLists, HostType.CAMPUS); @@ -51,13 +62,36 @@ public ScheduleInfoSummaryLists getScheduleLists(LocalDate date) { private List filterSchedulesByHostType(List schedules, HostType hostType) { return schedules.stream() .filter(schedule -> schedule.getHostType().equals(hostType)) - .map(schedule -> scheduleMapper.toScheduleInfoSummary(schedule)) + .map(scheduleMapper::toScheduleInfoSummary) .toList(); } + private List validateSchedules(Member member, List schedules) { + return schedules.stream() + .filter(schedule -> validateScheduleUniversityAndBranch(member, schedule)) + .filter(schedule -> validateScheduleSemester(member, schedule)) + .toList(); + } + + private boolean validateScheduleUniversityAndBranch(Member member, Schedule schedule) { + if (schedule.getHostType().equals(HostType.CENTER)) + return true; + if (schedule.getHostType().equals(HostType.BRANCH) + && member.getBranch() == schedule.getWriter().getBranch()) + return true; + return schedule.getHostType().equals(HostType.CAMPUS) + && member.getUniversity() == schedule.getWriter().getUniversity(); + } + + private boolean validateScheduleSemester(Member member, Schedule schedule) { + return member.getSemesters().stream() + .anyMatch(memberSemester -> schedule.getSemesterPermission().contains(memberSemester)); + } + @Override public ScheduleDetail getScheduleDetail(Member member, UUID scheduleId) { - Schedule schedule = scheduleRepository.findById(scheduleId).orElseThrow(() -> new RestApiException(ScheduleErrorCode.EMPTY_SCHEDULE)); + Schedule schedule = scheduleRepository.findById(scheduleId) + .orElseThrow(() -> new RestApiException(ScheduleErrorCode.EMPTY_SCHEDULE)); return scheduleMapper.toScheduleDetail(schedule); } diff --git a/src/main/java/com/umc/networkingService/domain/test/controller/TestController.java b/src/main/java/com/umc/networkingService/domain/test/controller/TestController.java index 9b0907eb..dc05d894 100644 --- a/src/main/java/com/umc/networkingService/domain/test/controller/TestController.java +++ b/src/main/java/com/umc/networkingService/domain/test/controller/TestController.java @@ -22,7 +22,7 @@ public class TestController { private final TestService testService; - @Operation(summary = "dummy Board 생성 API", description = "보드 더미데이터를 생성합니다. 회원 가입 완료 후 사용해주세요!") + @Operation(summary = "dummy Board, Schedule 생성 API", description = "보드, 스케줄 더미데이터를 생성합니다. 회원 가입 완료 후 사용해주세요!") @ApiResponses(value = { @ApiResponse(responseCode = "COMMON200", description = "성공") }) diff --git a/src/main/java/com/umc/networkingService/domain/test/service/TestService.java b/src/main/java/com/umc/networkingService/domain/test/service/TestService.java index f1e562ed..490f3496 100644 --- a/src/main/java/com/umc/networkingService/domain/test/service/TestService.java +++ b/src/main/java/com/umc/networkingService/domain/test/service/TestService.java @@ -17,6 +17,8 @@ import com.umc.networkingService.domain.member.repository.SemesterPartRepository; import com.umc.networkingService.domain.member.service.AuthService; import com.umc.networkingService.domain.member.service.MemberService; +import com.umc.networkingService.domain.schedule.dto.request.ScheduleRequest; +import com.umc.networkingService.domain.schedule.service.ScheduleService; import com.umc.networkingService.domain.university.entity.University; import com.umc.networkingService.domain.university.service.UniversityService; import com.umc.networkingService.global.common.enums.Role; @@ -29,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import java.time.LocalDateTime; import java.util.*; import static com.umc.networkingService.domain.board.dto.request.BoardRequest.BoardCreateRequest; @@ -46,6 +49,7 @@ public class TestService { private final BoardService boardService; private final BoardFileService boardFileService; + private final ScheduleService scheduleService; private final AmazonS3Client amazonS3Client; @Value("${cloud.aws.s3.bucket}") @@ -70,6 +74,7 @@ public String createDummyBoard(Member member) { createOB(members, HostType.CENTER); createNoticeAndWorkbook(members); + members.forEach(this::createSchedules); return "더미데이터 생성 완료"; } @@ -126,6 +131,7 @@ public List createDummyMember(Member loginMember) { return members; } + public List createSemesterPart(Member member, MemberDummyInfo memberInfo) { List semesterParts = new ArrayList<>(); for (int i = 0; i < memberInfo.getSemesters().size(); i++) @@ -246,5 +252,70 @@ private List getDummyImages(String bucketName) { return fileUrls; } + private void createSchedules(Member member) { + Optional hostType = getHostType(member); + if (hostType.isPresent()) { + createDemoDaySchedule(member, hostType.get()); + createHackathonSchedule(member, hostType.get()); + createDiningSchedule(member, hostType.get()); + } + } + + private void createDemoDaySchedule(Member member, HostType hostType) { + ScheduleRequest.CreateSchedule request = ScheduleRequest.CreateSchedule.builder() + .title("UMC 5기 데모데이") + .content("데모데이가 코 앞으로 다가왔습니당") + .startDateTime(LocalDateTime.of(2024, 2, 19, 0,0)) + .endDateTime(LocalDateTime.of(2024, 2, 21,23,59)) + .semesterPermission(List.of(Semester.FIFTH, Semester.FOURTH, Semester.THIRD, Semester.SECOND, Semester.FIRST)) + .hostType(hostType) + .placeSetting("올댓마인드 문래점") + .build(); + scheduleService.createSchedule(member, request); + } + + private void createDiningSchedule(Member member, HostType hostType) { + int day = getRandomNumber(); + ScheduleRequest.CreateSchedule request = ScheduleRequest.CreateSchedule.builder() + .title("회식") + .content("여러분들 회식 많이 참여해주세요") + .startDateTime(LocalDateTime.of(2024, 2, day, 18,0)) + .endDateTime(LocalDateTime.of(2024, 2, day,23,59)) + .semesterPermission(List.of(Semester.FIFTH)) + .hostType(hostType) + .placeSetting("장소 미정") + .build(); + scheduleService.createSchedule(member, request); + } + private void createHackathonSchedule(Member member, HostType hostType) { + int day = getRandomNumber(); + ScheduleRequest.CreateSchedule request = ScheduleRequest.CreateSchedule.builder() + .title("UMC 헤커톤") + .content("헤커톤 우승 상금 백만원!!!") + .startDateTime(LocalDateTime.of(2024, 2, day, 14,0)) + .endDateTime(LocalDateTime.of(2024, 2, day + 1,14,0)) + .semesterPermission(List.of(Semester.FIFTH, Semester.FOURTH, Semester.THIRD, Semester.SECOND, Semester.FIRST)) + .hostType(hostType) + .placeSetting("헤커톤 장소") + .build(); + scheduleService.createSchedule(member, request); + } + + private Optional getHostType(Member member) { + int rolePriority = member.getRole().getPriority(); + if (rolePriority > 4) + return Optional.empty(); + if (rolePriority > 3) + return Optional.of(HostType.CAMPUS); + if (rolePriority > 2) + return Optional.of(HostType.BRANCH); + return Optional.of(HostType.CENTER); + } + + // 1 ~ 29 중 랜덤 숫자 생성 + private int getRandomNumber() { + Random random = new Random(); + return random.nextInt(28) + 1; + } }