package ru.mcs.diary.subject;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import ru.mcs.diary.auth.CurrentUser;
import ru.mcs.diary.auth.CustomUserDetails;
import ru.mcs.diary.subject.dto.SubjectCreateRequest;
@Controller
@RequestMapping("/subjects")
@RequiredArgsConstructor
public class SubjectController {
private final SubjectService subjectService;
@GetMapping
public String list(@CurrentUser CustomUserDetails user, Model model) {
model.addAttribute("subjects", subjectService.getAllSubjects(user.getTeacherId()));
model.addAttribute("user", user);
model.addAttribute("activeMenu", "subjects");
model.addAttribute("pageTitle", "Предметы");
return "subject/list";
}
@GetMapping("/new")
public String createForm(@CurrentUser CustomUserDetails user, Model model) {
model.addAttribute("request", new SubjectCreateRequest());
model.addAttribute("user", user);
model.addAttribute("activeMenu", "subjects");
model.addAttribute("pageTitle", "Новый предмет");
return "subject/form";
}
@PostMapping("/new")
public String create(@Valid @ModelAttribute("request") SubjectCreateRequest request,
BindingResult bindingResult,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes,
Model model) {
if (bindingResult.hasErrors()) {
model.addAttribute("user", user);
model.addAttribute("activeMenu", "subjects");
model.addAttribute("pageTitle", "Новый предмет");
return "subject/form";
}
try {
subjectService.createSubject(request, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Предмет добавлен");
return "redirect:/subjects";
} catch (IllegalArgumentException e) {
model.addAttribute("error", e.getMessage());
model.addAttribute("user", user);
model.addAttribute("activeMenu", "subjects");
model.addAttribute("pageTitle", "Новый предмет");
return "subject/form";
}
}
@GetMapping("/{id}/edit")
public String editForm(@PathVariable Long id,
@CurrentUser CustomUserDetails user,
Model model) {
Subject subject = subjectService.getSubject(id, user.getTeacherId());
SubjectCreateRequest request = new SubjectCreateRequest();
request.setId(subject.getId());
request.setName(subject.getName());
request.setDescription(subject.getDescription());
model.addAttribute("request", request);
model.addAttribute("user", user);
model.addAttribute("activeMenu", "subjects");
model.addAttribute("pageTitle", "Редактировать предмет");
return "subject/form";
}
@PostMapping("/{id}/edit")
public String update(@PathVariable Long id,
@Valid @ModelAttribute("request") SubjectCreateRequest request,
BindingResult bindingResult,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes,
Model model) {
if (bindingResult.hasErrors()) {
request.setId(id);
model.addAttribute("user", user);
model.addAttribute("activeMenu", "subjects");
model.addAttribute("pageTitle", "Редактировать предмет");
return "subject/form";
}
try {
subjectService.updateSubject(id, request, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Изменения сохранены");
return "redirect:/subjects";
} catch (IllegalArgumentException e) {
request.setId(id);
model.addAttribute("error", e.getMessage());
model.addAttribute("user", user);
model.addAttribute("activeMenu", "subjects");
model.addAttribute("pageTitle", "Редактировать предмет");
return "subject/form";
}
}
@PostMapping("/{id}/delete")
public String delete(@PathVariable Long id,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes) {
try {
subjectService.deleteSubject(id, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Предмет удалён");
} catch (Exception e) {
redirectAttributes.addFlashAttribute("error", "Нельзя удалить предмет, у которого есть группы");
}
return "redirect:/subjects";
}
}