From 6a3569029d9daf45138831d5523a02f9b749558c Mon Sep 17 00:00:00 2001 From: Subivas Date: Tue, 2 Dec 2025 23:21:44 +0100 Subject: [PATCH] =?UTF-8?q?refactor=20pour=20int=C3=A9grer=20l'architectur?= =?UTF-8?q?e=203-tiers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PhotoController.java | 196 +++++++++--------- .../fotosharing/dto/CommentaireDTO.java | 15 ++ .../epul4a/fotosharing/dto/PartageDTO.java | 13 ++ .../epul4a/fotosharing/dto/PhotoDTO.java | 19 ++ .../fotosharing/dto/UtilisateurDTO.java | 14 ++ .../fotosharing/mapper/CommentaireMapper.java | 18 ++ .../fotosharing/mapper/PartageMapper.java | 20 ++ .../fotosharing/mapper/PhotoMapper.java | 28 +++ .../fotosharing/mapper/UtilisateurMapper.java | 17 ++ .../epul4a/fotosharing/model/Partage.java | 9 +- .../service/CommentaireService.java | 3 +- .../fotosharing/service/PartageService.java | 10 + .../fotosharing/service/PhotoService.java | 23 +- .../service/UtilisateurService.java | 8 + .../service/impl/CommentaireServiceImpl.java | 11 +- .../service/impl/PartageServiceImpl.java | 78 +++++++ .../service/impl/PhotoServiceImpl.java | 192 +++++++++-------- .../service/impl/UtilisateurServiceImpl.java | 30 +++ src/main/resources/templates/mes-photos.html | 18 +- .../resources/templates/photo-detail.html | 8 + .../controller/PhotoController.class | Bin 10662 -> 8818 bytes .../fotosharing/dto/CommentaireDTO.class | Bin 0 -> 1657 bytes .../epul4a/fotosharing/dto/PartageDTO.class | Bin 0 -> 1681 bytes .../epul4a/fotosharing/dto/PhotoDTO.class | Bin 0 -> 2140 bytes .../fotosharing/dto/UtilisateurDTO.class | Bin 0 -> 1377 bytes .../mapper/CommentaireMapper.class | Bin 0 -> 1443 bytes .../fotosharing/mapper/PartageMapper.class | Bin 0 -> 1749 bytes .../fotosharing/mapper/PhotoMapper.class | Bin 0 -> 1997 bytes .../mapper/UtilisateurMapper.class | Bin 0 -> 1092 bytes .../model/Partage$Permission.class | Bin 0 -> 1402 bytes .../epul4a/fotosharing/model/Partage.class | Bin 1738 -> 2391 bytes .../service/CommentaireService.class | Bin 685 -> 686 bytes .../fotosharing/service/PartageService.class | Bin 0 -> 577 bytes .../fotosharing/service/PhotoService.class | Bin 1497 -> 1155 bytes .../service/UtilisateurService.class | Bin 0 -> 337 bytes .../service/impl/CommentaireServiceImpl.class | Bin 4332 -> 4920 bytes .../service/impl/PartageServiceImpl.class | Bin 0 -> 5516 bytes .../service/impl/PhotoServiceImpl.class | Bin 10605 -> 9917 bytes .../service/impl/UtilisateurServiceImpl.class | Bin 0 -> 1585 bytes target/classes/templates/mes-photos.html | 18 +- target/classes/templates/photo-detail.html | 8 + 41 files changed, 530 insertions(+), 226 deletions(-) create mode 100644 src/main/java/local/epul4a/fotosharing/dto/CommentaireDTO.java create mode 100644 src/main/java/local/epul4a/fotosharing/dto/PartageDTO.java create mode 100644 src/main/java/local/epul4a/fotosharing/dto/PhotoDTO.java create mode 100644 src/main/java/local/epul4a/fotosharing/dto/UtilisateurDTO.java create mode 100644 src/main/java/local/epul4a/fotosharing/mapper/CommentaireMapper.java create mode 100644 src/main/java/local/epul4a/fotosharing/mapper/PartageMapper.java create mode 100644 src/main/java/local/epul4a/fotosharing/mapper/PhotoMapper.java create mode 100644 src/main/java/local/epul4a/fotosharing/mapper/UtilisateurMapper.java create mode 100644 src/main/java/local/epul4a/fotosharing/service/PartageService.java create mode 100644 src/main/java/local/epul4a/fotosharing/service/UtilisateurService.java create mode 100644 src/main/java/local/epul4a/fotosharing/service/impl/PartageServiceImpl.java create mode 100644 src/main/java/local/epul4a/fotosharing/service/impl/UtilisateurServiceImpl.java create mode 100644 target/classes/local/epul4a/fotosharing/dto/CommentaireDTO.class create mode 100644 target/classes/local/epul4a/fotosharing/dto/PartageDTO.class create mode 100644 target/classes/local/epul4a/fotosharing/dto/PhotoDTO.class create mode 100644 target/classes/local/epul4a/fotosharing/dto/UtilisateurDTO.class create mode 100644 target/classes/local/epul4a/fotosharing/mapper/CommentaireMapper.class create mode 100644 target/classes/local/epul4a/fotosharing/mapper/PartageMapper.class create mode 100644 target/classes/local/epul4a/fotosharing/mapper/PhotoMapper.class create mode 100644 target/classes/local/epul4a/fotosharing/mapper/UtilisateurMapper.class create mode 100644 target/classes/local/epul4a/fotosharing/model/Partage$Permission.class create mode 100644 target/classes/local/epul4a/fotosharing/service/PartageService.class create mode 100644 target/classes/local/epul4a/fotosharing/service/UtilisateurService.class create mode 100644 target/classes/local/epul4a/fotosharing/service/impl/PartageServiceImpl.class create mode 100644 target/classes/local/epul4a/fotosharing/service/impl/UtilisateurServiceImpl.class diff --git a/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java b/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java index 7df688e..3049b02 100644 --- a/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java +++ b/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java @@ -1,49 +1,46 @@ package local.epul4a.fotosharing.controller; -import local.epul4a.fotosharing.model.Partage; -import local.epul4a.fotosharing.model.Photo; -import local.epul4a.fotosharing.model.Utilisateur; -import local.epul4a.fotosharing.repository.PartageRepository; -import local.epul4a.fotosharing.repository.PhotoRepository; -import local.epul4a.fotosharing.repository.UtilisateurRepository; -import local.epul4a.fotosharing.security.CustomUserDetails; +import local.epul4a.fotosharing.dto.CommentaireDTO; +import local.epul4a.fotosharing.dto.PartageDTO; +import local.epul4a.fotosharing.dto.PhotoDTO; import local.epul4a.fotosharing.service.CommentaireService; +import local.epul4a.fotosharing.service.PartageService; import local.epul4a.fotosharing.service.PhotoService; +import local.epul4a.fotosharing.service.UtilisateurService; import org.springframework.core.io.Resource; -import org.springframework.core.io.PathResource; import org.springframework.data.domain.Page; -import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; -import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; - @Controller public class PhotoController { private final PhotoService photoService; - private final PhotoRepository photoRepository; private final CommentaireService commentaireService; - private final UtilisateurRepository utilisateurRepository; - private final PartageRepository partageRepository; + private final PartageService partageService; + private final UtilisateurService utilisateurService; - public PhotoController(PhotoService photoService, PhotoRepository photoRepository, CommentaireService commentaireService, UtilisateurRepository utilisateurRepository, PartageRepository partageRepository) { + public PhotoController( + PhotoService photoService, + CommentaireService commentaireService, + PartageService partageService, + UtilisateurService utilisateurService + ) { this.photoService = photoService; - this.photoRepository = photoRepository; this.commentaireService = commentaireService; - this.utilisateurRepository = utilisateurRepository; - this.partageRepository = partageRepository; + this.partageService = partageService; + this.utilisateurService = utilisateurService; } + + /* ========================== UPLOAD ========================== */ + @GetMapping("/upload") public String uploadForm() { return "upload"; @@ -52,147 +49,142 @@ public class PhotoController { @PostMapping("/upload") public String doUpload(@RequestParam("file") MultipartFile file, @RequestParam(value = "visibilite", defaultValue = "PRIVATE") String visibilite, - Authentication authentication, + Authentication auth, Model model) { try { - String email = authentication.getName(); // l'email de l'utilisateur connecté - Photo p = photoService.store(file, visibilite, email); - model.addAttribute("message", "Upload OK : " + p.getId()); - return "redirect:/"; - } catch (Exception e) { - model.addAttribute("error", e.getMessage()); + photoService.store(file, visibilite, auth.getName()); + return "redirect:/mes-photos"; + } catch (Exception ex) { + model.addAttribute("error", ex.getMessage()); return "upload"; } } + + /* ========================== RAW IMAGE ========================== */ + @GetMapping("/photo/{id}/raw") - public ResponseEntity rawPhoto(@PathVariable("id") Long id) { - Photo photo = photoRepository.findById(id).orElse(null); - if (photo == null) { + public ResponseEntity rawPhoto(@PathVariable Long id) { + + PhotoDTO photo = photoService.getPhotoById(id); + if (photo == null) return ResponseEntity.notFound().build(); - } - Path p = photoService.loadAsPath(photo.getUuidFichier()); - Resource r = new PathResource(p); - - if (!r.exists()) { + Resource r = photoService.loadAsResource(photo.getUuidFichier()); + if (!r.exists()) return ResponseEntity.notFound().build(); - } - - String contentType = "application/octet-stream"; - try { - contentType = Files.probeContentType(p); - } catch (Exception ignored) { - } return ResponseEntity.ok() - .contentType(MediaType.parseMediaType(contentType)) - .header(HttpHeaders.CONTENT_DISPOSITION, - "inline; filename=\"" + photo.getNomFichierOriginal() + "\"") + .contentType(MediaType.IMAGE_JPEG) // simplifiable, ou détecté dans service .body(r); } + + /* ========================== MES PHOTOS ========================== */ + @GetMapping("/mes-photos") public String mesPhotos( - @RequestParam(name = "pagePrivees", defaultValue = "0") int pagePrivees, - @RequestParam(name = "pagePubliques", defaultValue = "0") int pagePubliques, - @RequestParam(name = "pagePartagees", defaultValue = "0") int pagePartagees, - @RequestParam(name = "pageMesPartagees", defaultValue = "0") int pageMesPartagees, - Model model, - Authentication auth - ) { - String email = auth.getName(); - // Chaque liste utilise sa propre pagination - model.addAttribute("photosPrivees", photoService.listPrivatePhotos(email, pagePrivees, 12)); - model.addAttribute("photosPubliques", photoService.listPublicPhotos(email, pagePubliques, 12)); - model.addAttribute("photosPartagees", photoService.listSharedWith(email, pagePartagees, 12)); - model.addAttribute("mesPhotosPartagees", photoService.listSharedPhotos(email, pageMesPartagees, 12)); + @RequestParam(defaultValue = "0") int pagePrivees, + @RequestParam(defaultValue = "0") int pagePubliques, + @RequestParam(defaultValue = "0") int pagePartagees, + @RequestParam(defaultValue = "0") int pageMesPartagees, + Authentication auth, Model model) { + + String email = auth.getName(); + + model.addAttribute("photosPrivees", + photoService.listPrivatePhotos(email, pagePrivees, 12)); + + model.addAttribute("photosPubliques", + photoService.listPublicPhotos(email, pagePubliques, 12)); + + model.addAttribute("photosPartagees", + photoService.listSharedWith(email, pagePartagees, 12)); + + model.addAttribute("mesPhotosPartagees", + photoService.listSharedPhotos(email, pageMesPartagees, 12)); - // Ajouter les 3 index séparés model.addAttribute("pagePrivees", pagePrivees); model.addAttribute("pagePubliques", pagePubliques); model.addAttribute("pagePartagees", pagePartagees); model.addAttribute("pageMesPartagees", pageMesPartagees); + return "mes-photos"; } + /* ========================== GALERIE ========================== */ + @GetMapping("/galerie") public String galerie(@RequestParam(defaultValue = "0") int page, Model model) { - Page photosPage = photoService.listPublic(page, 12); + + Page photosPage = photoService.listPublic(page, 12); + model.addAttribute("photosPage", photosPage); model.addAttribute("currentPage", page); + return "galerie"; } + /* ========================== DETAIL PHOTO ========================== */ + @GetMapping("/photo/{id}") @PreAuthorize("@securityService.canAccessPhoto(authentication, #id)") public String viewPhoto(@PathVariable Long id, @RequestParam(defaultValue = "0") int page, - Model model, - Authentication auth) { - Photo photo = photoRepository.findById(id).orElse(null); - if (photo == null) { + Authentication auth, + Model model) { + + PhotoDTO photo = photoService.getPhotoById(id); + if (photo == null) return "redirect:/galerie"; - } + model.addAttribute("photo", photo); - // Pagination des commentaires - model.addAttribute("commentairesPage", - commentaireService.listByPhoto(id, page, 10)); + + Page commentaires = + commentaireService.listByPhoto(id, page, 10); + model.addAttribute("commentairesPage", commentaires); model.addAttribute("currentPage", page); - // utilisateur connecté (peut être null) + String currentUser = (auth != null ? auth.getName() : null); model.addAttribute("currentUser", currentUser); - // Liste des partages - List partages = partageRepository.findByPhoto_Id(id); - model.addAttribute("partages", partages); + + model.addAttribute("partages", + partageService.getPartagesForPhoto(id)); + return "photo-detail"; } + /* ========================== COMMENTAIRES ========================== */ @PostMapping("/photo/{id}/comment") public String addComment(@PathVariable Long id, @RequestParam String contenu, Authentication auth) { - if (auth == null) { - return "redirect:/login"; - } - String email = auth.getName(); - commentaireService.addComment(id, email, contenu); + + commentaireService.addComment(id, auth.getName(), contenu); return "redirect:/photo/" + id; } + + /* ========================== PARTAGE PHOTO ========================== */ @PostMapping("/photo/{id}/share") @PreAuthorize("@securityService.canAccessPhoto(authentication, #id)") - public String share(@PathVariable Long id, - @RequestParam String email, - Authentication auth) { - // Vérifier que c'est le propriétaire - Photo photo = photoRepository.findById(id).orElse(null); - if (photo == null) return "redirect:/galerie"; - if (!photo.getProprietaire().getEmail().equals(auth.getName())) { - return "redirect:/photo/" + id + "?error=notowner"; - } - // Trouver utilisateur - Utilisateur user = utilisateurRepository.findByEmail(email).orElse(null); - if (user == null) { - return "redirect:/photo/" + id + "?error=usernotfound"; - } - // Ajouter partage - Partage p = new Partage(); - p.setPhoto(photo); - p.setUtilisateur(user); - partageRepository.save(p); + public String sharePhoto(@PathVariable Long id, + @RequestParam String email, + @RequestParam String permission, + Authentication auth) { + + partageService.share(id, email, permission, auth.getName()); return "redirect:/photo/" + id + "?shared=ok"; } + @GetMapping("/photo/{id}/unshare/{email}") public String unshare(@PathVariable Long id, @PathVariable String email) { - photoService.unshare(id, email); + + partageService.unshare(id, email); return "redirect:/photo/" + id; } - - -} - +} \ No newline at end of file diff --git a/src/main/java/local/epul4a/fotosharing/dto/CommentaireDTO.java b/src/main/java/local/epul4a/fotosharing/dto/CommentaireDTO.java new file mode 100644 index 0000000..cdb9bf7 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/dto/CommentaireDTO.java @@ -0,0 +1,15 @@ +package local.epul4a.fotosharing.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +public class CommentaireDTO { + private Long id; + private String contenu; + private LocalDateTime dateCommentaire; + private UtilisateurDTO auteur; +} diff --git a/src/main/java/local/epul4a/fotosharing/dto/PartageDTO.java b/src/main/java/local/epul4a/fotosharing/dto/PartageDTO.java new file mode 100644 index 0000000..c4defd2 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/dto/PartageDTO.java @@ -0,0 +1,13 @@ +package local.epul4a.fotosharing.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class PartageDTO { + private Long id; + private UtilisateurDTO utilisateur; + private String permission; // READ / COMMENT / ADMIN + private PhotoDTO photo; +} diff --git a/src/main/java/local/epul4a/fotosharing/dto/PhotoDTO.java b/src/main/java/local/epul4a/fotosharing/dto/PhotoDTO.java new file mode 100644 index 0000000..fcb5d90 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/dto/PhotoDTO.java @@ -0,0 +1,19 @@ +package local.epul4a.fotosharing.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +public class PhotoDTO { + + private Long id; + private String nomFichierOriginal; + private String uuidFichier; + private LocalDateTime dateUpload; + private String visibilite; + private UtilisateurDTO proprietaire; + +} diff --git a/src/main/java/local/epul4a/fotosharing/dto/UtilisateurDTO.java b/src/main/java/local/epul4a/fotosharing/dto/UtilisateurDTO.java new file mode 100644 index 0000000..11951b9 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/dto/UtilisateurDTO.java @@ -0,0 +1,14 @@ +package local.epul4a.fotosharing.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UtilisateurDTO { + + private Long id; + private String email; + private String nom; + private String prenom; +} diff --git a/src/main/java/local/epul4a/fotosharing/mapper/CommentaireMapper.java b/src/main/java/local/epul4a/fotosharing/mapper/CommentaireMapper.java new file mode 100644 index 0000000..7c91724 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/mapper/CommentaireMapper.java @@ -0,0 +1,18 @@ +package local.epul4a.fotosharing.mapper; + +import local.epul4a.fotosharing.dto.CommentaireDTO; +import local.epul4a.fotosharing.model.Commentaire; + +public class CommentaireMapper { + + public static CommentaireDTO toDTO(Commentaire c) { + if (c == null) return null; + CommentaireDTO dto = new CommentaireDTO(); + dto.setId(c.getId()); + dto.setContenu(c.getContenu()); + dto.setDateCommentaire(c.getDateCommentaire()); + // Auteur via mapper dédié + dto.setAuteur(UtilisateurMapper.toDTO(c.getAuteur())); + return dto; + } +} diff --git a/src/main/java/local/epul4a/fotosharing/mapper/PartageMapper.java b/src/main/java/local/epul4a/fotosharing/mapper/PartageMapper.java new file mode 100644 index 0000000..d7b59c8 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/mapper/PartageMapper.java @@ -0,0 +1,20 @@ +package local.epul4a.fotosharing.mapper; + +import local.epul4a.fotosharing.dto.PartageDTO; +import local.epul4a.fotosharing.model.Partage; + +public class PartageMapper { + + public static PartageDTO toDTO(Partage p) { + if (p == null) return null; + + PartageDTO dto = new PartageDTO(); + dto.setId(p.getId()); + dto.setUtilisateur(UtilisateurMapper.toDTO(p.getUtilisateur())); + dto.setPhoto(PhotoMapper.toDTO(p.getPhoto())); + dto.setPermission(p.getPermission().name()); + + return dto; + } +} + diff --git a/src/main/java/local/epul4a/fotosharing/mapper/PhotoMapper.java b/src/main/java/local/epul4a/fotosharing/mapper/PhotoMapper.java new file mode 100644 index 0000000..a38cb75 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/mapper/PhotoMapper.java @@ -0,0 +1,28 @@ +package local.epul4a.fotosharing.mapper; + +import local.epul4a.fotosharing.dto.PhotoDTO; +import local.epul4a.fotosharing.dto.UtilisateurDTO; +import local.epul4a.fotosharing.model.Photo; +import local.epul4a.fotosharing.model.Utilisateur; + +public class PhotoMapper { + public static PhotoDTO toDTO(Photo p) { + if (p == null) return null; + PhotoDTO dto = new PhotoDTO(); + dto.setId(p.getId()); + dto.setNomFichierOriginal(p.getNomFichierOriginal()); + dto.setUuidFichier(p.getUuidFichier()); + dto.setDateUpload(p.getDateUpload()); + dto.setVisibilite(p.getVisibilite().name()); + Utilisateur u = p.getProprietaire(); + if (u != null) { + UtilisateurDTO uDTO = new UtilisateurDTO(); + uDTO.setId(u.getId()); + uDTO.setEmail(u.getEmail()); + uDTO.setNom(u.getNom()); + uDTO.setPrenom(u.getPrenom()); + dto.setProprietaire(uDTO); + } + return dto; + } +} diff --git a/src/main/java/local/epul4a/fotosharing/mapper/UtilisateurMapper.java b/src/main/java/local/epul4a/fotosharing/mapper/UtilisateurMapper.java new file mode 100644 index 0000000..77f830e --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/mapper/UtilisateurMapper.java @@ -0,0 +1,17 @@ +package local.epul4a.fotosharing.mapper; + +import local.epul4a.fotosharing.dto.UtilisateurDTO; +import local.epul4a.fotosharing.model.Utilisateur; + +public class UtilisateurMapper { + + public static UtilisateurDTO toDTO(Utilisateur u) { + if (u == null) return null; + UtilisateurDTO dto = new UtilisateurDTO(); + dto.setId(u.getId()); + dto.setEmail(u.getEmail()); + dto.setNom(u.getNom()); + dto.setPrenom(u.getPrenom()); + return dto; + } +} diff --git a/src/main/java/local/epul4a/fotosharing/model/Partage.java b/src/main/java/local/epul4a/fotosharing/model/Partage.java index 9f6aef2..0e564eb 100644 --- a/src/main/java/local/epul4a/fotosharing/model/Partage.java +++ b/src/main/java/local/epul4a/fotosharing/model/Partage.java @@ -8,6 +8,11 @@ import lombok.Setter; @Getter @Setter public class Partage { + public enum Permission { + READ, + COMMENT, + ADMIN + } @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -21,5 +26,7 @@ public class Partage { @JoinColumn(name = "id_utilisateur") private Utilisateur utilisateur; - // Getters & Setters + @Enumerated(EnumType.STRING) + private Permission permission = Permission.READ; + } diff --git a/src/main/java/local/epul4a/fotosharing/service/CommentaireService.java b/src/main/java/local/epul4a/fotosharing/service/CommentaireService.java index 84d4dff..e1ba02e 100644 --- a/src/main/java/local/epul4a/fotosharing/service/CommentaireService.java +++ b/src/main/java/local/epul4a/fotosharing/service/CommentaireService.java @@ -1,5 +1,6 @@ package local.epul4a.fotosharing.service; +import local.epul4a.fotosharing.dto.CommentaireDTO; import local.epul4a.fotosharing.model.Commentaire; import org.springframework.data.domain.Page; @@ -8,6 +9,6 @@ import java.util.List; public interface CommentaireService { List listByPhoto(Long photoId); void addComment(Long photoId, String email, String contenu); - Page listByPhoto(Long photoId, int page, int size); + Page listByPhoto(Long photoId, int page, int size); } diff --git a/src/main/java/local/epul4a/fotosharing/service/PartageService.java b/src/main/java/local/epul4a/fotosharing/service/PartageService.java new file mode 100644 index 0000000..3f7e6a2 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/service/PartageService.java @@ -0,0 +1,10 @@ +package local.epul4a.fotosharing.service; + +import local.epul4a.fotosharing.dto.PartageDTO; +import java.util.List; + +public interface PartageService { + void share(Long photoId, String targetEmail, String permission, String ownerEmail); + void unshare(Long photoId, String targetEmail); + List getPartagesForPhoto(Long photoId); +} diff --git a/src/main/java/local/epul4a/fotosharing/service/PhotoService.java b/src/main/java/local/epul4a/fotosharing/service/PhotoService.java index 0142705..5a9b8cf 100644 --- a/src/main/java/local/epul4a/fotosharing/service/PhotoService.java +++ b/src/main/java/local/epul4a/fotosharing/service/PhotoService.java @@ -1,6 +1,8 @@ package local.epul4a.fotosharing.service; +import local.epul4a.fotosharing.dto.PhotoDTO; import local.epul4a.fotosharing.model.Photo; +import org.springframework.core.io.Resource; import org.springframework.data.domain.Page; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @@ -8,19 +10,14 @@ import java.nio.file.Path; import java.util.List; public interface PhotoService { - Photo store(MultipartFile file, String visibilite, String ownerEmail) throws IOException; - Path loadAsPath(String uuidFile); - List listByOwner(String email); - List listPublicPhotos(); - List listSharedWith(String email); - List listPrivatePhotos(String email); - List listPublicPhotos(String email); - void unshare(Long photoId, String email); - Page listPublic(int page, int size); - Page listPrivatePhotos(String email, int page, int size); - Page listPublicPhotos(String email, int page, int size); - Page listSharedWith(String email, int page, int size); - Page listSharedPhotos(String email, int page, int size); + PhotoDTO store(MultipartFile file, String visibilite, String ownerEmail); + PhotoDTO getPhotoById(Long id); + Resource loadAsResource(String uuidFichier); + Page listPublic(int page, int size); + Page listPrivatePhotos(String email, int page, int size); + Page listPublicPhotos(String email, int page, int size); + Page listSharedWith(String email, int page, int size); + Page listSharedPhotos(String email, int page, int size); diff --git a/src/main/java/local/epul4a/fotosharing/service/UtilisateurService.java b/src/main/java/local/epul4a/fotosharing/service/UtilisateurService.java new file mode 100644 index 0000000..bcb4f99 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/service/UtilisateurService.java @@ -0,0 +1,8 @@ +package local.epul4a.fotosharing.service; + +import local.epul4a.fotosharing.dto.UtilisateurDTO; + +public interface UtilisateurService { + UtilisateurDTO findByEmail(String email); + boolean existsByEmail(String email); +} diff --git a/src/main/java/local/epul4a/fotosharing/service/impl/CommentaireServiceImpl.java b/src/main/java/local/epul4a/fotosharing/service/impl/CommentaireServiceImpl.java index bb9b5b2..e7b6e80 100644 --- a/src/main/java/local/epul4a/fotosharing/service/impl/CommentaireServiceImpl.java +++ b/src/main/java/local/epul4a/fotosharing/service/impl/CommentaireServiceImpl.java @@ -1,5 +1,7 @@ package local.epul4a.fotosharing.service.impl; +import local.epul4a.fotosharing.dto.CommentaireDTO; +import local.epul4a.fotosharing.mapper.CommentaireMapper; import local.epul4a.fotosharing.model.Commentaire; import local.epul4a.fotosharing.model.Photo; import local.epul4a.fotosharing.model.Utilisateur; @@ -51,9 +53,14 @@ public class CommentaireServiceImpl implements CommentaireService { commentaireRepository.save(c); } @Override - public Page listByPhoto(Long photoId, int page, int size) { + public Page listByPhoto(Long photoId, int page, int size) { Pageable pageable = PageRequest.of(page, size); - return commentaireRepository.findByPhoto_Id(photoId, pageable); + + Page commentaires = + commentaireRepository.findByPhoto_Id(photoId, pageable); + + return commentaires.map(CommentaireMapper::toDTO); } + } diff --git a/src/main/java/local/epul4a/fotosharing/service/impl/PartageServiceImpl.java b/src/main/java/local/epul4a/fotosharing/service/impl/PartageServiceImpl.java new file mode 100644 index 0000000..910e13d --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/service/impl/PartageServiceImpl.java @@ -0,0 +1,78 @@ +package local.epul4a.fotosharing.service.impl; + +import local.epul4a.fotosharing.dto.PartageDTO; +import local.epul4a.fotosharing.mapper.PartageMapper; +import local.epul4a.fotosharing.model.Partage; +import local.epul4a.fotosharing.model.Photo; +import local.epul4a.fotosharing.model.Utilisateur; +import local.epul4a.fotosharing.repository.PartageRepository; +import local.epul4a.fotosharing.repository.PhotoRepository; +import local.epul4a.fotosharing.repository.UtilisateurRepository; +import local.epul4a.fotosharing.service.PartageService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class PartageServiceImpl implements PartageService { + + private final PartageRepository partageRepository; + private final PhotoRepository photoRepository; + private final UtilisateurRepository utilisateurRepository; + + public PartageServiceImpl( + PartageRepository partageRepository, + PhotoRepository photoRepository, + UtilisateurRepository utilisateurRepository + ) { + this.partageRepository = partageRepository; + this.photoRepository = photoRepository; + this.utilisateurRepository = utilisateurRepository; + } + + @Override + public List getPartagesForPhoto(Long photoId) { + return partageRepository.findByPhoto_Id(photoId) + .stream() + .map(PartageMapper::toDTO) + .toList(); + } + + @Override + public void share(Long photoId, String targetEmail, String permissionStr, String ownerEmail) { + + Photo photo = photoRepository.findById(photoId) + .orElseThrow(() -> new RuntimeException("Photo introuvable")); + + if (!photo.getProprietaire().getEmail().equals(ownerEmail)) + throw new RuntimeException("Vous n'êtes pas propriétaire"); + + Utilisateur target = utilisateurRepository.findByEmail(targetEmail) + .orElseThrow(() -> new RuntimeException("Utilisateur introuvable")); + + if (partageRepository.existsByPhoto_IdAndUtilisateur_Email(photoId, targetEmail)) + return; + + Partage.Permission permission = Partage.Permission.valueOf(permissionStr); + + Partage partage = new Partage(); + partage.setPhoto(photo); + partage.setUtilisateur(target); + partage.setPermission(permission); + + partageRepository.save(partage); + } + + @Override + public void unshare(Long photoId, String targetEmail) { + + Partage partage = partageRepository.findByPhoto_Id(photoId) + .stream() + .filter(p -> p.getUtilisateur().getEmail().equals(targetEmail)) + .findFirst() + .orElse(null); + + if (partage != null) + partageRepository.delete(partage); + } +} diff --git a/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java b/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java index 96166f4..413dfed 100644 --- a/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java +++ b/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java @@ -1,5 +1,7 @@ package local.epul4a.fotosharing.service.impl; +import local.epul4a.fotosharing.dto.PhotoDTO; +import local.epul4a.fotosharing.mapper.PhotoMapper; import local.epul4a.fotosharing.model.Partage; import local.epul4a.fotosharing.model.Photo; import local.epul4a.fotosharing.model.Utilisateur; @@ -8,15 +10,15 @@ import local.epul4a.fotosharing.repository.PhotoRepository; import local.epul4a.fotosharing.repository.UtilisateurRepository; import local.epul4a.fotosharing.service.PhotoService; import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; +import org.springframework.core.io.Resource; +import org.springframework.core.io.UrlResource; +import org.springframework.data.domain.*; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.net.MalformedURLException; import java.nio.file.*; import java.time.LocalDateTime; import java.util.List; @@ -27,134 +29,130 @@ public class PhotoServiceImpl implements PhotoService { @Value("${file.upload-dir}") private String uploadDir; - private final PhotoRepository photoRepository; private final UtilisateurRepository utilisateurRepository; private final PartageRepository partageRepository; - public PhotoServiceImpl(PhotoRepository photoRepository, UtilisateurRepository utilisateurRepository, PartageRepository partageRepository) { + public PhotoServiceImpl( + PhotoRepository photoRepository, + UtilisateurRepository utilisateurRepository, + PartageRepository partageRepository) { this.photoRepository = photoRepository; this.utilisateurRepository = utilisateurRepository; this.partageRepository = partageRepository; } + + //============= STORE PHOTO ============================= @Override - public Photo store(MultipartFile file, String visibilite, String ownerEmail) throws IOException { - if (file.isEmpty()) throw new IOException("Fichier vide"); - - // Vérifier taille / type si besoin (ici basique) - String original = StringUtils.cleanPath(file.getOriginalFilename()); - String uuid = UUID.randomUUID().toString() + "-" + original; - - Path uploadPath = Paths.get(uploadDir); - if (!Files.exists(uploadPath)) Files.createDirectories(uploadPath); - - Path target = uploadPath.resolve(uuid); - Files.copy(file.getInputStream(), target, StandardCopyOption.REPLACE_EXISTING); - - Photo p = new Photo(); - p.setNomFichierOriginal(original); - p.setUuidFichier(uuid); - p.setDateUpload(LocalDateTime.now()); - p.setVisibilite(Photo.Visibilite.valueOf(visibilite)); - Utilisateur u = utilisateurRepository.findByEmail(ownerEmail).orElseThrow(() -> new IOException("Utilisateur introuvable")); - p.setProprietaire(u); - - return photoRepository.save(p); + public PhotoDTO store(MultipartFile file, String visibilite, String ownerEmail) { + try { + if (file.isEmpty()) throw new IOException("Fichier vide"); + String original = StringUtils.cleanPath(file.getOriginalFilename()); + String uuid = UUID.randomUUID() + "-" + original; + Path uploadPath = Paths.get(uploadDir); + if (!Files.exists(uploadPath)) + Files.createDirectories(uploadPath); + Files.copy(file.getInputStream(), + uploadPath.resolve(uuid), + StandardCopyOption.REPLACE_EXISTING); + Utilisateur owner = utilisateurRepository.findByEmail(ownerEmail) + .orElseThrow(() -> new RuntimeException("Utilisateur introuvable")); + Photo p = new Photo(); + p.setNomFichierOriginal(original); + p.setUuidFichier(uuid); + p.setVisibilite(Photo.Visibilite.valueOf(visibilite)); + p.setDateUpload(LocalDateTime.now()); + p.setProprietaire(owner); + return PhotoMapper.toDTO(photoRepository.save(p)); + } catch (Exception ex) { + throw new RuntimeException("Erreur upload : " + ex.getMessage(), ex); + } } - @Override - public Path loadAsPath(String uuidFile) { - return Paths.get(uploadDir).resolve(uuidFile); - } - @Override - public List listByOwner(String email) { - return photoRepository.findByProprietaire_Email(email); - } + //============= GET PHOTO BY ID ========================== @Override - public List listPublicPhotos() { - return photoRepository.findByVisibilite(Photo.Visibilite.PUBLIC); - } - - @Override - public List listSharedWith(String email) { - List partages = partageRepository.findByUtilisateur_Email(email); - - return partages.stream() - .map(Partage::getPhoto) - .toList(); - } - - @Override - public List listPrivatePhotos(String email) { - return photoRepository.findByProprietaire_Email(email).stream() - .filter(p -> p.getVisibilite() == Photo.Visibilite.PRIVATE) - .toList(); - } - - @Override - public List listPublicPhotos(String email) { - return photoRepository.findByProprietaire_Email(email).stream() - .filter(p -> p.getVisibilite() == Photo.Visibilite.PUBLIC) - .toList(); - } - - @Override - public void unshare(Long photoId, String email) { - Partage p = partageRepository.findByPhoto_Id(photoId).stream() - .filter(x -> x.getUtilisateur().getEmail().equals(email)) - .findFirst() + public PhotoDTO getPhotoById(Long id) { + return photoRepository.findById(id) + .map(PhotoMapper::toDTO) .orElse(null); - if (p != null) partageRepository.delete(p); } + + + //============= LOAD RESOURCE ============================ @Override - public Page listPublic(int page, int size) { + public Resource loadAsResource(String uuidFichier) { + try { + Path file = Paths.get(uploadDir).resolve(uuidFichier); + Resource resource = new UrlResource(file.toUri()); + if (!resource.exists() || !resource.isReadable()) + throw new RuntimeException("Impossible de lire le fichier : " + uuidFichier); + return resource; + } catch (MalformedURLException e) { + throw new RuntimeException("Fichier introuvable : " + uuidFichier); + } + } + + + + //============= LIST PUBLIC PHOTOS ======================= + @Override + public Page listPublic(int page, int size) { Pageable pageable = PageRequest.of(page, size); - return photoRepository.findByVisibilite(Photo.Visibilite.PUBLIC, pageable); + return photoRepository + .findByVisibilite(Photo.Visibilite.PUBLIC, pageable) + .map(PhotoMapper::toDTO); } + + + //============= PRIVATE PHOTOS OF USER =================== @Override - public Page listPrivatePhotos(String email, int page, int size) { + public Page listPrivatePhotos(String email, int page, int size) { Pageable pageable = PageRequest.of(page, size); - return photoRepository.findByProprietaire_EmailAndVisibilite( - email, - Photo.Visibilite.PRIVATE, - pageable - ); + return photoRepository + .findByProprietaire_EmailAndVisibilite(email, Photo.Visibilite.PRIVATE, pageable) + .map(PhotoMapper::toDTO); } + + + //============= PUBLIC PHOTOS OF USER ==================== @Override - public Page listPublicPhotos(String email, int page, int size) { + public Page listPublicPhotos(String email, int page, int size) { Pageable pageable = PageRequest.of(page, size); - return photoRepository.findByProprietaire_EmailAndVisibilite( - email, - Photo.Visibilite.PUBLIC, - pageable - ); + return photoRepository + .findByProprietaire_EmailAndVisibilite(email, Photo.Visibilite.PUBLIC, pageable) + .map(PhotoMapper::toDTO); } + + + //============= PHOTOS SHARED WITH USER ================== @Override - public Page listSharedWith(String email, int page, int size) { - List partages = partageRepository.findByUtilisateur_Email(email); - List photos = partages.stream().map(Partage::getPhoto).toList(); - // convertir list en page manuellement + public Page listSharedWith(String email, int page, int size) { + List photos = + partageRepository.findByUtilisateur_Email(email) + .stream() + .map(Partage::getPhoto) + .map(PhotoMapper::toDTO) + .toList(); int start = page * size; int end = Math.min(start + size, photos.size()); - List sublist = photos.subList(start, end); - return new PageImpl<>(sublist, PageRequest.of(page, size), photos.size()); + List sub = photos.subList(start, end); + return new PageImpl<>(sub, PageRequest.of(page, size), photos.size()); } + + //============= PHOTOS SET AS SHARED BY USER ============= @Override - public Page listSharedPhotos(String email, int page, int size) { + public Page listSharedPhotos(String email, int page, int size) { Pageable pageable = PageRequest.of(page, size); - return photoRepository.findByProprietaire_EmailAndVisibilite( - email, - Photo.Visibilite.SHARED, - pageable - ); + return photoRepository + .findByProprietaire_EmailAndVisibilite(email, Photo.Visibilite.SHARED, pageable) + .map(PhotoMapper::toDTO); } - -} +} \ No newline at end of file diff --git a/src/main/java/local/epul4a/fotosharing/service/impl/UtilisateurServiceImpl.java b/src/main/java/local/epul4a/fotosharing/service/impl/UtilisateurServiceImpl.java new file mode 100644 index 0000000..775df1b --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/service/impl/UtilisateurServiceImpl.java @@ -0,0 +1,30 @@ +package local.epul4a.fotosharing.service.impl; + +import local.epul4a.fotosharing.dto.UtilisateurDTO; +import local.epul4a.fotosharing.mapper.UtilisateurMapper; +import local.epul4a.fotosharing.model.Utilisateur; +import local.epul4a.fotosharing.repository.UtilisateurRepository; +import local.epul4a.fotosharing.service.UtilisateurService; +import org.springframework.stereotype.Service; + +@Service +public class UtilisateurServiceImpl implements UtilisateurService { + + private final UtilisateurRepository utilisateurRepository; + + public UtilisateurServiceImpl(UtilisateurRepository utilisateurRepository) { + this.utilisateurRepository = utilisateurRepository; + } + + @Override + public UtilisateurDTO findByEmail(String email) { + Utilisateur u = utilisateurRepository.findByEmail(email) + .orElse(null); + return UtilisateurMapper.toDTO(u); + } + + @Override + public boolean existsByEmail(String email) { + return utilisateurRepository.findByEmail(email).isPresent(); + } +} diff --git a/src/main/resources/templates/mes-photos.html b/src/main/resources/templates/mes-photos.html index 8610353..11329f4 100644 --- a/src/main/resources/templates/mes-photos.html +++ b/src/main/resources/templates/mes-photos.html @@ -8,9 +8,6 @@

