diff --git a/README.md b/README.md index 5a99ac9..2d33f08 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,33 @@ Projet du groupe 01: - William Karpinski: Extension gestion des horaires - Léo Moulin: Extension inscription des étudiants +## Running + +Le projet peut être lancé grace à docker compose. + +```sh +$ docker compose up +``` + +Dans le cas ou vous modifiers des fichiers, pour éviter que les images de docker soient recrées avec les changement + +```sh +$ docker compose up --force-recreate --build +``` + ## Dévelopement -``` -$ ./gradlew backend:run frontend:run --parallel -``` +Dans le cas ou vous êtes dans une phase de développement, il est plus simple d'utiliser gradle pour lancer le backend et frontend dans un mode de développement. +**Attention**: Ce mode n'est pas fait pour être utilisé en production! +```sh +$ ./gradlew run --parallel +``` permet de lancer le frontend sur [http://localhost:5173](http://localhost:5173) ansi que le frontend sur [http://localhost:8080](http://localhost:8080) + +Ceci requière également docker pour lancer une instance de postgresql pris en charge par spring. + +Il est possible de se passer entièrement de docker en supprimant la dépendance dans le fichier `backend/build.gradle.kts`: ~~`developmentOnly("org.springframework.boot:spring-boot-docker-compose")`~~ +Il est alors nécéssaire d'avoir une instance de postgresql tournant sur `localhost:5432` avec une table `clyde`, utilisateur: `devel` et password: `devel` +(cette configuration peut également être changée dans le fichier resources/application.properties de spring) + diff --git a/backend/Dockerfile b/backend/Dockerfile index 5475dc9..1ed9969 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,6 +1,15 @@ +## Building phase +FROM gradle:jdk21-alpine AS BUILD +WORKDIR /backend + +COPY . . +RUN gradle build -x test + +## Running Phase FROM eclipse-temurin:21-jdk-alpine -VOLUME /tmp +WORKDIR /backend VOLUME /cdn -ENV SPRING_PROFILES_ACTIVE=prod -COPY build/libs/backend-0.0.1-SNAPSHOT.jar /app.jar -ENTRYPOINT ["java", "-jar", "/app.jar"] +# ENV SPRING_PROFILES_ACTIVE=prod +COPY --from=BUILD /backend/build/libs/Clyde-0.0.1-SNAPSHOT.jar /backend/app.jar +EXPOSE 8080 +ENTRYPOINT ["java", "-jar", "/backend/app.jar"] diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 2551f2a..810f47e 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -16,6 +16,8 @@ repositories { } dependencies { + compileOnly("org.projectlombok:lombok") + annotationProcessor("org.projectlombok:lombok") implementation("org.springframework.boot:spring-boot-starter-jdbc") implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-mail") diff --git a/backend/settings.gradle.kts b/backend/settings.gradle.kts new file mode 100644 index 0000000..7d39fc5 --- /dev/null +++ b/backend/settings.gradle.kts @@ -0,0 +1,13 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * For more detailed information on multi-project builds, please refer to https://docs.gradle.org/8.6/userguide/multi_project_builds.html in the Gradle documentation. + */ + +plugins { + // Apply the foojay-resolver plugin to allow automatic download of JDKs + id("org.gradle.toolchains.foojay-resolver-convention") version "0.7.0" +} + +rootProject.name = "Clyde" diff --git a/backend/src/main/java/ovh/herisson/Clyde/DTO/Msg/DiscussionDTO.java b/backend/src/main/java/ovh/herisson/Clyde/DTO/Msg/DiscussionDTO.java new file mode 100644 index 0000000..cd7f3cf --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/DTO/Msg/DiscussionDTO.java @@ -0,0 +1,34 @@ +package ovh.herisson.Clyde.DTO.Msg; + +/****************************************************** + * @file DiscussionDTO.java + * @author Anthony Debucquoy + * @scope Extension messagerie + * + * File to format a discussion using messageDTO + ******************************************************/ + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import lombok.AllArgsConstructor; +import lombok.Data; +import ovh.herisson.Clyde.Tables.User; +import ovh.herisson.Clyde.Tables.Msg.Discussion; +import ovh.herisson.Clyde.DTO.Msg.MessagesDTO; + +@Data +@AllArgsConstructor +public class DiscussionDTO { + private long id; + private String name; + private List members; + private List msgs; + + public static DiscussionDTO construct(Discussion d, User u){ + List msgsdto = new ArrayList<>(); + d.getMsgs().forEach(x -> msgsdto.add(MessagesDTO.construct(x, u))); + return new DiscussionDTO(d.getId(), d.getName(), d.getMembers(), msgsdto); + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/DTO/Msg/MessagesDTO.java b/backend/src/main/java/ovh/herisson/Clyde/DTO/Msg/MessagesDTO.java new file mode 100644 index 0000000..2ce0228 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/DTO/Msg/MessagesDTO.java @@ -0,0 +1,33 @@ +package ovh.herisson.Clyde.DTO.Msg; + +/****************************************************** + * @file MessagesDTO.java + * @author Anthony Debucquoy + * @scope Extension messagerie + * + * File to Format the response adding the sender field + ******************************************************/ + +import lombok.AllArgsConstructor; +import lombok.Data; +import ovh.herisson.Clyde.Tables.User; +import ovh.herisson.Clyde.Tables.Msg.Message; +import java.util.Date; + +@Data +@AllArgsConstructor +public class MessagesDTO { + private long id; + private String content; + private User author; + private boolean sender; + private Date created; + //TODO: Attachment + + public static MessagesDTO construct(Message m, User user){ + boolean sender = false; + if(m.getAuthor().equals(user)) + sender = true; + return new MessagesDTO(m.getId(), m.getContent(), m.getAuthor(), sender, m.getCreated()); + } +} 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 202a1e6..74f76fa 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java @@ -67,14 +67,17 @@ public class ApplicationsController { if (!authServ.isNotIn(new Role[]{Role.Teacher,Role.Secretary,Role.Admin},token)) authorizedApps.add(Applications.ManageCourses); - if (!authServ.isNotIn(new Role[]{Role.InscriptionService,Role.Admin},token)){ - authorizedApps.add(Applications.Inscription); + if (!authServ.isNotIn(new Role[]{Role.InscriptionService,Role.Admin, Role.Teacher},token)){ + authorizedApps.add(Applications.Requests); authorizedApps.add(Applications.StudentsList);} if (!authServ.isNotIn(new Role[]{Role.Secretary,Role.Admin},token)){ authorizedApps.add(Applications.UsersList); authorizedApps.add(Applications.ManageSchedules); authorizedApps.add(Applications.LessonRequests);} + + if (!authServ.isNotIn(new Role[]{Role.Secretary,Role.Admin, Role.InscriptionService},token)){ + authorizedApps.add(Applications.Payments);} return authorizedApps; } } 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 b11a075..9ee05de 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java @@ -133,4 +133,5 @@ public class CourseController { courseServ.delete(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 409e269..efe34e6 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java @@ -4,11 +4,13 @@ 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.Repositories.Inscription.ExternalCurriculumRepository; +import ovh.herisson.Clyde.Repositories.Inscription.InscriptionRepository; import ovh.herisson.Clyde.Responses.UnauthorizedResponse; import ovh.herisson.Clyde.Services.*; -import ovh.herisson.Clyde.Tables.Curriculum; -import ovh.herisson.Clyde.Tables.Role; +import ovh.herisson.Clyde.Tables.*; +import java.util.HashMap; import java.util.Map; @RestController @@ -21,12 +23,18 @@ public class CurriculumController { private final UserCurriculumService userCurriculumServ; private final CurriculumCourseService curriculumCourseServ; + private final InscriptionRepository ir; + private final UserService userServ; - public CurriculumController(CurriculumService curriculumServ, AuthenticatorService authServ, UserCurriculumService userCurriculumServ, CurriculumCourseService curriculumCourseServ){ + private final ExternalCurriculumRepository ecr; + public CurriculumController(CurriculumService curriculumServ, AuthenticatorService authServ, UserCurriculumService userCurriculumServ, CurriculumCourseService curriculumCourseServ, InscriptionRepository ir, UserService userServ, ExternalCurriculumRepository ecr){ this.curriculumServ = curriculumServ; this.authServ = authServ; this.userCurriculumServ = userCurriculumServ; this.curriculumCourseServ = curriculumCourseServ; + this.ir = ir; + this.userServ = userServ; + this.ecr = ecr; } @GetMapping("/curriculum/{id}") @@ -52,6 +60,22 @@ public class CurriculumController { return new ResponseEntity<>(curriculumCourseServ.getDepthCurriculum(curriculum),HttpStatus.OK); } + + //Return the list of all curicullums of an user + @GetMapping("/onescurriculum/{userId}") + public ResponseEntity> findOnesCurriculum(@RequestHeader("Authorization") String token, @PathVariable String userId){ + if (authServ.getUserFromToken(token) == null) + return new UnauthorizedResponse<>(null); + + User u = userServ.getUserById(Long.parseLong(userId)); + HashMap toReturn = userCurriculumServ.findAllCurriculumByStudent(u); + + if (toReturn == null) + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + + return new ResponseEntity<>(toReturn,HttpStatus.OK); + } + @GetMapping("/curriculums") public ResponseEntity>> findAllIndDepth(){ return new ResponseEntity<>(curriculumCourseServ.getAllDepthCurriculum(),HttpStatus.OK); @@ -94,4 +118,5 @@ public class CurriculumController { curriculumServ.delete(toDelete); return new ResponseEntity<>(HttpStatus.OK); } + } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/ExternalCurriculumController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/ExternalCurriculumController.java new file mode 100644 index 0000000..a8a87ce --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/ExternalCurriculumController.java @@ -0,0 +1,62 @@ +package ovh.herisson.Clyde.EndPoints.Inscription; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import ovh.herisson.Clyde.Repositories.Inscription.ExternalCurriculumRepository; +import ovh.herisson.Clyde.Repositories.Inscription.InscriptionRepository; +import ovh.herisson.Clyde.Repositories.UserRepository; +import ovh.herisson.Clyde.Tables.Inscription.ExternalCurriculum; +import ovh.herisson.Clyde.Tables.Inscription.InscriptionRequest; +import ovh.herisson.Clyde.Tables.User; + +import java.util.ArrayList; +import java.util.Map; + +@RestController +@CrossOrigin(originPatterns = "*", allowCredentials = "true") +public class ExternalCurriculumController { + + public final ExternalCurriculumRepository ecr; + public final InscriptionRepository inscriptionRepository; + public final UserRepository userRepository; + + public ExternalCurriculumController(ExternalCurriculumRepository ecr, InscriptionRepository inscriptionRepository, UserRepository userRepository) { + this.ecr = ecr; + this.inscriptionRepository = inscriptionRepository; + this.userRepository = userRepository; + } + + //everyone can post some externalcurriculums (the validity of the elements is assured by the inscription service) + @PostMapping("/externalcurriculum") + public ResponseEntity postExternalCurriculum(@RequestBody Map externalCurrInfos){ + //An external curriculum can either be linked to an User or to an InscriptionRequest + InscriptionRequest ir = null; + User user = null; + if (externalCurrInfos.get("inscriptionRequestId") != null){ + ir = inscriptionRepository.findById((Integer) externalCurrInfos.get("inscriptionRequestId")); + }else{ + user = userRepository.findById((Integer) externalCurrInfos.get("userRegNo")); + } + + ExternalCurriculum toSave = new ExternalCurriculum(ir, (String) externalCurrInfos.get("school"),(String) externalCurrInfos.get("formation"),(String) externalCurrInfos.get("completion"), (Integer)externalCurrInfos.get("startYear"), (Integer)externalCurrInfos.get("endYear"), (String)externalCurrInfos.get("justifDocUrl"), user); + + return new ResponseEntity<>(ecr.save(toSave), HttpStatus.OK); + } + + @GetMapping("/externalcurriculum/{inscReqId}") + public ResponseEntity> getExternalCurrListByInscrReq(@PathVariable long inscReqId){ + InscriptionRequest ir = inscriptionRepository.findById(inscReqId); + + ArrayList toReturn = ecr.getExternalCurriculumByInscriptionRequest(ir); + return new ResponseEntity<>(toReturn, HttpStatus.OK); + } + + @GetMapping("/externalcurriculumbyuser/{userId}") + public ResponseEntity> getExternalCurrByUser(@PathVariable long userId){ + User user = userRepository.findById(userId); + + ArrayList toReturn = ecr.getExternalCurriculumByUser(user); + return new ResponseEntity<>(toReturn, HttpStatus.OK); + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/InscriptionController.java similarity index 75% rename from backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java rename to backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/InscriptionController.java index 35c4852..60f4585 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/InscriptionController.java @@ -1,13 +1,13 @@ -package ovh.herisson.Clyde.EndPoints; +package ovh.herisson.Clyde.EndPoints.Inscription; 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.InscriptionService; +import ovh.herisson.Clyde.Services.Inscription.InscriptionService; import ovh.herisson.Clyde.Services.ProtectionService; -import ovh.herisson.Clyde.Tables.InscriptionRequest; +import ovh.herisson.Clyde.Tables.Inscription.InscriptionRequest; import ovh.herisson.Clyde.Tables.RequestState; import ovh.herisson.Clyde.Tables.Role; import java.util.Map; @@ -79,4 +79,22 @@ public class InscriptionController { return new ResponseEntity<>(HttpStatus.OK); } + + //Allow teacher or admin to accept or refuse the equivalence + @PatchMapping("/request/registerequiv/{id}/{newstate}") + public ResponseEntity editRegisterEquiv(@RequestHeader("Authorization") String token, @PathVariable long id, @PathVariable RequestState newstate){ + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Teacher}, token)) + return new UnauthorizedResponse<>(null); + + InscriptionRequest toEdit = inscriptionServ.getById(id); + toEdit.setEquivalenceState(newstate); + + inscriptionServ.save(toEdit); + + if (toEdit.getState() == RequestState.Accepted && (toEdit.getEquivalenceState() == RequestState.Accepted || toEdit.getEquivalenceState() == RequestState.Unrequired)) + { + inscriptionServ.createUser(toEdit); + } + return new ResponseEntity<>(HttpStatus.OK); + } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/MinervalController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/MinervalController.java new file mode 100644 index 0000000..737f472 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/MinervalController.java @@ -0,0 +1,55 @@ +package ovh.herisson.Clyde.EndPoints.Inscription; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import ovh.herisson.Clyde.Repositories.Inscription.MinervalRepository; +import ovh.herisson.Clyde.Responses.UnauthorizedResponse; +import ovh.herisson.Clyde.Services.AuthenticatorService; +import ovh.herisson.Clyde.Tables.Inscription.Minerval; +import ovh.herisson.Clyde.Tables.Role; + +import java.util.*; + +@RestController +@CrossOrigin(originPatterns = "*", allowCredentials = "true") +public class MinervalController { + private final AuthenticatorService authServ; + private final MinervalRepository mr; + + public MinervalController(AuthenticatorService authServ, MinervalRepository mr) { + this.authServ = authServ; + this.mr = mr; + } + + //A new minerval entry is posted when the inscription service accept a registration request + @PostMapping("/minerval/{studentRegNo}") + public ResponseEntity postMinerval(@RequestHeader("Authorization") String token, @PathVariable long studentRegNo){ + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary,Role.InscriptionService},token)) + return new UnauthorizedResponse<>(null); + + Calendar c = new GregorianCalendar(); + + mr.save(new Minerval(studentRegNo, 0, 835, c.get(Calendar.YEAR))); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/minerval/{studentRegNo}") + public ResponseEntity getCurrentMinervalbyRegNo(@PathVariable long studentRegNo){ + ArrayList mlist = mr.getMinervalsByStudentRegNoOrderByYearDesc(studentRegNo); + + //The list is ordered by year in descending order then the index 0 contains the actual minerval (for this year) + Minerval m = mlist.get(0); + return new ResponseEntity<>(m, HttpStatus.OK); + } + + @PatchMapping("/minerval") + public ResponseEntity updateMinerval(@RequestBody Minerval updatedMinerval){ + Minerval minerval = mr.findById(updatedMinerval.getId()); + + minerval.setPaidAmount(updatedMinerval.getPaidAmount()); + minerval.setToPay(updatedMinerval.getToPay()); + mr.save(minerval); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/PaymentController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/PaymentController.java new file mode 100644 index 0000000..9a16fb2 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/PaymentController.java @@ -0,0 +1,45 @@ +package ovh.herisson.Clyde.EndPoints.Inscription; + + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import ovh.herisson.Clyde.Repositories.Inscription.PaymentRepository; +import ovh.herisson.Clyde.Tables.Inscription.Payment; + +import java.util.ArrayList; + +@RestController +@CrossOrigin(originPatterns = "*", allowCredentials = "true") +public class PaymentController { + + private final PaymentRepository paymentRepository; + + public PaymentController(PaymentRepository paymentRepository){ + this.paymentRepository = paymentRepository; + } + + //Post a payment record + @PostMapping("/payment") + public ResponseEntity postPayment(@RequestBody Payment payment){ + paymentRepository.save(payment); + return new ResponseEntity<>(HttpStatus.OK); + } + + + //Get all payment records of a student + @GetMapping("/payment/{studentRegNo}") + public ResponseEntity> getPaymentsByUser(@PathVariable long studentRegNo){ + ArrayList toReturn = paymentRepository.getPaymentsByStudentRegNo(studentRegNo); + return new ResponseEntity<>(toReturn, HttpStatus.OK); + } + + @GetMapping("/payment") + public ResponseEntity> getAllPayments(){ + ArrayList toReturn = new ArrayList(); + + + paymentRepository.findAll().forEach(toReturn::add); + return new ResponseEntity<>(toReturn, HttpStatus.OK); + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/RequestsController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/RequestsController.java new file mode 100644 index 0000000..74d1bf0 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Inscription/RequestsController.java @@ -0,0 +1,312 @@ +package ovh.herisson.Clyde.EndPoints.Inscription; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import ovh.herisson.Clyde.Repositories.CourseRepository; +import ovh.herisson.Clyde.Repositories.CurriculumRepository; +import ovh.herisson.Clyde.Repositories.Inscription.ChangeCurriculumRequestRepository; +import ovh.herisson.Clyde.Repositories.Inscription.ExemptionsRequestRepository; +import ovh.herisson.Clyde.Repositories.Inscription.ScholarshipRequestRepository; +import ovh.herisson.Clyde.Repositories.Inscription.UnregisterRequestRepository; +import ovh.herisson.Clyde.Repositories.UserCurriculumRepository; +import ovh.herisson.Clyde.Repositories.UserRepository; +import ovh.herisson.Clyde.Responses.UnauthorizedResponse; +import ovh.herisson.Clyde.Services.AuthenticatorService; +import ovh.herisson.Clyde.Services.UserService; +import ovh.herisson.Clyde.Tables.*; +import ovh.herisson.Clyde.Tables.Inscription.ExemptionsRequest; +import ovh.herisson.Clyde.Tables.Inscription.ScholarshipRequest; +import ovh.herisson.Clyde.Tables.Inscription.UnregisterRequest; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.Map; + +@RestController +@CrossOrigin(originPatterns = "*", allowCredentials = "true") +public class RequestsController { + + public final ExemptionsRequestRepository err; + public final ScholarshipRequestRepository srr; + public final UserRepository userRepository; + public final AuthenticatorService authServ; + public final UnregisterRequestRepository unregisterRequestRepository; + public final CourseRepository courseRepository; + public final UserService userService; + public final UserCurriculumRepository userCurriculumRepository; + public final CurriculumRepository curriculumRepository; + + public final ChangeCurriculumRequestRepository changeCurriculumRequestRepository; + + public RequestsController(ExemptionsRequestRepository err, ScholarshipRequestRepository srr, UserRepository userRepository, AuthenticatorService authServ, UnregisterRequestRepository unregisterRequestRepository, CourseRepository courseRepository, UserService userService, UserCurriculumRepository userCurriculumRepository, CurriculumRepository curriculumRepository, ChangeCurriculumRequestRepository changeCurriculumRequestRepository) { + this.err = err; + this.srr = srr; + this.userRepository = userRepository; + this.authServ = authServ; + this.unregisterRequestRepository = unregisterRequestRepository; + this.courseRepository = courseRepository; + this.userService = userService; + this.userCurriculumRepository = userCurriculumRepository; + this.curriculumRepository = curriculumRepository; + this.changeCurriculumRequestRepository = changeCurriculumRequestRepository; + } + + @PostMapping(value="/exemptionreq") + public ResponseEntity createExemptionReq(@RequestBody Map exemptionsRequestInfo){ + User user = userRepository.findById((Integer) exemptionsRequestInfo.get("userRegNo")); + Course course = courseRepository.findById((Integer) exemptionsRequestInfo.get("courseId")); + + ExemptionsRequest exemptionsRequest = new ExemptionsRequest(user, course, (String) exemptionsRequestInfo.get("justifDocument"), RequestState.Pending, new Date()); + + err.save(exemptionsRequest); + + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PostMapping(value="/scholarshipreq") + public ResponseEntity createScholarshipReq(@RequestBody Map scholarshipRequestInfo){ + User user = userRepository.findById((Integer)scholarshipRequestInfo.get("userId")); + ScholarshipRequest toCreate = new ScholarshipRequest(user, RequestState.Pending, 0, new Date(), (String) scholarshipRequestInfo.get("taxDocUrl"), (String) scholarshipRequestInfo.get("residencyDocUrl")); + + srr.save(toCreate); + + return new ResponseEntity<>(HttpStatus.CREATED); + } + + //Get all the exemptions Request + @GetMapping(value = "/exemptionsreq") + public ResponseEntity> getAllExemptionsRequests(@RequestHeader("Authorization") String token){ + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary,Role.InscriptionService},token)) + return new UnauthorizedResponse<>(null); + + ArrayList toReturn = new ArrayList<>(); + + err.findAll().forEach(toReturn::add); + + return new ResponseEntity<>(toReturn, HttpStatus.OK); + } + + @GetMapping(value = "/exemptionsreq/{id}") + public ResponseEntity getExemptionRequestbyId(@RequestHeader("Authorization") String token, @PathVariable long id){ + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary,Role.InscriptionService},token)) + return new UnauthorizedResponse<>(null); + + ExemptionsRequest exemptionsRequest = err.findById(id); + + return new ResponseEntity<>(exemptionsRequest, HttpStatus.OK); + } + + @PatchMapping(value = "/exemptionsreq/{id}/{newstate}") + public ResponseEntity changeExemptionReqState(@RequestHeader("Authorization") String token, @PathVariable long id, @PathVariable RequestState newstate){ + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary,Role.InscriptionService},token)) + return new UnauthorizedResponse<>(null); + + ExemptionsRequest exemptionsRequest = err.findById(id); + exemptionsRequest.setState(newstate); + err.save(exemptionsRequest); + + return new ResponseEntity<>(HttpStatus.OK); + } + + //Get all the scholarships requests + @GetMapping(value = "/scholarshipreq") + public ResponseEntity> getAllScholarshipRequests(@RequestHeader("Authorization") String token){ + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary,Role.InscriptionService},token)) + return new UnauthorizedResponse<>(null); + + ArrayList toReturn = new ArrayList<>(); + + srr.findAll().forEach(toReturn::add); + + return new ResponseEntity<>(toReturn, HttpStatus.OK); + } + + @PostMapping(value = "/unregister") + public ResponseEntity postUnregReq(@RequestBody Map uninscr){ + User u = userRepository.findById((int) uninscr.get("userId")); + Curriculum c; + + if (uninscr.get("curriculumId") == null){ + c = null; + }else{ + c = curriculumRepository.findById((Integer) uninscr.get("curriculumId")); + } + + UnregisterRequest ur = new UnregisterRequest(RequestState.Pending, (String) uninscr.get("reason"), new Date(), u.getRegNo(), u.getFirstName(), u.getLastName(), u.getEmail(), c); + unregisterRequestRepository.save(ur); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PatchMapping(value = "/scholarshipreq/") + public ResponseEntity editScholReq(@RequestBody Map infos){ + ScholarshipRequest scholarshipRequest = srr.findById((Integer) infos.get("id")); + + if (infos.get("state").equals("Accepted")){ + scholarshipRequest.setState(RequestState.Accepted); + scholarshipRequest.setAmount((int) infos.get("amount")); + }else{ + scholarshipRequest.setState(RequestState.Refused); + } + + srr.save(scholarshipRequest); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping(value = "/scholarshipreq/{id}") + public ResponseEntity getScholReqbyId(@PathVariable long id){ + ScholarshipRequest toReturn = srr.findById(id); + return new ResponseEntity<>(toReturn, HttpStatus.OK); + } + + @GetMapping(value = "/unregister") + public ResponseEntity> getAllUnregReq(){ + ArrayList toReturn = new ArrayList<>(); + unregisterRequestRepository.findAll().forEach(toReturn::add); + return new ResponseEntity<>(toReturn, HttpStatus.OK); + } + + @GetMapping(value = "/unregister/{id}") + public ResponseEntity getUnregbyId(@PathVariable long id){ + UnregisterRequest unregisterRequest = unregisterRequestRepository.findById(id); + return new ResponseEntity<>(unregisterRequest, HttpStatus.OK); + } + + @PatchMapping(value = "/unregister/{id}/{newstate}") + public ResponseEntity pathUnregReq(@PathVariable long id, @PathVariable RequestState newstate){ + UnregisterRequest unregisterRequest = unregisterRequestRepository.findById(id); + User u = userRepository.findById(unregisterRequest.getRegNo()); + unregisterRequest.setState(newstate); + + if (newstate == RequestState.Accepted){ + if (unregisterRequest.getCurriculum() == null){ + ArrayList userCurricula = userCurriculumRepository.findByUserOrderByCurriculum(u); + for (int i = 0; i < userCurricula.size(); i++){ + userCurricula.get(i).setActual(false); + } + userCurriculumRepository.saveAll(userCurricula); + }else{ + //This usercurriculum will contain the usercurriculum to set false + UserCurriculum userCurriculum = userCurriculumRepository.findByUserAndCurriculumAndActual(u, unregisterRequest.getCurriculum(), true); + userCurriculum.setActual(false); + userCurriculumRepository.save(userCurriculum); + } + } + + unregisterRequestRepository.save(unregisterRequest); + return new ResponseEntity<>(HttpStatus.OK); + } + + //We look in the usercursus table if the student has already the previous year of a curriculum + public boolean studentHasPrevYear(Curriculum curriculum, User user){ + ArrayList userCurrList = userCurriculumRepository.findByUserOrderByCurriculum(user); + for (int i = 0; i < userCurrList.size(); i++){ + if (userCurrList.get(i).getCurriculum().getOption().equals(curriculum.getOption()) && userCurrList.get(i).getCurriculum().getYear() == curriculum.getYear()-1){ + return true; + } + } + return false; + } + @PostMapping("/changecurriculumreq") + public ResponseEntity addChangeCurrReq(@RequestBody Map reqInfos){ + User user = userRepository.findById((Integer) reqInfos.get("userId")); + + Curriculum actualCurriculum; + + //If null then it means we are in a supplementary cursus case + if (reqInfos.get("actualcursus") == null){ + actualCurriculum = null; + }else{ + actualCurriculum = curriculumRepository.findById((Integer) reqInfos.get("actualcursus")); + } + + Curriculum destinationCurriculum = curriculumRepository.findById((Integer) reqInfos.get("newcursus")); + + ChangeCurriculumRequest changeCurriculumRequest = new ChangeCurriculumRequest(user, actualCurriculum, destinationCurriculum, new Date(), RequestState.Pending, RequestState.Unrequired); + + //Si l'année du cursus est plus grande que 1 et que l'étudiant n'a pas dans sa liste de cursus l'année d'en dessous alors on demande l'accord du prof + if (destinationCurriculum.getYear() > 1 && !studentHasPrevYear(destinationCurriculum, user)){ + changeCurriculumRequest.setTeacherApprovalState(RequestState.Pending); + } + changeCurriculumRequestRepository.save(changeCurriculumRequest); + + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/changecurriculumreq") + public ResponseEntity> getAllChangeCurrReq(@RequestHeader("Authorization") String token){ + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary,Role.InscriptionService},token)) + return new UnauthorizedResponse<>(null); + + ArrayList toReturn = new ArrayList<>(); + + changeCurriculumRequestRepository.findAll().forEach(toReturn::add); + + return new ResponseEntity<>(toReturn, HttpStatus.OK); + } + + @GetMapping("/changecurriculumreq/{id}") + public ResponseEntity getCCrbyId(@RequestHeader("Authorization") String token, @PathVariable long id){ + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary,Role.InscriptionService},token)) + return new UnauthorizedResponse<>(null); + + ChangeCurriculumRequest toReturn = changeCurriculumRequestRepository.findById(id); + return new ResponseEntity<>(toReturn, HttpStatus.OK); + } + + @PatchMapping("/changecurriculumreq/{id}/{newState}") + public ResponseEntity editCCReq(@RequestHeader("Authorization") String token, @PathVariable long id, @PathVariable RequestState newState){ + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary,Role.InscriptionService},token)) + return new UnauthorizedResponse<>(null); + + ChangeCurriculumRequest toEdit = changeCurriculumRequestRepository.findById(id); + + toEdit.setState(newState); + + if (newState == RequestState.Accepted && (toEdit.getTeacherApprovalState() == RequestState.Accepted || toEdit.getTeacherApprovalState() == RequestState.Unrequired)){ + //If actual curriculum is not null then we need to set that the user doesn't follow it anymore + acceptProcedure(toEdit); + } + + changeCurriculumRequestRepository.save(toEdit); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PatchMapping("/changecurriculumreqteacher/{id}/{newteacherstate}") + public ResponseEntity editCCReqTeacherState(@RequestHeader("Authorization") String token, @PathVariable long id, @PathVariable RequestState newteacherstate){ + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary,Role.InscriptionService},token)) + return new UnauthorizedResponse<>(null); + + ChangeCurriculumRequest toEdit = changeCurriculumRequestRepository.findById(id); + + toEdit.setState(newteacherstate); + + if (newteacherstate == RequestState.Accepted && toEdit.getState() == RequestState.Accepted){ + //If actual curriculum is not null then we need to set that the user doesn't follow it anymore + acceptProcedure(toEdit); + } + + changeCurriculumRequestRepository.save(toEdit); + return new ResponseEntity<>(HttpStatus.OK); + } + + private void acceptProcedure(ChangeCurriculumRequest toEdit) { + User u = toEdit.getUser(); + if (toEdit.getActualCurriculum() != null){ + ArrayList listcurr = userCurriculumRepository.findByUserOrderByCurriculum(u); + + for (int i = 0; i < listcurr.size(); i++){ + if (listcurr.get(i).getCurriculum() == toEdit.getActualCurriculum()){ + listcurr.get(i).setActual(false); + } + } + + userCurriculumRepository.saveAll(listcurr); + } + + Calendar c = Calendar.getInstance(); + UserCurriculum userCurriculum = new UserCurriculum(u, toEdit.getDestinationCurriculum(), c.get(Calendar.YEAR), true); + userCurriculumRepository.save(userCurriculum); + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LessonController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LessonController.java index 080b024..72a05b1 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LessonController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LessonController.java @@ -1,5 +1,13 @@ package ovh.herisson.Clyde.EndPoints; +/****************************************************** + * @file LessonController.java + * @author William Karpinski + * @scope Extension Horaire + * + * Controller of Lessons API + ******************************************************/ + import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -28,6 +36,9 @@ public class LessonController { this.authServ = authServ; } + /** + * Return a lesson via its id + */ @GetMapping("/lesson/{id}") public ResponseEntity> getLesson(@PathVariable long id){ Lesson lesson = lessonServ.findById(id); @@ -38,6 +49,9 @@ public class LessonController { return new ResponseEntity<>(ProtectionService.lessonWithoutPassword(lesson),HttpStatus.OK); } + /** + * Return all the lessons + */ @GetMapping("/lessons") public ResponseEntity>> getAllLessons(@RequestHeader("Authorization") String token){ if(authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token)) @@ -45,15 +59,29 @@ public class LessonController { return new ResponseEntity<>(ProtectionService.lessonsWithoutPassword(lessonServ.findAll()),HttpStatus.OK); } + /** + * Return all the lessons of a teacher's courses + */ @GetMapping("/lessons/owned") public ResponseEntity>> getOwnedLessons(@RequestHeader("Authorization") String token){ - System.out.println(authServ); if (authServ.isNotIn(new Role[]{Role.Admin,Role.Teacher},token)){ return new UnauthorizedResponse<>(null);} return new ResponseEntity<>(ProtectionService.lessonsWithoutPassword(lessonServ.findAllOwnedLesson(authServ.getUserFromToken(token))),HttpStatus.OK); } + /** + ⋅* Return all the lessons of a student + */ + @GetMapping("/lessons/OwnCurriculum") + public ResponseEntity>> getOnesLessons(@RequestHeader("Authorization") String token){ + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Student},token)){ + return new UnauthorizedResponse<>(null);} + return new ResponseEntity<>(ProtectionService.lessonsWithoutPassword(lessonServ.findOnesLessons(authServ.getUserFromToken(token))),HttpStatus.OK); + } + /** + * Post a new lesson + */ @PostMapping("/lesson") public ResponseEntity> postLesson(@RequestHeader("Authorization") String token, @RequestBody Map lessonInfos){ @@ -69,7 +97,9 @@ public class LessonController { return new ResponseEntity<>(null,HttpStatus.BAD_REQUEST); return new ResponseEntity<>(ProtectionService.lessonWithoutPassword(createdLesson), HttpStatus.OK); } - + /** + * Modify a lesson + */ @PatchMapping("/lesson/{id}") public ResponseEntity patchLesson(@RequestHeader("Authorization") String token, @RequestBody Map updates, @@ -81,7 +111,9 @@ public class LessonController { } return new ResponseEntity<>(HttpStatus.OK); } - + /** + * Delete a lesson + */ @DeleteMapping("lesson/{id}") public ResponseEntity deleteLesson(@RequestHeader("Authorization") String token, @PathVariable Long id){ diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LessonRequestsController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LessonRequestsController.java index e3ba2bb..68eeeeb 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LessonRequestsController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LessonRequestsController.java @@ -1,5 +1,13 @@ package ovh.herisson.Clyde.EndPoints; +/****************************************************** + * @file LessonRequestsController.java + * @author William Karpinski + * @scope Extension Horaire + * + * Controller of lesson requests API + ******************************************************/ + import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -27,7 +35,9 @@ public class LessonRequestsController { this.authServ = authServ; this.lessonServ = lessonServ; } - + /** + * Return a lesson request via its id + */ @GetMapping("/requests/lessonRequest/{id}") public ResponseEntity> getById(@RequestHeader("Authorization") String token, @PathVariable long id){ if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token)) @@ -37,7 +47,9 @@ public class LessonRequestsController { return new ResponseEntity<>(ProtectionService.lessonRequestWithoutPassword(lessonRequest), HttpStatus.OK); } - + /** + * return all the requests made by a user + */ @GetMapping("/requests/lessonRequests/owned") public ResponseEntity>> getOwnedRequests(@RequestHeader("Authorization") String token){ if(authServ.isNotIn(new Role[]{Role.Admin,Role.Teacher},token)) @@ -47,7 +59,9 @@ public class LessonRequestsController { return new ResponseEntity<>(ProtectionService.lessonRequestsWithoutPassword(lessonChangesRequests),HttpStatus.OK); } - + /** + * Return all the lesson requests + */ @GetMapping("/requests/lessonRequests") public ResponseEntity>> getAllRequests(@RequestHeader("Authorization") String token){ if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token)) @@ -57,7 +71,9 @@ public class LessonRequestsController { return new ResponseEntity<>(ProtectionService.lessonRequestsWithoutPassword(lessonRequests), HttpStatus.OK); } - + /** + * Post a lesson request + */ @PostMapping("/requests/lessonRequest") public ResponseEntity> makeRequest(@RequestHeader("Authorization") String token, @RequestBody Map lessonRequestInfos){ if(authServ.isNotIn(new Role[]{Role.Admin,Role.Teacher},token)) @@ -68,7 +84,9 @@ public class LessonRequestsController { return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); return new ResponseEntity<>(ProtectionService.lessonRequestWithoutPassword(lessonChangesRequest),HttpStatus.OK); } - + /** + * Modify a lesson Request + */ @PatchMapping("/requests/lessonRequest/{id}") public ResponseEntity changeRequestState(@PathVariable long id, @RequestHeader("Authorization") String token, @@ -116,7 +134,9 @@ public class LessonRequestsController { } - + /** + * Delete a lesson request + */ @DeleteMapping("/requests/lessonRequest/{id}") public ResponseEntity deleteRequest(@RequestHeader("Authorization") String token, @PathVariable long id){ if(authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary,Role.Teacher},token)) 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 ef3c559..7ab988d 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LoginController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LoginController.java @@ -5,10 +5,14 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import ovh.herisson.Clyde.Repositories.CurriculumRepository; import ovh.herisson.Clyde.Responses.UnauthorizedResponse; import ovh.herisson.Clyde.Services.AuthenticatorService; import ovh.herisson.Clyde.Services.ProtectionService; -import ovh.herisson.Clyde.Tables.InscriptionRequest; +import ovh.herisson.Clyde.Tables.Curriculum; +import ovh.herisson.Clyde.Tables.Inscription.InscriptionRequest; +import ovh.herisson.Clyde.Tables.RequestState; + import java.util.Date; import java.util.Map; @@ -16,7 +20,7 @@ import java.util.Map; @CrossOrigin(originPatterns = "*", allowCredentials = "true") public class LoginController { private final AuthenticatorService authServ; - + private final CurriculumRepository curriculumRepository; static public class RequestLogin{ private final String identifier; private final String password; @@ -29,8 +33,9 @@ public class LoginController { } } - public LoginController(AuthenticatorService authServ){ + public LoginController(AuthenticatorService authServ, CurriculumRepository curriculumRepository){ this.authServ = authServ; + this.curriculumRepository = curriculumRepository; } @PostMapping(value = "/login") @@ -48,9 +53,18 @@ public class LoginController { @PostMapping("/register") public ResponseEntity> register(@RequestBody InscriptionRequest inscriptionRequest){ + //We ensure here that if the targeted cursus year is more than first grade then we need the teacher equivalence approval + Curriculum curr = curriculumRepository.findById(inscriptionRequest.getCurriculumId()); + + if (curr.getYear() > 1){ + inscriptionRequest.setEquivalenceState(RequestState.Pending); + }else{ + inscriptionRequest.setEquivalenceState(RequestState.Unrequired); + } InscriptionRequest returnedInscriptionRequest = authServ.register(inscriptionRequest); + return new ResponseEntity<>(ProtectionService.requestWithoutPassword(returnedInscriptionRequest), 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 23229ce..a9d5487 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/MockController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/MockController.java @@ -2,10 +2,16 @@ package ovh.herisson.Clyde.EndPoints; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.web.bind.annotation.*; -import ovh.herisson.Clyde.Repositories.TokenRepository; -import ovh.herisson.Clyde.Repositories.UserRepository; +import ovh.herisson.Clyde.Repositories.*; +import ovh.herisson.Clyde.Repositories.Inscription.ExternalCurriculumRepository; +import ovh.herisson.Clyde.Repositories.Inscription.MinervalRepository; +import ovh.herisson.Clyde.Repositories.Inscription.ScholarshipRequestRepository; +import ovh.herisson.Clyde.Repositories.Inscription.UnregisterRequestRepository; import ovh.herisson.Clyde.Services.*; +import ovh.herisson.Clyde.Services.Inscription.InscriptionService; import ovh.herisson.Clyde.Tables.*; +import ovh.herisson.Clyde.Tables.Inscription.*; + import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -15,14 +21,14 @@ import java.util.Date; public class MockController { private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); - + public final UserService userService; public final UserRepository userRepo; public final TokenRepository tokenRepo; public final TokenService tokenService; public final CurriculumCourseService CurriculumCourseService; public final CurriculumService curriculumService; public final CourseService courseService; - + public final ExternalCurriculumRepository externalCurriculumRepository; public final InscriptionService inscriptionService; public final LessonService lessonService; @@ -32,19 +38,31 @@ public class MockController { public final LessonRequestService lessonRequestService; ArrayList mockUsers; + public final UserCurriculumRepository ucr; - public MockController(UserRepository userRepo, TokenRepository tokenRepo, TokenService tokenService, CurriculumCourseService CurriculumCourseService, CurriculumService curriculumService, CourseService courseService, InscriptionService inscriptionService, LessonService lessonService, ScheduleService scheduleService, ScheduleLessonService scheduleLessonService, LessonRequestService lessonRequestService){ + public final MinervalRepository minervalRepository; + + public final ScholarshipRequestRepository scholarshipRequestRepository; + + public final UnregisterRequestRepository uninscriptionRequestRepository; + public MockController(UserService userService, UserRepository userRepo, TokenRepository tokenRepo, TokenService tokenService, CurriculumCourseService CurriculumCourseService, CurriculumService curriculumService, CourseService courseService, ExternalCurriculumRepository externalCurriculumRepository, InscriptionService inscriptionService, UserCurriculumRepository ucr, MinervalRepository minervalRepository, ScholarshipRequestRepository scholarshipRequestRepository, UnregisterRequestRepository unregisterRequestRepository, LessonService lessonService, ScheduleService scheduleService, ScheduleLessonService scheduleLessonService, LessonRequestService lessonRequestService){ + this.userService = userService; this.tokenRepo = tokenRepo; this.userRepo = userRepo; this.tokenService = tokenService; this.CurriculumCourseService = CurriculumCourseService; this.curriculumService = curriculumService; this.courseService = courseService; + this.externalCurriculumRepository = externalCurriculumRepository; this.inscriptionService = inscriptionService; this.lessonService = lessonService; this.scheduleService = scheduleService; this.scheduleLessonService = scheduleLessonService; this.lessonRequestService = lessonRequestService; + this.ucr = ucr; + this.minervalRepository = minervalRepository; + this.scholarshipRequestRepository = scholarshipRequestRepository; + this.uninscriptionRequestRepository = unregisterRequestRepository; } /** Saves an example of each user type by : @@ -57,28 +75,48 @@ public class MockController { public void postMock(){ // user part - - User herobrine = new User("brine","hero","admin@admin.com","behind","ShadowsLand",new Date(0), null,Role.Admin,passwordEncoder.encode("admin")); User joe = new User("Mama","Joe","student@student.com","roundabout","England",new Date(0), null,Role.Student,passwordEncoder.encode("student")); User meh = new User("Polo","Marco","secretary@secretary.com","a Box","Monaco",new Date(0), null,Role.Secretary,passwordEncoder.encode("secretary")); User joke = new User("Gaillard","Corentin","teacher@teacher.com","lab","faculty",new Date(0), null,Role.Teacher,passwordEncoder.encode("teacher")); User jojo = new User("Bridoux","Justin","teacher2@teacher2.com","lab","faculty",new Date(0), null,Role.Teacher,passwordEncoder.encode("teacher")); User lena = new User("Louille","Lena","inscriptionService@InscriptionService.com","no","yes",new Date(0), null,Role.InscriptionService,passwordEncoder.encode("inscriptionService")); - mockUsers = new ArrayList<>(Arrays.asList(herobrine,joe,meh,joke,lena,jojo)); + User popo = new User("Smith", "Paul", "paulsmith@gmail.com", "306 rue du poulet", "belgique", new Date(0), null, Role.Student, passwordEncoder.encode("jesuispaulleroi")); + mockUsers = new ArrayList<>(Arrays.asList(herobrine,joe,meh,joke,lena,jojo, popo)); - userRepo.saveAll(mockUsers); + userService.saveAll(mockUsers); + ExternalCurriculum externalCurriculum = new ExternalCurriculum(null, "HEH", "Bachelier en ingénieur", "completed", 2015, 2017, null, joe); + externalCurriculumRepository.save(externalCurriculum); + + Minerval minerval = new Minerval(joe.getRegNo(), 0, 852, 2023); + minervalRepository.save(minerval); // Course / Curriculum part - Curriculum infoBab1 = new Curriculum(1,"info"); - Curriculum chemistryBab1 = new Curriculum(1,"chemistry"); - Curriculum psychologyBab1 = new Curriculum(1,"psychology"); + Curriculum infoBab1 = new Curriculum(1,"info", false); + Curriculum chemistryBab1 = new Curriculum(1,"chemistry", false); + Curriculum psychologyBab1 = new Curriculum(1,"psychology", false); + Curriculum infoBab2 = new Curriculum(2,"info", false); + Curriculum masterinfo1 = new Curriculum(4, "info", false); + Curriculum masterinfo2 = new Curriculum(5, "info", false); + Curriculum chemistryBab2 = new Curriculum(2, "chemistry", false); + Curriculum ingebab1 = new Curriculum(1, "ingénieur", true); curriculumService.save(infoBab1); curriculumService.save(chemistryBab1); curriculumService.save(psychologyBab1); + curriculumService.save(infoBab2); + curriculumService.save(masterinfo1); + curriculumService.save(masterinfo2); + curriculumService.save(chemistryBab2); + curriculumService.save(ingebab1); + ucr.save(new UserCurriculum(joe, infoBab1, 2022, false)); + ucr.save(new UserCurriculum(joe, chemistryBab1, 2023, true)); + ucr.save(new UserCurriculum(joe, infoBab1, 2023, true)); + ucr.save(new UserCurriculum(joe, psychologyBab1, 2020, false)); + ucr.save(new UserCurriculum(popo, infoBab1, 2022, false)); + ucr.save(new UserCurriculum(popo, infoBab2, 2023, true)); Course progra1 = new Course(5,"Programmation et algorithmique 1",joke); Course chemistry1 = new Course(12, "Thermochimie",joke); @@ -90,10 +128,12 @@ public class MockController { courseService.save(psycho1); courseService.save(commun); + ScholarshipRequest ssr1 = new ScholarshipRequest(joe, RequestState.Pending, 0, new Date(), "test", "test"); + scholarshipRequestRepository.save(ssr1); CurriculumCourseService.save(new CurriculumCourse(infoBab1,progra1)); CurriculumCourseService.save(new CurriculumCourse(infoBab1,commun)); - + CurriculumCourseService.save(new CurriculumCourse(infoBab1, psycho1)); CurriculumCourseService.save(new CurriculumCourse(psychologyBab1,psycho1)); CurriculumCourseService.save(new CurriculumCourse(psychologyBab1,commun)); @@ -101,8 +141,7 @@ public class MockController { CurriculumCourseService.save(new CurriculumCourse(chemistryBab1,commun)); CurriculumCourseService.save(new CurriculumCourse(chemistryBab1,chemistry1)); - - InscriptionRequest inscriptionRequest = new InscriptionRequest("helen","prenom","non","helen@gmail.com","america",new Date(),(long) 1,RequestState.Pending,"yes.png","password"); + InscriptionRequest inscriptionRequest = new InscriptionRequest("helen","prenom","non","helen@gmail.com","america",new Date(),(long) 4,RequestState.Pending,"yes.png","password", null, new Date(), RequestState.Pending, null); inscriptionService.save(inscriptionRequest); @@ -149,6 +188,12 @@ public class MockController { lessonRequestService.save(request1); lessonRequestService.save(request2); lessonRequestService.save(request3); + + UnregisterRequest unregisterRequest = new UnregisterRequest(RequestState.Pending, "je veux partir", new Date(), joe.getRegNo(), joe.getFirstName(), joe.getLastName(), joe.getEmail(), null); + uninscriptionRequestRepository.save(unregisterRequest); + + externalCurriculum = new ExternalCurriculum(inscriptionRequest, "HEH", "Bachelier en informatique", "Completed", 2015, 2018, null, null); + externalCurriculumRepository.save(externalCurriculum); } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Msg/MessagesController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Msg/MessagesController.java new file mode 100644 index 0000000..9f1db44 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Msg/MessagesController.java @@ -0,0 +1,126 @@ +package ovh.herisson.Clyde.EndPoints.Msg; + +/****************************************************** + * @file MessagesController.java + * @author Anthony Debucquoy + * @scope Extension messagerie + * + * Entry point for the messages application + ******************************************************/ + +import org.springframework.beans.factory.annotation.Autowired; +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.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RestController; + +import lombok.AllArgsConstructor; +import ovh.herisson.Clyde.DTO.Msg.DiscussionDTO; +import ovh.herisson.Clyde.Repositories.UserRepository; +import ovh.herisson.Clyde.Repositories.Msg.DiscussionRepository; +import ovh.herisson.Clyde.Responses.UnauthorizedResponse; +import ovh.herisson.Clyde.Services.AuthenticatorService; +import ovh.herisson.Clyde.Services.UserService; +import ovh.herisson.Clyde.Services.Msg.DiscussionService; +import ovh.herisson.Clyde.Tables.User; +import ovh.herisson.Clyde.Tables.Msg.Discussion; +import ovh.herisson.Clyde.Tables.Msg.Message; + +@RestController +@CrossOrigin(originPatterns = "*", allowCredentials = "true") +@AllArgsConstructor +public class MessagesController { + + private AuthenticatorService authServ; + private DiscussionService discServ; + private DiscussionRepository discRepo; + private UserService userServ; + + @GetMapping("/discussions") + public ResponseEntity> getDiscussions(@RequestHeader("Authorization") String token ){ + User user = authServ.getUserFromToken(token); + if(user == null){ + return new UnauthorizedResponse<>(null); + } + + Iterable mock = discServ.getOwned(authServ.getUserFromToken(token)); + + return new ResponseEntity<>(mock, HttpStatus.OK); + } + + @GetMapping("/discussion/{id}") + public ResponseEntity getDiscussion(@RequestHeader("Authorization") String token, @PathVariable long id){ + User user = authServ.getUserFromToken(token); + if(user == null || !discServ.hasDiscussion(user, id) ){ + return new UnauthorizedResponse<>(null); + } + return new ResponseEntity<>(DiscussionDTO.construct(discRepo.findById(id).orElse(null), authServ.getUserFromToken(token)), HttpStatus.OK); + } + + @PatchMapping("/discussion/{id}") + public ResponseEntity AlterDiscussion(@RequestHeader("Authorization") String token, @PathVariable long id, @RequestBody Discussion data){ + User user = authServ.getUserFromToken(token); + if(user == null){ + return new UnauthorizedResponse<>(null); + } + + Discussion disc = discRepo.findById(id).orElse(null); + disc.setName(data.getName()); + discRepo.save(disc); + return new ResponseEntity<>(disc, HttpStatus.OK); + } + + @PatchMapping("/discussion/{id}/add") + public ResponseEntity invite(@RequestHeader("Authorization") String token, @PathVariable long id, @RequestBody User data){ + User user = authServ.getUserFromToken(token); + if(user == null){ + return new UnauthorizedResponse<>(null); + } + + Discussion disc = discRepo.findById(id).orElse(null); + User invited = userServ.getUserById(data.getRegNo()); + disc.addMember(invited); + discRepo.save(disc); + return new ResponseEntity<>(disc, HttpStatus.OK); + } + + @PatchMapping("/discussion/{id}/remove") + public ResponseEntity removeMember(@RequestHeader("Authorization") String token, @PathVariable long id, @RequestBody User data){ + User user = authServ.getUserFromToken(token); + if(user == null){ + return new UnauthorizedResponse<>(null); + } + + Discussion disc = discRepo.findById(id).orElse(null); + User member = userServ.getUserById(data.getRegNo()); + disc.delMember(member); + discRepo.save(disc); + return new ResponseEntity<>(disc, HttpStatus.OK); + } + + @PostMapping("/discussion/{id}") + public ResponseEntity sendMessage(@RequestHeader("Authorization") String token, @PathVariable long id, @RequestBody Message msg){ + User user = authServ.getUserFromToken(token); + if(user == null){ + return new UnauthorizedResponse<>(null); + } + + Discussion disc = discRepo.findById(id).orElse(null); + msg.setAuthor(user); + if(disc != null) + discServ.CreateMessage(disc, msg); + return new ResponseEntity<>(disc, HttpStatus.OK); + } + + + @PostMapping("/discussion") + public ResponseEntity createDiscussion(@RequestHeader("Authorization") String token, @RequestBody Discussion data){ + return new ResponseEntity<>(discServ.create(data.getName(), authServ.getUserFromToken(token)), HttpStatus.OK); + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ScheduleController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ScheduleController.java index 4c21684..2fe62d5 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ScheduleController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ScheduleController.java @@ -1,6 +1,14 @@ package ovh.herisson.Clyde.EndPoints; -import ch.qos.logback.core.net.SyslogOutputStream; +/****************************************************** + * @file ScheduleController.java + * @author William Karpinski + * @scope Extension Horaire + * + * Controller of Schedule API + ******************************************************/ + + import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -37,7 +45,9 @@ public class ScheduleController { this.curriculumServ = curriculumServ; this.lessonServ = lessonServ; } - + /** + * Return schedule via its id + */ @GetMapping("/schedule/{id}") public ResponseEntity> findById(@PathVariable long id){ Schedule schedule = scheduleServ.findById(id); @@ -47,17 +57,9 @@ public class ScheduleController { return new ResponseEntity<>(scheduleLessonServ.getDepthScheduleBySchedule(schedule),HttpStatus.OK); } - - @GetMapping("/schedule") - public ResponseEntity> findSelfSchedule(@RequestHeader("Authorization") String token){ - if(authServ.getUserFromToken(token) == null) - return new UnauthorizedResponse<>(null); - Schedule schedule = scheduleLessonServ.getScheduleByCurriculum(userCurriculumService.findByUser(authServ.getUserFromToken(token))); - if(schedule == null) - return new ResponseEntity<>(HttpStatus.BAD_REQUEST); - return new ResponseEntity<>(scheduleLessonServ.getDepthScheduleBySchedule(schedule),HttpStatus.OK); - } - + /** + * Return a schedule via its curriculum id + */ @GetMapping("/schedule/curriculum/{id}") public ResponseEntity> findCurriculumSchedule(@PathVariable Long id){ Schedule schedule = scheduleLessonServ.getScheduleByCurriculum(curriculumServ.findById(id)); @@ -65,12 +67,16 @@ public class ScheduleController { return new ResponseEntity<>(HttpStatus.BAD_REQUEST); return new ResponseEntity<>(scheduleLessonServ.getDepthScheduleBySchedule(schedule),HttpStatus.OK); } - + /** + * Return all schedules + */ @GetMapping("/schedules") public ResponseEntity>> findAllSchedule(){ return new ResponseEntity<>(scheduleLessonServ.getAllSchedule(),HttpStatus.OK); } - + /** + * Post a new schedule + */ @PostMapping("/schedule") public ResponseEntity postSchedule(@RequestHeader("Authorization") String token, @RequestBody Schedule schedule){ @@ -78,6 +84,9 @@ public class ScheduleController { return new UnauthorizedResponse<>(null); return new ResponseEntity<>(scheduleServ.save(schedule),HttpStatus.OK); } + /** + * Post a lesson to a schedule + */ @PostMapping("/schedule/{id}") public ResponseEntity postLessonToSchedule(@RequestHeader("Authorization") String token, @RequestBody Long lessonId, @@ -92,6 +101,9 @@ public class ScheduleController { return new ResponseEntity<>(HttpStatus.OK); } + /** + * Delete a lesson from a schedule + */ @DeleteMapping("/schedule/lesson/{id}") public ResponseEntity deleteLessonFromSchedule(@RequestHeader("Authorization") String token, @RequestBody Long lessonId, diff --git a/backend/src/main/java/ovh/herisson/Clyde/JdbcConfig.java b/backend/src/main/java/ovh/herisson/Clyde/JdbcConfig.java deleted file mode 100644 index 801e549..0000000 --- a/backend/src/main/java/ovh/herisson/Clyde/JdbcConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -package ovh.herisson.Clyde; - -import javax.sql.DataSource; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.jdbc.datasource.DriverManagerDataSource; -import org.springframework.scheduling.annotation.EnableScheduling; - -@Configuration -@EnableScheduling -public class JdbcConfig { - - @Bean - @Profile("!prod") - public DataSource psqlSource(){ - DriverManagerDataSource source = new DriverManagerDataSource(); - source.setDriverClassName("org.postgresql.Driver"); - source.setUrl("jdbc:postgresql://localhost:5442/clyde"); - source.setUsername("devel"); - source.setPassword("devel"); - - return source; - } - - @Bean - @Profile("prod") - public DataSource psqlSourceProd(){ - DriverManagerDataSource source = new DriverManagerDataSource(); - source.setDriverClassName("org.postgresql.Driver"); - source.setUrl("jdbc:postgresql:clyde?socketFactory=org.newsclub.net.unix.AFUNIXSocketFactory$FactoryArg&socketFactoryArg=/var/run/postgresql/.s.PGSQL.5432"); - source.setUsername("clyde"); - - return source; - } -} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/ChangeCurriculumRequestRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/ChangeCurriculumRequestRepository.java new file mode 100644 index 0000000..0248e43 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/ChangeCurriculumRequestRepository.java @@ -0,0 +1,9 @@ +package ovh.herisson.Clyde.Repositories.Inscription; + +import org.springframework.data.repository.CrudRepository; +import ovh.herisson.Clyde.Tables.ChangeCurriculumRequest; + +public interface ChangeCurriculumRequestRepository extends CrudRepository { + ChangeCurriculumRequest findById(long id); +} + diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/ExemptionsRequestRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/ExemptionsRequestRepository.java new file mode 100644 index 0000000..d644ef1 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/ExemptionsRequestRepository.java @@ -0,0 +1,8 @@ +package ovh.herisson.Clyde.Repositories.Inscription; + +import org.springframework.data.repository.CrudRepository; +import ovh.herisson.Clyde.Tables.Inscription.ExemptionsRequest; + +public interface ExemptionsRequestRepository extends CrudRepository { + ExemptionsRequest findById(long id); +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/ExternalCurriculumRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/ExternalCurriculumRepository.java new file mode 100644 index 0000000..7b4ee4e --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/ExternalCurriculumRepository.java @@ -0,0 +1,15 @@ +package ovh.herisson.Clyde.Repositories.Inscription; + +import org.springframework.data.repository.CrudRepository; +import ovh.herisson.Clyde.Tables.Inscription.ExternalCurriculum; +import ovh.herisson.Clyde.Tables.Inscription.InscriptionRequest; +import ovh.herisson.Clyde.Tables.User; + +import java.util.ArrayList; + +public interface ExternalCurriculumRepository extends CrudRepository { + ArrayList getExternalCurriculumByInscriptionRequest(InscriptionRequest ir); + + ArrayList getExternalCurriculumByUser(User user); + ExternalCurriculum getExternalCurriculumById(long id); +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/InscriptionRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/InscriptionRepository.java similarity index 62% rename from backend/src/main/java/ovh/herisson/Clyde/Repositories/InscriptionRepository.java rename to backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/InscriptionRepository.java index 0d83e6b..6564377 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/InscriptionRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/InscriptionRepository.java @@ -1,7 +1,7 @@ -package ovh.herisson.Clyde.Repositories; +package ovh.herisson.Clyde.Repositories.Inscription; import org.springframework.data.repository.CrudRepository; -import ovh.herisson.Clyde.Tables.InscriptionRequest; +import ovh.herisson.Clyde.Tables.Inscription.InscriptionRequest; public interface InscriptionRepository extends CrudRepository { diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/MinervalRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/MinervalRepository.java new file mode 100644 index 0000000..475ac3c --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/MinervalRepository.java @@ -0,0 +1,12 @@ +package ovh.herisson.Clyde.Repositories.Inscription; + +import org.springframework.data.repository.CrudRepository; +import ovh.herisson.Clyde.Tables.Inscription.Minerval; + +import java.util.ArrayList; + +public interface MinervalRepository extends CrudRepository { + public ArrayList getMinervalsByStudentRegNoOrderByYearDesc(Long studentRegNo); + + public Minerval findById(long id); +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/PaymentRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/PaymentRepository.java new file mode 100644 index 0000000..c479a4e --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/PaymentRepository.java @@ -0,0 +1,10 @@ +package ovh.herisson.Clyde.Repositories.Inscription; + +import org.springframework.data.repository.CrudRepository; +import ovh.herisson.Clyde.Tables.Inscription.Payment; + +import java.util.ArrayList; + +public interface PaymentRepository extends CrudRepository { + public ArrayList getPaymentsByStudentRegNo(long regNo); +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/ScholarshipRequestRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/ScholarshipRequestRepository.java new file mode 100644 index 0000000..c0c1407 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/ScholarshipRequestRepository.java @@ -0,0 +1,8 @@ +package ovh.herisson.Clyde.Repositories.Inscription; + +import org.springframework.data.repository.CrudRepository; +import ovh.herisson.Clyde.Tables.Inscription.ScholarshipRequest; + +public interface ScholarshipRequestRepository extends CrudRepository { + public ScholarshipRequest findById(long id); +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/UnregisterRequestRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/UnregisterRequestRepository.java new file mode 100644 index 0000000..f6a4ebc --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Inscription/UnregisterRequestRepository.java @@ -0,0 +1,8 @@ +package ovh.herisson.Clyde.Repositories.Inscription; + +import org.springframework.data.repository.CrudRepository; +import ovh.herisson.Clyde.Tables.Inscription.UnregisterRequest; + +public interface UnregisterRequestRepository extends CrudRepository { + public UnregisterRequest findById(long l); +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/LessonChangesRequestRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/LessonChangesRequestRepository.java index 9e8f3a4..4f732d6 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/LessonChangesRequestRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/LessonChangesRequestRepository.java @@ -1,5 +1,11 @@ package ovh.herisson.Clyde.Repositories; +/****************************************************** + * @file LessonChangesRequestRepository.java + * @author William Karpinski + * @scope Extension Horaire + ******************************************************/ + import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import ovh.herisson.Clyde.Tables.LessonChangesRequest; diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/LessonRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/LessonRepository.java index 4638085..6d80ef8 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/LessonRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/LessonRepository.java @@ -1,5 +1,11 @@ package ovh.herisson.Clyde.Repositories; +/****************************************************** + * @file LessonRepository.java + * @author William Karpinski + * @scope Extension Horaire + ******************************************************/ + import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import ovh.herisson.Clyde.Tables.Course; diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/Msg/DiscussionRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Msg/DiscussionRepository.java new file mode 100644 index 0000000..9b2675b --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Msg/DiscussionRepository.java @@ -0,0 +1,23 @@ +package ovh.herisson.Clyde.Repositories.Msg; + +/****************************************************** + * @file DiscussionRepository.java + * @author Anthony Debucquoy + * @scope Extension messagerie + * + * Repository of Discussion allowing to fetch discussion by user + ******************************************************/ + + +import java.util.List; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; + +import ovh.herisson.Clyde.Tables.Msg.Discussion; + +public interface DiscussionRepository extends CrudRepository{ + + @Query("SELECT d FROM Discussion d INNER JOIN FETCH d.members dm WHERE dm.id = ?1") + List findByMembership(long userid); +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/Msg/MessageRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Msg/MessageRepository.java new file mode 100644 index 0000000..021ac79 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Msg/MessageRepository.java @@ -0,0 +1,14 @@ +package ovh.herisson.Clyde.Repositories.Msg; + +/****************************************************** + * @file MessageRepository.java + * @author Anthony Debucquoy + * @scope Extension messagerie + ******************************************************/ + + +import org.springframework.data.repository.CrudRepository; + +import ovh.herisson.Clyde.Tables.Msg.Message; + +public interface MessageRepository extends CrudRepository {} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/ScheduleLessonRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/ScheduleLessonRepository.java index 68cd593..97e69ca 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/ScheduleLessonRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/ScheduleLessonRepository.java @@ -1,5 +1,10 @@ package ovh.herisson.Clyde.Repositories; +/****************************************************** + * @file ScheduleLessonRepository.java + * @author William Karpinski + * @scope Extension Horaire + ******************************************************/ import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -14,18 +19,9 @@ public interface ScheduleLessonRepository extends CrudRepository findLessonByCurriculum(Curriculum curriculum); - @Query("select distinct sl.schedule from ScheduleLesson sl") - Iterable findDistinctSchedule(); - @Query("select distinct sl.schedule from ScheduleLesson sl where sl.schedule.curriculum = ?1") Schedule findScheduleByCurriculum(Curriculum curriculum); - @Query("select distinct sl.lesson from ScheduleLesson sl where sl.schedule = ?1") - Iterable findLessonsBySchedule(Schedule schedule); - - - - @Modifying @Transactional @Query("delete from ScheduleLesson sl where sl.lesson =?1") diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/ScheduleRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/ScheduleRepository.java index 7159da9..04f3cde 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/ScheduleRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/ScheduleRepository.java @@ -1,5 +1,11 @@ package ovh.herisson.Clyde.Repositories; +/****************************************************** + * @file ScheduleRepository.java + * @author William Karpinski + * @scope Extension Horaire + ******************************************************/ + import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import ovh.herisson.Clyde.Tables.Course; diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserCurriculumRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserCurriculumRepository.java index 32f207a..75922fa 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserCurriculumRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserCurriculumRepository.java @@ -6,8 +6,14 @@ import ovh.herisson.Clyde.Tables.Curriculum; import ovh.herisson.Clyde.Tables.User; import ovh.herisson.Clyde.Tables.UserCurriculum; +import java.util.ArrayList; + public interface UserCurriculumRepository extends CrudRepository { @Query("select uc.curriculum from UserCurriculum uc where uc.user = ?1") Curriculum findByUser(User student); + + ArrayList findByUserOrderByCurriculum(User student); + UserCurriculum findByUserAndCurriculumAndActual(User user, Curriculum curriculum, boolean actual); + } 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 25c127f..9e517b7 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java @@ -1,7 +1,10 @@ package ovh.herisson.Clyde.Services; import org.springframework.stereotype.Service; +import ovh.herisson.Clyde.Services.Inscription.InscriptionService; import ovh.herisson.Clyde.Tables.*; +import ovh.herisson.Clyde.Tables.Inscription.InscriptionRequest; + import java.util.Date; @Service 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 19549d0..b522da3 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java @@ -46,7 +46,7 @@ public class CurriculumCourseService { toReturn.put("curriculumId", curriculum.getCurriculumId()); toReturn.put("year", curriculum.getYear()); toReturn.put("option", curriculum.getOption()); - + toReturn.put("requireCertificate", curriculum.isRequireCertificate()); return toReturn; } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumService.java index af04d78..790c51f 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumService.java @@ -18,7 +18,6 @@ public class CurriculumService { public Curriculum findById(long id){ return curriculumRepo.findById(id); } - public void delete(Curriculum curriculum) { curriculumRepo.delete(curriculum); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/Inscription/InscriptionService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/Inscription/InscriptionService.java new file mode 100644 index 0000000..208471d --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/Inscription/InscriptionService.java @@ -0,0 +1,109 @@ +package ovh.herisson.Clyde.Services.Inscription; + +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; +import ovh.herisson.Clyde.Repositories.*; +import ovh.herisson.Clyde.Repositories.Inscription.ExternalCurriculumRepository; +import ovh.herisson.Clyde.Repositories.Inscription.InscriptionRepository; +import ovh.herisson.Clyde.Repositories.Inscription.MinervalRepository; +import ovh.herisson.Clyde.Services.UserService; +import ovh.herisson.Clyde.Tables.*; +import ovh.herisson.Clyde.Tables.Inscription.ExternalCurriculum; +import ovh.herisson.Clyde.Tables.Inscription.InscriptionRequest; +import ovh.herisson.Clyde.Tables.Inscription.Minerval; + +import java.util.ArrayList; +import java.util.Calendar; + +@Service +public class InscriptionService { + + private final InscriptionRepository inscriptionRepo; + + private final UserRepository userRepo; + + private final UserCurriculumRepository userCurriculumRepo; + + private final CurriculumRepository curriculumRepo; + + private final MinervalRepository minervalRepository; + private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + private final ExternalCurriculumRepository externalCurriculumRepository; + private final UserService userService; + public InscriptionService(InscriptionRepository inscriptionRepo, UserRepository userRepo, UserCurriculumRepository userCurriculumRepo, CurriculumRepository curriculumRepo, MinervalRepository minervalRepository, ExternalCurriculumRepository externalCurriculumRepository, UserService userService){ + this.inscriptionRepo = inscriptionRepo; + this.userRepo = userRepo; + this.userCurriculumRepo = userCurriculumRepo; + this.curriculumRepo = curriculumRepo; + this.minervalRepository = minervalRepository; + this.externalCurriculumRepository = externalCurriculumRepository; + this.userService = userService; + } + + public InscriptionRequest save(InscriptionRequest inscriptionRequest){ + inscriptionRequest.setPassword(passwordEncoder.encode(inscriptionRequest.getPassword())); + return inscriptionRepo.save(inscriptionRequest); + } + + public InscriptionRequest getById(long id){ + return inscriptionRepo.findById(id); + } + + public Iterable getAll(){ + return inscriptionRepo.findAll(); + } + + public boolean modifyState(long id, RequestState requestState) { + InscriptionRequest inscrRequest = getById(id); + + if (inscrRequest == null) + return false; + + inscrRequest.setState(requestState); + save(inscrRequest); + + //saves the user from the request if accepted from teacher and inscription services + if (requestState == RequestState.Accepted && (inscrRequest.getEquivalenceState() == RequestState.Accepted || inscrRequest.getEquivalenceState() == RequestState.Unrequired)) + { + return createUser(inscrRequest); + } + return true; + } + + public boolean createUser(InscriptionRequest inscrRequest){ + //We must send an email here + + if (curriculumRepo.findById(inscrRequest.getCurriculumId()) == null) + return false; + + User userFromRequest = new User( + inscrRequest.getLastName(), + inscrRequest.getFirstName(), + inscrRequest.getEmail(), + inscrRequest.getAddress(), + inscrRequest.getCountry(), + inscrRequest.getBirthDate(), + inscrRequest.getProfilePicture(), + inscrRequest.getPassword() + ); + + userService.save(userFromRequest); + Calendar c = Calendar.getInstance(); + userCurriculumRepo.save(new UserCurriculum(userFromRequest, curriculumRepo.findById(inscrRequest.getCurriculumId()),c.get(Calendar.YEAR), true)); + + //Create a minerval for the new student + Minerval minerval = new Minerval(userFromRequest.getRegNo(), 0, 852, 2023); + minervalRepository.save(minerval); + + //Assign the externals curriculums from the inscription request to newly created student + ArrayList extCurrList = externalCurriculumRepository.getExternalCurriculumByInscriptionRequest(inscrRequest); + for (int i = 0; i < extCurrList.size(); i++){ + extCurrList.get(i).setUser(userFromRequest); + externalCurriculumRepository.save(extCurrList.get(i)); + } + return true; + } + public void delete(InscriptionRequest toDelete) { + inscriptionRepo.delete(toDelete); + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java deleted file mode 100644 index 311dbf2..0000000 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java +++ /dev/null @@ -1,94 +0,0 @@ -package ovh.herisson.Clyde.Services; - -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.stereotype.Service; -import ovh.herisson.Clyde.Repositories.CurriculumRepository; -import ovh.herisson.Clyde.Repositories.InscriptionRepository; -import ovh.herisson.Clyde.Repositories.UserCurriculumRepository; -import ovh.herisson.Clyde.Repositories.UserRepository; -import ovh.herisson.Clyde.Tables.InscriptionRequest; -import ovh.herisson.Clyde.Tables.RequestState; -import ovh.herisson.Clyde.Tables.User; -import ovh.herisson.Clyde.Tables.UserCurriculum; - -@Service -public class InscriptionService { - - private final InscriptionRepository inscriptionRepo; - - private final UserRepository userRepo; - - private final UserCurriculumRepository userCurriculumRepo; - - private final CurriculumRepository curriculumRepo; - - private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); - - - public InscriptionService(InscriptionRepository inscriptionRepo, UserRepository userRepo, UserCurriculumRepository userCurriculumRepo, CurriculumRepository curriculumRepo){ - this.inscriptionRepo = inscriptionRepo; - this.userRepo = userRepo; - this.userCurriculumRepo = userCurriculumRepo; - this.curriculumRepo = curriculumRepo; - } - - public InscriptionRequest save(InscriptionRequest inscriptionRequest){ - inscriptionRequest.setPassword(passwordEncoder.encode(inscriptionRequest.getPassword())); - return inscriptionRepo.save(inscriptionRequest); - } - - public InscriptionRequest getById(long id){ - return inscriptionRepo.findById(id); - } - - public Iterable getAll(){ - return inscriptionRepo.findAll(); - } - - public boolean modifyState(long id, RequestState requestState) { - InscriptionRequest inscrRequest = getById(id); - - if (inscrRequest == null) - return false; - - // if th state is the same we don't send an email - if (requestState == inscrRequest.getState()) - return false; - - /** todo send an email to tell the poster of the inscrRequest (inscrRequest.getEmail()) - * to notify them that the state of their request changed - * FooEmailFormat toSend = (String.format("Your request state changed from %s to %s"), - * inscrRequest.getState(), requestState) - * FooEmailSender.send(toSend, inscrRequest.getEmail()) - */ - - - //saves the user from the request if accepted - if (requestState == RequestState.Accepted) - { - if (curriculumRepo.findById(inscrRequest.getCurriculumId()) == null) - return false; - - User userFromRequest = new User( - inscrRequest.getLastName(), - inscrRequest.getFirstName(), - inscrRequest.getEmail(), - inscrRequest.getAddress(), - inscrRequest.getCountry(), - inscrRequest.getBirthDate(), - inscrRequest.getProfilePicture(), - inscrRequest.getPassword() - ); - - userRepo.save(userFromRequest); - userCurriculumRepo.save(new UserCurriculum(userFromRequest, curriculumRepo.findById(inscrRequest.getCurriculumId()))); - } - inscrRequest.setState(requestState); - save(inscrRequest); - return true; - } - - public void delete(InscriptionRequest toDelete) { - inscriptionRepo.delete(toDelete); - } -} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/LessonRequestService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/LessonRequestService.java index 8d16615..21a6732 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/LessonRequestService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/LessonRequestService.java @@ -1,5 +1,10 @@ package ovh.herisson.Clyde.Services; +/****************************************************** + * @file LeessonRequestService.java + * @author William Karpinski + * @scope Extension Horaire + ******************************************************/ import org.springframework.stereotype.Service; import ovh.herisson.Clyde.Repositories.*; import ovh.herisson.Clyde.Tables.*; @@ -40,17 +45,31 @@ public class LessonRequestService { this.userServ = userServ; this.courseRepository = courseRepository; } - public Iterable findOwnRequests(User user){ - return lessonChangesRepo.findOwnRequests(user); - } + + /** + * Create a new lesson request + */ public LessonChangesRequest save(LessonChangesRequest lessonRequest){ return lessonChangesRepo.save(lessonRequest); } + + /** + * Find all the requests made by a user + */ + public Iterable findOwnRequests(User user){ + return lessonChangesRepo.findOwnRequests(user); + } public LessonChangesRequest findById(long id){ return lessonChangesRepo.findById(id); } + /** + * Return all the requests + */ public Iterable getAll(){return lessonChangesRepo.findAll();} + /** + * Create a lesson if a request is accepted + */ public boolean modifyCreateRequestState(LessonChangesRequest lessonRequest, RequestState state, String local ){ if(lessonRequest == null || state == lessonRequest.getState() || state == null){ return false;} @@ -78,23 +97,31 @@ public class LessonRequestService { return lessonChangesRepo.findRequestByLessonId(id); } + /** + * Refuse all the lesson request that depends on a certain lesson + * Used after the deletion of the lesson + */ public void refuseAllByLessonId(long id){ Iterable toRefuse = findRequestByLessonId(id); for(LessonChangesRequest element : toRefuse) element.setState(RequestState.Refused); - } + } + /** + * Modify a lesson if a request is accepted + */ public boolean modifyChangeRequestState(Map updates, long lessonId,RequestState state){ if(state == RequestState.Accepted){ - - Lesson lesson = lessonServ.findById(lessonId); return lessonServ.modifyData(lesson.getLessonID(),updates); } return true; } + /** + * Delete a lesson if a request is accepted + */ public void modifyDeleteRequest(LessonChangesRequest lessonChangesRequest, RequestState state){ if(state == RequestState.Accepted){ lessonServ.delete(lessonServ.findById(lessonChangesRequest.getLessonId())); @@ -102,6 +129,9 @@ public class LessonRequestService { } } + /** + * Construct a lesson request + */ public LessonChangesRequest createLessonRequest(Map lessonInfos) { LessonChangesRequest target = new LessonChangesRequest(); @@ -141,9 +171,6 @@ public class LessonRequestService { return target; } - - - public void delete (LessonChangesRequest toDelete) { lessonChangesRepo.delete(toDelete); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/LessonService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/LessonService.java index 7a0fa12..474d473 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/LessonService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/LessonService.java @@ -1,44 +1,86 @@ package ovh.herisson.Clyde.Services; + +/****************************************************** + * @file LessonService.java + * @author William Karpinski + * @scope Extension Horaire + ******************************************************/ import org.springframework.stereotype.Service; import ovh.herisson.Clyde.Repositories.CourseRepository; +import ovh.herisson.Clyde.Repositories.CurriculumCourseRepository; import ovh.herisson.Clyde.Repositories.LessonRepository; -import ovh.herisson.Clyde.Tables.Course; -import ovh.herisson.Clyde.Tables.Lesson; -import ovh.herisson.Clyde.Tables.Role; -import ovh.herisson.Clyde.Tables.User; +import ovh.herisson.Clyde.Repositories.UserCurriculumRepository; +import ovh.herisson.Clyde.Tables.*; -import java.lang.reflect.GenericSignatureFormatError; import java.util.ArrayList; import java.util.Map; @Service public class LessonService { private final LessonRepository lessonRepo; + private final UserCurriculumRepository userCurriculumRepo; private final CourseRepository courseRepo; - public LessonService(LessonRepository lessonRepo, CourseRepository courseRepo){ + + private final CurriculumCourseRepository curriculumCourseRepo; + public LessonService(LessonRepository lessonRepo, UserCurriculumRepository userCurriculumRepo, CourseRepository courseRepo, CurriculumCourseRepository curriculumCourseRepo){ this.lessonRepo = lessonRepo; + this.userCurriculumRepo = userCurriculumRepo; this.courseRepo = courseRepo; + this.curriculumCourseRepo = curriculumCourseRepo; } + /** + * Create a lesson + */ public Lesson save(Lesson lesson){ return lessonRepo.save(lesson); } + /** + * Find a lesson by its id + */ public Lesson findById(long id){ return lessonRepo.findById(id); } + /** + * Return all the lessons + */ public Iterable findAll(){return lessonRepo.findAll();} - + /** + * Return all a teacher's lessons + */ public Iterable findAllOwnedLesson(User teacher){ ArrayList toReturn = new ArrayList<>(); ArrayList coursesOwned = (ArrayList) courseRepo.findAllOwnedCoures(teacher); for (Course element : coursesOwned) { for(Lesson lesson : lessonRepo.findLessonByCourse(element)) - toReturn.add(lesson); + toReturn.add(lesson); } return toReturn; } + /** + * Return all a student's lessons + */ + + public Iterable findOnesLessons(User student){ + ArrayList toReturn = new ArrayList<>(); + ArrayList courses = new ArrayList<>(); + ArrayList userCurriculums = userCurriculumRepo.findByUserOrderByCurriculum(student); + for(UserCurriculum uc: userCurriculums){ + Curriculum c = uc.getCurriculum(); + if(uc.isActual()) + courses.addAll((ArrayList) curriculumCourseRepo.findCoursesByCurriculum(c)); + } + for (Course element : courses) { + for(Lesson lesson : lessonRepo.findLessonByCourse(element)) + toReturn.add(lesson); + } + return toReturn; + } + /** + * Construct a new lesson + */ public Lesson createLesson(Map lessonInfos) { Lesson target = new Lesson(); @@ -66,7 +108,9 @@ public class LessonService { } return target; } - + /** + * Modify a lesson + */ public boolean modifyData(long id, Map updates){ Lesson target = lessonRepo.findById(id); @@ -92,7 +136,9 @@ public class LessonService { lessonRepo.save(target); return true; } - + /** + * Delete a lesson + */ public void delete(Lesson lesson){ lessonRepo.delete(lesson); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/Msg/DiscussionService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/Msg/DiscussionService.java new file mode 100644 index 0000000..9a471da --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/Msg/DiscussionService.java @@ -0,0 +1,57 @@ +package ovh.herisson.Clyde.Services.Msg; + +import java.util.List; + +/****************************************************** + * @file DiscussionService.java + * @author Anthony Debucquoy + * @scope Extension messagerie + * + * Various function utilised by the messages application + ******************************************************/ + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.fasterxml.jackson.databind.util.JSONPObject; + +import ovh.herisson.Clyde.Repositories.Msg.DiscussionRepository; +import ovh.herisson.Clyde.Tables.User; +import ovh.herisson.Clyde.Tables.Msg.Discussion; +import ovh.herisson.Clyde.Tables.Msg.Message; + +@Service +public class DiscussionService { + + @Autowired + private DiscussionRepository discRepo; + + public Discussion create(String name, User author){ + return discRepo.save(new Discussion(name, author)); + } + + /** + * list discussions owned by a certain user + */ + public Iterable getOwned(User author){ + return discRepo.findByMembership(author.getRegNo()); + } + + /** + * Create a message and link it to it's discussion + */ + public Discussion CreateMessage(Discussion disc, Message msg){ + disc.addMessage(msg); + return discRepo.save(disc); + } + + /** + * Check if a user is in a discussion + */ + public boolean hasDiscussion(User user, long id) { + Discussion disc = discRepo.findById(id).orElse(null); + List members = disc.getMembers(); + return members.contains(user); + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java index 34d4173..1d7d851 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java @@ -1,6 +1,7 @@ package ovh.herisson.Clyde.Services; import ovh.herisson.Clyde.Tables.*; +import ovh.herisson.Clyde.Tables.Inscription.InscriptionRequest; import java.util.ArrayList; import java.util.HashMap; @@ -112,7 +113,9 @@ public class ProtectionService { toReturn.put("curriculum", inscriptionRequest.getCurriculumId()); toReturn.put("state", inscriptionRequest.getState()); toReturn.put("profilePictureUrl", inscriptionRequest.getProfilePicture()); - + toReturn.put("identityCard", inscriptionRequest.getIdentityCard()); + toReturn.put("submissionDate", inscriptionRequest.getSubmissionDate()); + toReturn.put("equivalenceState", inscriptionRequest.getEquivalenceState()); return toReturn; } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/ScheduleLessonService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/ScheduleLessonService.java index f43d28f..d89fa01 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/ScheduleLessonService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/ScheduleLessonService.java @@ -1,5 +1,10 @@ package ovh.herisson.Clyde.Services; +/****************************************************** + * @file ScheduleLessonService.java + * @author William Karpinski + * @scope Extension Horaire + ******************************************************/ import org.springframework.stereotype.Service; import ovh.herisson.Clyde.Repositories.LessonRepository; import ovh.herisson.Clyde.Repositories.ScheduleLessonRepository; @@ -23,14 +28,15 @@ public class ScheduleLessonService { this.lessonRepo = lessonRepo; this.scheduleRepo = scheduleRepo; } - public boolean save(ScheduleLesson scheduleLesson){ if(scheduleLesson == null) return false; scheduleLessonRepo.save(scheduleLesson); return true; } - + /** + * Save a lesson to all the schedule it is linked + */ public boolean saveToAllSchedule(Lesson lesson){ Iterable schedules = scheduleRepo.findAllLessonSchedule(lesson.getCourse()); if(schedules == null) @@ -40,7 +46,9 @@ public class ScheduleLessonService { } return true; } - + /** + * Delete a scheduleLesson via its lesson + */ public boolean delete(long lessonId){ if(lessonId == 0) return false; @@ -48,28 +56,12 @@ public class ScheduleLessonService { return true; } - public Schedule getScheduleByCurriculum(Curriculum curriculum){ return scheduleLessonRepo.findScheduleByCurriculum(curriculum); } - - public Map getDepthScheduleByCurriculum(Curriculum curriculum){ - if(curriculum == null) - return null; - - HashMap toReturn = new HashMap<>(); - ArrayList> lessons = new ArrayList<>(); - Iterable foundLessons = scheduleLessonRepo.findLessonByCurriculum(curriculum); - - for (Lesson l: foundLessons){ - lessons.add(ProtectionService.lessonWithoutPassword(l)); - } - toReturn.put("lessons",lessons); - toReturn.put("scheduleId" , scheduleLessonRepo.findScheduleByCurriculum(curriculum).getScheduleID()); - toReturn.put("curriculum", curriculum); - return toReturn; - } - + /** + * Return a schedule and the list of lessons that corresponds + */ public Map getDepthScheduleBySchedule(Schedule schedule){ if(schedule == null) return null; @@ -86,7 +78,9 @@ public class ScheduleLessonService { toReturn.put("curriculum", schedule.getCurriculum()); return toReturn; } - + /** + * Return all the schedules + */ public Iterable> getAllSchedule(){ ArrayList> toReturn = new ArrayList<>(); diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/UserCurriculumService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/UserCurriculumService.java index 6484e2b..2861a6e 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/UserCurriculumService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/UserCurriculumService.java @@ -1,20 +1,53 @@ package ovh.herisson.Clyde.Services; import org.springframework.stereotype.Service; +import ovh.herisson.Clyde.Repositories.CurriculumRepository; +import ovh.herisson.Clyde.Repositories.Inscription.ExternalCurriculumRepository; import ovh.herisson.Clyde.Repositories.UserCurriculumRepository; -import ovh.herisson.Clyde.Tables.Curriculum; -import ovh.herisson.Clyde.Tables.User; +import ovh.herisson.Clyde.Tables.*; + +import java.util.ArrayList; +import java.util.HashMap; @Service public class UserCurriculumService { private final UserCurriculumRepository userCurriculumRepository; + private final CurriculumRepository curriculumRepo; - public UserCurriculumService(UserCurriculumRepository userCurriculumRepository) { + private final ExternalCurriculumRepository externalCurriculumRepo; + public UserCurriculumService(UserCurriculumRepository userCurriculumRepository, CurriculumRepository curriculumRepo, ExternalCurriculumRepository externalCurriculumRepo) { this.userCurriculumRepository = userCurriculumRepository; + this.curriculumRepo = curriculumRepo; + this.externalCurriculumRepo = externalCurriculumRepo; } public Curriculum findByUser(User student){ return userCurriculumRepository.findByUser(student); } + + public HashMap findAllCurriculumByStudent(User student) { + ArrayList list = userCurriculumRepository.findByUserOrderByCurriculum(student); + + ArrayList> curriculumlist = new ArrayList>(); + + for (int i = 0; i < list.size(); i++) { + HashMap element = new HashMap<>(); + Curriculum c = list.get(i).getCurriculum(); + + element.put("curriculumId", c.getCurriculumId()); + element.put("year", c.getYear()); + element.put("option", c.getOption()); + element.put("dateyear", list.get(i).getYear()); + element.put("actual", list.get(i).isActual()); + + curriculumlist.add(element); + } + + HashMap toReturn = new HashMap(); + toReturn.put("curriculumList", curriculumlist); + return toReturn; + } + + } 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 72eabd5..9c6bd7f 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java @@ -2,6 +2,7 @@ package ovh.herisson.Clyde.Services; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; +import ovh.herisson.Clyde.Tables.RegNoGenerator; import ovh.herisson.Clyde.Repositories.UserRepository; import ovh.herisson.Clyde.Tables.Role; import ovh.herisson.Clyde.Tables.User; @@ -106,10 +107,17 @@ public class UserService { } public User save(User user){ + RegNoGenerator.resetCount(); user.setPassword(passwordEncoder.encode(user.getPassword())); return userRepo.save(user); } + public void saveAll(ArrayList list){ + //S'assure que le compteur est bien a 0 + RegNoGenerator.resetCount(); + userRepo.saveAll(list); + } + public Iterable getAll(){ return userRepo.findAll(); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Applications.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Applications.java index 35d49aa..741de69 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/Applications.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Applications.java @@ -26,6 +26,7 @@ public enum Applications { LessonRequests, // InscriptionService authorization - Inscription, - StudentsList + Requests, + StudentsList, + Payments } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/ChangeCurriculumRequest.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/ChangeCurriculumRequest.java new file mode 100644 index 0000000..a309023 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/ChangeCurriculumRequest.java @@ -0,0 +1,95 @@ +package ovh.herisson.Clyde.Tables; + +import jakarta.persistence.*; + +import java.util.Date; + +@Entity +public class ChangeCurriculumRequest { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + + @ManyToOne + @JoinColumn(name="Users") + private User user; + + @ManyToOne + @JoinColumn(name = "ActualCurriculum") + private Curriculum actualCurriculum; + + @ManyToOne + @JoinColumn(name = "DestCurriculum") + private Curriculum destinationCurriculum; + + private Date date; + + private RequestState state; + + private RequestState teacherApprovalState; + public ChangeCurriculumRequest(){} + + public ChangeCurriculumRequest(User user, Curriculum actualCurriculum, Curriculum destinationCurriculum, Date date, RequestState state, RequestState teacherApprovalState){ + this.user = user; + this.actualCurriculum = actualCurriculum; + this.destinationCurriculum = destinationCurriculum; + this.date = date; + this.state = state; + this.teacherApprovalState = teacherApprovalState; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + + public Curriculum getActualCurriculum() { + return actualCurriculum; + } + + public void setActualCurriculum(Curriculum actualCurriculum) { + this.actualCurriculum = actualCurriculum; + } + + public Curriculum getDestinationCurriculum() { + return destinationCurriculum; + } + + public void setDestinationCurriculum(Curriculum destinationCurriculum) { + this.destinationCurriculum = destinationCurriculum; + } + + public void setDate(Date date) { + this.date = date; + } + + public Date getDate() { + return date; + } + + public RequestState getState() { + return state; + } + + public void setState(RequestState state) { + this.state = state; + } + + public int getId() { + return id; + } + + public RequestState getTeacherApprovalState() { + return teacherApprovalState; + } + + public void setTeacherApprovalState(RequestState teacherApprovalState) { + this.teacherApprovalState = teacherApprovalState; + } +} + + diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Curriculum.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Curriculum.java index 67075d1..4bcac40 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/Curriculum.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Curriculum.java @@ -12,9 +12,13 @@ public class Curriculum { private int curriculumId; private int year; private String option; - public Curriculum(int year, String option){ + + //True if the curriculum need an entry exam + private boolean requireCertificate; + public Curriculum(int year, String option, boolean requireCertificate){ this.year = year; this.option = option; + this.requireCertificate = requireCertificate; } public Curriculum() {} @@ -39,4 +43,11 @@ public class Curriculum { this.option = option; } + public void setRequireCertificate(boolean requireCertificate) { + this.requireCertificate = requireCertificate; + } + + public boolean isRequireCertificate() { + return requireCertificate; + } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/FileType.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/FileType.java index 18ce1be..ad5eab4 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/FileType.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/FileType.java @@ -1,8 +1,8 @@ package ovh.herisson.Clyde.Tables; public enum FileType { - ProfilePicture, - - EducationCertificate + EducationCertificate, + JustificationDocument, + IdentityCard, } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/ExemptionsRequest.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/ExemptionsRequest.java new file mode 100644 index 0000000..8942bb6 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/ExemptionsRequest.java @@ -0,0 +1,87 @@ +package ovh.herisson.Clyde.Tables.Inscription; + + +import jakarta.persistence.*; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; +import ovh.herisson.Clyde.Tables.Course; +import ovh.herisson.Clyde.Tables.RequestState; +import ovh.herisson.Clyde.Tables.User; + +import java.util.Date; + +@Entity +public class ExemptionsRequest { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + + @JoinColumn(name = "Users") + @ManyToOne(fetch = FetchType.EAGER) + private User user; + + @JoinColumn(name = "Course") + @ManyToOne(fetch = FetchType.EAGER) + private Course course; + private String justifDocument; + + private RequestState state; + + private Date date; + + public ExemptionsRequest(User user, Course course, String justifDocument, RequestState state, Date date){ + this.user = user; + this.course = course; + this.justifDocument = justifDocument; + this.state = state; + this.date = date; + } + + + public ExemptionsRequest(){} + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Course getCourse() { + return course; + } + + public void setCourse(Course course) { + this.course = course; + } + + public String getJustifDocument() { + return justifDocument; + } + + public void setJustifDocument(String justifDocument) { + this.justifDocument = justifDocument; + } + + + public RequestState getState() { + return state; + } + + public void setState(RequestState state) { + this.state = state; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public int getId() { + return id; + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/ExternalCurriculum.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/ExternalCurriculum.java new file mode 100644 index 0000000..893971b --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/ExternalCurriculum.java @@ -0,0 +1,114 @@ +package ovh.herisson.Clyde.Tables.Inscription; + + +import jakarta.persistence.*; +import ovh.herisson.Clyde.Tables.User; + +//This table stores a student's curriculum from another university +@Entity +public class ExternalCurriculum { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + + //An external curriculum is first linked to an inscription request and when it is accepted and the user is created we link it to the user + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name="InscriptionRequest") + private InscriptionRequest inscriptionRequest; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name="Users") + private User user; + + private String school; + + private String formation; + + //This string denotes the completion of the external formation or the last year completed by the student in this formation + private String completion; + + private int startYear; + private int endYear; + private String justifdocUrl; + + public ExternalCurriculum(){} + + public ExternalCurriculum(InscriptionRequest ir, String school, String formation, String completion, int startYear, int endYear, String justifdocUrl,User user){ + this.inscriptionRequest = ir; + this.school = school; + this.formation = formation; + this.completion = completion; + this.startYear = startYear; + this.endYear = endYear; + this.justifdocUrl = justifdocUrl; + this.user = user; + } + + public int getId() { + return id; + } + + public InscriptionRequest getInscriptionRequest() { + return inscriptionRequest; + } + + public void setInscriptionRequest(InscriptionRequest inscriptionRequest) { + this.inscriptionRequest = inscriptionRequest; + } + + public String getSchool() { + return school; + } + + public void setSchool(String school) { + this.school = school; + } + + public String getFormation() { + return formation; + } + + public void setFormation(String formation) { + this.formation = formation; + } + + public String getCompletion(){ + return completion; + } + + public void setCompletion(String completion) { + this.completion = completion; + } + + public int getStartYear() { + return startYear; + } + + public void setStartYear(int startYear) { + this.startYear = startYear; + } + + public int getEndYear() { + return endYear; + } + + public void setEndYear(int endYear) { + this.endYear = endYear; + } + + public void setJustifdocUrl(String justifdocUrl) { + this.justifdocUrl = justifdocUrl; + } + + public String getJustifdocUrl() { + return justifdocUrl; + } + + public void setUser(User user) { + this.user = user; + } + + public User getUser() { + return user; + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/InscriptionRequest.java similarity index 67% rename from backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java rename to backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/InscriptionRequest.java index 18e20d0..1d0271c 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/InscriptionRequest.java @@ -1,6 +1,8 @@ -package ovh.herisson.Clyde.Tables; +package ovh.herisson.Clyde.Tables.Inscription; import jakarta.persistence.*; +import ovh.herisson.Clyde.Tables.RequestState; + import java.util.Date; @@ -15,14 +17,17 @@ public class InscriptionRequest { private String email; private String country; private Date birthDate; - private Long curriculumId; private RequestState state; private String profilePicture; - private String password; + private String identityCard; + private String admissionDocUrl; + private Date submissionDate; + private RequestState equivalenceState; public InscriptionRequest(){} - public InscriptionRequest(String lastName, String firstName, String address, String email, String country, Date birthDate,Long curriculumId, RequestState state, String profilePicture, String password){ + + public InscriptionRequest(String lastName, String firstName, String address, String email, String country, Date birthDate,Long curriculumId, RequestState state, String profilePicture, String password, String identityCard, Date submissionDate, RequestState equivalenceState, String admissionDocUrl){ this.lastName = lastName; this.firstName = firstName; this.address = address; @@ -33,6 +38,10 @@ public class InscriptionRequest { this.state = state; this.profilePicture = profilePicture; this.password = password; + this.identityCard = identityCard; + this.submissionDate = submissionDate; + this.equivalenceState = equivalenceState; + this.admissionDocUrl = admissionDocUrl; } public int getId() { @@ -118,4 +127,36 @@ public class InscriptionRequest { public void setPassword(String password) { this.password = password; } + + public String getIdentityCard() { + return identityCard; + } + + public void setIdentityCard(String identityCard) { + this.identityCard = identityCard; + } + + public Date getSubmissionDate() { + return submissionDate; + } + + public void setSubmissionDate(Date submissionDate) { + this.submissionDate = submissionDate; + } + + public RequestState getEquivalenceState() { + return equivalenceState; + } + + public void setEquivalenceState(RequestState equivalenceState) { + this.equivalenceState = equivalenceState; + } + + public String getAdmissionDocUrl() { + return admissionDocUrl; + } + + public void setAdmissionDocUrl(String admissionDocUrl) { + this.admissionDocUrl = admissionDocUrl; + } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/Minerval.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/Minerval.java new file mode 100644 index 0000000..dac5799 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/Minerval.java @@ -0,0 +1,64 @@ +package ovh.herisson.Clyde.Tables.Inscription; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +@Entity +public class Minerval { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + private long studentRegNo; + private int paidAmount; + private int toPay; + + //If the academic year is 2023-2024 then 2023 will be stored here (we take the lowest year) + private int year; + public Minerval(){} + + public Minerval(long studentRegNo, int paidAmount, int toPay, int year){ + this.studentRegNo = studentRegNo; + this.paidAmount = paidAmount; + this.toPay = toPay; + this.year = year; + } + + public long getStudentRegNo() { + return studentRegNo; + } + + public void setStudentRegNo(long studentRegNo) { + this.studentRegNo = studentRegNo; + } + + public int getPaidAmount() { + return paidAmount; + } + + public void setPaidAmount(int paidAmount) { + this.paidAmount = paidAmount; + } + + public int getToPay() { + return toPay; + } + + public void setToPay(int toPay) { + this.toPay = toPay; + } + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + + public long getId() { + return id; + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/Payment.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/Payment.java new file mode 100644 index 0000000..5f4fbf9 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/Payment.java @@ -0,0 +1,83 @@ +package ovh.herisson.Clyde.Tables.Inscription; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +import java.util.Date; + +@Entity +public class Payment { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + private long studentRegNo; + private String card; + private String client; + private Date expDate; + private int amount; + private Date date; + public Payment(){} + + public Payment(long studentRegNo, String card, String client, Date expDate, int amount, Date date){ + this.studentRegNo = studentRegNo; + this.card = card; + this.client = client; + this.expDate = expDate; + this.amount = amount; + this.date = date; + } + + public long getStudentRegNo() { + return studentRegNo; + } + + public void setStudentRegNo(long studentRegNo) { + this.studentRegNo = studentRegNo; + } + + public String getCard() { + return card; + } + + public void setCard(String card) { + this.card = card; + } + + public String getClient() { + return client; + } + + public void setClient(String client) { + this.client = client; + } + + public Date getExpDate() { + return expDate; + } + + public void setExpDate(Date expDate) { + this.expDate = expDate; + } + + public int getAmount() { + return amount; + } + + public void setAmount(int amount) { + this.amount = amount; + } + + public long getId() { + return id; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/ScholarshipRequest.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/ScholarshipRequest.java new file mode 100644 index 0000000..842bf90 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/ScholarshipRequest.java @@ -0,0 +1,89 @@ +package ovh.herisson.Clyde.Tables.Inscription; + +import jakarta.persistence.*; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; +import ovh.herisson.Clyde.Tables.RequestState; +import ovh.herisson.Clyde.Tables.User; + +import java.util.Date; +import java.util.Map; + +@Entity +public class ScholarshipRequest { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + @JoinColumn(name="Users") + @ManyToOne(fetch = FetchType.EAGER) + @OnDelete(action = OnDeleteAction.CASCADE) + private User user; + private RequestState state; + private Date date; + private int amount; + private String taxDocUrl; + private String residencyDocUrl; + + public ScholarshipRequest(User user, RequestState state, int amount, Date date, String taxDocUrl, String residencyDocUrl){ + this.user = user; + this.state = state; + this.amount = amount; + this.date = date; + this.taxDocUrl = taxDocUrl; + this.residencyDocUrl = residencyDocUrl; + } + + public ScholarshipRequest(){} + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public RequestState getState() { + return state; + } + + public void setState(RequestState state) { + this.state = state; + } + + public int getAmount() { + return amount; + } + + public void setAmount(int amount) { + this.amount = amount; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public long getId() { + return id; + } + + public String getResidencyDocUrl() { + return residencyDocUrl; + } + + public void setResidencyDocUrl(String residencyDocUrl) { + this.residencyDocUrl = residencyDocUrl; + } + + public String getTaxDocUrl() { + return taxDocUrl; + } + + public void setTaxDocUrl(String taxDocUrl) { + this.taxDocUrl = taxDocUrl; + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/UnregisterRequest.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/UnregisterRequest.java new file mode 100644 index 0000000..9127ecb --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Inscription/UnregisterRequest.java @@ -0,0 +1,115 @@ +package ovh.herisson.Clyde.Tables.Inscription; + +import jakarta.persistence.*; +import ovh.herisson.Clyde.Tables.Curriculum; +import ovh.herisson.Clyde.Tables.RequestState; +import ovh.herisson.Clyde.Tables.User; + +import java.util.Date; + +@Entity +public class UnregisterRequest { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + private RequestState state; + private String reason; + private Date date; + + //We store these informations again so if the user is deleted we still have the informations for history + private long regNo; + + private String firstName; + + private String lastName; + + private String email; + + //Null if the user unregister for the academic year, contains a curriculum if the user wants to unregister from a specific curriculum + @ManyToOne + @JoinColumn(name = "Curriculum") + private Curriculum curriculum; + + public UnregisterRequest(RequestState state, String reason, Date date, long regNo, String firstName, String lastName, String email, Curriculum curriculum){ + this.state = state; + this.reason = reason; + this.date = date; + this.regNo = regNo; + this.firstName = firstName; + this.lastName = lastName; + this.email = email; + this.curriculum = curriculum; + } + + public UnregisterRequest(){} + + public RequestState getState() { + return state; + } + + public void setState(RequestState state) { + this.state = state; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public long getId() { + return id; + } + + public void setDate(Date date) { + this.date = date; + } + + public Date getDate() { + return date; + } + + public String getEmail() { + return email; + } + + public String getLastName() { + return lastName; + } + + public String getFirstName() { + return firstName; + } + + public void setEmail(String email) { + this.email = email; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public void setRegNo(long regNo) { + this.regNo = regNo; + } + + public long getRegNo() { + return regNo; + } + + public void setCurriculum(Curriculum curriculum) { + this.curriculum = curriculum; + } + + public Curriculum getCurriculum() { + return curriculum; + } + +} + diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Lesson.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Lesson.java index af75921..673e532 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/Lesson.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Lesson.java @@ -1,5 +1,14 @@ package ovh.herisson.Clyde.Tables; + +/****************************************************** + * @file Lesson.java + * @author William Karpinski + * @scope Extension Horaire + * + * Represent a course in a schedule + ******************************************************/ + import jakarta.persistence.*; import org.hibernate.annotations.OnDelete; import org.hibernate.annotations.OnDeleteAction; diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/LessonChangesRequest.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/LessonChangesRequest.java index 6258f2b..c969548 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/LessonChangesRequest.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/LessonChangesRequest.java @@ -1,5 +1,14 @@ package ovh.herisson.Clyde.Tables; + +/****************************************************** + * @file LessonChangesRequest.java + * @author William Karpinski + * @scope Extension Horaire + * + * Represent a request about changes on schedules and lessons + ******************************************************/ + import jakarta.persistence.*; import org.hibernate.annotations.OnDelete; import org.hibernate.annotations.OnDeleteAction; @@ -31,6 +40,12 @@ public class LessonChangesRequest { private String lessonType; + /** + * Can take 3 values: + * 0 : Request to CREATE a lesson + * 1 : Request to MODIFY an existing lesson + * 2 : Request to DELETE a lesson + */ private int requestType; public LessonChangesRequest(User user, RequestState state, String lessonStart, diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Msg/Discussion.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Msg/Discussion.java new file mode 100644 index 0000000..4d76d5f --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Msg/Discussion.java @@ -0,0 +1,72 @@ +package ovh.herisson.Clyde.Tables.Msg; + +/****************************************************** + * @file Discussion.java + * @author Anthony Debucquoy + * @scope Extension messagerie + * + * Discussion allow to regroupe multiple user in and message together + * for the messages application to work + ******************************************************/ + + +import java.util.List; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.OneToMany; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import ovh.herisson.Clyde.Tables.User; + +@Entity +@Getter +@Setter +@NoArgsConstructor +public class Discussion{ + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + private String name; + + @ManyToMany + @JoinTable( + name = "discussion_members", + joinColumns = @JoinColumn(name = "discussion_id"), + inverseJoinColumns = @JoinColumn(name = "user_id") + ) + private List members; + + @OneToMany(mappedBy="discussion", orphanRemoval = true, cascade = CascadeType.ALL) + private List msgs; + + public Discussion(String name){ + this.name = name; + } + + public Discussion(String name, User user){ + this.name = name; + this.members = List.of(user); + } + + public void addMessage(Message msg){ + msg.setDiscussion(this); + msgs.add(msg); + } + + public void addMember(User user) { + members.add(user); + } + + public void delMember(User user) { + members.remove(user); + } +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Msg/Message.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Msg/Message.java new file mode 100644 index 0000000..2afa6ba --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Msg/Message.java @@ -0,0 +1,66 @@ +package ovh.herisson.Clyde.Tables.Msg; + +/****************************************************** + * @file Message.java + * @author Anthony Debucquoy + * @scope Extension messagerie + * + * Represent a message sent to a discussion + ******************************************************/ + + +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import java.util.Date; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.PrePersist; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import ovh.herisson.Clyde.Tables.User; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +public class Message { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + private String content; + + @CreationTimestamp + @Column(nullable = false) + private Date created; + + @ManyToOne + private User author; + + public User getAuthor() { + return author; + } + + @OneToOne + private Message response; + + @ManyToOne(optional = false) + @JsonIgnore + private Discussion discussion; + +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/ReInscriptionRequest.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/ReInscriptionRequest.java deleted file mode 100644 index b96ed42..0000000 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/ReInscriptionRequest.java +++ /dev/null @@ -1,78 +0,0 @@ -package ovh.herisson.Clyde.Tables; - -import jakarta.persistence.*; -import org.hibernate.annotations.OnDelete; -import org.hibernate.annotations.OnDeleteAction; - -@Entity -public class ReInscriptionRequest { - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private int id; - - @ManyToOne - @JoinColumn(name = "Users") - @OnDelete(action = OnDeleteAction.CASCADE) - private User user; - - @ManyToOne - @JoinColumn(name = "Curriculum") - @OnDelete(action = OnDeleteAction.CASCADE) - private Curriculum newCurriculum; - private RequestState state; - - //Permet de différencier les demandes de changement et une réinscription dans le même Curriculum - //Pour la réinscription on va le mettre a 0 - private boolean type = false; - - public ReInscriptionRequest(){} - - public ReInscriptionRequest(User user, Curriculum newCurriculum, RequestState state, boolean type){ - this.user = user; - this.newCurriculum = newCurriculum; - this.state = state; - this.type = type; - } - - public ReInscriptionRequest(User user, Curriculum newCurriculum, RequestState state){ - this.user = user; - this.newCurriculum = newCurriculum; - this.state = state; - } - - public int getId() { - return id; - } - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } - - public Curriculum getNewCurriculum() { - return newCurriculum; - } - - public void setNewCurriculum(Curriculum newCurriculum) { - this.newCurriculum = newCurriculum; - } - - public RequestState getState() { - return state; - } - - public void setState(RequestState state) { - this.state = state; - } - - public boolean isType() { - return type; - } - - public void setType(boolean type) { - this.type = type; - } -} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/RegNoGenerator.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/RegNoGenerator.java new file mode 100644 index 0000000..886cc09 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/RegNoGenerator.java @@ -0,0 +1,46 @@ +package ovh.herisson.Clyde.Tables; + +import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.id.IdentifierGenerator; + +import java.sql.*; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +public class RegNoGenerator implements IdentifierGenerator { + private static int count = 0; + @Override + public Object generate(SharedSessionContractImplementor session, Object object) { + try{ + JdbcConnectionAccess jdbccon = session.getJdbcConnectionAccess(); + Connection conn = jdbccon.obtainConnection(); + + Statement statement = conn.createStatement(); + + Calendar c = new GregorianCalendar(); + int y = c.get(Calendar.YEAR); + String query = "select count(reg_no) + "+count+" from Users where reg_no/10000 = " + y%1000; + + ResultSet set = statement.executeQuery(query); + long resp = 0; + if(set.next()){ + resp = set.getLong(1)+((y%1000)*10000); + count += 1; + } + + conn.close(); + statement.close(); + + return resp; + + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + public static void resetCount(){ + count = 0; + } +} \ No newline at end of file diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/RequestState.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/RequestState.java index d52f1c9..fd2eeb0 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/RequestState.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/RequestState.java @@ -3,5 +3,6 @@ package ovh.herisson.Clyde.Tables; public enum RequestState { Accepted, Refused, - Pending + Pending, + Unrequired } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Schedule.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Schedule.java index c34222e..e2f1982 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/Schedule.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Schedule.java @@ -1,6 +1,14 @@ package ovh.herisson.Clyde.Tables; + +/****************************************************** + * @file Schedule.java + * @author William Karpinski + * @scope Extension Horaire + * + * Represent a schedule linked to a curriculum + ******************************************************/ import jakarta.persistence.*; import org.hibernate.annotations.OnDelete; import org.hibernate.annotations.OnDeleteAction; diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/ScheduleLesson.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/ScheduleLesson.java index 895cef1..9dca028 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/ScheduleLesson.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/ScheduleLesson.java @@ -1,11 +1,19 @@ package ovh.herisson.Clyde.Tables; + +/****************************************************** + * @file ScheduleLesson.java + * @author William Karpinski + * @scope Extension Horaire + * + * Used to link schedules and lessons to each others + ******************************************************/ + import jakarta.persistence.*; import org.hibernate.annotations.OnDelete; import org.hibernate.annotations.OnDeleteAction; - @Entity public class ScheduleLesson{ @Id diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java index de958df..b21738e 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java @@ -1,14 +1,22 @@ package ovh.herisson.Clyde.Tables; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; -import java.util.Date; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; +import org.hibernate.annotations.GenericGenerator; +import ovh.herisson.Clyde.Tables.Msg.Discussion; +import ovh.herisson.Clyde.Tables.Msg.Message; +import java.util.Date; +import java.util.List; @Entity @Table(name = "Users") public class User { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GenericGenerator(name = "userGen", type = ovh.herisson.Clyde.Tables.RegNoGenerator.class) + @GeneratedValue(generator = "userGen") private Long regNo; private String lastName; private String firstName; @@ -18,8 +26,19 @@ public class User { private String country; private Date birthDate; private String profilePictureUrl; - private ovh.herisson.Clyde.Tables.Role role; + private Role role; + + @JsonIgnore private String password; + + ////// Extension Messagerie ///// + @OneToMany(mappedBy = "author", cascade = CascadeType.ALL) + private List msgs; + ///////////////////////////////// + + @ManyToMany( mappedBy = "members" ) + private List discussions; + public User(String lastName, String firstName, String email, String address, String country, Date birthDate, String profilePictureUrl, Role role, String password) { diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/UserCurriculum.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/UserCurriculum.java index f42e588..395eca7 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/UserCurriculum.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/UserCurriculum.java @@ -21,9 +21,16 @@ public class UserCurriculum { @OnDelete(action = OnDeleteAction.CASCADE) private Curriculum curriculum; - public UserCurriculum(User user, Curriculum curriculum){ + private int year; + + //True if the user has that curriculum at the moment false if not + private boolean actual; + + public UserCurriculum(User user, Curriculum curriculum, int year, boolean actual){ this.user = user; this.curriculum = curriculum; + this.year = year; + this.actual = actual; } public UserCurriculum() {} @@ -47,4 +54,20 @@ public class UserCurriculum { public void setCurriculum(Curriculum curriculum) { this.curriculum = curriculum; } + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + + public void setActual(boolean actual) { + this.actual = actual; + } + + public boolean isActual() { + return actual; + } } diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 5d00d8e..190c76b 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -1,3 +1,12 @@ spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect -spring.sql.init.mode=always \ No newline at end of file +spring.sql.init.mode=always + +# spring.datasource.url=jdbc:postgresql://localhost:5442/clyde +spring.datasource.url=jdbc:postgresql://db:5432/clyde +spring.datasource.username=devel +spring.datasource.password=devel + +# spring.config.activate.on-profile=prod +# spring.datasource.url=jdbc:postgresql:clyde?socketFactory=org.newsclub.net.unix.AFUNIXSocketFactory$FactoryArg&socketFactoryArg=/var/run/postgresql/.s.PGSQL.5432 +# spring.datasource.username=clyde diff --git a/backend/src/test/java/ovh/herisson/Clyde/Repositories/UserRepoTest.java b/backend/src/test/java/ovh/herisson/Clyde/Repositories/UserRepoTest.java index f99ff2f..599ec60 100644 --- a/backend/src/test/java/ovh/herisson/Clyde/Repositories/UserRepoTest.java +++ b/backend/src/test/java/ovh/herisson/Clyde/Repositories/UserRepoTest.java @@ -24,6 +24,7 @@ public class UserRepoTest { @BeforeEach public void setup(){ + userRepo.deleteAll(); User herobrine = new User("brine","hero","admin@admin.com","in your WalLs","ShadowsLand", new GregorianCalendar(2005, 4, 3).getTime(), null, Role.Admin,"admin"); userRepo.save(herobrine); } @@ -34,8 +35,8 @@ public class UserRepoTest { } @Test public void usertest(){ - Assert.assertEquals("brine", userRepo.findById(1).getLastName()); - Assert.assertTrue(new GregorianCalendar(2005, 4, 3).getTime().equals(userRepo.findById(1).getBirthDate())); + Assert.assertEquals("brine", userRepo.findByEmail("admin@admin.com").getLastName()); + Assert.assertTrue(new GregorianCalendar(2005, 4, 3).getTime().equals(userRepo.findByEmail("admin@admin.com").getBirthDate())); } } diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..ec5f6bc --- /dev/null +++ b/compose.yaml @@ -0,0 +1,29 @@ +services: + db: + image: 'postgres:16' + environment: + - 'POSTGRES_DB=clyde' + - 'POSTGRES_USER=devel' + - 'POSTGRES_PASSWORD=devel' + # Uncomment this to allow connections to the db from outside the container + # ports: + # - '5442:5432' + back: + build: backend/. + ports: + - "8080:8080" + volumes: + - cdn:/backend/cdn + ulimits: + nofile: + soft: 65536 + hard: 65536 + front: + build: frontend/. + volumes: + - cdn:/app/front/dist/cdn + ports: + - "8000:8080" + +volumes: + cdn: diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..2df53ae --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,11 @@ +# https://v2.vuejs.org/v2/cookbook/dockerize-vuejs-app +FROM node:lts-alpine +RUN npm install -g http-server +WORKDIR /app/front +COPY package*.json ./ +RUN npm install +COPY . . +ENV VITE_CLYDE_MODE=container +RUN npm run build +EXPOSE 8080 +CMD [ "http-server", "dist" ] diff --git a/frontend/public/i18n/EN.txt b/frontend/public/i18n/EN.txt index d5d232f..60fe065 100644 --- a/frontend/public/i18n/EN.txt +++ b/frontend/public/i18n/EN.txt @@ -31,6 +31,7 @@ app.studentList=Students List app.users=Users app.manageOwnLessons=Manage Owned Courses Schedule app.lessonRequests=Schedule Requests +app.payments = Payments request.moreInfos=More Infos request.accept=Accept request.refuse=Refuse diff --git a/frontend/public/i18n/FR.txt b/frontend/public/i18n/FR.txt index bd21ce5..db0a730 100644 --- a/frontend/public/i18n/FR.txt +++ b/frontend/public/i18n/FR.txt @@ -31,6 +31,7 @@ app.studentList=Liste des étudiants app.users=Utilisateurs app.manageOwnLessons=Gérer ses horaires de cours app.lessonRequests=Requêtes d'horaire +app.payments = Payements request.moreInfos=Plus d'Infos request.accept=Accepter request.refuse=Refuser @@ -55,3 +56,4 @@ Curriculum=Cursus Credits=Credits InscriptionService=S.I. faculty=Faculté + diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 62e1291..daf1064 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -32,7 +32,6 @@ window.addEventListener('hashchange', () => {