Newer
Older
teacher-diary / src / main / java / ru / mcs / diary / subject / SubjectController.java
@malexple malexple 19 days ago 5 KB add groups
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";
    }
}