모임 수정 로직
- 모집 방법은 수정할 수 없다.
- 모집 인원은 확정된 참가 신청 수 보다는 커야 한다. 예) 5명의 참가 신청을 확정 상태로 변경했다면, 모임을 수정할 때 모집 인원 수가 5보다는 커야 한다. 3으로 줄이면 안된다.
- 최대한 모임 개설하기 화면의 코드를 재사용한다.
- 모집 인원을 늘린 선착순 모임의 경우에, 자동으로 추가 인원의 참가 신청을 확정 상태로 변경해야 한다. (나중에 할 일)
모임 수정 뷰 요청을 처리하는 핸들러 작성
package me.weekbelt.studyolle.event;
@Controller
@RequestMapping("/study/{path}")
@RequiredArgsConstructor
public class EventController {
// .........
@GetMapping("/events/{id}/edit")
public String updateEventForm(@CurrentAccount Account account, @PathVariable String path,
@PathVariable Long id, Model model) {
Study study = studyService.getStudyToUpdate(account, path);
Event event = eventService.findEventById(id);
model.addAttribute("account", account);
model.addAttribute("study", study);
model.addAttribute("event", event);
model.addAttribute(modelMapper.map(event, EventForm.class));
return "event/update-form";
}
}
모임 수정 뷰(event/update-form.html) 작성
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments.html :: head"></head>
<body class="bg-light">
<nav th:replace="fragments.html :: main-nav"></nav>
<div th:replace="fragments.html :: study-banner"></div>
<div class="container">
<div th:replace="fragments.html :: event-form (mode='edit', action='/study/' + ${study.path}
+ '/events/' + ${event.id} + '/edit')"></div>
<div th:replace="fragments.html :: footer"></div>
</div>
<script th:replace="fragments.html :: form-validation"></script>
<script th:replace="fragments.html :: editor-script"></script>
</body>
</html>
모임 수정 요청 처리 핸들러 작성
package me.weekbelt.studyolle.event;
@Controller
@RequestMapping("/study/{path}")
@RequiredArgsConstructor
public class EventController {
// ........
@PostMapping("/events/{id}/edit")
public String updateEventSubmit(@CurrentAccount Account account, @PathVariable String path,
@PathVariable Long id, @Valid EventForm eventForm,
Errors errors, Model model) {
Study study = studyService.getStudyToUpdate(account, path);
Event event = eventService.findEventById(id);
// 화면에 EventType 창이 없어도 서버에 요청이 가능하기 때문에 이것을 방지하기 위해
eventForm.setEventType(event.getEventType());
eventValidator.validateUpdateForm(eventForm, event, errors);
if (errors.hasErrors()) {
model.addAttribute("account", account);
model.addAttribute("study", study);
model.addAttribute("event", event);
return "event/update-form";
}
eventService.updateEvent(event, eventForm);
return "redirect:/study/" + study.getEncodedPath() + "/events/" + event.getId();
}
}
수정하는 모집인원이 현재 참가자 수 보다 많아야 하기때문에 그것을 검증하는 로직을 EventValidator에 validateUpdateForm메소드로 추가한다.
package me.weekbelt.studyolle.event.validator;
@Component
public class EventValidator implements Validator {
// .....
public void validateUpdateForm(EventForm eventForm, Event event, Errors errors) {
if (eventForm.getLimitOfEnrollments() < event.getNumberOfAcceptedEnrollments()) {
errors.rejectValue("limitOfEnrollments", "wrong.value", "확인된 참가 신청보다 모집 인원 수가 커야 합니다.");
}
}
}
Event엔티티에 참가신청자의 갯수를 확인하는 getNumberOfAcceptedEnrollments메소드를 추가
package me.weekbelt.studyolle.domain;
// .....
public class Event {
// .......
public long getNumberOfAcceptedEnrollments() {
return this.enrollments.stream().filter(Enrollment::isAccepted).count();
}
}
모임 수정을 처리하는 메소드 작성
package me.weekbelt.studyolle.event;
@Service
@Transactional
@RequiredArgsConstructor
public class EventService {
// .......
private final ModelMapper modelMapper;
// .......
public void updateEvent(Event event, EventForm eventForm) {
modelMapper.map(eventForm, event);
// TODO 모집 인원을 늘린 선착순 모임의 경우에, 자동으로 추가 인원의 참가 신청을 확정 상태로 변경해야 한다. (나중에 할 일)
}
}
참고: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1#
'스프링과 JPA 기반 웹 어플리케이션 개발 > 5부 모임' 카테고리의 다른 글
67. 모임 참가 신청 및 취소 (0) | 2020.05.06 |
---|---|
66. 모임 취소 (0) | 2020.05.04 |
64. 모임 목록 조회 (0) | 2020.05.04 |
63. 모임 조회 (0) | 2020.05.04 |
62. 모임 만들기 폼 서브밋 (0) | 2020.05.04 |