diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java index 1629baa..77b2f3e 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java @@ -2,6 +2,7 @@ package ovh.herisson.Clyde.EndPoints; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestHeader; @@ -9,10 +10,12 @@ import org.springframework.web.bind.annotation.RestController; import ovh.herisson.Clyde.Services.AuthenticatorService; import ovh.herisson.Clyde.Tables.Applications; import ovh.herisson.Clyde.Tables.Role; +import ovh.herisson.Clyde.Tables.User; import java.util.ArrayList; @RestController +@CrossOrigin(originPatterns = "*", allowCredentials = "true") public class ApplicationsController { AuthenticatorService authServ; @@ -41,12 +44,17 @@ public class ApplicationsController { } public ArrayList getAuthorizedApplications(String token){ - Role posterRole = authServ.getUserFromToken(token).getRole(); ArrayList authorizedApps = new ArrayList<>(); authorizedApps.add(Applications.Login); authorizedApps.add(Applications.Profile); + User user = authServ.getUserFromToken(token); + if(user == null) + return authorizedApps; + + Role posterRole = user.getRole(); + if (posterRole == Role.Teacher || posterRole == Role.Student || posterRole == Role.Admin){ authorizedApps.add(Applications.Msg); authorizedApps.add(Applications.Forum); diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java new file mode 100644 index 0000000..011689f --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java @@ -0,0 +1,80 @@ +package ovh.herisson.Clyde.EndPoints; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import ovh.herisson.Clyde.Responses.UnauthorizedResponse; +import ovh.herisson.Clyde.Services.AuthenticatorService; +import ovh.herisson.Clyde.Services.CourseService; +import ovh.herisson.Clyde.Services.TeacherCourseService; +import ovh.herisson.Clyde.Tables.Course; +import ovh.herisson.Clyde.Tables.Role; +import ovh.herisson.Clyde.Tables.TeacherCourse; +import ovh.herisson.Clyde.Tables.User; + +import java.util.ArrayList; +import java.util.Map; + +@RestController +@CrossOrigin(originPatterns = "*", allowCredentials = "true") +public class CourseController { + + private final CourseService courseServ; + + private final TeacherCourseService teacherCourseServ; + + private final AuthenticatorService authServ; + + public CourseController(CourseService courseServ, TeacherCourseService teacherCourseServ, AuthenticatorService authServ) { + this.courseServ = courseServ; + this.teacherCourseServ = teacherCourseServ; + this.authServ = authServ; + } + + @GetMapping("/course/{id}") + public ResponseEntity getCourse(@RequestHeader("Authorization") String token, @PathVariable long id){ + if (authServ.getUserFromToken(token) == null) + return new UnauthorizedResponse<>(null); + + return new ResponseEntity<>(courseServ.findById(id), HttpStatus.OK); + } + + + @PostMapping("/course") + public ResponseEntity postCourse(@RequestHeader("Authorization") String token, @RequestBody Course course){ + if (authServ.isNotSecretaryOrAdmin(token)) + return new UnauthorizedResponse<>(null); + + return new ResponseEntity<>(courseServ.save(course), HttpStatus.CREATED); + } + + + @PatchMapping("/course/{id}") + public ResponseEntity patchCourse(@RequestHeader("Authorization") String token, + @RequestBody Map updates, + @PathVariable long id) + { + + if (authServ.IsNotIn(new Role[]{Role.Admin,Role.Teacher,Role.Secretary}, token)){ + return new UnauthorizedResponse<>(null); + } + + return new ResponseEntity<>(courseServ.modifyData(id, updates, authServ.getUserFromToken(token).getRole()), HttpStatus.OK); + } + + @PostMapping("/course/{id}") + public ResponseEntity postTeachers(@RequestHeader("Authorization") String token, + @RequestBody Iterable teacherIds, + @PathVariable Long id) + { + if (authServ.IsNotIn(new Role[]{Role.Admin,Role.Secretary}, token)) + return new UnauthorizedResponse<>(null); + + + + teacherCourseServ.saveAll(teacherIds,courseServ.findById(id)); + return new ResponseEntity<>(HttpStatus.OK); + + } + +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java index 8e9b256..1892d6c 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java @@ -15,6 +15,7 @@ import ovh.herisson.Clyde.Tables.User; import java.util.Map; @RestController +@CrossOrigin(originPatterns = "*", allowCredentials = "true") public class CurriculumController { @@ -43,4 +44,17 @@ public class CurriculumController { public ResponseEntity> findAll(){ return new ResponseEntity<>(curriculumCourseServ.findAll(),HttpStatus.OK); } + + /**@PostMapping("/curriculum") //todo now + public ResponseEntity postCurriculum(@RequestHeader("Authorization") String token,@RequestBody Curriculum curriculum){ + + if (!isSecretaryOrAdmin(token)){ + return new UnauthorizedResponse<>("you're not allowed to post a Curriculum"); + } + + CurriculumServ.save(Curriculum); + + return new ResponseEntity<>("created !",HttpStatus.CREATED); + }**/ + } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LoginController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LoginController.java index 1e761ec..2be125d 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LoginController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LoginController.java @@ -47,6 +47,6 @@ public class LoginController { @PostMapping("/request/register") public ResponseEntity register(@RequestBody InscriptionRequest inscriptionRequest){ authServ.register(inscriptionRequest); - return new ResponseEntity<>("Is OK", HttpStatus.OK); + return new ResponseEntity<>("Is OK", HttpStatus.CREATED); } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/MockController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/MockController.java index 23fb5db..784a2f3 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/MockController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/MockController.java @@ -68,10 +68,10 @@ public class MockController { curriculumService.save(psychologyBab1); - Course progra1 = new Course(5,"Programmation et algorithimque 1","TODO DELETE"); - Course chemistry1 = new Course(12, "Thermochimie","TODO DELETE"); - Course psycho1 = new Course(21, "rien faire t'as cru c'est psycho", "TODO DELETE"); - Course commun = new Course(2, "cours commun","TODO DELETE"); + Course progra1 = new Course(5,"Programmation et algorithimque 1",joke); + Course chemistry1 = new Course(12, "Thermochimie",joke); + Course psycho1 = new Course(21, "rien faire t'as cru c'est psycho",joke); + Course commun = new Course(2, "cours commun",joke); courseService.save(progra1); courseService.save(chemistry1); diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java index 84fd34a..add697e 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java @@ -9,6 +9,8 @@ import ovh.herisson.Clyde.Services.AuthenticatorService; import ovh.herisson.Clyde.Services.UserService; import ovh.herisson.Clyde.Tables.Role; import ovh.herisson.Clyde.Tables.User; + +import java.security.Key; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -72,6 +74,23 @@ public class UserController { return new ResponseEntity<>("data modified", HttpStatus.OK); } + + @GetMapping("/teachers") + public ResponseEntity>> getAllTeachers(@RequestHeader("Authorization") String token){ + if (authServ.getUserFromToken(token) == null) + return new UnauthorizedResponse<>(null); + Iterable teachers = userService.getAllTeachers(); + ArrayList> withoutPassword = new ArrayList<>(); + + for (User t: teachers){ + withoutPassword.add(userWithoutPassword(t)); + } + + return new ResponseEntity<>(withoutPassword, HttpStatus.OK); + } + + + /** return user's data except password * @param user the user to return * @return all the user data without the password diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/TeacherCourseRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/TeacherCourseRepository.java new file mode 100644 index 0000000..ffe654a --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/TeacherCourseRepository.java @@ -0,0 +1,8 @@ +package ovh.herisson.Clyde.Repositories; + + +import org.springframework.data.repository.CrudRepository; +import ovh.herisson.Clyde.Tables.TeacherCourse; + +public interface TeacherCourseRepository extends CrudRepository { +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserRepository.java index af2bd08..b2643e0 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserRepository.java @@ -15,4 +15,8 @@ public interface UserRepository extends CrudRepository { /** @Query(value = "select a.* from Users a ",nativeQuery = true) Iterable findAllUsers();**/ + + @Query("select u from User u where u.role = ovh.herisson.Clyde.Tables.Role.Teacher") + Iterable findAllTeachers(); + } \ No newline at end of file diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java index a3301c1..63ef3c1 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java @@ -50,5 +50,18 @@ public class AuthenticatorService { return poster.getRole() != Role.Secretary || poster.getRole() != Role.Admin; } + public boolean IsNotIn(Role[] roles, String token){ + if (token == null) + return true; + + User poster = getUserFromToken(token); + if (poster == null) return true; + + for (Role r:roles){ + if (poster.getRole() == r) + return false; + } + return true; + } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java index 368dbb2..8278bbe 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java @@ -3,6 +3,10 @@ package ovh.herisson.Clyde.Services; import org.springframework.stereotype.Service; import ovh.herisson.Clyde.Repositories.CourseRepository; import ovh.herisson.Clyde.Tables.Course; +import ovh.herisson.Clyde.Tables.Role; +import ovh.herisson.Clyde.Tables.User; + +import java.util.Map; @Service public class CourseService { @@ -13,11 +17,39 @@ public class CourseService { this.courseRepo = courseRepo; } - public void save(Course course){ - courseRepo.save(course); + public Course save(Course course){ + return courseRepo.save(course); } public Course findById(long id){ return courseRepo.findById(id); } + + public Course modifyData(long id, Map updates, Role role) { + Course target = courseRepo.findById(id); + + if (role == Role.Teacher){ + for (Map.Entry entry : updates.entrySet()){ + if (entry.getKey().equals("title")){ + target.setTitle((String) entry.getValue()); + return courseRepo.save(target); + } + } + } + + for (Map.Entry entry: updates.entrySet()){ + switch (entry.getKey()){ + case "title": + target.setTitle((String) entry.getValue()); + break; + case "credits": + target.setCredits((Integer) entry.getValue()); + break; + case "owner": + target.setOwner((User) entry.getValue()); //todo check if is a teacher ! + break; + } + } + return courseRepo.save(target); + } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java new file mode 100644 index 0000000..0996adf --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java @@ -0,0 +1,39 @@ +package ovh.herisson.Clyde.Services; + +import org.springframework.stereotype.Controller; +import ovh.herisson.Clyde.Repositories.TeacherCourseRepository; +import ovh.herisson.Clyde.Repositories.UserRepository; +import ovh.herisson.Clyde.Tables.Course; +import ovh.herisson.Clyde.Tables.TeacherCourse; +import ovh.herisson.Clyde.Tables.User; + +import java.util.ArrayList; + +@Controller +public class TeacherCourseService { + private final TeacherCourseRepository teacherCourseRepo; + + private final UserRepository userRepo; + + public TeacherCourseService(TeacherCourseRepository teacherCourseRepo, UserRepository userRepo) { + this.teacherCourseRepo = teacherCourseRepo; + this.userRepo = userRepo; + } + + public boolean saveAll(Iterable teacherIds, Course course){ + + ArrayList addedIds = new ArrayList<>(); + for (Long teacherId : teacherIds){ + User teacher = userRepo.findById((long) teacherId); + if ( teacher== null){ + return false; + } + if (!addedIds.contains(teacherId)) + { + teacherCourseRepo.save(new TeacherCourse(teacher,course)); + addedIds.add(teacherId); + } + } + return true; + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java index 55a2f92..a561512 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java @@ -103,4 +103,8 @@ public class UserService { public Iterable getAll(){ return userRepo.findAll(); } + + + + public Iterable getAllTeachers (){return userRepo.findAllTeachers();} } \ No newline at end of file diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Course.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Course.java index 54e167a..e338d7d 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/Course.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Course.java @@ -1,9 +1,6 @@ package ovh.herisson.Clyde.Tables; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; @Entity public class Course { @@ -12,12 +9,15 @@ public class Course { private int courseID; private int credits; private String title; - private String faculty; - public Course(int credits, String title, String faculty){ + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "Users") + private User owner; + + public Course(int credits, String title, User owner){ this.credits = credits; this.title = title; - this.faculty = faculty; + this.owner = owner; } public Course() {} @@ -34,14 +34,6 @@ public class Course { this.credits = credits; } - public String getFaculty() { - return faculty; - } - - public void setFaculty(String faculty){ - this.faculty = faculty; - } - public String getTitle() { return title; } @@ -49,4 +41,12 @@ public class Course { public void setTitle(String title){ this.title = title; } + + public User getOwner() { + return owner; + } + + public void setOwner(User owner) { + this.owner = owner; + } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/TeacherGivenCourse.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/TeacherCourse.java similarity index 56% rename from backend/src/main/java/ovh/herisson/Clyde/Tables/TeacherGivenCourse.java rename to backend/src/main/java/ovh/herisson/Clyde/Tables/TeacherCourse.java index a1ee138..3392c72 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/TeacherGivenCourse.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/TeacherCourse.java @@ -3,30 +3,26 @@ package ovh.herisson.Clyde.Tables; import jakarta.persistence.*; @Entity -public class TeacherGivenCourse { +public class TeacherCourse { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "Users") private User user; - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "Course") private Course course; - //This flag helps make the difference between an assistant or a Teacher (who owns the course) - private boolean owned; - - public TeacherGivenCourse(User user, Course course, boolean owned){ + public TeacherCourse(User user, Course course){ this.user = user; this.course = course; - this.owned = owned; } - public TeacherGivenCourse() {} + public TeacherCourse() {} public int getId() { return id; @@ -48,11 +44,4 @@ public class TeacherGivenCourse { this.course = course; } - public boolean isOwned() { - return owned; - } - - public void setOwned(boolean owned) { - this.owned = owned; - } } diff --git a/frontend/src/App.vue b/frontend/src/App.vue index e9de01f..6414ee9 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,36 +1,10 @@