Newer
Older
teacher-diary / src / main / java / ru / mcs / diary / student / StudentController.java
package ru.mcs.diary.student;

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.parent.ParentService;
import ru.mcs.diary.parent.ParentType;
import ru.mcs.diary.student.dto.StudentCreateRequest;

@Controller
@RequestMapping("/students")
@RequiredArgsConstructor
public class StudentController {

    private final StudentService studentService;
    private final ParentService parentService;

    @GetMapping
    public String list(@CurrentUser CustomUserDetails user, Model model) {
        model.addAttribute("students", studentService.getAllStudents(user.getTeacherId()));
        model.addAttribute("user", user);
        model.addAttribute("activeMenu", "students");
        model.addAttribute("pageTitle", "Ученики");
        return "student/list";
    }

    @GetMapping("/new")
    public String createForm(@CurrentUser CustomUserDetails user, Model model) {
        model.addAttribute("request", new StudentCreateRequest());
        model.addAttribute("user", user);
        model.addAttribute("activeMenu", "students");
        model.addAttribute("pageTitle", "Новый ученик");
        return "student/form";
    }

    @PostMapping("/new")
    public String create(@Valid @ModelAttribute("request") StudentCreateRequest request,
                         BindingResult bindingResult,
                         @CurrentUser CustomUserDetails user,
                         RedirectAttributes redirectAttributes,
                         Model model) {
        if (bindingResult.hasErrors()) {
            model.addAttribute("user", user);
            model.addAttribute("activeMenu", "students");
            model.addAttribute("pageTitle", "Новый ученик");
            return "student/form";
        }

        try {
            Student student = studentService.createStudent(request, user.getTeacherId());
            redirectAttributes.addFlashAttribute("success", "Ученик успешно добавлен");
            return "redirect:/students/" + student.getId();
        } catch (Exception e) {
            model.addAttribute("error", e.getMessage());
            model.addAttribute("user", user);
            model.addAttribute("activeMenu", "students");
            model.addAttribute("pageTitle", "Новый ученик");
            return "student/form";
        }
    }

    @GetMapping("/{id}")
    public String view(@PathVariable Long id,
                       @CurrentUser CustomUserDetails user,
                       Model model) {
        Student student = studentService.getStudentWithParents(id, user.getTeacherId());
        model.addAttribute("student", student);
        model.addAttribute("parents", parentService.getAllParents(user.getTeacherId()));
        model.addAttribute("parentTypes", ParentType.values());
        model.addAttribute("user", user);
        model.addAttribute("activeMenu", "students");
        model.addAttribute("pageTitle", student.getFullName());
        return "student/view";
    }

    @GetMapping("/{id}/edit")
    public String editForm(@PathVariable Long id,
                           @CurrentUser CustomUserDetails user,
                           Model model) {
        Student student = studentService.getStudent(id, user.getTeacherId());

        StudentCreateRequest request = new StudentCreateRequest();
        request.setId(student.getId());
        request.setLastName(student.getLastName());
        request.setFirstName(student.getFirstName());
        request.setPatronymic(student.getPatronymic());
        request.setPhone(student.getPhone());
        request.setBirthDate(student.getBirthDate());
        request.setNotes(student.getNotes());

        model.addAttribute("request", request);
        model.addAttribute("user", user);
        model.addAttribute("activeMenu", "students");
        model.addAttribute("pageTitle", "Редактировать ученика");
        return "student/form";
    }

    @PostMapping("/{id}/edit")
    public String update(@PathVariable Long id,
                         @Valid @ModelAttribute("request") StudentCreateRequest request,
                         BindingResult bindingResult,
                         @CurrentUser CustomUserDetails user,
                         RedirectAttributes redirectAttributes,
                         Model model) {
        if (bindingResult.hasErrors()) {
            request.setId(id);
            model.addAttribute("user", user);
            model.addAttribute("activeMenu", "students");
            model.addAttribute("pageTitle", "Редактировать ученика");
            return "student/form";
        }

        studentService.updateStudent(id, request, user.getTeacherId());
        redirectAttributes.addFlashAttribute("success", "Изменения сохранены");
        return "redirect:/students/" + id;
    }

    @PostMapping("/{id}/delete")
    public String delete(@PathVariable Long id,
                         @CurrentUser CustomUserDetails user,
                         RedirectAttributes redirectAttributes) {
        studentService.deleteStudent(id, user.getTeacherId());
        redirectAttributes.addFlashAttribute("success", "Ученик удалён");
        return "redirect:/students";
    }

    @PostMapping("/{id}/link-parent")
    public String linkParent(@PathVariable Long id,
                             @RequestParam Long parentId,
                             @RequestParam ParentType parentType,
                             @CurrentUser CustomUserDetails user,
                             RedirectAttributes redirectAttributes) {
        try {
            studentService.linkParent(id, parentId, parentType, user.getTeacherId());
            redirectAttributes.addFlashAttribute("success", "Родитель привязан");
        } catch (IllegalArgumentException e) {
            redirectAttributes.addFlashAttribute("error", e.getMessage());
        }
        return "redirect:/students/" + id;
    }

    @PostMapping("/{studentId}/unlink-parent/{parentId}")
    public String unlinkParent(@PathVariable Long studentId,
                               @PathVariable Long parentId,
                               @CurrentUser CustomUserDetails user,
                               RedirectAttributes redirectAttributes) {
        studentService.unlinkParent(studentId, parentId, user.getTeacherId());
        redirectAttributes.addFlashAttribute("success", "Связь с родителем удалена");
        return "redirect:/students/" + studentId;
    }
}