calendar
event 생성(시간겹치는 로직, 이메일발송)
로드존슨
2023. 3. 18. 12:50
728x90
1. 컨트롤단에서 response 하는 로직은 이전에 했던 task 생성과 똑같다 다만 create 메서드가 다르다.
public class ScheduleController {
private final TaskService taskService;
private final EventService eventService;
@PostMapping("/tasks")
public ResponseEntity<Void> createTask(@RequestBody TaskCreateReq taskCreateReq,
AuthUser authUser) {
taskService.create(taskCreateReq, authUser);
return ResponseEntity.ok().build();
}
@PostMapping("/event")
public ResponseEntity<Void> createTask(@RequestBody EventCreateReq eventCreateReq,
AuthUser authUser) {
eventService.create(eventCreateReq, authUser);
return ResponseEntity.ok().build();
}
}
event 단에서 create 메서드를 하는 이유를 하기 전에 event 가 무엇이고 뭘 해야 하는지를 다시금 생각해보자
event 는 일정을 잡고 참석자들이 모이게 만들기 위해 만들어진 api이다.
그래서 일정을 잡기 위해서는
1)기존의 일정들과 시간이 겹치지 않는지 확인하는 로직과
2)겹치지 않고 저장이 되었다면 참석자들에게 메일을 보내는 로직이 필요하다.
전체코드는 아래와 같다.
@Service
@RequiredArgsConstructor
public class EventService {
private final UserService userService;
private final ScheduleRepository scheduleRepository;
private final EngagementRepository engagementRepository;
private final EmailService emailService;
@Transactional
public void create(EventCreateReq req, AuthUser authUser) {
// attendees 의 스케쥴 시간과 겹치지 않는지?
final List<Engagement> engagementList =
engagementRepository.findAllByAttendeeIdInAndSchedule_EndAtAfter(req.getAttendeeIds(),
req.getStartAt());
if (engagementList
.stream()
.anyMatch(e -> e.getEvent().isOverlapped(req.getStartAt(), req.getEndAt())
&& e.getStatus() == RequestStatus.ACCEPTED)) {
throw new RuntimeException("cannot make engagement. period overlapped.");
}
final Schedule eventSchedule = Schedule.event(req.getTitle(), req.getDescription(), req.getStartAt(), req.getEndAt(), userService.getOrThrowById(authUser.getId()));
scheduleRepository.save(eventSchedule);
req.getAttendeeIds().stream()
.map(userService::getOrThrowById)
.forEach(user -> {
final Engagement e = engagementRepository.save(new Engagement(eventSchedule, user));
emailService.sendEngagement(e);
});
}
}
1) 기존의 일정들과 시간이 겹치치 않는지 확인하는 로직
1) engagementRepositoy에 메소드를 만들어 필요한 정보만 가지고 온다.
//findBy[EntityProperty]InAnd[EntityProperty]GreaterThan을 따릅니다.
//attendeeId' 및 'schedule_EndAtAfter'는 엔터티 속성이다.
//schedule'의 'endAt' 속성이 주어진 'startAt' 시간 이후인 모든 참여를 찾는 데 사용
//After 키워드는 endAt의 값이 특정 시간 이후여야 함을 지정
2)필요한 정보를 가지고 시간이 겹치지 않는지 로직구현을 한다.
2) 이메일 발송하는 로직구현
728x90