SubjectController.java 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package com.example.projectback.controllers;
  2. import com.example.projectback.model.*;
  3. import com.example.projectback.repository.*;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.http.HttpStatus;
  6. import org.springframework.http.ResponseEntity;
  7. import org.springframework.security.access.prepost.PreAuthorize;
  8. import org.springframework.web.bind.annotation.*;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. import java.util.Map;
  12. import java.util.Optional;
  13. @RestController
  14. @CrossOrigin(origins = "http://localhost:4200")
  15. @RequestMapping("/subjects")
  16. public class SubjectController {
  17. private final SubjectRepository subjectRepository;
  18. private final SubjectStudentRepository subjectStudentRepository;
  19. private final StudentRepository studentRepository;
  20. private final GradeRepository gradeRepository;
  21. private final UserRepository userRepository;
  22. @Autowired
  23. public SubjectController(SubjectRepository subjectRepository, SubjectStudentRepository subjectStudentRepository,
  24. StudentRepository studentRepository, GradeRepository gradeRepository,
  25. UserRepository userRepository) {
  26. this.subjectRepository = subjectRepository;
  27. this.subjectStudentRepository = subjectStudentRepository;
  28. this.studentRepository = studentRepository;
  29. this.gradeRepository = gradeRepository;
  30. this.userRepository = userRepository;
  31. }
  32. @GetMapping
  33. @PreAuthorize("hasRole('ADMIN')")
  34. public List<Subject> getAllSubjects() {
  35. return subjectRepository.findAll();
  36. }
  37. @GetMapping("/student/{id}")
  38. @PreAuthorize("hasRole('ADMIN') or hasRole('USER')")
  39. public List<Subject> getAllSubjectsForStudent(@PathVariable("id") Long studentID) {
  40. User user = userRepository.getById(studentID);
  41. Student student = studentRepository.getByEmail(user.getEmail());
  42. List<SubjectStudent> assoc = subjectStudentRepository.getAllByStudent(student);
  43. List<Subject> studentSubjects = new ArrayList<>();
  44. for (SubjectStudent subjectStudent: assoc) {
  45. Subject subject = subjectStudent.getSubject();
  46. List<SubjectStudent> newAssoc = new ArrayList<>();
  47. newAssoc.add(new SubjectStudent(subject, student));
  48. subject.setStudentsAssoc(newAssoc);
  49. studentSubjects.add(subject);
  50. }
  51. return studentSubjects;
  52. }
  53. @GetMapping("/{id}")
  54. @PreAuthorize("hasRole('ADMIN')")
  55. public ResponseEntity<Subject> getSubject(@PathVariable("id") Long id) {
  56. Optional<Subject> subject = subjectRepository.findById(id);
  57. if (subject.isEmpty()) {
  58. return new ResponseEntity<>(HttpStatus.NOT_FOUND);
  59. }
  60. return new ResponseEntity<>(subject.get(), HttpStatus.OK);
  61. }
  62. @PostMapping
  63. @PreAuthorize("hasRole('ADMIN')")
  64. public ResponseEntity<Subject> addSubject(@RequestBody Subject subject) {
  65. subjectRepository.save(subject);
  66. return new ResponseEntity<>(subject, HttpStatus.CREATED);
  67. }
  68. @PostMapping("/delete")
  69. @PreAuthorize("hasRole('ADMIN')")
  70. public ResponseEntity<Changeset> deleteSubjects(@RequestBody Changeset changeset) {
  71. for (Long recId : changeset.getRecords()) {
  72. Optional<Subject> subject = subjectRepository.findById(recId);
  73. if (subject.isEmpty()) continue;
  74. List<SubjectStudent> subjectStudents = subjectStudentRepository.getAllBySubject(subject.get());
  75. List<Grade> grades = gradeRepository.getAllBySubjectID(subject.get().getId());
  76. List<Student> allStudents = studentRepository.findAll();
  77. for(Student student: allStudents) {
  78. student.getGrades().removeAll(grades);
  79. studentRepository.save(student);
  80. }
  81. subjectStudentRepository.deleteAll(subjectStudents);
  82. gradeRepository.deleteAll(grades);
  83. subjectRepository.delete(subject.get());
  84. }
  85. return new ResponseEntity<>(changeset, HttpStatus.OK);
  86. }
  87. @PatchMapping("/{id}")
  88. @PreAuthorize("hasRole('ADMIN')")
  89. public ResponseEntity<Subject> updatePartOfSubject(@RequestBody Map<String, Object> updates, @PathVariable("id") Long id) {
  90. Optional<Subject> subject = subjectRepository.findById(id);
  91. if (subject.isEmpty()) {
  92. return new ResponseEntity<>(HttpStatus.NOT_FOUND);
  93. }
  94. partialUpdates(subject.get(), updates);
  95. return new ResponseEntity<>(subject.get(), HttpStatus.OK);
  96. }
  97. private void partialUpdates(Subject subject, Map<String, Object> updates) {
  98. if (updates.containsKey("name")) {
  99. subject.setName((String) updates.get("nane"));
  100. }
  101. if (updates.containsKey("studentAssoc")) {
  102. List<SubjectStudent> newStudents = subject.getStudentsAssoc();
  103. for (Integer studentId : (List<Integer>) updates.get("studentAssoc")) {
  104. Student student = this.studentRepository.getById(studentId.longValue());
  105. SubjectStudent newAssoc = new SubjectStudent(subject, student);
  106. this.subjectStudentRepository.save(newAssoc);
  107. newStudents.add(newAssoc);
  108. }
  109. subject.setStudentsAssoc(newStudents);
  110. }
  111. subjectRepository.save(subject);
  112. }
  113. @DeleteMapping("/{subjectID}/{studentID}")
  114. @PreAuthorize("hasRole('ADMIN')")
  115. public ResponseEntity<Subject> removeStudentFromSubject(@PathVariable("subjectID") Long subjectID, @PathVariable Long studentID) {
  116. Optional<Subject> subject = subjectRepository.findById(subjectID);
  117. Optional<Student> student = studentRepository.findById(studentID);
  118. if (subject.isEmpty() || student.isEmpty()) {
  119. return new ResponseEntity<>(HttpStatus.NOT_FOUND);
  120. }
  121. SubjectStudent assoc = this.subjectStudentRepository.getByStudentAndSubject(student.get(), subject.get());
  122. subject.get().getStudentsAssoc().remove(assoc);
  123. this.subjectStudentRepository.delete(assoc);
  124. this.subjectRepository.save(subject.get());
  125. return new ResponseEntity<>(subject.get(), HttpStatus.OK);
  126. }
  127. }