diff --git a/.file.swp b/.file.swp new file mode 100644 index 0000000..97eb5de Binary files /dev/null and b/.file.swp differ diff --git a/.idea/misc.xml b/.idea/misc.xml index 06e8b35..2289c27 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -11,4 +11,7 @@ + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index dbaf653..6704f63 100644 --- a/pom.xml +++ b/pom.xml @@ -2,12 +2,7 @@ 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.6.1 - - + fr.organizee organizee 0.0.1-SNAPSHOT @@ -16,6 +11,12 @@ 11 + + org.springframework.boot + spring-boot-starter-parent + 2.6.1 + + org.springframework.boot @@ -38,7 +39,10 @@ org.springframework.boot spring-boot-starter-web - + + org.springframework.boot + spring-boot-starter-mail + mysql mysql-connector-java diff --git a/src/main/java/fr/organizee/controller/ContactController.java b/src/main/java/fr/organizee/controller/ContactController.java index ef79042..4f2ac45 100644 --- a/src/main/java/fr/organizee/controller/ContactController.java +++ b/src/main/java/fr/organizee/controller/ContactController.java @@ -20,8 +20,10 @@ public class ContactController { @Autowired private ContactRepository contactRepo; + + //Récupère les infos d'un contact par son ID @GetMapping(value = "/{id}") - @PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") + //@PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") public ResponseEntity findById(@PathVariable int id){ Optional contact = null; try @@ -34,8 +36,9 @@ public class ContactController { return ResponseEntity.status(HttpStatus.OK).body(contact); } + //Récupère les infos d'un contact par la team ID @GetMapping(value = "team/{team_id}") - @PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") + //@PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") public ResponseEntity findByTeamId(@PathVariable int team_id){ List contacts = null; try @@ -44,12 +47,12 @@ public class ContactController { } catch (Exception e) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); } - return ResponseEntity.status(HttpStatus.OK).body(contacts); } + //Ajoute un nouveau contact @PostMapping(value="/add") - @PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") + //@PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") public ResponseEntity addContact(@RequestBody Contact contact){ Contact resultContact = null; try { @@ -61,8 +64,9 @@ public class ContactController { return ResponseEntity.status(HttpStatus.CREATED).body(resultContact); } + //Mise à jour du contact par son ID @PutMapping("/update/{id}") - @PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") + //@PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") public ResponseEntity updateContact(@RequestBody Contact contact, @PathVariable Integer id) throws Exception { Contact resultContact = null; try { @@ -75,8 +79,9 @@ public class ContactController { return ResponseEntity.status(HttpStatus.OK).body(resultContact); } + //Efface le contact par on ID @DeleteMapping(value = "/delete/{id}") - @PreAuthorize("hasRole('ROLE_PARENT')") + //@PreAuthorize("hasRole('ROLE_PARENT')") public ResponseEntity deleteContact(@PathVariable int id){ try { contactRepo.delete(contactRepo.getById(id)); diff --git a/src/main/java/fr/organizee/controller/EvenementController.java b/src/main/java/fr/organizee/controller/EvenementController.java index a5c3673..f6a32a8 100644 --- a/src/main/java/fr/organizee/controller/EvenementController.java +++ b/src/main/java/fr/organizee/controller/EvenementController.java @@ -1,15 +1,14 @@ package fr.organizee.controller; import fr.organizee.model.Evenement; -import fr.organizee.model.Membre; -import fr.organizee.model.Team; +import fr.organizee.model.Menu; import fr.organizee.repository.EvenementRepository; -import fr.organizee.repository.TeamRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import javax.persistence.EntityNotFoundException; import java.util.List; import java.util.Optional; @@ -21,17 +20,59 @@ public class EvenementController { @Autowired private EvenementRepository evenementRepo; - // Recupérer tout les evenements pour une team {id} - @GetMapping(value = "/all/{id}") - public ResponseEntity getAll(){ + // Recupérer tout les evenements pour une team {team_id} + @GetMapping(value = "/team/{team_id}") + public ResponseEntity findByTeamId(@PathVariable int team_id){ List liste = null; try { - liste = evenementRepo.findAll(); + liste = evenementRepo.FindEvenementsByTeam(team_id); } catch (Exception e) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); } return ResponseEntity.status(HttpStatus.OK).body(liste); } + + // Ajoute un evenement au calendrier + @PostMapping(value="/add", produces="application/json", consumes="application/json") + public ResponseEntity addTache(@RequestBody Evenement event){ + Evenement resultEvent = null; + try { + resultEvent = evenementRepo.saveAndFlush(event); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); + } + + return ResponseEntity.status(HttpStatus.CREATED).body(resultEvent); + } + + //Mise a jour d'un evenement par son ID + @PutMapping("/update/{id}") + //@PreAuthorize("hasRole('ROLE_PARENT')") + public ResponseEntity updateEvenement(@RequestBody Evenement event, @PathVariable Integer id) throws Exception { + Evenement resultEvenement = null; + try { + resultEvenement = evenementRepo.save(event); + + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage()); + } + + return ResponseEntity.status(HttpStatus.OK).body(resultEvenement); + } + + //Efface un evenement par son ID + @DeleteMapping(value = "/delete/{id}") + //@PreAuthorize("hasRole('ROLE_PARENT')") + public ResponseEntity deleteEvenement(@PathVariable int id){ + try { + evenementRepo.delete(evenementRepo.getById(id)); + return ResponseEntity.status(HttpStatus.OK).body("Evenement effacé !"); + + } catch (EntityNotFoundException e) { + + return ResponseEntity.status(HttpStatus.OK).body("Evenement introuvable !"); + } + } } diff --git a/src/main/java/fr/organizee/controller/MailController.java b/src/main/java/fr/organizee/controller/MailController.java new file mode 100644 index 0000000..5df737e --- /dev/null +++ b/src/main/java/fr/organizee/controller/MailController.java @@ -0,0 +1,41 @@ +package fr.organizee.controller; + +import fr.organizee.model.Mail; +import fr.organizee.service.SendMailService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.mail.MessagingException; + +@RestController +@CrossOrigin("*") +@RequestMapping("/sendmail") +public class MailController { + SendMailService service; + + public MailController(SendMailService service) { + this.service = service; + } + + // Envoi de mail en text brut + @PostMapping("/text") + public ResponseEntity sendMail(@RequestBody Mail mail) { + service.sendMail(mail); + return new ResponseEntity<>("Email Sent successfully", HttpStatus.OK); + } + + // Envoi de mail au format HTML + @PostMapping("/html") + public ResponseEntity sendMailHTML(@RequestBody Mail mail) throws MessagingException { + service.sendMailHTML(mail); + return new ResponseEntity<>("HTML mail sent successfully", HttpStatus.OK); + } + + // Envoi du mail avec une piece jointe + @PostMapping("/attachment") + public ResponseEntity sendAttachmentEmail(@RequestBody Mail mail) throws MessagingException { + service.sendMailWithAttachments(mail); + return new ResponseEntity<>("Attachment mail sent successfully", HttpStatus.OK); + } +} \ No newline at end of file diff --git a/src/main/java/fr/organizee/controller/MembreController.java b/src/main/java/fr/organizee/controller/MembreController.java index 93df3d8..e611f83 100644 --- a/src/main/java/fr/organizee/controller/MembreController.java +++ b/src/main/java/fr/organizee/controller/MembreController.java @@ -4,7 +4,10 @@ import fr.organizee.dto.JsonWebToken; import fr.organizee.dto.MembreDto; import fr.organizee.exception.ExistingUsernameException; import fr.organizee.exception.InvalidCredentialsException; +import fr.organizee.exception.MembreNotFoundException; import fr.organizee.model.Membre; +import fr.organizee.model.Menu; +import fr.organizee.model.Team; import fr.organizee.repository.MembreRepository; import fr.organizee.service.MembreService; import org.springframework.beans.factory.annotation.Autowired; @@ -19,51 +22,202 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -/* toto */ + @RestController @CrossOrigin("*") -@RequestMapping("/membres") +@RequestMapping(value="/membres") public class MembreController { @Autowired private MembreRepository membreRepo; - + @Autowired private MembreService membreService; - @Autowired private BCryptPasswordEncoder passwordEncoder; + public MembreController() {} + @ResponseBody public String home() { StringBuilder sb = new StringBuilder(); sb.append("

Affichages des membres

"); - sb.append("
  • Liste des membres
  • "); + sb.append("
    • Liste des membres
    • "); return sb.toString(); } - // Récupère tout les membres de la base + /** + * Rechercher tous les membres + * @return + * http://localhost:8088/membres/all + */ @GetMapping(value = "/all") - @PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") - public ResponseEntity getAll(){ - List liste = null; + //@PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") + public ResponseEntity getAllMembres(){ + List listeMembres; try { - liste = membreRepo.findAll(); + listeMembres = membreRepo.findAll(); + } catch (Exception e) { + MembreNotFoundException commandeNotFoundException = new MembreNotFoundException(); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(commandeNotFoundException.getMessage()); + } + + return ResponseEntity.status(HttpStatus.OK).body(listeMembres); + } + + /** + * Rechercher tous les membres admin + * @return + * http://localhost:8088/membres/admin/all + */ + + @GetMapping(value="/admin/all") + @PreAuthorize("hasRole('ROLE_PARENT')") + public List getAllAdminUsers() { + return membreService.findAllUsers().stream().map(appUser -> + new MembreDto(appUser.getEmail(), + appUser.getRoleList())).collect(Collectors.toList()); + } + + /** + * Rechercher un membre par son Id + * @return + * http://localhost:8088/membres/1 + */ + + @GetMapping(value="/{id}") + //@PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") + public ResponseEntity getMembreById(@PathVariable int id) { + Optional membre; + try { + membre = membreRepo.findById(id); + if (membre.isPresent()) { + return ResponseEntity.status(HttpStatus.OK).body(membre); + } else { + MembreNotFoundException membreNotFoundException = new MembreNotFoundException(id); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(membreNotFoundException.getMessage()); + } + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + + /** + * Rechercher un membre par l'Id de sa team + * @return + * http://localhost:8088/membres/1 + */ + @GetMapping(value = "team/{team_id}") + //@PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") + public ResponseEntity findByTeamId(@PathVariable int team_id) { + List membres = null; + try { + membres = membreRepo.FindMembresByTeam(team_id); } catch (Exception e) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); } - - return ResponseEntity.status(HttpStatus.OK).body(liste); + return ResponseEntity.status(HttpStatus.OK).body(membres); } - @GetMapping("/admin/all") - @PreAuthorize("hasRole('ROLE_PARENT')") - public List getAllAdminUsers() { - return membreService.findAllUsers().stream().map(appUser -> new MembreDto(appUser.getEmail(), appUser.getRoleList())).collect(Collectors.toList()); + /** + * Inscription + * @return + * http://localhost:8088/membres/sign-up + */ + @PostMapping(value="/sign-up") + public ResponseEntity signUp(@RequestBody Membre membre) { + try { + return ResponseEntity.ok(new JsonWebToken(membreService.signup(membre))); + } catch (ExistingUsernameException ex) { + return ResponseEntity.badRequest().build(); + } } + + /** + * Ajout d'un membre + * @return + * http://localhost:8088/membres/add + */ + @PostMapping(value="/add/{team_id}", produces="application/json", consumes= "application/json") + //@PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") + public ResponseEntity addMembre(@RequestBody Membre membre, @PathVariable Integer team_id){ + Membre resultMembre = null; + try{ + Team team = new Team(); + team.setId(team_id); + membre.setTeam(team); + //resultMembre = membreRepo.saveAndFlush(membre); + return ResponseEntity.ok(new JsonWebToken(membreService.signup(membre))); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); + } + + //return ResponseEntity.status(HttpStatus.CREATED).body(resultMembre); + } + + /** + * Modifier une commande par son Id + * @return + * http://localhost:8088/membres/update/1 + * + */ + @PutMapping("/update/{id}") + //@PreAuthorize("hasRole('ROLE_PARENT')") + public ResponseEntity updateMembre(@RequestBody Membre membre, @PathVariable int id){ + Optional membreUpdate; + try { + membreUpdate = membreRepo.findById(id); + // membre trouvé + if(membreUpdate.isPresent()){ + membre.setId(membreUpdate.get().getId()); + membreRepo.save(membre); + } + //membre inconnu + else{ + MembreNotFoundException membreNotFoundException = new MembreNotFoundException(id); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(membreNotFoundException.getMessage()); + } + //gestion de l'erreur + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + // retour membre + return ResponseEntity.status(HttpStatus.OK).body(membre); + } + + /** + * Supprimer un membre par son Id + * @return + * http://localhost:8088/membres/delete/1 + */ + @DeleteMapping(value = "/delete/{id}") + //@PreAuthorize("hasRole('ROLE_PARENT')") + public ResponseEntity deleteMembre(@PathVariable int id){ + try { + membreRepo.getById(id); + membreRepo.deleteById(id); + return ResponseEntity.status(HttpStatus.OK).body("Membre supprimé !"); + } catch (Exception e) { + MembreNotFoundException membreNotFoundException = new MembreNotFoundException(id); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(membreNotFoundException.getMessage()); + } + } + + + /**************************** Login / Se connceter ****************************/ + @PostMapping("/sign-in") + public ResponseEntity signIn(@RequestBody Membre membre) { + try { + return ResponseEntity.ok(new JsonWebToken(membreService.signin(membre.getEmail(), membre.getPassword()))); + } catch (InvalidCredentialsException ex) { + return ResponseEntity.badRequest().build(); + } + } + + /********************* Gestion Mot de Passe ************************************/ //cette methode ne fonctionne pas parce que ça affiche "trouvé" dans tous les cas @GetMapping("/forgot-password") //@PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") @@ -102,100 +256,4 @@ public class MembreController { return ResponseEntity.status(HttpStatus.OK).body(resultMembre); } - - - //Récupérer les informations d'un membre par son ID - @GetMapping(value = "/{id}") - //@PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") - public ResponseEntity findById(@PathVariable int id){ - Optional membre = null; - try - { - membre = membreRepo.findById(id); - } catch (Exception e) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); - } - - return ResponseEntity.status(HttpStatus.OK).body(membre); - } - - //Efface un membre par son ID - @DeleteMapping(value = "/delete/{id}") - //@PreAuthorize("hasRole('ROLE_PARENT')") - public ResponseEntity deleteMembre(@PathVariable int id){ - try { - membreRepo.delete(membreRepo.getById(id)); - //membreRepo.deleteById(id); - return ResponseEntity.status(HttpStatus.OK).body("Membre effacé !"); - - } catch (EntityNotFoundException e) { - - return ResponseEntity.status(HttpStatus.OK).body("Membre introuvable !"); - } - } - - //Ajouter un membre et inscription - @PostMapping("/sign-up") - public ResponseEntity signUp(@RequestBody Membre membre) { - try { - return ResponseEntity.ok(new JsonWebToken(membreService.signup(membre))); - } catch (ExistingUsernameException ex) { - return ResponseEntity.badRequest().build(); - } - } - - //Login - @PostMapping("/sign-in") - public ResponseEntity signIn(@RequestBody Membre membre) { - try { - return ResponseEntity.ok(new JsonWebToken(membreService.signin(membre.getEmail(), membre.getPassword()))); - } catch (InvalidCredentialsException ex) { - return ResponseEntity.badRequest().build(); - } - } - - //Met a jour les informations d'un membre par son ID - @PutMapping("/update/{id}") - //@PreAuthorize("hasRole('ROLE_PARENT')") - public ResponseEntity updateMembre(@RequestBody Membre membre, @PathVariable Integer id) throws Exception { - Membre resultMembre = null; - try { - resultMembre = membreRepo.save(membre); - - } catch (Exception e) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage()); - } - - return ResponseEntity.status(HttpStatus.OK).body(resultMembre); - } - -// UPDATE SUR UN CHAMPS -// @PutMapping("/update/{id}") -// public ResponseEntity updateMembre(@RequestBody Membre membre, @PathVariable Integer id) throws Exception { -// Membre resultMembre = null; -// Membre oldMembre = membreRepo.getById(id); -// oldMembre.setNom(membre.getNom()); -// //Membre resultMembre = membreRepo.getById(id); -// try { -// resultMembre = membreRepo.save(oldMembre); -// -// } catch (Exception e) { -// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage()); -// } -// -// return ResponseEntity.status(HttpStatus.OK).body(resultMembre); -// } - -// @GetMapping(value = "/team/{id}") -// public ResponseEntity findTeamById(@PathVariable int id){ -// Optional liste = null; -// try -// { -// liste = teamRepo.findById(id); -// } catch (Exception e) { -// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); -// } -// -// return ResponseEntity.status(HttpStatus.OK).body(liste); -// } } diff --git a/src/main/java/fr/organizee/controller/MenuController.java b/src/main/java/fr/organizee/controller/MenuController.java index b7db085..4b18a32 100644 --- a/src/main/java/fr/organizee/controller/MenuController.java +++ b/src/main/java/fr/organizee/controller/MenuController.java @@ -1,6 +1,7 @@ package fr.organizee.controller; import fr.organizee.model.Menu; +import fr.organizee.model.Team; import fr.organizee.repository.MenuRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -49,11 +50,14 @@ public class MenuController { } //Ajoute un nouveau menu - @PostMapping(value="/add") + @PostMapping(value="/add/{team_id}", produces="application/json", consumes= "application/json") //@PreAuthorize("hasRole('ROLE_PARENT') or hasRole('ROLE_ENFANT')") - public ResponseEntity addMenu(@RequestBody Menu menu){ + public ResponseEntity addMenu(@RequestBody Menu menu, @PathVariable Integer team_id){ Menu resultMenu = null; try { + Team team=new Team(); + team.setId(team_id); + menu.setTeam(team); resultMenu = menuRepository.saveAndFlush(menu); } catch (Exception e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); @@ -63,11 +67,15 @@ public class MenuController { } //Mise a jour d'un menu par son ID - @PutMapping("/update/{id}") + @PutMapping("/update/{team_id}/{id}") //@PreAuthorize("hasRole('ROLE_PARENT')") - public ResponseEntity updateMenu(@RequestBody Menu menu, @PathVariable Integer id) throws Exception { + public ResponseEntity updateMenu(@RequestBody Menu menu, @PathVariable Integer team_id, @PathVariable Integer id) throws Exception { Menu resultMenu = null; try { + menu.setId(menuRepository.findById(id).get().getId()); + Team team=new Team(); + team.setId(team_id); + menu.setTeam(team); resultMenu = menuRepository.save(menu); } catch (Exception e) { diff --git a/src/main/java/fr/organizee/controller/TacheController.java b/src/main/java/fr/organizee/controller/TacheController.java index 681d760..58e5ccc 100644 --- a/src/main/java/fr/organizee/controller/TacheController.java +++ b/src/main/java/fr/organizee/controller/TacheController.java @@ -1,6 +1,7 @@ package fr.organizee.controller; import fr.organizee.model.Tache; +import fr.organizee.model.TodoList; import fr.organizee.repository.TacheRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -61,10 +62,13 @@ public class TacheController { } // Ajoute une tache - @PostMapping(value="/add", produces="application/json", consumes="application/json") - public ResponseEntity addTache(@RequestBody Tache tache){ + @PostMapping(value="/add/{idTodoList}", produces="application/json", consumes="application/json") + public ResponseEntity addTache(@RequestBody Tache tache,@PathVariable Integer idTodoList){ Tache resultTache = null; try { + TodoList todolist=new TodoList(); + todolist.setId(idTodoList); + tache.setTodolist(todolist); resultTache = tacheRepo.saveAndFlush(tache); } catch (Exception e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); @@ -73,11 +77,14 @@ public class TacheController { return ResponseEntity.status(HttpStatus.CREATED).body(resultTache); } - //Met a jour les informations d'une date avec son ID + //Met a jour les informations d'une tache avec son ID @PutMapping("/update/{id}") public ResponseEntity updateTache(@RequestBody Tache tache, @PathVariable Integer id) throws Exception { Tache resultTache = null; try { + TodoList todolist=new TodoList(); + todolist.setId(tacheRepo.findById(tache.getId()).get().getTodolist().getId()); + tache.setTodolist(todolist); resultTache = tacheRepo.save(tache); } catch (Exception e) { diff --git a/src/main/java/fr/organizee/exception/MembreNotFoundAdvice.java b/src/main/java/fr/organizee/exception/MembreNotFoundAdvice.java new file mode 100644 index 0000000..f50edba --- /dev/null +++ b/src/main/java/fr/organizee/exception/MembreNotFoundAdvice.java @@ -0,0 +1,13 @@ +package fr.organizee.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +public class MembreNotFoundAdvice { + @ResponseBody + @ExceptionHandler(MembreNotFoundException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + String membreNotFoundHandler(MembreNotFoundException ex){return ex.getMessage();} +} diff --git a/src/main/java/fr/organizee/exception/MembreNotFoundException.java b/src/main/java/fr/organizee/exception/MembreNotFoundException.java new file mode 100644 index 0000000..fda48c0 --- /dev/null +++ b/src/main/java/fr/organizee/exception/MembreNotFoundException.java @@ -0,0 +1,7 @@ +package fr.organizee.exception; + + +public class MembreNotFoundException extends RuntimeException{ + public MembreNotFoundException(int id){ super("Membre" + id + " introuvable");} + public MembreNotFoundException(){ super("Membres introuvables");} +} diff --git a/src/main/java/fr/organizee/model/Contact.java b/src/main/java/fr/organizee/model/Contact.java index 2c5ffb2..25b2d2d 100644 --- a/src/main/java/fr/organizee/model/Contact.java +++ b/src/main/java/fr/organizee/model/Contact.java @@ -1,5 +1,6 @@ package fr.organizee.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; @@ -10,6 +11,7 @@ public class Contact { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; + private String couleur; private String nom; private String prenom; private String telephone; @@ -17,14 +19,15 @@ public class Contact { private String adresse; private LocalDate dateNaissance; @ManyToOne - @JoinColumn(name="TEAM_ID") - @JsonIgnoreProperties("contact") + @JoinColumn(name = "TEAM_ID") + @JsonIgnoreProperties({"contact", "membre"}) private Team team; public Contact() { } - public Contact(String nom, String prenom, String telephone, String email, String adresse, LocalDate dateNaissance, Team team) { + public Contact(String couleur, String nom, String prenom, String telephone, String email, String adresse, LocalDate dateNaissance, Team team) { + this.couleur = couleur; this.nom = nom; this.prenom = prenom; this.telephone = telephone; @@ -42,6 +45,14 @@ public class Contact { this.id = id; } + public String getCouleur() { + return couleur; + } + + public void setCouleur(String couleur) { + this.couleur = couleur; + } + public String getNom() { return nom; } @@ -93,6 +104,7 @@ public class Contact { public Team getTeam() { return team; } + public void setTeam(Team team) { this.team = team; } @@ -101,6 +113,7 @@ public class Contact { public String toString() { return "Contact{" + "id=" + id + + ", couleur='" + couleur + '\'' + ", nom='" + nom + '\'' + ", prenom='" + prenom + '\'' + ", telephone='" + telephone + '\'' + diff --git a/src/main/java/fr/organizee/model/Evenement.java b/src/main/java/fr/organizee/model/Evenement.java index 15a355f..f2f83fd 100644 --- a/src/main/java/fr/organizee/model/Evenement.java +++ b/src/main/java/fr/organizee/model/Evenement.java @@ -1,5 +1,6 @@ package fr.organizee.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; @@ -10,28 +11,28 @@ public class Evenement { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; - private LocalDateTime eventDebut; - private LocalDateTime eventFin; + private LocalDateTime start; + private LocalDateTime end; private int allDay; - private String libelle; - @ManyToOne(cascade = CascadeType.MERGE) + private String text; + @ManyToOne @JoinColumn(name="MEMBRE_ID") @JsonIgnoreProperties("evenement") private Membre membre; - @ManyToOne(cascade = CascadeType.MERGE) + @ManyToOne @JoinColumn(name="TEAM_ID") - @JsonIgnoreProperties("evenement") + @JsonIgnoreProperties({"evenement", "membre"}) private Team team; public Evenement() { } - public Evenement(int id, LocalDateTime eventDebut, LocalDateTime eventFin, int allDay, String libelle, Membre membre, Team team) { + public Evenement(int id, LocalDateTime start, LocalDateTime end, int allDay, String text, Membre membre, Team team) { this.id = id; - this.eventDebut = eventDebut; - this.eventFin = eventFin; + this.start = start; + this.end = end; this.allDay = allDay; - this.libelle = libelle; + this.text = text; this.membre = membre; this.team = team; } @@ -44,20 +45,20 @@ public class Evenement { this.id = id; } - public LocalDateTime getEventDebut() { - return eventDebut; + public LocalDateTime getStart() { + return start; } - public void setEventDebut(LocalDateTime eventDebut) { - this.eventDebut = eventDebut; + public void setStart(LocalDateTime start) { + this.start = start; } - public LocalDateTime getEventFin() { - return eventFin; + public LocalDateTime getEnd() { + return end; } - public void setEventFin(LocalDateTime eventFin) { - this.eventFin = eventFin; + public void setEnd(LocalDateTime end) { + this.end = end; } public int getAllDay() { @@ -68,12 +69,12 @@ public class Evenement { this.allDay = allDay; } - public String getLibelle() { - return libelle; + public String getText() { + return text; } - public void setLibelle(String libelle) { - this.libelle = libelle; + public void setText(String text) { + this.text = text; } public Membre getMembre() { @@ -96,10 +97,10 @@ public class Evenement { public String toString() { return "Evenement{" + "id=" + id + - ", eventDebut=" + eventDebut + - ", eventFin=" + eventFin + + ", start=" + start + + ", end=" + end + ", allDay=" + allDay + - ", libelle='" + libelle + '\'' + + ", text='" + text + '\'' + ", membre=" + membre + ", team=" + team + '}'; diff --git a/src/main/java/fr/organizee/model/Mail.java b/src/main/java/fr/organizee/model/Mail.java new file mode 100644 index 0000000..cbd551b --- /dev/null +++ b/src/main/java/fr/organizee/model/Mail.java @@ -0,0 +1,41 @@ +package fr.organizee.model; + +public class Mail { + private String recipient; + private String subject; + private String message; + + public Mail() { + } + + public Mail(String recipient, String subject, String message) { + this.recipient = recipient; + this.subject = subject; + this.message = message; + } + + public String getRecipient() { + return recipient; + } + + public void setRecipient(String recipient) { + this.recipient = recipient; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} + diff --git a/src/main/java/fr/organizee/model/Menu.java b/src/main/java/fr/organizee/model/Menu.java index e11cba4..4be974c 100644 --- a/src/main/java/fr/organizee/model/Menu.java +++ b/src/main/java/fr/organizee/model/Menu.java @@ -10,21 +10,21 @@ public class Menu { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; - private String libelle; private LocalDate dateMenu; - private int validationProposition; + private String repasMidi; + private String repasSoir; @ManyToOne @JoinColumn(name="TEAM_ID") - @JsonIgnoreProperties("menu") + @JsonIgnoreProperties({"menu","membre"}) private Team team; public Menu() { } - public Menu(String libelle, LocalDate dateMenu, int validationProposition, Team team) { - this.libelle = libelle; + public Menu(LocalDate dateMenu,String repasMidi, String repasSoir, Team team) { this.dateMenu = dateMenu; - this.validationProposition=validationProposition; + this.repasMidi= repasMidi; + this.repasSoir= repasSoir; this.team = team; } @@ -36,14 +36,6 @@ public class Menu { this.id = id; } - public String getLibelle() { - return libelle; - } - - public void setLibelle(String libelle) { - this.libelle = libelle; - } - public LocalDate getDateMenu() { return dateMenu; } @@ -52,12 +44,20 @@ public class Menu { this.dateMenu = dateMenu; } - public int getValidationProposition() { - return validationProposition; + public String getRepasMidi() { + return repasMidi; } - public void setValidationProposition(int validationProposition) { - this.validationProposition = validationProposition; + public void setRepasMidi(String repasMidi) { + this.repasMidi = repasMidi; + } + + public String getRepasSoir() { + return repasSoir; + } + + public void setRepasSoir(String repasSoir) { + this.repasSoir = repasSoir; } public Team getTeam() { @@ -68,13 +68,14 @@ public class Menu { this.team = team; } + @Override public String toString() { return "Menu{" + "id=" + id + - ", libelle='" + libelle + '\'' + ", dateMenu=" + dateMenu + - ", validationProposition=" + validationProposition + + ", repasMidi='" + repasMidi + '\'' + + ", repasSoir='" + repasSoir + '\'' + ", team=" + team + '}'; } diff --git a/src/main/java/fr/organizee/model/Team.java b/src/main/java/fr/organizee/model/Team.java index ded5837..14ff97e 100644 --- a/src/main/java/fr/organizee/model/Team.java +++ b/src/main/java/fr/organizee/model/Team.java @@ -1,5 +1,6 @@ package fr.organizee.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; @@ -12,17 +13,24 @@ public class Team { @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String nom; + @OneToMany(mappedBy = "team", fetch=FetchType.LAZY, cascade = CascadeType.ALL) @JsonIgnoreProperties("team") private List membres = new ArrayList<>(); + @OneToMany(mappedBy = "team", fetch=FetchType.LAZY, cascade = CascadeType.ALL) @JsonIgnoreProperties("team") + @JsonIgnore private List contacts = new ArrayList<>(); + @OneToMany(mappedBy = "team", fetch=FetchType.LAZY, cascade = CascadeType.ALL) @JsonIgnoreProperties("team") + @JsonIgnore private List todolists = new ArrayList<>(); + @OneToMany(mappedBy = "team", fetch=FetchType.LAZY, cascade = CascadeType.ALL) @JsonIgnoreProperties("team") + @JsonIgnore private List menus = new ArrayList<>(); public Team() { diff --git a/src/main/java/fr/organizee/model/TodoList.java b/src/main/java/fr/organizee/model/TodoList.java index 007e68a..f8ec979 100644 --- a/src/main/java/fr/organizee/model/TodoList.java +++ b/src/main/java/fr/organizee/model/TodoList.java @@ -1,5 +1,6 @@ package fr.organizee.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; @@ -14,7 +15,7 @@ public class TodoList { private String nom; @ManyToOne @JoinColumn(name="TEAM_ID") - @JsonIgnoreProperties("todolist") + @JsonIgnoreProperties({"todolist","membre"}) private Team team; @OneToMany(mappedBy = "todolist", fetch=FetchType.LAZY, cascade = CascadeType.ALL) @JsonIgnoreProperties("todolist") diff --git a/src/main/java/fr/organizee/repository/EvenementRepository.java b/src/main/java/fr/organizee/repository/EvenementRepository.java index 51164c5..e8663ee 100644 --- a/src/main/java/fr/organizee/repository/EvenementRepository.java +++ b/src/main/java/fr/organizee/repository/EvenementRepository.java @@ -2,8 +2,15 @@ package fr.organizee.repository; import fr.organizee.model.Evenement; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; + + @Repository public interface EvenementRepository extends JpaRepository { + @Query(value = "select * from evenement where team_id = :team_id", nativeQuery = true) + List FindEvenementsByTeam(@Param("team_id") int team_id); } diff --git a/src/main/java/fr/organizee/repository/MembreRepository.java b/src/main/java/fr/organizee/repository/MembreRepository.java index 137f203..5a6cf22 100644 --- a/src/main/java/fr/organizee/repository/MembreRepository.java +++ b/src/main/java/fr/organizee/repository/MembreRepository.java @@ -2,6 +2,7 @@ package fr.organizee.repository; import fr.organizee.model.Contact; import fr.organizee.model.Membre; +import fr.organizee.model.Menu; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -12,6 +13,10 @@ import java.util.Optional; @Repository public interface MembreRepository extends JpaRepository { + + @Query(value = "select * from membre where team_id = :team_id", nativeQuery = true) + List FindMembresByTeam(@Param("team_id") int team_id); + Membre findByNom(String nom); Optional findByEmail(String email); diff --git a/src/main/java/fr/organizee/repository/MenuRepository.java b/src/main/java/fr/organizee/repository/MenuRepository.java index 1f22d7d..7c5d0cb 100644 --- a/src/main/java/fr/organizee/repository/MenuRepository.java +++ b/src/main/java/fr/organizee/repository/MenuRepository.java @@ -14,4 +14,5 @@ public interface MenuRepository extends JpaRepository { @Query(value = "select * from menu where team_id = :team_id", nativeQuery = true) List FindMenusByTeam(@Param("team_id") int team_id); + } diff --git a/src/main/java/fr/organizee/security/JwtTokenProvider.java b/src/main/java/fr/organizee/security/JwtTokenProvider.java index 9ec508d..502f9a7 100644 --- a/src/main/java/fr/organizee/security/JwtTokenProvider.java +++ b/src/main/java/fr/organizee/security/JwtTokenProvider.java @@ -27,6 +27,8 @@ import io.jsonwebtoken.JwtException; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; +import fr.organizee.repository.MembreRepository; + /** * JWT : classe utilitaire chargée de fournir le Jeton (Token) et les vérifications */ @@ -44,6 +46,8 @@ public class JwtTokenProvider { @Autowired private UserDetailsService userDetailsService; + @Autowired + private MembreRepository membreRepo; /** * Cette méthode d'initialisation s'exécute avant le constructeur * Elle encode notre code secret en base64 pour la transmission dans le header @@ -104,6 +108,10 @@ public class JwtTokenProvider { public String createToken(String email, List roles){ Claims claims = Jwts.claims().setSubject(email); + claims.put("userId", membreRepo.findByEmail(email).get().getId()); + if(membreRepo.findByEmail(email).get().getTeam() != null){ + claims.put("teamId", membreRepo.findByEmail(email).get().getTeam().getId()); + } claims.put("auth", roles.stream().map(s -> new SimpleGrantedAuthority(s.getAuthority())).filter(Objects::nonNull).collect(Collectors.toList())); System.out.println("claims = "+claims); diff --git a/src/main/java/fr/organizee/service/MembreServiceImpl.java b/src/main/java/fr/organizee/service/MembreServiceImpl.java index 2197bbc..e04c48e 100644 --- a/src/main/java/fr/organizee/service/MembreServiceImpl.java +++ b/src/main/java/fr/organizee/service/MembreServiceImpl.java @@ -48,7 +48,9 @@ public class MembreServiceImpl implements MembreService { @Override public String signup(Membre membre) throws ExistingUsernameException { if (!membreRepository.existsByEmail(membre.getEmail())) { - Membre membreToSave = new Membre(membre.getNom(), membre.getPrenom(), membre.getCouleur(), membre.getDateNaissance(), membre.getTeam(), membre.getEmail(), passwordEncoder.encode(membre.getPassword()), membre.getRoleList()); + Membre membreToSave = new Membre(membre.getNom(), membre.getPrenom(), membre.getCouleur(), + membre.getDateNaissance(), membre.getTeam(), membre.getEmail(), + passwordEncoder.encode(membre.getPassword()), membre.getRoleList()); membreRepository.save(membreToSave); return jwtTokenProvider.createToken(membre.getEmail(), membre.getRoleList()); } else { diff --git a/src/main/java/fr/organizee/service/SendMailService.java b/src/main/java/fr/organizee/service/SendMailService.java new file mode 100644 index 0000000..9437b10 --- /dev/null +++ b/src/main/java/fr/organizee/service/SendMailService.java @@ -0,0 +1,15 @@ +package fr.organizee.service; + +import fr.organizee.model.Mail; + +import javax.mail.MessagingException; + +public interface SendMailService { + void sendMail(Mail mail); + + void sendMailHTML(Mail mail) throws MessagingException; + + void sendMailWithAttachments(Mail mail) throws MessagingException; +} + + diff --git a/src/main/java/fr/organizee/service/SendMailServiceImpl.java b/src/main/java/fr/organizee/service/SendMailServiceImpl.java new file mode 100644 index 0000000..c9974ca --- /dev/null +++ b/src/main/java/fr/organizee/service/SendMailServiceImpl.java @@ -0,0 +1,68 @@ +package fr.organizee.service; + + +import fr.organizee.model.Mail; +import org.springframework.core.io.ClassPathResource; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; + +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; + +@Service +public class SendMailServiceImpl implements SendMailService { + private final JavaMailSender javaMailSender; + + public SendMailServiceImpl(JavaMailSender javaMailSender) { + this.javaMailSender = javaMailSender; + } + + @Override + public void sendMail(Mail mail) { + + SimpleMailMessage msg = new SimpleMailMessage(); + msg.setTo(mail.getRecipient(), mail.getRecipient()); + + msg.setSubject(mail.getSubject()); + msg.setText(mail.getMessage()); + + javaMailSender.send(msg); + } + + @Override + public void sendMailHTML(Mail mail) throws MessagingException { + MimeMessage msg = javaMailSender.createMimeMessage(); + + MimeMessageHelper helper = new MimeMessageHelper(msg, true, "utf-8"); + + helper.setTo(mail.getRecipient()); + + helper.setSubject(mail.getSubject()); + + String htmlMsg = "

      Test d'envoi de mail au format HTML

      " + +""; + + msg.setContent(htmlMsg, "text/html"); + + javaMailSender.send(msg); + } + + @Override + public void sendMailWithAttachments(Mail mail) throws MessagingException { + MimeMessage msg = javaMailSender.createMimeMessage(); + + MimeMessageHelper helper = new MimeMessageHelper(msg, true); + + helper.setTo("destinataire@email"); + + helper.setSubject("Testing from Spring Boot"); + + helper.setText("Find the attached image", true); + + helper.addAttachment("hero.jpg", new ClassPathResource("hero.jpg")); + + javaMailSender.send(msg); + } +} \ No newline at end of file diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 0af0130..148a508 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -37,5 +37,16 @@ INSERT INTO `tache` (`id`, `etat`, `texte`, `todolist_id`) VALUES (4, 0, 'Acheter un sapin', 3), (5, 0, 'Trouver un repas', 3); -INSERT INTO `evenement` (`id`, `all_day`, `event_debut`, `event_fin`, `libelle`, `membre_id`, `team_id`) VALUES - (1, 0, '2022-01-13 09:00:33', '2022-01-13 13:04:38', 'Simplon', 1, 1); \ No newline at end of file +INSERT INTO `evenement` (`id`, `all_day`, `start`, `end`, `text`, `membre_id`, `team_id`) VALUES + (1, 0, '2022-02-04 09:00:00', '2022-02-04 13:00:00', 'Simplon', 1, 1), + (2, 0, '2022-02-03 12:00:00', '2022-02-03 13:00:00', 'Footing', 2, 1); + + +INSERT INTO menu (id, date_menu, repas_midi, team_id, repas_soir) VALUES +(1, '2022-02-21', 'canard à l orange', 4, 'pâtes au beurre'), +(4, '2022-02-22', 'lasagnes', 4, 'riz sauté'), +(11, '2022-02-23', 'roti de dinde orloff', 4, 'choucroute'), +(13, '2022-02-24', 'hachis parmentier', 4, 'salade composée'), +(15, '2022-02-25', 'legumes', 4, 'croque monsieurs'), +(17, '2022-02-26', 'sauté de veau', 4, 'soupe et jambon'), +(21, '2022-02-27', 'lasagnes', 4, 'pizza'); \ No newline at end of file