From 05ed28626aa2e015cc305fd383d4ec7502bcc9b1 Mon Sep 17 00:00:00 2001 From: Wawilski Date: Sun, 21 Apr 2024 19:55:39 +0200 Subject: [PATCH 1/2] Add course to a curriculum when created --- .../Clyde/EndPoints/CourseController.java | 20 ++++++++++--------- .../CurriculumCourseRepository.java | 8 ++++++++ frontend/src/Apps/ManageCourses.vue | 20 ++++++++++--------- frontend/src/Apps/ManageOwnLessons.vue | 2 +- frontend/src/rest/courses.js | 6 +++--- 5 files changed, 34 insertions(+), 22 deletions(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java index f85980c..e3c3e0e 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java @@ -6,10 +6,7 @@ import org.springframework.web.bind.annotation.*; import ovh.herisson.Clyde.Repositories.CurriculumCourseRepository; import ovh.herisson.Clyde.Responses.UnauthorizedResponse; import ovh.herisson.Clyde.Services.*; -import ovh.herisson.Clyde.Tables.Course; -import ovh.herisson.Clyde.Tables.Role; -import ovh.herisson.Clyde.Tables.User; -import ovh.herisson.Clyde.Tables.UserCurriculum; +import ovh.herisson.Clyde.Tables.*; import java.util.ArrayList; import java.util.HashMap; @@ -28,15 +25,18 @@ public class CourseController { private final UserService userService; + private final CurriculumService curriculumService; + private final UserCurriculumService userCurriculumService; private final CurriculumCourseRepository curriculumCourseRepository; private final CurriculumCourseService curriculumCourseService; - public CourseController(CourseService courseServ, TeacherCourseService teacherCourseServ, AuthenticatorService authServ, UserService userService, UserCurriculumService userCurriculumService, CurriculumCourseRepository curriculumCourseRepository, CurriculumCourseService curriculumCourseService) { + public CourseController(CourseService courseServ, TeacherCourseService teacherCourseServ, AuthenticatorService authServ, UserService userService, CurriculumService curriculumService, UserCurriculumService userCurriculumService, CurriculumCourseRepository curriculumCourseRepository, CurriculumCourseService curriculumCourseService) { this.courseServ = courseServ; this.teacherCourseServ = teacherCourseServ; this.authServ = authServ; this.userService = userService; + this.curriculumService = curriculumService; this.userCurriculumService = userCurriculumService; this.curriculumCourseRepository = curriculumCourseRepository; this.curriculumCourseService = curriculumCourseService; @@ -82,16 +82,18 @@ public class CourseController { } - @PostMapping("/course") + @PostMapping("/course/curriculum/{id}") public ResponseEntity> postCourse(@RequestHeader("Authorization") String token, - @RequestBody Course course) + @RequestBody Course course,@PathVariable long id) { if (authServ.isNotIn(new Role[]{Role.Secretary,Role.Admin},token)) return new UnauthorizedResponse<>(null); Course createdCourse = courseServ.save(course); - if (createdCourse == null) + Curriculum curriculum = curriculumService.findById(id); + if (createdCourse == null || curriculum == null) return new ResponseEntity<>(null,HttpStatus.BAD_REQUEST); - + CurriculumCourse curriculumCourse = new CurriculumCourse(curriculum,course); + curriculumCourseService.save(curriculumCourse); return new ResponseEntity<>(ProtectionService.courseWithoutPassword(createdCourse), HttpStatus.CREATED); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/CurriculumCourseRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/CurriculumCourseRepository.java index c99f50b..5d4f7b6 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/CurriculumCourseRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/CurriculumCourseRepository.java @@ -1,5 +1,7 @@ package ovh.herisson.Clyde.Repositories; +import jakarta.transaction.Transactional; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import ovh.herisson.Clyde.Tables.Course; @@ -14,4 +16,10 @@ public interface CurriculumCourseRepository extends CrudRepository findDistinctCurriculums(); + + @Modifying + @Transactional + @Query("delete from CurriculumCourse cc where cc.course =?1") + void delete(Course course); + } diff --git a/frontend/src/Apps/ManageCourses.vue b/frontend/src/Apps/ManageCourses.vue index 387dfba..bba81ce 100644 --- a/frontend/src/Apps/ManageCourses.vue +++ b/frontend/src/Apps/ManageCourses.vue @@ -3,26 +3,22 @@ import {reactive , ref} from 'vue' import { getCourses,deleteCourse,alterCourse,createCourse } from "@/rest/courses.js" import {getUser, getSelf, getTeachers } from "@/rest/Users.js" + import {getAllCurriculums} from "@/rest/curriculum.js"; const self = await getSelf(); const curriculum = ref(await getCourses(self.role)); const profList = await getTeachers(); - + const allCurriculums = ref(await getAllCurriculums()); const createMod = ref(false) const deleteMod = ref(false) const editElementID = ref("") - function editItem(id){ - editElementID.value = id; - } - - //Juste pour montrer le Create Mode - const pattern = { + "id":null, "title":null, "credits":null, "owner":null, @@ -41,7 +37,8 @@ } if (!isnull){ - await createCourse(toAdd.title,toAdd.credits,toAdd.owner); + await createCourse(toAdd.id,toAdd.title,toAdd.credits,toAdd.owner); + toAdd= Object.assign({},pattern); curriculum.value = await getCourses(self.role); @@ -102,7 +99,12 @@
- +
+ {{i18n("Curriculum")}} + +
{{i18n("name")}} : diff --git a/frontend/src/Apps/ManageOwnLessons.vue b/frontend/src/Apps/ManageOwnLessons.vue index ba762ef..cd6f778 100644 --- a/frontend/src/Apps/ManageOwnLessons.vue +++ b/frontend/src/Apps/ManageOwnLessons.vue @@ -136,7 +136,7 @@ async function askChanges(i){
{{i18n("schedule")}} :
diff --git a/frontend/src/rest/courses.js b/frontend/src/rest/courses.js index 3a87f5c..4a5f869 100644 --- a/frontend/src/rest/courses.js +++ b/frontend/src/rest/courses.js @@ -7,8 +7,8 @@ import { restGet, restPost, restDelete, restPatch } from './restConsumer.js' /** * Create a new course */ -export async function createCourse(name, credits, owner){ - return restPost("/course", {title: name, credits: credits, owner} ) +export async function createCourse(id,name, credits, owner){ + return restPost("/course/curriculum/" + id, {title: name, credits: credits, owner} ) } /** @@ -19,7 +19,7 @@ export async function deleteCourse(id){ } /** - * Get informations on a particular course + * Get information on a particular course * * @param id identification of the course * From 69be9681ff4f045f8f2070b465e753d1ccb1a134 Mon Sep 17 00:00:00 2001 From: Wawilski Date: Sun, 21 Apr 2024 21:50:38 +0200 Subject: [PATCH 2/2] Add course to Curriculum --- .../Clyde/EndPoints/CurriculumController.java | 29 +++++++-- .../CurriculumCourseRepository.java | 2 + .../Services/CurriculumCourseService.java | 4 ++ frontend/public/i18n/EN.txt | 1 + frontend/public/i18n/FR.txt | 1 + frontend/src/Apps/ManageCourses.vue | 65 ++++++++++++++++--- frontend/src/rest/curriculum.js | 6 ++ 7 files changed, 93 insertions(+), 15 deletions(-) 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 efe34e6..cd11055 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java @@ -19,6 +19,7 @@ public class CurriculumController { private final CurriculumService curriculumServ; + private final CourseService courseServ; private final AuthenticatorService authServ; private final UserCurriculumService userCurriculumServ; @@ -27,8 +28,9 @@ public class CurriculumController { private final UserService userServ; private final ExternalCurriculumRepository ecr; - public CurriculumController(CurriculumService curriculumServ, AuthenticatorService authServ, UserCurriculumService userCurriculumServ, CurriculumCourseService curriculumCourseServ, InscriptionRepository ir, UserService userServ, ExternalCurriculumRepository ecr){ + public CurriculumController(CurriculumService curriculumServ, CourseService courseServ, AuthenticatorService authServ, UserCurriculumService userCurriculumServ, CurriculumCourseService curriculumCourseServ, InscriptionRepository ir, UserService userServ, ExternalCurriculumRepository ecr){ this.curriculumServ = curriculumServ; + this.courseServ = courseServ; this.authServ = authServ; this.userCurriculumServ = userCurriculumServ; this.curriculumCourseServ = curriculumCourseServ; @@ -60,6 +62,18 @@ public class CurriculumController { return new ResponseEntity<>(curriculumCourseServ.getDepthCurriculum(curriculum),HttpStatus.OK); } + @GetMapping("/course/curriculum/{id}") + public ResponseEntity> getCurriculumsByCourse(@RequestHeader("Authorization") String token, @PathVariable long id){ + if(authServ.isNotIn(new Role[]{Role.Admin, Role.Secretary},token)) + return new UnauthorizedResponse<>(null); + Course course = courseServ.findById(id); + if(course == null) + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + Iterable curriculum = curriculumCourseServ.findCurriculumByCourses(course); + return new ResponseEntity<>(curriculum, HttpStatus.OK); + } + + //Return the list of all curicullums of an user @GetMapping("/onescurriculum/{userId}") @@ -91,17 +105,20 @@ public class CurriculumController { } @PostMapping("/curriculum/{id}") - public ResponseEntity postCoursesToCurriculum(@RequestHeader("Authorization") String token, - @RequestBody Iterable coursesIds, - @PathVariable long id) - { + public ResponseEntity postCourseToCurriculum(@RequestHeader("Authorization") String token, + @RequestBody long coursesId, + @PathVariable long id){ if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token)) return new UnauthorizedResponse<>(null); - if (!curriculumCourseServ.saveAll(coursesIds, curriculumServ.findById(id))) + CurriculumCourse curriculumCourse = new CurriculumCourse(curriculumServ.findById(id), courseServ.findById(coursesId)); + if(curriculumCourse.getCourse() == null || curriculumCourse.getCurriculum() == null) return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + + curriculumCourseServ.save(curriculumCourse); + return new ResponseEntity<>(HttpStatus.OK); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/CurriculumCourseRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/CurriculumCourseRepository.java index 5d4f7b6..b8dfc14 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/CurriculumCourseRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/CurriculumCourseRepository.java @@ -13,6 +13,8 @@ public interface CurriculumCourseRepository extends CrudRepository findCoursesByCurriculum(Curriculum curriculum); + @Query("select distinct cc.curriculum from CurriculumCourse cc where cc.course = ?1") + Iterable findCurriculumByCourses(Course course); @Query("select distinct cc.curriculum from CurriculumCourse cc") Iterable findDistinctCurriculums(); diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java index b522da3..c9b92db 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java @@ -51,6 +51,10 @@ public class CurriculumCourseService { return toReturn; } + public Iterable findCurriculumByCourses(Course course){ + return curriculumCourseRepo.findCurriculumByCourses(course); + } + public Iterable> getAllDepthCurriculum(){ ArrayList> toReturn = new ArrayList<>(); diff --git a/frontend/public/i18n/EN.txt b/frontend/public/i18n/EN.txt index 6598207..af0ff63 100644 --- a/frontend/public/i18n/EN.txt +++ b/frontend/public/i18n/EN.txt @@ -105,6 +105,7 @@ courses.modify=Modify courses.toDelete=Course to Delete courses.confirm=Confirm courses.back=Back +courses.AddToCurriculum=Add to a new Curriculum profile.modify.data=Modify personnal data profile.reRegister=Re-register profile.unRegister=Unregister diff --git a/frontend/public/i18n/FR.txt b/frontend/public/i18n/FR.txt index a09c338..d24c0b4 100644 --- a/frontend/public/i18n/FR.txt +++ b/frontend/public/i18n/FR.txt @@ -105,6 +105,7 @@ courses.modify=Modifier courses.toDelete=Cours à supprimer courses.confirm=Confirmer courses.back=Retour +courses.AddToCurriculum=Ajouter à un cursus profile.modify.data=Modifier données personnelles profile.reRegister=Réinsciption profile.unRegister=Désinscription diff --git a/frontend/src/Apps/ManageCourses.vue b/frontend/src/Apps/ManageCourses.vue index bba81ce..4e60c7b 100644 --- a/frontend/src/Apps/ManageCourses.vue +++ b/frontend/src/Apps/ManageCourses.vue @@ -3,7 +3,7 @@ import {reactive , ref} from 'vue' import { getCourses,deleteCourse,alterCourse,createCourse } from "@/rest/courses.js" import {getUser, getSelf, getTeachers } from "@/rest/Users.js" - import {getAllCurriculums} from "@/rest/curriculum.js"; + import {addCourseToCurriculum, getAllCurriculums, getCurriculumsByCourse} from "@/rest/curriculum.js"; const self = await getSelf(); @@ -11,11 +11,16 @@ const curriculum = ref(await getCourses(self.role)); const profList = await getTeachers(); const allCurriculums = ref(await getAllCurriculums()); + const curriculumToAdd = ref(); const createMod = ref(false) const deleteMod = ref(false) const editElementID = ref("") + const editAddCourse = ref(""); + + + const curriculumToAddId = ref() const pattern = { "id":null, @@ -45,7 +50,32 @@ }} - + async function setAddToCurriculum(item){ + let temp = []; + let courseCurriculum = await getCurriculumsByCourse(item.courseID); + let isIn = false; + for (let element in allCurriculums.value){ + for (let item in courseCurriculum){ + if((courseCurriculum[item].option == allCurriculums.value[element].option) && (courseCurriculum[item].year == allCurriculums.value[element].year) ){ + isIn = true; + break; + } + + } + if(!isIn){ + temp.push(allCurriculums.value[element]) + } + isIn = false; + } + curriculumToAdd.value = temp.slice(); + } + + async function addToCurriculum(item){ + await addCourseToCurriculum(curriculumToAddId.value,item.courseID); + curriculumToAddId.value = null; + curriculumToAdd.value = null; + allCurriculums.value = await getAllCurriculums(); + } function setModify(item){ for(const el in profList){ @@ -93,7 +123,7 @@ -
@@ -138,24 +168,39 @@
-
- +
-
+
-
+
+ + +
+
-
+
{{item.title}}
{{item.owner.lastName}}
{{i18n("Credits")}}:{{item.credits}}
-
+ +
+ {{i18n("Curriculum")}}: + +
+
+
{{i18n("Credits")}}:{{item.credits}}
+ +
diff --git a/frontend/src/rest/curriculum.js b/frontend/src/rest/curriculum.js index a34328c..5eb17f9 100644 --- a/frontend/src/rest/curriculum.js +++ b/frontend/src/rest/curriculum.js @@ -23,6 +23,9 @@ export async function getAllCurriculums(){ return restGet("/curriculums"); } +export async function getCurriculumsByCourse(id){ + return restGet("/course/curriculum/"+ id); +} /** * Get informations on a particular curriculum * @@ -53,4 +56,7 @@ export async function getSomeonesCurriculumList(user){ return restGet("/onescurriculum/"+user) } +export async function addCourseToCurriculum(id,courseID){ + return restPost("/curriculum/"+id, courseID); +}