Mes photos

Uploader une photo

Retour accueil

-
-

Vous n'avez pas encore de photos.

-

Mes photos privées

+ th:href="@{/mes-photos( + pagePrivees=${pagePrivees}, + pagePubliques=${pagePubliques}, + pagePartagees=${pagePartagees}, + pageMesPartagees=${pageMesPartagees - 1} + )}">⬅ + th:href="@{/mes-photos( + pagePrivees=${pagePrivees}, + pagePubliques=${pagePubliques}, + pagePartagees=${pagePartagees}, + pageMesPartagees=${pageMesPartagees + 1} + )}">➡ +
diff --git a/src/main/resources/templates/photo-detail.html b/src/main/resources/templates/photo-detail.html index 7ad65a6..fa57d9d 100644 --- a/src/main/resources/templates/photo-detail.html +++ b/src/main/resources/templates/photo-detail.html @@ -34,6 +34,8 @@
  • + — + Retirer
  • @@ -43,6 +45,12 @@
    + +
diff --git a/target/classes/local/epul4a/fotosharing/controller/PhotoController.class b/target/classes/local/epul4a/fotosharing/controller/PhotoController.class index 341b172a6807c12b5daea656e0de1ebe2d982666..c6787a5cd6761ff5364536db8b3a1a60f4fb697d 100644 GIT binary patch literal 8818 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 F{|i}p?dkvk literal 10662 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 diff --git a/target/classes/local/epul4a/fotosharing/dto/CommentaireDTO.class b/target/classes/local/epul4a/fotosharing/dto/CommentaireDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..0aba19c87c7a2363691b6dc494ed47ab46f604a7 GIT binary patch literal 1657 zcmb7@Yi|-k6o%iST!b#YKrhx-ZM{NkyY=$Ps!2nmX@b_++V2C5FcoIZGTYy!iN?ea z{s4cJ@yxQ&1vb)tnPHamK4;!{&;I%Q>oyHqJLBivZFALhk7{S4 zZWz)pq>|w#T-MXu9XqWXDCFtu%eM))4XcJ;qk|7c`ec8TD7boD)kWJNaw^{q-J-ua!H z@J@KGO-~9zvr}?y&*8(QY02)yCXxI1nxvY-98yMwQaNHjNQq(fgRiW+Lv=2@l6vhc zr42VyD{56BKb@NX?7k67cy#dwT{=g+N38}_L6}b%c>et4^$&e+|0QFgI4=Dki#miPOkuKxJf65TewZ|VexllzS5rwT!^P*#OqXJ z(HjBi4(`T)@}nSUBIq9O$AIQXLHUWG2Y46*S{wzFZUDgXcg literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/dto/PartageDTO.class b/target/classes/local/epul4a/fotosharing/dto/PartageDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..35370792951c5e986272d76472664091467c3359 GIT binary patch literal 1681 zcmb7^Yje^-6o%goglm8nN~>0F>#aa-Q!k&q%{V$bok7dk%J%>(Y=wkLHvL^XqvMPp z`~m(b$FqTfKr@AY+07>BJZIl`&*tyH-+utS#FGp(#FB^`(2-zRIkV0!vv1j5^SE`! z+ma#iLfAsSVu)3$%`{R-Cy_Cbg~71fciL9pcZw9{XvVnr&g;^Z;Ewg zMU&L4_4s96_Jqe!U4WnXLDxa2O$%u~XQqQlCS1SxEe7-31}aPhGs6_-+RBTcmhRVI>D zUgpH{-8O$GRBIHb7vVr%0PIlPYjpqOG}1kyCr#afV5S}pX6jFx)1Zz(g2wB#GHGTs z>$P8C--EClG^)=aAC;&Hci&hM`u|@FN{=Rw9oPz6=Q0*{^%P#sL7w)Ydsd54n$X?+wic34@Y zj*y{7c{=^Z=p45dV&dE$9!BAF%i>jMOz>(ki{HmV6n=GCylS`!zH|X^;xGzdUKX$V Pc!J-!fPX|*X?Xk}zN$2n literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/dto/PhotoDTO.class b/target/classes/local/epul4a/fotosharing/dto/PhotoDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..d977d063d35dab2c8e1c17e888df4c4d0913e622 GIT binary patch literal 2140 zcmb7^YflqF6o$_fN~P=;C=|hh;st3zSX8`mF(DERNd+R%@7s242e-S;c9!3ziN?ea z{s4cJ@ty63?y{lf%TCYCyw99#|Ni^^hlqA*H%T!XO3<)IaT;MXabaGXhGp7S$ zixexP(G1;Xl&qMNpEoSW#H({Hh7@&f6qL97I6Q;pqvkZar%=gD(G(?N3CR^{UZVxN z&q!;yPQw*kn!@Fb)(SVqdoBTJ0`IwqdYjSk2d4trctP0w$g7vQduEm_?4*59ib$2R z+nd9(CYp?vZ+@hcRN&)PE)Nl6I+yQBl%HBg+0UM>f&6x0Cv8M;DR&*6m_9>&Oz+CxLVu z(BCfM@n$O{Q@L$liA*+KE@f1!(CxQ5?G&11Cl9~a7Fh5!Hn literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/dto/UtilisateurDTO.class b/target/classes/local/epul4a/fotosharing/dto/UtilisateurDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..139a13c116f719d6a18775a69ce8bb4dd0d0a733 GIT binary patch literal 1377 zcmb7?S#Q%o5Xb-PB+gNXrb$|ka-TUUe&LA%65>*&&{nkMeUmK77Ta4nn|>~kKuA3B z0r*geS;wStu$1t!v$H$%oAcN2A3p&+!%hhnGI?Yj4nx~heeSv9bmBec?nkB7c*H|V-UF@N4_bP1%(a+=uZ|BG zEIFVEo%0YK6%2O`@`8hPR2Xu?=h9=S&KVtP1B}e74r<0M6DZ%fZ93R8x_uf7dSb}F zR0F}V-jRXWpZGly9`l|@FV&7ov`e`eJ$}sUksLGZbpE4?T}pB&^d41GZ8Yc7jA~)n zem@Dc^u=CqCdZOuy$AxOxt1!RP*n=$_tYo%tq4R&of#0XK)lz}y6XvKTshT87W<~Y zB3%yST65!R8nwn^7R@fT`JK=sH8|uU_k|WA1uu|89A|UhCk|u0Y%-Y!qRZbvr6V;7 z`{Io>jjSby`p66uw`dj??NgRc+6%f_W}cCxfkl!AMY0I$A8a}=lID_RBy+9rU|%A$ zOLUrV5b`pe&eQ-`uuU4nRa_%@()la$pXt-WxpOJS`8wGc^oUsi68IsJs+(7x$2fdh~=!G=s5Q?Qh60b~qoAwx$+whfRyj2pR5^UyhMd zL9%lX&`86VSH+vnnBk3*#5dFN8>`~Y!p-nTN#a}S`1-1Nv&S>MQIhyJbsq zAdQ59UYKcQO!T3jP-u&miv4}*TQTf|W*TN$4-zu6z~Lx20bZ+YYY`gr~a2 zZ$Qsmi`{D1ZV=`>I1>4JLaB5fBV(x28AirZwUGp>5~e!Tb^H}FB*9h^rrU!~K7B@I zHkGJ;VEmQ~K8hzHLbH zxWF@uBXLX?4nd#8&-Z!MpY`~FM>9&mLp0e}oZE*&E(GFMDo#`Sv@z`{U=AZvY-)JAp1l6hu|T5GV8<=pS{hrkfRQd;dU` zTta-=Fb(%HA(GDQDd;9l)vS_U(?p|LThO)lmTNgx-8R^!>{{B6Zo7I#tnIRI1(5_U zKvj@bkwPzF@?6`xRTi}qYeK9d+>J6}Ae||kf+|>MB`^K#x-h&qr0MM6K2_O2P^@7jya0U3a+TQife@V^G)?eL)cotcGJ6IsIJAN z5Zh@?R6uovHIQ z8O;>Z3Nn(kEFss4G|%dUuI&)C?OKs=@*N2Be4bD_RSk7t8Cw=bh^)o=(}NE7%i)E*>$lsusr@>6GqN5_)*J)zhuHMpQdump)`^$6Dl zp;OHT10;*CUi!dUwDa%V6mHcjb9Vf3uCSSlMA2&6C9!UJq@BroR?a?xx?!5aUajel zBc#FUPhy4_!I%f@rpMw;&++lYfl!i O$!mhO7TELF%IGf>Y3qFe literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/mapper/PhotoMapper.class b/target/classes/local/epul4a/fotosharing/mapper/PhotoMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..4c56109afc4dd1f7a8144213c831161f796729d0 GIT binary patch literal 1997 zcmb7FYf~Fl7=8{RSqKLRw_a?$RDp(YS(JJyv{(y8!2nSpTJM`=OO|eS<7VUUs$aG< zcE*o(#{Z<_^X{fYS_mq`oHzTP=XvkvoIn5m?RNlo;bqZ>l!1PYG%^ag6YCetbS>}L z+^?M2)leaG$MKwST_Kg9D;pS4m~s88<(hW0?cTD?M}FwH>Q>;8Qwx2wRHtI|a6bzJ zsVs(|4Ge3HU{qncC$r(#Y&YR5q>t@zyQVOnpDUgQRP?>$HL*ITF^&nsS_y0-|0-&( zERLr%F5$Am6wU4VjV-5IckEz4aE=|%aup_DGJgXLIYO65ZKu}pDN({+AX_pOP4eiDd)t zYP=_zoBxxq(C=9dTPk!*<9(@+q;u*(I{Bf-N4Tvp$^w-FzZp1oXgL8RUi$Zlk3weG zV%^%ont?Ti`JN%l{C2_PDPEN+UY9BUSfS99nhbCkIg3?{3G=?jhE!&N!9QqNjw?G4 zG`1wy0p{9KuH!R}Z9!&;;`l8Y`tY*^=k`ufe|7K@5c&h2V=y>*CyHT-&L#yIa zGhUQgF7wim?~bxRtUE1*#olq9^}%kYgplWY9(wtm;gC{*)lIvGNZ+o5{Y`9jdWefcDbn;I7icg6A^?}VmhU-IqnUsn$ zU3d!hYrOppSJ?&z@GV!J0Pr2Y=hq;9z>hRSvN9<9sr$L`9BK9B8H|TdF<6{0M94cB z^H{aCfbrDryZX66yjW_Om=maYeoJ~aH5hr@vi9EB{;(?pmpE9f%i}?oe!%`ZzZQNm0icp7v>PNs;8}}HPB4AWCQ4-jk?T;J`R4{GOURV)GyddiY zvX0wV`=ee{1xK>!Q6=y2VKwM{cs(g5bk`jUY&rkkX@{)VJ{_#UyW&6SXAg3xG#h+= zYN(4C39QZLoSPJ)#7RhCeKzT@jWTsDTOY{Bi8r}DrMrInPzJK6v4tL~42mU`u~ zp@pddkKC{FT+)#j=`QgT1DOPaVwqMo%7SvTdtcg z$uClBOw6;;+tO!fLjse68m8z|k-W010`L{g;)R4eU6>%MdxJCSR%dt7bU^-Je zF;0!FWl+&u`zO5a7c>mxwu%uQN!+0ft^h^5*`QQT4Xeqw4jJatUEb@K;dzBFL)90p zEObW@1d@MD$6efG2rrqo>8~&hbyIabH#4;eLK<~pEP`kRy7+vgV*-<+AueR-@?>%pH2gHX0Nq@q5!4 z;$`k1I|np^gz>pcg)08BNkU6;YGbPH8*3|$dtlmz#SpEUN4DWNUE&RRzZtry}ybUS9XM_vjIbKM)h$WI@Ul|s$ygKp|W!XHs literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/model/Partage.class b/target/classes/local/epul4a/fotosharing/model/Partage.class index a31deba56a6a2a03ed7731767be611b359a2fe0e..33151884259959d8d49827199cdcae74b55ee56f 100644 GIT binary patch literal 2391 zcmb7_T~pge6o%h5Hee$gFb#n~^U>1Oc2d+dA8kXLh5(^X4Pl7unO#I0x}qzK-NMI;{r3U zofF6Q9M!R39K4o?T44N$*YU`br?XzqP(8aJTWlW7qO1VR`~H7G_QMn-?Pp6pjb^ z4Pws12e>4Vaoeo8aaMA}SDk*6%N7=}D3CioVol7Hx>)1a4_&gbj1L8-LhX8P;Ak24 z1a7ARemL`96Ik32m3F(b`sUVdv)=qs;96pi9Y>uu{TIqOUr+RS?z?Kk z_rk8COIA5u$%VM>S8<0+9KO@BWXhHbyHPQux3yJ7c0_L>g+D^PA2A-AYqW5+ME`p9L&D{0>@R=HVGN9sC7RjyRIrhj)*UseK3 z@kgzzlZ4M&W|r=O|HdACF7hVH+lwSvAu>(xeGv+j7&W9Pfz|ZbA%EsAn!JNOBXB<* zaDJ`e6SarpXyWu%O zAZZrPR)-rr#WFm=v%K>t1NQ)}Sz6clyiWUu#7Fp;FL;i{)6=w8IQj#JhjbNuTD9LHYQJLQEsDR;&R~^y^M5h-EHl~0 zEAqwXxI;_e3*4oL;n=hcCs+Fo<)1l-045DEHx!(UgYWUZnZ3`azyo}l0Gb~KT}}mk zg|8DpS4Kfgsi22gO8^x|L03~jkNBe=8}!=rbG&xzEy`zIj+&J3ljfP!G$!h>8AS?t z%(po~V+QYb?pr)b!p~n6A1N%xFPy`#<7pE9%0=;!Mq~W)Is67Tlkh_le1CHymB;wm i5quU~>{KqmNqY|D!S^Nj83=CiZ literal 1738 zcma)6T~8B16g^W~3Z)b%iXbRe5nDjk57fk}iBU8)sqcSRb3jT24QQVTW_V3 zUDna4nzk>QHsN|YZuTM&Jg?I0^bw`kyZe<=<&(f_=ox#a>Q$TrrIT}^8SflRy>e{7 zt(X#5W}5~~SdGtt!Wq7vQ!M_9W(mxcEhYE;c1?CGCZ!O_mbJZAI;!K~W87<5)FvM# zbKpHoNHnEaqW{@^f%X2Mul@uGEC>3R)Jcc~S)S6aImgDSvRYK~9S)`?Ps$6;i$I2` zA?pRUqp?Hzx(|2I$9#UYjY5^vy(hhv(_q^a+~d4x_fHEgMC;X`Yt57)Z0KYGBN9B6 zUepw+502lh%Qu#`F&$X3t;H8u2_2eU-U6>z#0}ob82=4peDaP%;4-5*Mhjf8FkX~c z!c~6Yy$!Z!7%g*qh4D2P*BSC=hHtJS$qoK(_{F@(BB49xXE{2 z1ru-!Yg`3xW1U$!zMp}=Bl(pdhQXN-@Ezvplk;2!3fKrCnjR&}MiOmeD}-onlxQK6 z=q|P?eU8;VC80KAd}H$mlB2>*_L&w28G$gmvw>v>aS8qyY0&wG@8NzJ{q#lY2bKr) kIyg`N01w0H=PpV=7@B~7euO@T9kvz2qy9u{6CVTr0Ju_cF8}}l diff --git a/target/classes/local/epul4a/fotosharing/service/CommentaireService.class b/target/classes/local/epul4a/fotosharing/service/CommentaireService.class index a5c9458cbdf43626c47d0c80d140a503c98ee0ea..c66c185ae5a380a504e4ea21fdd4822e4c5ad648 100644 GIT binary patch delta 36 scmZ3>x{h_jI!4CK$?F+Igi=cK^_}x`b5rw55;KcZT|)dPi!jXu0P>p*>i_@% delta 20 ccmZ3-x|VgrI!4Bf$?F+ICVmm0EX_0-08!lsqyPW_ diff --git a/target/classes/local/epul4a/fotosharing/service/PartageService.class b/target/classes/local/epul4a/fotosharing/service/PartageService.class new file mode 100644 index 0000000000000000000000000000000000000000..cc07511c614433389a65ea589a084aa257323b4c GIT binary patch literal 577 zcma)3%}xR_5S}hSD~mti`UEB>aMSpvx#?{yiMlCmXj7v9Z-58y)?r?5ng zF>;u+-^_g9{Jnp?z5&23oP`iD;7Vsgaa@+_TJRU`w4Dhfi=10DE14mm2;)SK=@y1i zXV968mEcNH*7$jjnPbrKG-NQmOumANF7p02oI0<(m#6ncWk%>`dP)t51v)gALAabz zi^C~{wi6~t_plIBF^HCE7SdX&3j%swps6BZSyZiE?9rMp8j+O@f8`I|6=#H zla)>?o=EHZ3|gto3*kz?iP67=o8-^sPo3T^{{C^?za#A^)uqXBAQg$nKd*A-civ>c zphmX^sL_!c&?FoZ>ek_ao)%d|)&_sWLpZ9!tzZ`>_c5G6uwgaW#@!)C0A0#G-TdND DLr$ML literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/service/PhotoService.class b/target/classes/local/epul4a/fotosharing/service/PhotoService.class index a22284a80e45795a5f6b87f1854b6a77b9a589b8..c370058c2f4a2e2cdaccaa5a5b89e4232b632e0c 100644 GIT binary patch literal 1155 zcmbtTO>Yx15FKxmrb*k7^8H`RAs zObN*2u@7NOkc0L=Ri@rd6@L19cEs9F(Pt*@sF2&EbplE~P9vZ;CP!V; z+?Fi^-Tc+Hh2XAws@P$u*r6Xt=$dS;;YK1 z24T^*VQ2QMEMT{Q>TqiTH411CZbMWMR3o^M5yOAGJZ6_C Tt6iS1c6qkKg>^qKRPA2@3>P@> literal 1497 zcmbtUU2oGc6ur*cW$j?B8w@tSVS^M2{K69(NFWWVQl?f^f@e2zTMsvm9H#{&{umGZ z0DctWI!Q;-8nqP| zJr)6{ogsqV+;E{nVEden8I=rU+P!lg7y{MAD9s6c_k5)>HMSM{nvM8G>Cbe+dvuga zBVwivJ)3^L7m^?Qf2(zkO`C%>{Zf@96>^ztJSI>-{Sxrl2o)tR)ClZm#f74+_Js!< zIOArh!Va?n4c7^QN*}dg{#YcUC!{deP?L!3(-9LA4XIf8Ht8@kB;a|MRX1}eLNZ&6 z+DKHik)|TFjS|?DA~Em2wry1chvhX=BP8`P81t(<=dX3eAYvx9r|d70da~S+y+Mj? ztE-dtqzJOR#^c!WigsqDyt)LgK(b{?x;R=q{3PrdHZoQ%#?0_3t(!)6`mn{L*%o~@ ze=0r_aAP~2ti9T*f1GAHd_njs020|Ari9$`^+0FRpU5AOy8P JL3#(C{sEA+e)IqU diff --git a/target/classes/local/epul4a/fotosharing/service/UtilisateurService.class b/target/classes/local/epul4a/fotosharing/service/UtilisateurService.class new file mode 100644 index 0000000000000000000000000000000000000000..aba2c643aa5c7e1ed36b92020f131197944e17aa GIT binary patch literal 337 zcmZ{g%}xSA5QMA2Wf3ItVtfU?I0wBE4;u9Z!DRK~t=(;8$iSGHULvo?!3Xf6jI$x} zC+e{(mHN8+?S1nK;2eV-EyAhuB|9U}wL4=o_3Gn{gIzwEC}CwwG52bnjjU3KVr%8t zA?(k2#l~?;P9En{Dxp8M%j$A{ypFwEd^6riHC}y0zp&>RV~?=B{(>{uDuDQ zFE?#zOX({NZD~u(t8e;92#+L4{PDv-zexP^$3NoC+Js20rK`Df_TF>PoEhIwO|_Y~ zAI{ta@H}QF%n3b_fQHvC>_@La#4Z*KBXV3zCbtc_IX~~Y*(myuGjPCygM$JsvR-dl zArKn0ivnBQcMjOYc4o-W7cvKHEt%O~8PnUsSp$dUO?|l-kazW^t^Fuih+xY+xB^e@ zKIHjcbKdn!-q5h!S8xoFcJ0{t3N-HYa(3Yr zyOdW=JtIY@M#%m6(m=5~uuQ;$Ms#n6Pjelamjknn(y( z+g;ZwZ7$g5vQsv2O}-fG3{MFxlcUxmc`TL`o;({%Mc&}$mgKEiYgd_9-bmkpCWNsJ z^RXOtXvPAh;1lg63M|ABhGj!ts&a(8SO`%r^^64!fumTA5K7EnAhE_Z+Ia;=*EAY5 zjB~3&&Cyv3v?Ery1-3BH4OnJIpGwa%?5uGN8rPKxNl zBCJFkRuRi!9oAqIy0H~cV+Yn^FP`BWem0o-5)5|s&d%(u%~V(g?*)o_G0H4N&h2;~ zAMo_6$@C$P(W7r^YOAU?UoM4s`>Ys!X%0)0J7-X&lF=f$TI+FblDH2|mN; zq-sD6U*Jp1{)!|PZsJJ&EtQe$Qy;xW5@c;76RRW#?rv M%on(d>$ETV2zm+TG5`Po delta 891 zcmZuv+fEZv6kTTu9UKN)q(Ug5qJdBvsaleH=Rr**kVry&-~s7?mA2Ma+9{~06)*LI zHyrPG^aGS&B52~9FFyHV{0XCfU|eU~)IK=Lp0m%Iz4uyYomuYq*`|H{^YJr)-FUO8 zEjpbl4hwj#Io-Rj3Soi9LuM=y%NS-Pn_eGFn(0(_${0&TG>l+OM+!!PC!A_`tEA?$9Uuhst1};fflSnD{8S8^;m~E(JrEZ2gi`G z+TCrrx(;?le4;Q37r(-LnBpoz)x%wLVWK*0Q<2S{n&yb z1Tl&poAUrvc7{uw;UcHRvY4_Jg)z;{!I^zHiBmj%H@4z5X6R9fTxW1L$Ac7YkTSE3 zX@<1nT+xO&SLvyzrF9uYJ1T59nkrT>>?rd?vl&BFwawPoQ|Kw_^OW>?ki&Vq+Jjk{ zI@nZ$3%E#uWm8!>dO>z>qg1%5KKbdj3%Vtsnna vKft!aRr<(&l{*F3aJ`7malOHi7krbH_wWFZi`f%q&-qOw#S6T`Yc%}@2>p&( diff --git a/target/classes/local/epul4a/fotosharing/service/impl/PartageServiceImpl.class b/target/classes/local/epul4a/fotosharing/service/impl/PartageServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..8336e35083565195beecbf77186a55696ceb712d GIT binary patch literal 5516 zcmbVQ`Fj)B6+KU0#+JuMI4m_JK)`@k6d*XnBCNqcBf!DL6q=L{(%2r5X2i_MKxvz< z3F*Es>At0brVDK_F|-LSZPKRczVCbg3ch|lZ)PNouw|?LL7JI2?{4Rwd*6HW;(x9@ z3*a97JBkQu6x6DyL%l%kxHhiEGnzRX-+%15o^l21HyNhkZWgHN=p1fD0~!@XRWv~r z*qE_WS|+aN@|ioe_=x3N&X{H!ly-D`+(_whBb&>_2Q}N(M)e_oY!8P7=H~pt1A5MK z4A-*H2;7ydsLw7=D`+bTCZty_D&`<2Fef)gH%c!BHdLpzT+Gwis^S*R6PTZOjf~-F zuAaBUniExNeqcJ`L=zTZp@NsGXu~2p`F}+&&@y6}>Fs9*rT0hoqy?6DBuhC=TIOh? z(;tvA#FK{O()6vkO~DcsOR}@%S0>rvs}drv(E0T6d!t%7wb*5gir^;PAdoF@Veeg-7=9bxSK`YA(ye@^0|WeA=? zpNhM%k+F{I^sWMQLwO===yoECek2rZQdzXD#nuvZ1*HN_mc29M=m*Da>y*ISY0)bx z4A2XeI@NC#Xs-xD)=KNFWf^}ITd-Zl4&2LvqyK}pm9q`q)eKt~SVN>|(Gsc&hBkm* z3U;g5gO>|*RWC~LX?$l^GuTk(74qwaM3%A*QFju173@>7AA@D>&7VMi=qK}9#$l09 zm%Jki4hSqNRn&pJ=^9ym=joL0C9?qs1(pn3d1slq`uYV|cb4Te{yadgpZ5@n;(iRv z27BlxD}j@p!%a90ntG**2l0@=-4!7SwZRaC;hxmw(=h<0jFAO%p?**x4;dLjpX^Dm zR-xe-d7z(W**K-vvdv6~OdbsktPG>(wVP1;DHuEwMH;$-5f!5tBQ-0=7jVp98rlbS zJ8L)&YeqmB*D`s1|A@e@u*rgn*$5XbK_Qi-`*DF))wvRdfg1UjRbj#+@f@;VmV!WM z$E?QX#6;(?RB%#-4brWJ3PN}a#Aj6#njR?2s~87sy;*t_0;_LUUDMzpX}ADqRJ;af z1!^5_oVC0v40d@-3%8C|)Zle0UXO<<$s%A!TNjorrm57oiVc0x*3(9ci>tRjyivuQ z@MhNKh>>x1o5c|5$;`I|zHQ@bR>_P*}4AZr({J3^3qc`A# z+zfeC3J)vzFey=yoQ3UG`OZqHDF=R~;u0oe_>Dk!^a37}J;3ecHPVG&R-u^5Uc3f3eT?vzN(^MOYv!ZhUTOXb%GDTXFWxqvywp!1$BQxnSBkVXOyYC|hh!3Jyd-S)Fzexe zFBT$>)!?}w>#&vQ{@rwO7=1W|jd+MVz!4;n#U{8sXrJXV_fgK0$$HR_tq97w02IcH zC-6lNvU7NncQq0NoabFFt)0XLe2FC3O+8QH%c!T7ZhQq_C7njFoGH0T>V2IuEr{HZ zpCh*1z)FQ@VhQ)$S`Y3gc>5%O=lK)(2A=jI=a|pIJ`bu=+Iz0xwKDH-ka>R#*OCdG zy9Q%l@AD)mA?lsP+aokw0BAW~0CtiM1DKCpq}6UL<8gd7?xV9wLbNx;*uEkNeMJ!Z z0uWXcWEoP87g7Vn4Qx<&?2*AVMhd~iqOw^s6v^GK3?jm-+C71HlOJ8A$5VXviCWKD zpi43bJ~36#6dzfnmuX5+8+&n}ZMla(5cTNwKGI8)UU)q4b*<-oHuGuce_)#Vz0BiP z>WJW*_!h5H%d@;b$Db_W-_qhWd>h~Q?tXwD;>W?=PlCIj;}`ff{=)h4n4KmZf8E-K Lzu_PF7ux;{Tn9!r literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class b/target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class index 68989cfac0e095b3f30dfadf95934208c0e0056f..0cd1326cf2cdf2aeba87521a4f958d07b03881c5 100644 GIT binary patch literal 9917 zcmcIq33yc3b^ebu(i5Wx2(gMq7PgFq0FMnAg9HR2gguS~LJPJ`Z2UCygdU9Mjc48n zV;nEBNn$&WmpHBCEKS-pY0|WDoERjiW4BG}Hcj0Avq&|f_(Stqr#q5;l zxXC&+3(WmaY}~QaEt5{%4r3Ksl(yFrv9{iVz6U+EedqeainnV_wBlOQJZ5_b)6Ov` zX(iOgNiru`(zbr~!Z5Bwn}PKv+Oa{u2hMP-F-sg>IG-|}mGmg<_A>I#7OxC>W#zj} z?8Z9?ST>b#t@u7CEohv*I*cytHPCHhA9`{&k)%o0gFL~pv`zOw?C9Ctw4>M6xHpfPWg(O2MePHVkY7s)t1st2Whu)D;+P)=V=+}>F@38?m60X zM|5x~dVpqdwQnkCPZV4oq0mBShWlf>LPv`pE>Tv=I0~02a za0NT&5=E5nDHAB_$DCw*@2Q>%%VCJR1jO2x_y}5w&PE9CRp*T-@~WJ6^^~z}GN!z6 zWH6gbCFp?(gomtwNfRe=Urx&<Ys;9Jgfsq#`X@l6G42*1qwCeJtiJiGZt{haMpx1Mu6LzFmWk~zzb%yvx*PB#IU6nJF*;6!c&ztx# ze#qxdtsT}rU$8omzRWVk!)d%=;v;yG`4xrgPrJ-0Y|o;*Bh;4_tH>mD7Vt5A+`uPH z{0KfN*isSV%Gnvudd5=TswA+NiK4+!7(a?1Gw^8>KaS4`HdNel!b+v=w4V(2>1RQW z=k6O~R5*B9Iko!exhs;7d#+EL1R3dmA{W7QTAWX<418X&QY%`27|14-TJqn+_$=(7@IZhFFw4-fR_4X2SDarW=yqJcj! z@rU>}&q6u5E>qVV+oI9+y;rb~#m*W0k%>RXpHM&j z!+U$9-6T`_oK*0J_4pY6%*1!`=fvDM&|?4k=-duyv45SD6#ns;(^Mu~e~G^`@Yl+u z|E7X&XQEq(J=&`CvAxLV=K{7y`R`2py+YaOABZ0A8tPGy{iBJ0!awsg_>dKQ@1r^; z=}N|nar|&Omr?N~RnXO(;JPwo{}umc;NMOB2mX^)eMN?f!^X_=m;uxWp(rHz7*JPb z#4h$Wy(}uI-~Yz{82Dck-@{uaC8GLF>&^t(cs>woo%*AyKxL{gow6Ngt@3L6oq_5>uASGMZi{JL>PXL_3NCdwMrRRxqZ_#h_I~ zCoIclB|WLE66`LH44T&5jqEnnVLBsgOlj6mXz%t#w=Ago{Cuc1(Cz5 zRlu^pM)wSu(zl*grS|oHnZ7CRq~9(0{3U!|@j)nUihVzgtIA%xc)ytkkLd-CtD6-9 zQ%F|a_JQogsGS~CK&y6x%4H9;!KdDX!H_rZ5Vh@LW{=D@_hW*^E`e@-5tb~=7>0FUv3^0mq+Gd5 z_T7_7J1y8)8I)O77=aMxRqHOd#Lr$C<89WDON(U7=MSV5QYNTkcew+6DfB4cWKp#h z)`A2D@q8Bcu@lU<1I?REYBe`|PpJfSN3mn>byX{|vMePjHic2hHWUe?*VCJ+R#zAE zC_k$cbQEtA=(l{5Gcz?KDs`%TqOwB;b2((ntPxIb3A9`(VI%2!WgJ0`OAHf?GX2@n zgcDP#{ao`frMMLHI9fuK+^R?a;I)_Kc4mU2=90v`LFZV~^0Mmu49T=i`kj8n=TQ?|e` zb?oj{>4kPs^qq{rc9ND`%~&c}R_Y#4rE)HEhi^am^;gWO&sBj@YhpBRwQ3*PdIRf; zTwznT4kfqYL2dS`FG`=G=@i|@T(3eugMC>e%g`a)u18@a!4lGI*z39;lO-$VyY5V# z93u*{Ng9NOR_XOXP>U|Cl@npqNy3zS#A*<$PS~zn)RRv0x~9cRxz-yUaxEc0;5_U`6Zb`70(Za{E;6{TB>SU7HL2&kpGXq6!VU64umQ!-SA*W4w zKp2bHRm>HF9N7ri$xJ__CtZy0bwZ67*jp+L!EcDGympmDoKJmiNe`hCIgB zft+C)tn)Rka3?wGo}hYkwDT_>_WOB?;DzGz6ioDWb}M_k?8CSAy6%Z=s!Wh9^2Q|# zhiD6BrXMMqU)p{sX0qE#BnH{Y>!e8U3(NcEaYLRk9?&?`0^=d;WzgCcV(a|zR zD7=012QS_wWiR>YBU%hi$!CpQal1D7numlJb-m#WfOH~kA%N9kIx?$q;HN4HL=Wi?jUYn71XjHeo9Bfn{KEE@?jpY2WY)jP{MMV1E0iSFq?y9Iuk~{C63<8{k!82yK{$ z^;p2`!o|EWZ0BgZzg{-TM!u1f-dFUK+PO+UslDlI_&mRw6F{aw5+JwNOT=eJzRluo z9>*?jn8s3JQ*{0XtQu)ta}HO%#v#@WQ&`s#n!?5@Y;Fpj$9ABjru{3}S^X-uOkqz) zZBs2D_fO&07cpNyADBY_?OZ&>0;0C5W*T=;;8$_?NcGFOXK)H*cX0juP187Dh4V-O zXOVdwr#g%aI6ZO>@9wB;s%r|J#e@8*Ig3Y{>bUu1XYqJb-4vcWiw|+!IEx=96{D$c z8Xv8~>o`4yPrcL;x`5A(sI@(yUgB5ZB2{+|I6yNxNaXr?BY!|k zz09YO=X|Af$zJZFwyqKB;*UtT>f{=x89H4>x zin2(P55F#W5sQ>^H=M_Bf!}}owM{Q^fgbo>e?X(fYh8RR&~r0!20NUM)MyKiU^DLw z_uwwhxSN_gs=41v{WRhRqP>N3w9w*vWItK##saxTZq>3K%FA|0qSSzB4Xj4>_psT( zh=Difzs=37H2hl>@ZZWwAJx*|ChsIm>hMnn(l@VKJ%!&ppkRL)-=TzmTJ0l0jlZZu z0d(IDjMH=+x`5+Y!E3xVydEsLf#y7O&C)A<8iZ!HKl;deEmp_@Imo@0GUioDFLgmz zApLx;l0%eaKn4TW9;I58&sn>A4O#05X_I&vf7=wA#y^BE!Ci(hdsu`l|CfnLLg?jz zC9ynrYh_45r#8@hDzjUw`K;#pm732`&R&PeV=1r05IKA~UcYl$ULWLM50Tf0$?GHJ z^`RdWueaxTmBmy;9fge%&_%TLf2rc7!hZ81iUrzg#}2teMrbY(Y?V7{X*HzP zDo6NKONz_oUHoduUF1MH2Y>$EobP|To8JPzR9??VbJ+22w46=K>dWf+Bh)iJ2Ho{4 z_KaJ2*QZX5I_&?SHrWtXNjfc49qns)wAFw0$}26FtLUSYK17F{T5b6|5t31kRY^=# z_P|kzbBfL9?L_5azK_X!sl#zOE))7asozs_ucY;RM*o`)Mo-Fv@)TFA>#{RAEg#&| MBu~q;@*y<+A1s&%6#xJL literal 10605 zcmcIq30Pd$b^gyV@L+gI2yI4-wHV0)En}^gK$0aPuyBw>gh0Ec2lEh53^U`IH%PLh zB#!OGNo>bU9NVdzxNWwkY3sN#0=rJ!B}$v7`@W?6-gK|Krf&ax-<#nL%n11M`TJnz zE%%=DpZ(l>=bLZ8_Ei9TAY!5#reH@r*>A<8b}Ad+W<>{*ZZb1yr5(=B*y$0c-;O%Nsd%(&kZ-!Z zCmnnsn440Mj@hYX#&MJBtAg#FC26Je!#qk8(^?dsIVR?!RCFPokb8%1z1Em%1@h3v|u+y&Zgo?D|XOH3+krMHo#a5 z#G!{Tf_>O;;DCu%P)5(z2^xEVR*5S85ndUsMSm{>^2}5|KFR_bEe6^Jw`h&#UvxT& zp`+THA~=K&1NWGC7doeaQ2s#>74{V;qm;G9$B`$bP`3C;@((AdwY0P#JvRZmZHk3#&Pr*=rwTyCuzGv zoSqLGX*-jQk1$Bq6){5zvWsxq#2K8WGt+_{iB#65)op8-zL@i071t9lXsCOq7^*dy zy6PFK3Kw7*=rhrem|$fg(r$Wl%u2^5#?#@BwRLswZ*4o@cCw@Uc*l{u1*<)u$y;jb zG=|b444AkGMsK*E>;-rGVo$<5iB?fpn84H0c#nZgOd=&~!f-NX`-LR}2W9GG*hE67 zwT$f^Ne=s2FPFa5h?I%@)QCA8(UWyz{*VYVa1CTljNmeLuGQr_!*;Y&)whH6t>e67 zfF+WAzcgo)sY9p{2Uktpj|T)b`*1_o_-1De2V%P9k>TYTK~ou$j0?r0J~h#e@}ase|Bgl|i2ntjHNr4;jcN z`c=J*c4t$mIBO-ve-cj_c-q7>_;@bZ3&;tolj*j2#y&onR&KG`S9=M9!K&c(Rt(}# z2%1Xj!P8{VgbI{%J#XR#e3Bg$ovSOIWY1u`784&`W?G{JNNIb#i0?P>DHET@OM zaRlt4JGo#36wX*G*%g#-U%Da!SK~$epot&CXPCS^8wO=K?;EtCr~~V$)XME-fnjTQ z4WBddd3=F2r>o~cXGbe-Fl)b5kiKZ*NAM*kK@U>U(_5!is#ZyXr+c|>0%A=P3#-^s)4VWcoRRBOPf<^Gi?rAsfp%EkH`mHo|^A2 zQ|D_wKV#x&@pTI0COxSN8$0b0btuC(O#B>vp4G^;mFz2vM|oG;jyY`aY)$(YOneK! zNZJEV+_l-2?J63{6O&3qtwR{!Q1<>66TgaIqcwalSIeFA9jwKxgTCFFR2}zZf2m`4 z{u@e;-<)Wo^pcFW(k*&mLSBy(=#*K0+r;nSciC$y_U%qu>0(iVF7ioHCA!}?@dqjg zRCo!^z#lTCOS-9_;XMyk!v3*|Kf#}JI%~46YEi+$B9{(W;{F_eVc;)K{1yIMu)f#| zA!fN&l-;}KB-que#nydUZOKrQm2LC7j*iC8SIT0U4hHfjtKq}|7GC6P5ckOo6AtzqYvwaU)iveVA@f}?NB7% zHt~PLT5V*qeO|OL(1xE>0SpPT_|HV`YSSSiB5IpM$_0Ca0j_h$%vEuZ+6B2LhAEZ0 z^mHHEf2{3b1mBj3Db-?9J~r_^6IENViIF!=GzG@9^>|k1m@-!{P)SQy#Rzw6=9y9_ z^BHFh3QMh?i^kb$wh6M(ltr?bog3!|{buX*P^J{LN~vdd4=$V2zB6xvu!5425`K7y??`7ktw7rA;CKq{jWel8Fu5H-hab;{D z$qx6~>ElY#YO_GCMtZryrtbZRVRz7>)^?U=m@`4qtvG6~_OR^^CS%;B;^q$PAE}jR zsAh7!wyvl#Zn87g;?<^LxtjW9+Gx<;LTF)SO4ZdB3-X(x;4aWeU~LphUQXC)zq_pD z4uRg#BK<5EfgI~Oi?@Pb;Ni_Ld-YP4G3Q!o#uC#KTbZ?`wH;XgPyopaHcU4-5Luj3 z!*zE5&|xd(8#t2R%%fo-omJ=+qsyq+^jNX zXOV(2x%1dP9a7IOdzI5DhF#gdxYMs65?gaYf1$GKEa=Tq^t!ouY{%4|8+YdX-BuE= z4fH#TEZHwA427$yTsSmO8aq7%F9utbQ1i4tN6mSgxj3v5!aDIyhlofDm}L#y$k?WK>VqER%t;ZkEs z;@FJ&O|N044z1taK@Iv%%S;8 zs6U1DY7ZonZpKYpDX)BGD&-EAt8XiUNGql=E_Lt=!88?@G_nc)z(mU#@&(3wmQWm7lr1_~w~r+JGE_m2xSqTE6EW9dN{J`TZn!^4R%I+Zk?jbf}!k^JiB8R&$~hp zS;GC0kUI9_^)eo@Rr7l}|8LF63e>4XWIn7@=ePQs=dAjhEsU&0NLKMKP6A#MZoyrKjqaU&o5C z@zH9*7}hq2$FN}(Tk6BFVLQ-V-t-mhDtiNa#&B12MSTS?+s1JBCsCuX50ByKiTaBA z@^N&B&}@*-Dduk@{07dQDtiUzyT@Rkd>ziI>lkXTtgoyOk0Q>m@=+w~E60!?#g+QX z4P$uEC_X@5H5ZlPw^vKM zp7L(Ot%&l3bTgW<1zkKQJwqYx6leFmzwCc;)gX_3Ut9iiFOkT}5 zq*0o{~z#H(^reN3Wq2Q_>KL$aAy26=YM7THQ~ zdKrskn`}pw>>!=F2+e;RyAABof5+ucJ`9uDQs08oNNcU<{|3Gg*@=_BJGB#sLQ)qn z3N=p6D{XkrRH0EH)KV?-M(3rflU+nBnoYUzMv-sEXFLbNT|W70rD@XrfvI#m0(7hM zbgRXS66JuT+d{ItHK0ADzZYNk;onL6N~JZ5{ww(GIDU94ha;MU=?(Na_{8oav3+^4 z50Y3JiLD~Bc?A2TAspT?j#q@fGX{*~C%Gw%pBAke&r!TM>t=xTFy?ysV}cV{i5|^x zrAI6;(kf3Rj$I`C>=ZXn+`uJ`reBTV<^Gv5UV1cuY z<#VXVy>zs*8k=Xv6?tqcZm#Z}IZN~ZrJM2ZC;u4v+vMLrd;aZmw{Py3D8CYDhi{=@ zRsz#L8(zb&=K=f{JHAo;-kbRLk&QRBXUt;;_@fYy8*=fzgi!@t!a@vT2~+Ay4D;t2 z2}X8O!}C()j=Xwy$RX*_{0a-W zPCphd&>wW>Ub<`ye|E(8SVH@ovOut@Um$@8uoZ9vP!{B&ERe%;L_=ACw|Eue$T@OU zy2!<6ewYN_$_LE538GDo`5=Y~L6wHZ%a#*Fb67jlEBH=*cpU#2o`U15N;(?HHg8%U z$70``NlGJ9s26KQWt>y15rs9PnlhydDMZyxRC}jG_1O}r9wLW_-zil4a;Rh;Ra-@| z&iUTPe9#}~D;65#_}?-#SH3QCs=iX| z-5>MFbt#)DI-XNL&W!K`tM-#<#8WIUPoo{rXj#vCVDc6?m$$&Vyamqr7T_;IbdFK= zf0rC*wkapQZPG)JsUXz`>E#uF-a_l0;M+=_i&Vz)W*(%Qcr#COrZ?&&M=1|0Y0pzR z%`uvad6`s{u;=qc^1?e}&)SGu3eeY95%@j^i*i$Q{isxpN=?(K)P9Ng!74YTVR-4$ z)C%SR{Q1Q%f=nSb9DOBm8-U%M?YgICyn4rYU;Wr&d>Q=$uiG z(42jWB$qP9Nq(mk$#c_@ydaiO@;0c7#!gc;X7lA1c4o@sL{{_D1IV^R`gj+Teo;*+ zpGu5FY+g6>SC9|!en37g8$qxO@Wj{|{MNLht|p diff --git a/target/classes/local/epul4a/fotosharing/service/impl/UtilisateurServiceImpl.class b/target/classes/local/epul4a/fotosharing/service/impl/UtilisateurServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..a45d4564dbeedee7f575d3bd9a7fcf05124c0d45 GIT binary patch literal 1585 zcmbVMTTc@~6#k~PtSzNrwN%6lc)_+HD}onNBmsrQqzD1*1ICA?9b|C3v)P?R`A^{b4Y4PrO}5p!@MbLhN*MgGiMEbS1Rf58IB-tmpccd z#&yxKP5q@3rf?0#J!i9Ne@fI< zWtjVKB!<3SVbzxomm7wlU<-vxN1RRNXIU;bO@12snyrMi46~fVMdUOLrIE)ahHT(< z;s}WJy~Bj9HYS%cL;MaTpsPBixlM)iRmJFvw*YR^~=CKhRNu_yDylbpT8Hb za@&oOJ1xd-hSa9?oEl#dzHlSm_vFujDZe=whBrJ*i3YCAcll(uYfRXmhYIZF;i)fT9uCL*EJ9A$x&#E40RFO_jca zl_tJG`$W4KiuBIVSzrKh3?fOxqeQ!*=4nh|l6K@5pfcR0?*t79S{NOjqGLY%Yg&Df zeCac^iSOvAXpV5<7lv0SzhUGf{R(sC2w;dJ%?DhgP1iP89y;y?nItfc`{dbT)dSWU u%(hsUX!VoIbXbot_MuJIOCX?m&`BuMCdsr&LeMch2wWfH5v{)SW8g0rN3W&; literal 0 HcmV?d00001 diff --git a/target/classes/templates/mes-photos.html b/target/classes/templates/mes-photos.html index 8610353..11329f4 100644 --- a/target/classes/templates/mes-photos.html +++ b/target/classes/templates/mes-photos.html @@ -8,9 +8,6 @@

Mes photos

Uploader une photo

Retour accueil

-
-

Vous n'avez pas encore de photos.

-

Mes photos privées

+ th:href="@{/mes-photos( + pagePrivees=${pagePrivees}, + pagePubliques=${pagePubliques}, + pagePartagees=${pagePartagees}, + pageMesPartagees=${pageMesPartagees - 1} + )}">⬅ + th:href="@{/mes-photos( + pagePrivees=${pagePrivees}, + pagePubliques=${pagePubliques}, + pagePartagees=${pagePartagees}, + pageMesPartagees=${pageMesPartagees + 1} + )}">➡ +
diff --git a/target/classes/templates/photo-detail.html b/target/classes/templates/photo-detail.html index 7ad65a6..fa57d9d 100644 --- a/target/classes/templates/photo-detail.html +++ b/target/classes/templates/photo-detail.html @@ -34,6 +34,8 @@
  • + — + Retirer
  • @@ -43,6 +45,12 @@
    + +