Newer
Older
teacher-diary / src / main / java / ru / mcs / diary / group / GroupController.java
@malexple malexple 20 days ago 7 KB add groups
package ru.mcs.diary.group;

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.group.dto.GroupCreateRequest;
import ru.mcs.diary.student.StudentService;
import ru.mcs.diary.subject.SubjectService;

@Controller
@RequestMapping("/groups")
@RequiredArgsConstructor
public class GroupController {

    private final GroupService groupService;
    private final SubjectService subjectService;
    private final StudentService studentService;

    @GetMapping
    public String list(@CurrentUser CustomUserDetails user, Model model) {
        model.addAttribute("groups", groupService.getAllGroups(user.getTeacherId()));
        model.addAttribute("user", user);
        model.addAttribute("activeMenu", "groups");
        model.addAttribute("pageTitle", "Группы");
        return "group/list";
    }

    @GetMapping("/new")
    public String createForm(@CurrentUser CustomUserDetails user, Model model) {
        model.addAttribute("request", new GroupCreateRequest());
        model.addAttribute("subjects", subjectService.getAllSubjects(user.getTeacherId()));
        model.addAttribute("user", user);
        model.addAttribute("activeMenu", "groups");
        model.addAttribute("pageTitle", "Новая группа");
        return "group/form";
    }

    @PostMapping("/new")
    public String create(@Valid @ModelAttribute("request") GroupCreateRequest request,
                         BindingResult bindingResult,
                         @CurrentUser CustomUserDetails user,
                         RedirectAttributes redirectAttributes,
                         Model model) {
        if (bindingResult.hasErrors()) {
            model.addAttribute("subjects", subjectService.getAllSubjects(user.getTeacherId()));
            model.addAttribute("user", user);
            model.addAttribute("activeMenu", "groups");
            model.addAttribute("pageTitle", "Новая группа");
            return "group/form";
        }

        try {
            StudyGroup group = groupService.createGroup(request, user.getTeacherId());
            redirectAttributes.addFlashAttribute("success", "Группа создана");
            return "redirect:/groups/" + group.getId();
        } catch (Exception e) {
            model.addAttribute("error", e.getMessage());
            model.addAttribute("subjects", subjectService.getAllSubjects(user.getTeacherId()));
            model.addAttribute("user", user);
            model.addAttribute("activeMenu", "groups");
            model.addAttribute("pageTitle", "Новая группа");
            return "group/form";
        }
    }

    @GetMapping("/{id}")
    public String view(@PathVariable Long id,
                       @CurrentUser CustomUserDetails user,
                       Model model) {
        StudyGroup group = groupService.getGroupWithStudents(id, user.getTeacherId());
        model.addAttribute("group", group);
        model.addAttribute("availableStudents", studentService.getAllStudents(user.getTeacherId()));
        model.addAttribute("user", user);
        model.addAttribute("activeMenu", "groups");
        model.addAttribute("pageTitle", group.getName());
        return "group/view";
    }

    @GetMapping("/{id}/edit")
    public String editForm(@PathVariable Long id,
                           @CurrentUser CustomUserDetails user,
                           Model model) {
        StudyGroup group = groupService.getGroup(id, user.getTeacherId());

        GroupCreateRequest request = new GroupCreateRequest();
        request.setId(group.getId());
        request.setName(group.getName());
        request.setSubjectId(group.getSubject() != null ? group.getSubject().getId() : null);
        request.setPricePerLesson(group.getPricePerLesson());
        request.setDescription(group.getDescription());

        model.addAttribute("request", request);
        model.addAttribute("subjects", subjectService.getAllSubjects(user.getTeacherId()));
        model.addAttribute("user", user);
        model.addAttribute("activeMenu", "groups");
        model.addAttribute("pageTitle", "Редактировать группу");
        return "group/form";
    }

    @PostMapping("/{id}/edit")
    public String update(@PathVariable Long id,
                         @Valid @ModelAttribute("request") GroupCreateRequest request,
                         BindingResult bindingResult,
                         @CurrentUser CustomUserDetails user,
                         RedirectAttributes redirectAttributes,
                         Model model) {
        if (bindingResult.hasErrors()) {
            request.setId(id);
            model.addAttribute("subjects", subjectService.getAllSubjects(user.getTeacherId()));
            model.addAttribute("user", user);
            model.addAttribute("activeMenu", "groups");
            model.addAttribute("pageTitle", "Редактировать группу");
            return "group/form";
        }

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

    @PostMapping("/{id}/delete")
    public String delete(@PathVariable Long id,
                         @CurrentUser CustomUserDetails user,
                         RedirectAttributes redirectAttributes) {
        groupService.deleteGroup(id, user.getTeacherId());
        redirectAttributes.addFlashAttribute("success", "Группа удалена");
        return "redirect:/groups";
    }

    @PostMapping("/{id}/add-student")
    public String addStudent(@PathVariable Long id,
                             @RequestParam Long studentId,
                             @CurrentUser CustomUserDetails user,
                             RedirectAttributes redirectAttributes) {
        try {
            groupService.addStudent(id, studentId, user.getTeacherId());
            redirectAttributes.addFlashAttribute("success", "Ученик добавлен в группу");
        } catch (IllegalArgumentException e) {
            redirectAttributes.addFlashAttribute("error", e.getMessage());
        }
        return "redirect:/groups/" + id;
    }

    @PostMapping("/{groupId}/remove-student/{studentId}")
    public String removeStudent(@PathVariable Long groupId,
                                @PathVariable Long studentId,
                                @CurrentUser CustomUserDetails user,
                                RedirectAttributes redirectAttributes) {
        groupService.removeStudent(groupId, studentId, user.getTeacherId());
        redirectAttributes.addFlashAttribute("success", "Ученик удалён из группы");
        return "redirect:/groups/" + groupId;
    }
}