From ff088361a0ad255fef5781af621445efb2ea1570 Mon Sep 17 00:00:00 2001 From: Subivas Date: Wed, 3 Dec 2025 12:46:02 +0100 Subject: [PATCH] =?UTF-8?q?FEAT=20:=20Ajout=20du=20m=C3=A9canisme=20d'albu?= =?UTF-8?q?m=20avec=20partage=20et=20visibilit=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AlbumController.java | 169 ++++++++++++++ .../epul4a/fotosharing/dto/AlbumDTO.java | 20 ++ .../epul4a/fotosharing/dto/PartageDTO.java | 4 + .../fotosharing/mapper/AlbumMapper.java | 27 +++ .../local/epul4a/fotosharing/model/Album.java | 52 +++++ .../epul4a/fotosharing/model/Partage.java | 22 +- .../local/epul4a/fotosharing/model/Photo.java | 9 +- .../repository/AlbumRepository.java | 18 ++ .../repository/PartageRepository.java | 10 +- .../fotosharing/service/AlbumService.java | 24 ++ .../fotosharing/service/PartageService.java | 8 + .../fotosharing/service/PhotoService.java | 2 + .../service/impl/AlbumServiceImpl.java | 209 ++++++++++++++++++ .../service/impl/PartageServiceImpl.java | 175 ++++++++++++--- .../service/impl/PhotoServiceImpl.java | 25 ++- .../resources/templates/album-detail.html | 101 +++++++++ src/main/resources/templates/home.html | 1 + src/main/resources/templates/mes-albums.html | 70 ++++++ src/main/resources/templates/mes-photos.html | 9 +- .../controller/AlbumController.class | Bin 0 -> 7730 bytes .../epul4a/fotosharing/dto/AlbumDTO.class | Bin 0 -> 2646 bytes .../epul4a/fotosharing/dto/PartageDTO.class | Bin 1681 -> 1899 bytes .../fotosharing/mapper/AlbumMapper.class | Bin 0 -> 2836 bytes .../fotosharing/model/Album$Visibilite.class | Bin 0 -> 1389 bytes .../epul4a/fotosharing/model/Album.class | Bin 0 -> 4303 bytes .../model/Partage$Permission.class | Bin 1402 -> 1394 bytes .../epul4a/fotosharing/model/Partage.class | Bin 2391 -> 2631 bytes .../fotosharing/model/Photo$Visibilite.class | Bin 1377 -> 1377 bytes .../epul4a/fotosharing/model/Photo.class | Bin 2853 -> 4118 bytes .../repository/AlbumRepository.class | Bin 0 -> 1419 bytes .../repository/PartageRepository.class | Bin 1125 -> 1212 bytes .../security/CustomUserDetailsService.class | Bin 3492 -> 3492 bytes .../fotosharing/security/SecurityConfig.class | Bin 6210 -> 6210 bytes .../fotosharing/service/AlbumService.class | Bin 0 -> 1763 bytes .../fotosharing/service/PartageService.class | Bin 849 -> 1226 bytes .../fotosharing/service/PhotoService.class | Bin 1155 -> 1323 bytes .../service/impl/AlbumServiceImpl.class | Bin 0 -> 13024 bytes .../service/impl/PartageServiceImpl.class | Bin 7746 -> 11533 bytes .../service/impl/PhotoServiceImpl.class | Bin 9917 -> 10780 bytes target/classes/templates/album-detail.html | 101 +++++++++ target/classes/templates/home.html | 1 + target/classes/templates/mes-albums.html | 70 ++++++ target/classes/templates/mes-photos.html | 9 +- 43 files changed, 1080 insertions(+), 56 deletions(-) create mode 100644 src/main/java/local/epul4a/fotosharing/controller/AlbumController.java create mode 100644 src/main/java/local/epul4a/fotosharing/dto/AlbumDTO.java create mode 100644 src/main/java/local/epul4a/fotosharing/mapper/AlbumMapper.java create mode 100644 src/main/java/local/epul4a/fotosharing/model/Album.java create mode 100644 src/main/java/local/epul4a/fotosharing/repository/AlbumRepository.java create mode 100644 src/main/java/local/epul4a/fotosharing/service/AlbumService.java create mode 100644 src/main/java/local/epul4a/fotosharing/service/impl/AlbumServiceImpl.java create mode 100644 src/main/resources/templates/album-detail.html create mode 100644 src/main/resources/templates/mes-albums.html create mode 100644 target/classes/local/epul4a/fotosharing/controller/AlbumController.class create mode 100644 target/classes/local/epul4a/fotosharing/dto/AlbumDTO.class create mode 100644 target/classes/local/epul4a/fotosharing/mapper/AlbumMapper.class create mode 100644 target/classes/local/epul4a/fotosharing/model/Album$Visibilite.class create mode 100644 target/classes/local/epul4a/fotosharing/model/Album.class create mode 100644 target/classes/local/epul4a/fotosharing/repository/AlbumRepository.class create mode 100644 target/classes/local/epul4a/fotosharing/service/AlbumService.class create mode 100644 target/classes/local/epul4a/fotosharing/service/impl/AlbumServiceImpl.class create mode 100644 target/classes/templates/album-detail.html create mode 100644 target/classes/templates/mes-albums.html diff --git a/src/main/java/local/epul4a/fotosharing/controller/AlbumController.java b/src/main/java/local/epul4a/fotosharing/controller/AlbumController.java new file mode 100644 index 0000000..ad47d31 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/controller/AlbumController.java @@ -0,0 +1,169 @@ +package local.epul4a.fotosharing.controller; + +import local.epul4a.fotosharing.dto.AlbumDTO; +import local.epul4a.fotosharing.dto.PhotoDTO; +import local.epul4a.fotosharing.service.AlbumService; +import local.epul4a.fotosharing.service.PartageService; +import local.epul4a.fotosharing.service.PhotoService; +import org.springframework.data.domain.Page; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.List; + +@Controller +public class AlbumController { + + private final AlbumService albumService; + private final PhotoService photoService; + private final PartageService partageService; + public AlbumController(AlbumService albumService,PhotoService photoService,PartageService partageService) { + this.albumService = albumService; + this.photoService = photoService; + this.partageService = partageService; + } + + /* ============================ MES ALBUMS ============================ */ + @GetMapping("/mes-albums") + public String mesAlbums( + @RequestParam(defaultValue = "0") int page, + Authentication auth, + Model model + ) { + String email = auth.getName(); + Page albums = albumService.listMyAlbums(email, page, 10); + List sharedAlbums = albumService.listAlbumsSharedWithMe(email); + model.addAttribute("albums", albums); + model.addAttribute("currentPage", page); + model.addAttribute("sharedAlbums", sharedAlbums); + return "mes-albums"; + } + + + /* ============================ CREATION ALBUM ============================ */ + @PostMapping("/albums/create") + public String createAlbum( + @RequestParam String nom, + @RequestParam(required = false) String description, + @RequestParam(defaultValue = "PRIVATE") String visibilite, + Authentication auth + ) { + albumService.createAlbum(nom, description, visibilite, auth.getName()); + return "redirect:/mes-albums"; + } + + + /* ============================ DETAIL ALBUM ============================ */ + @GetMapping("/album/{id}") + public String viewAlbum( + @PathVariable Long id, + Authentication auth, + Model model + ) { + String email = auth.getName(); + AlbumDTO album = albumService.getAlbum(id); + if (album == null) + return "redirect:/mes-albums"; + model.addAttribute("album", album); + model.addAttribute("myPhotos", photoService.listAllPhotosOfUser(email)); + model.addAttribute("partages", partageService.getAlbumPartages(id)); + boolean canAdmin = partageService.canAdminAlbum(id, email); + model.addAttribute("canAdmin", canAdmin); + return "album-detail"; + } + + + /* ============================ AJOUT PHOTO ============================ */ + @PostMapping("/album/{id}/add") + public String addPhoto( + @PathVariable Long id, + @RequestParam Long photoId, + Authentication auth + ) { + try { + albumService.addPhoto(id, photoId, auth.getName()); + return "redirect:/album/" + id + "?added=ok"; + } catch (RuntimeException ex) { + return "redirect:/album/" + id + "?error=" + URLEncoder.encode(ex.getMessage(), StandardCharsets.UTF_8); + } + } + + + /* ============================ RETIRER PHOTO ============================ */ + @GetMapping("/album/{id}/remove/{photoId}") + public String removePhoto( + @PathVariable Long id, + @PathVariable Long photoId, + Authentication auth + ) { + albumService.removePhoto(id, photoId, auth.getName()); + return "redirect:/album/" + id; + } + + /* ============================ SUPPRESSION ALBUM ============================ */ + @GetMapping("/album/{id}/delete") + public String deleteAlbum( + @PathVariable Long id, + Authentication auth + ) { + albumService.deleteAlbum(id, auth.getName()); + return "redirect:/mes-albums"; + } + + /* ============================ PARTAGE ALBUM ============================ */ + @PostMapping("/album/{id}/share") + public String shareAlbum( + @PathVariable Long id, + @RequestParam String email, + @RequestParam String permission, + Authentication auth + ) { + try { + albumService.shareAlbum(id, email, permission, auth.getName()); + return "redirect:/album/" + id + "?shared=ok"; + } catch (Exception e) { + return "redirect:/album/" + id + "?error=" + e.getMessage(); + } + } + + + /* ============================ SUPPRIMER PARTAGE ALBUM ============================ */ + @GetMapping("/album/{id}/share/remove/{email}") + public String removeShareAlbum( + @PathVariable Long id, + @PathVariable String email, + Authentication auth + ) { + albumService.removeAlbumShare(id, email, auth.getName()); + return "redirect:/album/" + id + "?removed=ok"; + } + + /* ============================ MAJ PARTAGE ALBUM ============================ */ + @PostMapping("/album/{id}/share/update") + public String updateAlbumShare( + @PathVariable Long id, + @RequestParam String email, + @RequestParam String permission, + Authentication auth + ) { + albumService.updateAlbumPermission(id, email, permission, auth.getName()); + return "redirect:/album/" + id; + } + + /* ============================ SUPPRIMER PARTAGE ALBUM ============================ */ + @GetMapping("/album/{id}/unshare/{email}") + public String unshareAlbum( + @PathVariable Long id, + @PathVariable String email, + Authentication auth + ) { + albumService.removeAlbumShare(id, email, auth.getName()); + return "redirect:/album/" + id; + } + + +} diff --git a/src/main/java/local/epul4a/fotosharing/dto/AlbumDTO.java b/src/main/java/local/epul4a/fotosharing/dto/AlbumDTO.java new file mode 100644 index 0000000..3135fbe --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/dto/AlbumDTO.java @@ -0,0 +1,20 @@ +package local.epul4a.fotosharing.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; +import java.util.List; + +@Getter +@Setter +public class AlbumDTO { + private Long id; + private String nom; + private String description; + private String visibilite; + private LocalDateTime dateCreation; + private UtilisateurDTO proprietaire; + // Liste des photos pas les IDs pour éviter les boucles + private List photos; +} diff --git a/src/main/java/local/epul4a/fotosharing/dto/PartageDTO.java b/src/main/java/local/epul4a/fotosharing/dto/PartageDTO.java index c4defd2..fac7fe5 100644 --- a/src/main/java/local/epul4a/fotosharing/dto/PartageDTO.java +++ b/src/main/java/local/epul4a/fotosharing/dto/PartageDTO.java @@ -10,4 +10,8 @@ public class PartageDTO { private UtilisateurDTO utilisateur; private String permission; // READ / COMMENT / ADMIN private PhotoDTO photo; + + public String getUtilisateurEmail() { + return utilisateur != null ? utilisateur.getEmail() : null; + } } diff --git a/src/main/java/local/epul4a/fotosharing/mapper/AlbumMapper.java b/src/main/java/local/epul4a/fotosharing/mapper/AlbumMapper.java new file mode 100644 index 0000000..c6151fd --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/mapper/AlbumMapper.java @@ -0,0 +1,27 @@ +package local.epul4a.fotosharing.mapper; + +import local.epul4a.fotosharing.dto.AlbumDTO; +import local.epul4a.fotosharing.dto.PhotoDTO; +import local.epul4a.fotosharing.model.Album; + +import java.util.stream.Collectors; + +public class AlbumMapper { + public static AlbumDTO toDTO(Album album) { + if (album == null) return null; + AlbumDTO dto = new AlbumDTO(); + dto.setId(album.getId()); + dto.setNom(album.getNom()); + dto.setDescription(album.getDescription()); + dto.setVisibilite(album.getVisibilite().name()); + dto.setDateCreation(album.getDateCreation()); + dto.setProprietaire(UtilisateurMapper.toDTO(album.getProprietaire())); + dto.setPhotos( + album.getPhotos() + .stream() + .map(PhotoMapper::toDTO) + .collect(Collectors.toList()) + ); + return dto; + } +} diff --git a/src/main/java/local/epul4a/fotosharing/model/Album.java b/src/main/java/local/epul4a/fotosharing/model/Album.java new file mode 100644 index 0000000..66a0c73 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/model/Album.java @@ -0,0 +1,52 @@ +package local.epul4a.fotosharing.model; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; +import java.util.HashSet; +import java.util.Set; + +@Entity +@Getter +@Setter +public class Album { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String nom; + + @Column(length = 1000) + private String description; + + @ManyToOne(optional = false) + private Utilisateur proprietaire; + + private LocalDateTime dateCreation; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private Visibilite visibilite; + + @ManyToMany + @JoinTable( + name = "album_photo", + joinColumns = @JoinColumn(name = "album_id"), + inverseJoinColumns = @JoinColumn(name = "photo_id") + ) + private Set photos = new HashSet<>(); + + @OneToMany(mappedBy = "album", cascade = CascadeType.ALL, orphanRemoval = true) + private Set partages = new HashSet<>(); + + + public enum Visibilite { + PRIVATE, + SHARED, + PUBLIC + } +} diff --git a/src/main/java/local/epul4a/fotosharing/model/Partage.java b/src/main/java/local/epul4a/fotosharing/model/Partage.java index 0e564eb..e9a554a 100644 --- a/src/main/java/local/epul4a/fotosharing/model/Partage.java +++ b/src/main/java/local/epul4a/fotosharing/model/Partage.java @@ -8,25 +8,25 @@ import lombok.Setter; @Getter @Setter public class Partage { - public enum Permission { - READ, - COMMENT, - ADMIN - } @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne - @JoinColumn(name = "id_photo") - private Photo photo; - - @ManyToOne - @JoinColumn(name = "id_utilisateur") private Utilisateur utilisateur; @Enumerated(EnumType.STRING) - private Permission permission = Permission.READ; + private Permission permission; + @ManyToOne + private Photo photo; // nullable si partage d’album + + @ManyToOne + private Album album; // nullable si partage de photo + + public enum Permission { + READ, COMMENT, ADMIN + } } + diff --git a/src/main/java/local/epul4a/fotosharing/model/Photo.java b/src/main/java/local/epul4a/fotosharing/model/Photo.java index 5871074..e1ca2ab 100644 --- a/src/main/java/local/epul4a/fotosharing/model/Photo.java +++ b/src/main/java/local/epul4a/fotosharing/model/Photo.java @@ -5,7 +5,8 @@ import lombok.Getter; import lombok.Setter; import java.time.LocalDateTime; -import java.util.List; +import java.util.HashSet; +import java.util.Set; @Entity @Getter @@ -28,5 +29,9 @@ public class Photo { @JoinColumn(name = "id_utilisateur") private Utilisateur proprietaire; - // getters & setters + @ManyToMany(mappedBy = "photos") + private Set albums = new HashSet<>(); + + @OneToMany(mappedBy = "photo", cascade = CascadeType.ALL, orphanRemoval = true) + private Set partages = new HashSet<>(); } diff --git a/src/main/java/local/epul4a/fotosharing/repository/AlbumRepository.java b/src/main/java/local/epul4a/fotosharing/repository/AlbumRepository.java new file mode 100644 index 0000000..436dc52 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/repository/AlbumRepository.java @@ -0,0 +1,18 @@ +package local.epul4a.fotosharing.repository; + +import local.epul4a.fotosharing.model.Album; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface AlbumRepository extends JpaRepository { + // Albums dont je suis propriétaire + List findByProprietaire_Email(String email); + Page findByProprietaire_Email(String email, Pageable pageable); + // Albums publics + Page findByVisibilite(Album.Visibilite visibilite, Pageable pageable); + List findByPartages_Utilisateur_Email(String email); + +} diff --git a/src/main/java/local/epul4a/fotosharing/repository/PartageRepository.java b/src/main/java/local/epul4a/fotosharing/repository/PartageRepository.java index 215ed96..8fdc085 100644 --- a/src/main/java/local/epul4a/fotosharing/repository/PartageRepository.java +++ b/src/main/java/local/epul4a/fotosharing/repository/PartageRepository.java @@ -7,10 +7,16 @@ import java.util.List; import java.util.Optional; public interface PartageRepository extends JpaRepository { - + // PHOTO List findByPhoto_Id(Long photoId); boolean existsByPhoto_IdAndUtilisateur_Email(Long photoId, String email); + Partage findByPhoto_IdAndUtilisateur_Email(Long photoId, String email); + // ALBUM + List findByAlbum_Id(Long albumId); + boolean existsByAlbum_IdAndUtilisateur_Email(Long albumId, String email); + Partage findByAlbum_IdAndUtilisateur_Email(Long albumId, String email); List findByUtilisateur_Email(String email); - Optional findByPhoto_IdAndUtilisateur_Email(Long photoId, String email); int countByPhoto_Id(Long photoId); + } + diff --git a/src/main/java/local/epul4a/fotosharing/service/AlbumService.java b/src/main/java/local/epul4a/fotosharing/service/AlbumService.java new file mode 100644 index 0000000..66f6504 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/service/AlbumService.java @@ -0,0 +1,24 @@ +package local.epul4a.fotosharing.service; + +import local.epul4a.fotosharing.dto.AlbumDTO; +import local.epul4a.fotosharing.dto.PartageDTO; +import org.springframework.data.domain.Page; + +import java.util.List; + +public interface AlbumService { + AlbumDTO createAlbum(String nom, String description, String visibilite, String ownerEmail); + Page listMyAlbums(String email, int page, int size); + Page listPublicAlbums(int page, int size); + AlbumDTO getAlbum(Long id); + void addPhoto(Long albumId, Long photoId, String ownerEmail); + void removePhoto(Long albumId, Long photoId, String ownerEmail); + void deleteAlbum(Long albumId, String ownerEmail); + void shareAlbum(Long albumId, String targetEmail, String permission, String ownerEmail); + void updateAlbumPermission(Long albumId, String targetEmail, String permission, String ownerEmail); + void removeAlbumShare(Long albumId, String targetEmail, String ownerEmail); + List getAlbumPartages(Long albumId); + List listAlbumsSharedWithMe(String email); + + +} diff --git a/src/main/java/local/epul4a/fotosharing/service/PartageService.java b/src/main/java/local/epul4a/fotosharing/service/PartageService.java index 640cee8..2ae3b8c 100644 --- a/src/main/java/local/epul4a/fotosharing/service/PartageService.java +++ b/src/main/java/local/epul4a/fotosharing/service/PartageService.java @@ -15,5 +15,13 @@ public interface PartageService { boolean canAdmin(Long photoId, String email); void updatePermission(Long photoId, String targetEmail, String newPermission, String ownerEmail); int countShares(Long photoId); + void shareAlbum(Long albumId, String targetEmail, String permission, String ownerEmail); + void updateAlbumPermission(Long albumId, String targetEmail, String newPermission, String ownerEmail); + boolean canViewAlbum(Long albumId, String email); + boolean canCommentAlbum(Long albumId, String email); + boolean canAdminAlbum(Long albumId, String email); + List getAlbumPartages(Long albumId); + void removeAlbumShare(Long albumId, String targetEmail, String ownerEmail); + } diff --git a/src/main/java/local/epul4a/fotosharing/service/PhotoService.java b/src/main/java/local/epul4a/fotosharing/service/PhotoService.java index 5a9b8cf..16dfc55 100644 --- a/src/main/java/local/epul4a/fotosharing/service/PhotoService.java +++ b/src/main/java/local/epul4a/fotosharing/service/PhotoService.java @@ -18,6 +18,8 @@ public interface PhotoService { Page listPublicPhotos(String email, int page, int size); Page listSharedWith(String email, int page, int size); Page listSharedPhotos(String email, int page, int size); + List listAllPhotosOfUser(String email); + diff --git a/src/main/java/local/epul4a/fotosharing/service/impl/AlbumServiceImpl.java b/src/main/java/local/epul4a/fotosharing/service/impl/AlbumServiceImpl.java new file mode 100644 index 0000000..7e03ee6 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/service/impl/AlbumServiceImpl.java @@ -0,0 +1,209 @@ +package local.epul4a.fotosharing.service.impl; + +import local.epul4a.fotosharing.dto.AlbumDTO; +import local.epul4a.fotosharing.mapper.AlbumMapper; +import local.epul4a.fotosharing.model.Album; +import local.epul4a.fotosharing.model.Partage; +import local.epul4a.fotosharing.model.Photo; +import local.epul4a.fotosharing.model.Utilisateur; +import local.epul4a.fotosharing.repository.AlbumRepository; +import local.epul4a.fotosharing.repository.PartageRepository; +import local.epul4a.fotosharing.repository.PhotoRepository; +import local.epul4a.fotosharing.repository.UtilisateurRepository; +import local.epul4a.fotosharing.service.AlbumService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import local.epul4a.fotosharing.service.PartageService; +import local.epul4a.fotosharing.dto.PartageDTO; +import java.util.List; + + +import java.time.LocalDateTime; + +@Service +public class AlbumServiceImpl implements AlbumService { + private final AlbumRepository albumRepository; + private final UtilisateurRepository utilisateurRepository; + private final PhotoRepository photoRepository; + private final PartageService partageService; + private final PartageRepository partageRepository; + + + + public AlbumServiceImpl( + AlbumRepository albumRepository, + UtilisateurRepository utilisateurRepository, + PhotoRepository photoRepository, + PartageService partageService, + PartageRepository partageRepository + ) { + this.albumRepository = albumRepository; + this.utilisateurRepository = utilisateurRepository; + this.photoRepository = photoRepository; + this.partageService = partageService; + this.partageRepository = partageRepository; + } + + + @Override + public AlbumDTO createAlbum(String nom, String description, String visibilite, String ownerEmail) { + Utilisateur user = utilisateurRepository.findByEmail(ownerEmail) + .orElseThrow(() -> new RuntimeException("Utilisateur introuvable")); + Album album = new Album(); + album.setNom(nom); + album.setDescription(description); + album.setVisibilite(Album.Visibilite.valueOf(visibilite)); + album.setProprietaire(user); + album.setDateCreation(LocalDateTime.now()); + return AlbumMapper.toDTO(albumRepository.save(album)); + } + + @Override + public Page listMyAlbums(String email, int page, int size) { + return albumRepository.findByProprietaire_Email(email, PageRequest.of(page, size)) + .map(AlbumMapper::toDTO); + } + + @Override + public Page listPublicAlbums(int page, int size) { + return albumRepository.findByVisibilite(Album.Visibilite.PUBLIC, PageRequest.of(page, size)) + .map(AlbumMapper::toDTO); + } + + @Override + public AlbumDTO getAlbum(Long id) { + return albumRepository.findById(id) + .map(AlbumMapper::toDTO) + .orElse(null); + } + + @Override + public void addPhoto(Long albumId, Long photoId, String requesterEmail) { + Album album = albumRepository.findById(albumId) + .orElseThrow(() -> new RuntimeException("Album introuvable")); + //Propriétaire + boolean isOwner = album.getProprietaire().getEmail().equals(requesterEmail); + //admin du partage + boolean isAdmin = album.getPartages().stream() + .anyMatch(p -> + p.getUtilisateur().getEmail().equals(requesterEmail) + && p.getPermission() == Partage.Permission.ADMIN + ); + if (!isOwner && !isAdmin) + throw new RuntimeException("Vous n’avez pas les droits pour modifier cet album"); + Photo photo = photoRepository.findById(photoId) + .orElseThrow(() -> new RuntimeException("Photo introuvable")); + //Protection anti-doublons + boolean exists = album.getPhotos() + .stream() + .anyMatch(p -> p.getId().equals(photoId)); + if (exists) + throw new RuntimeException("Cette photo est déjà dans cet album"); + album.getPhotos().add(photo); + albumRepository.save(album); + // Synchroniser les partages sur la photo pour les utilisateurs de l'album + album.getPartages().forEach(p -> { + // On vérifie si l'utilisateur n'a PAS déjà un partage sur cette photo + boolean existeDeja = photo.getPartages().stream() + .anyMatch(pp -> pp.getUtilisateur().getEmail().equals(p.getUtilisateur().getEmail())); + + if (!existeDeja) { + // On crée un partage photo identique à l'autorisation de l'album + partageService.share(photo.getId(), p.getUtilisateur().getEmail(), p.getPermission().name(), requesterEmail); + } + }); + // S'assurer que le propriétaire a aussi accès + boolean ownerHasAccess = photo.getPartages().stream() + .anyMatch(p -> p.getUtilisateur().getEmail().equals(album.getProprietaire().getEmail())); + + if (!ownerHasAccess) { + partageService.share(photo.getId(), album.getProprietaire().getEmail(), "ADMIN", requesterEmail); + } + + } + + + + @Override + public void removePhoto(Long albumId, Long photoId, String ownerEmail) { + Album album = albumRepository.findById(albumId) + .orElseThrow(() -> new RuntimeException("Album introuvable")); + if (!album.getProprietaire().getEmail().equals(ownerEmail)) + throw new RuntimeException("Vous n'êtes pas propriétaire de l’album"); + Photo photo = photoRepository.findById(photoId) + .orElseThrow(() -> new RuntimeException("Photo introuvable")); + album.getPhotos().remove(photo); + albumRepository.save(album); + } + + @Override + public void deleteAlbum(Long albumId, String ownerEmail) { + Album album = albumRepository.findById(albumId) + .orElseThrow(() -> new RuntimeException("Album introuvable")); + if (!album.getProprietaire().getEmail().equals(ownerEmail)) + throw new RuntimeException("Vous n'êtes pas propriétaire de l’album"); + albumRepository.delete(album); + } + + @Override + public void shareAlbum(Long albumId, String targetEmail, String permission, String ownerEmail) { + partageService.shareAlbum(albumId, targetEmail, permission, ownerEmail); + } + + @Override + public void updateAlbumPermission(Long albumId, String targetEmail, String permission, String ownerEmail) { + partageService.updateAlbumPermission(albumId, targetEmail, permission, ownerEmail); + // --- Synchroniser les permissions sur toutes les photos de l’album --- + Album album = albumRepository.findById(albumId) + .orElseThrow(() -> new RuntimeException("Album introuvable")); + for (Photo photo : album.getPhotos()) { + // Chercher un partage photo existant + Partage partagePhoto = photo.getPartages().stream() + .filter(p -> p.getUtilisateur().getEmail().equals(targetEmail)) + .findFirst() + .orElse(null); + if (partagePhoto != null) { + // Mettre à jour la permission + partagePhoto.setPermission(Partage.Permission.valueOf(permission)); + partageRepository.save(partagePhoto); + } else { + // Si pas encore partagé → création + partageService.share( + photo.getId(), + targetEmail, + permission, + ownerEmail + ); + } + } + } + + + @Override + public void removeAlbumShare(Long albumId, String targetEmail, String ownerEmail) { + partageService.removeAlbumShare(albumId, targetEmail, ownerEmail); + } + + + + @Override + public List getAlbumPartages(Long albumId) { + return partageService.getAlbumPartages(albumId); + } + + @Override + public List listAlbumsSharedWithMe(String email) { + return albumRepository.findByPartages_Utilisateur_Email(email) + .stream() + .filter(a -> !a.getProprietaire().getEmail().equals(email)) + .map(AlbumMapper::toDTO) + .toList(); + } + + + + + + +} diff --git a/src/main/java/local/epul4a/fotosharing/service/impl/PartageServiceImpl.java b/src/main/java/local/epul4a/fotosharing/service/impl/PartageServiceImpl.java index 6c432fb..f0b9b48 100644 --- a/src/main/java/local/epul4a/fotosharing/service/impl/PartageServiceImpl.java +++ b/src/main/java/local/epul4a/fotosharing/service/impl/PartageServiceImpl.java @@ -2,9 +2,11 @@ package local.epul4a.fotosharing.service.impl; import local.epul4a.fotosharing.dto.PartageDTO; import local.epul4a.fotosharing.mapper.PartageMapper; +import local.epul4a.fotosharing.model.Album; import local.epul4a.fotosharing.model.Partage; import local.epul4a.fotosharing.model.Photo; import local.epul4a.fotosharing.model.Utilisateur; +import local.epul4a.fotosharing.repository.AlbumRepository; import local.epul4a.fotosharing.repository.PartageRepository; import local.epul4a.fotosharing.repository.PhotoRepository; import local.epul4a.fotosharing.repository.UtilisateurRepository; @@ -19,15 +21,18 @@ public class PartageServiceImpl implements PartageService { private final PartageRepository partageRepository; private final PhotoRepository photoRepository; private final UtilisateurRepository utilisateurRepository; + private final AlbumRepository albumRepository; public PartageServiceImpl( PartageRepository partageRepository, PhotoRepository photoRepository, - UtilisateurRepository utilisateurRepository + UtilisateurRepository utilisateurRepository, + AlbumRepository albumRepository ) { this.partageRepository = partageRepository; this.photoRepository = photoRepository; this.utilisateurRepository = utilisateurRepository; + this.albumRepository = albumRepository; } @Override @@ -62,11 +67,7 @@ public class PartageServiceImpl implements PartageService { @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); + Partage partage = partageRepository.findByPhoto_Id(photoId).stream().filter(p -> p.getUtilisateur().getEmail().equals(targetEmail)).findFirst().orElse(null); if (partage != null) partageRepository.delete(partage); @@ -82,9 +83,7 @@ public class PartageServiceImpl implements PartageService { // Photo publique => tout le monde peut voir if (photo.getVisibilite() == Photo.Visibilite.PUBLIC) return true; - Partage partage = partageRepository - .findByPhoto_IdAndUtilisateur_Email(photoId, email) - .orElse(null); + Partage partage = partageRepository.findByPhoto_IdAndUtilisateur_Email(photoId, email); return partage != null; // READ / COMMENT / ADMIN } @@ -95,9 +94,7 @@ public class PartageServiceImpl implements PartageService { // propriétaire = admin total if (photo.getProprietaire().getEmail().equals(email)) return true; - Partage partage = partageRepository - .findByPhoto_IdAndUtilisateur_Email(photoId, email) - .orElse(null); + Partage partage = partageRepository.findByPhoto_IdAndUtilisateur_Email(photoId, email); if (partage == null) return false; return partage.getPermission() == Partage.Permission.COMMENT || partage.getPermission() == Partage.Permission.ADMIN; @@ -110,9 +107,7 @@ public class PartageServiceImpl implements PartageService { // propriétaire = admin total if (photo.getProprietaire().getEmail().equals(email)) return true; - Partage partage = partageRepository - .findByPhoto_IdAndUtilisateur_Email(photoId, email) - .orElse(null); + Partage partage = partageRepository.findByPhoto_IdAndUtilisateur_Email(photoId, email); if (partage == null) return false; return partage.getPermission() == Partage.Permission.ADMIN; } @@ -121,28 +116,154 @@ public class PartageServiceImpl implements PartageService { public void updatePermission(Long photoId, String targetEmail, String newPermission, String requesterEmail) { Photo photo = photoRepository.findById(photoId) .orElseThrow(() -> new RuntimeException("Photo introuvable")); - //Vérifier si requester = propriétaire + // Si ce n'est pas le propriétaire → vérifier si ADMIN if (!photo.getProprietaire().getEmail().equals(requesterEmail)) { - // Sinon, vérifier s'il a ADMIN - Partage requesterPartage = partageRepository - .findByPhoto_IdAndUtilisateur_Email(photoId, requesterEmail) - .orElse(null); - if (requesterPartage == null || requesterPartage.getPermission() != Partage.Permission.ADMIN) { + Partage requesterPartage = + partageRepository.findByPhoto_IdAndUtilisateur_Email(photoId, requesterEmail); + if (requesterPartage == null || + requesterPartage.getPermission() != Partage.Permission.ADMIN) { throw new RuntimeException("Vous n’avez pas les droits ADMIN pour modifier les permissions."); } } - // OK → modification des droits - Partage partage = partageRepository - .findByPhoto_IdAndUtilisateur_Email(photoId, targetEmail) - .orElseThrow(() -> new RuntimeException("Partage introuvable")); - Partage.Permission permission = Partage.Permission.valueOf(newPermission); - partage.setPermission(permission); + Partage partage = + partageRepository.findByPhoto_IdAndUtilisateur_Email(photoId, targetEmail); + if (partage == null) + throw new RuntimeException("Partage introuvable"); + partage.setPermission(Partage.Permission.valueOf(newPermission)); partageRepository.save(partage); } + @Override public int countShares(Long photoId) { return partageRepository.countByPhoto_Id(photoId); } + @Override + public void shareAlbum(Long albumId, String targetEmail, String permissionStr, String ownerEmail) { + Album album = albumRepository.findById(albumId) + .orElseThrow(() -> new RuntimeException("Album introuvable")); + if (!album.getProprietaire().getEmail().equals(ownerEmail)) + throw new RuntimeException("Vous n’êtes pas propriétaire de cet album"); + Utilisateur target = utilisateurRepository.findByEmail(targetEmail) + .orElseThrow(() -> new RuntimeException("Utilisateur introuvable")); + if (partageRepository.existsByAlbum_IdAndUtilisateur_Email(albumId, targetEmail)) + throw new RuntimeException("Cet utilisateur a déjà accès à cet album"); + //Créer le partage ALBUM + Partage.Permission permission = Partage.Permission.valueOf(permissionStr); + Partage partage = new Partage(); + partage.setAlbum(album); + partage.setUtilisateur(target); + partage.setPermission(permission); + partageRepository.save(partage); + //Créer le partage PHOTO pour toutes les photos existantes + for (Photo photo : album.getPhotos()) { + boolean exists = partageRepository.existsByPhoto_IdAndUtilisateur_Email(photo.getId(), targetEmail); + if (!exists) { + Partage p = new Partage(); + p.setPhoto(photo); + p.setUtilisateur(target); + p.setPermission(permission); + partageRepository.save(p); + } + } + } + + + @Override + public void updateAlbumPermission(Long albumId, String targetEmail, String newPermission, String ownerEmail) { + Album album = albumRepository.findById(albumId) + .orElseThrow(() -> new RuntimeException("Album introuvable")); + if (!album.getProprietaire().getEmail().equals(ownerEmail)) + throw new RuntimeException("Vous n’êtes pas propriétaire"); + Partage partageAlbum = partageRepository.findByAlbum_IdAndUtilisateur_Email(albumId, targetEmail); + if (partageAlbum == null) + throw new RuntimeException("Partage introuvable"); + Partage.Permission perm = Partage.Permission.valueOf(newPermission); + //Mettre à jour permission sur ALBUM + partageAlbum.setPermission(perm); + partageRepository.save(partageAlbum); + //Mettre à jour permissions sur toutes les PHOTOS + for (Photo photo : album.getPhotos()) { + Partage partagePhoto = partageRepository.findByPhoto_IdAndUtilisateur_Email(photo.getId(), targetEmail); + if (partagePhoto != null) { + partagePhoto.setPermission(perm); + partageRepository.save(partagePhoto); + } + } + } + + + + @Override + public boolean canViewAlbum(Long albumId, String email) { + Album album = albumRepository.findById(albumId).orElse(null); + if (album == null) return false; + if (album.getVisibilite() == Album.Visibilite.PUBLIC) + return true; + if (album.getProprietaire().getEmail().equals(email)) + return true; + return partageRepository.existsByAlbum_IdAndUtilisateur_Email(albumId, email); + } + + @Override + public List getAlbumPartages(Long albumId) { + return partageRepository.findByAlbum_Id(albumId) + .stream() + .map(PartageMapper::toDTO) + .toList(); + } + + @Override + public boolean canCommentAlbum(Long albumId, String email) { + Album album = albumRepository.findById(albumId).orElse(null); + if (album == null) return false; + //Le propriétaire : autorisé à tout + if (album.getProprietaire().getEmail().equals(email)) + return true; + //Chercher un partage + Partage partage = partageRepository.findByAlbum_IdAndUtilisateur_Email(albumId, email); + if (partage == null) return false; + //COMMENT autorisé pour COMMENT et ADMIN + return partage.getPermission() == Partage.Permission.COMMENT + || partage.getPermission() == Partage.Permission.ADMIN; + } + + + @Override + public boolean canAdminAlbum(Long albumId, String email) { + Album album = albumRepository.findById(albumId).orElse(null); + if (album == null) return false; + //Le propriétaire est toujours ADMIN + if (album.getProprietaire().getEmail().equals(email)) + return true; + //hercher un partage + Partage partage = partageRepository.findByAlbum_IdAndUtilisateur_Email(albumId, email); + if (partage == null) return false; + //ADMIN uniquement si permission ADMIN + return partage.getPermission() == Partage.Permission.ADMIN; + } + + @Override + public void removeAlbumShare(Long albumId, String targetEmail, String ownerEmail) { + Album album = albumRepository.findById(albumId) + .orElseThrow(() -> new RuntimeException("Album introuvable")); + // Vérification propriétaire + if (!album.getProprietaire().getEmail().equals(ownerEmail)) + throw new RuntimeException("Vous n’êtes pas propriétaire"); + //Supprimer le partage ALBUM + Partage partageAlbum = partageRepository.findByAlbum_IdAndUtilisateur_Email(albumId, targetEmail); + if (partageAlbum != null) { + partageRepository.delete(partageAlbum); + } + //Supprimer les partages sur toutes les photos + for (Photo photo : album.getPhotos()) { + Partage partagePhoto = partageRepository.findByPhoto_IdAndUtilisateur_Email(photo.getId(), targetEmail); + if (partagePhoto != null) { + partageRepository.delete(partagePhoto); + } + } + } + + } 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 413dfed..fac5d6e 100644 --- a/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java +++ b/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java @@ -134,12 +134,13 @@ public class PhotoServiceImpl implements PhotoService { //============= PHOTOS SHARED WITH USER ================== @Override public Page listSharedWith(String email, int page, int size) { - List photos = - partageRepository.findByUtilisateur_Email(email) - .stream() - .map(Partage::getPhoto) - .map(PhotoMapper::toDTO) - .toList(); + List photos = partageRepository.findByUtilisateur_Email(email) + .stream() + .map(Partage::getPhoto) + .filter(photo -> photo != null) + .map(PhotoMapper::toDTO) + .filter(dto -> dto != null) + .toList(); int start = page * size; int end = Math.min(start + size, photos.size()); List sub = photos.subList(start, end); @@ -147,6 +148,7 @@ public class PhotoServiceImpl implements PhotoService { } + //============= PHOTOS SET AS SHARED BY USER ============= @Override public Page listSharedPhotos(String email, int page, int size) { @@ -155,4 +157,15 @@ public class PhotoServiceImpl implements PhotoService { .findByProprietaire_EmailAndVisibilite(email, Photo.Visibilite.SHARED, pageable) .map(PhotoMapper::toDTO); } + + //============= ALL PHOTOS OF USER ======================= + @Override + public List listAllPhotosOfUser(String email) { + + return photoRepository.findByProprietaire_Email(email) + .stream() + .map(PhotoMapper::toDTO) + .toList(); + } + } \ No newline at end of file diff --git a/src/main/resources/templates/album-detail.html b/src/main/resources/templates/album-detail.html new file mode 100644 index 0000000..5bad9a3 --- /dev/null +++ b/src/main/resources/templates/album-detail.html @@ -0,0 +1,101 @@ + + + + + Détail album + + + +⬅ Retour aux albums +

+

Description :

+

Propriétaire :

+

Visibilité :

+
+ +

Photos dans l’album

+
+ + + +
+ Retirer +
+ + + + + +
+ +
+ +

Ajouter une photo

+
+ Photo ajoutée ! +
+
+ + + +
+
+

Gestion des partages de l’album

+
+ +
+ +
+ + + + + +
+

Utilisateurs ayant accès :

+ + + + + + + + + + + + +
UtilisateurPermissionActions
+
+ + + +
+
+ Retirer +
+
+ + + Supprimer l’album + +
+ + + + + diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html index a5135cc..3442f17 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/home.html @@ -7,6 +7,7 @@

Bienvenue sur FotoSharing

Uploader une photo

Voir mes photos

+

Voir mes albums

Voir la galerie publique

diff --git a/src/main/resources/templates/mes-albums.html b/src/main/resources/templates/mes-albums.html new file mode 100644 index 0000000..4f692aa --- /dev/null +++ b/src/main/resources/templates/mes-albums.html @@ -0,0 +1,70 @@ + + + + + Mes albums + + + +

Mes albums

+ + +

Créer un album

+ + + +
+ +
+ + + +
+
+ + +

Liste de mes albums

+
+ + + + +

+
+ + +
+ + + +
+ +
+ +

Albums partagés avec moi

+
+

Aucun album ne vous a été partagé.

+
+
+
+
+ + + +

+ Partagé par : + +

+
+
+
+ + + + diff --git a/src/main/resources/templates/mes-photos.html b/src/main/resources/templates/mes-photos.html index 569bc48..765dd54 100644 --- a/src/main/resources/templates/mes-photos.html +++ b/src/main/resources/templates/mes-photos.html @@ -10,7 +10,7 @@

Retour accueil

Mes photos privées

- @@ -26,7 +26,7 @@

Mes photos publiques

- @@ -42,8 +42,8 @@

Mes photos partagées

-
- +
+ @@ -76,6 +76,7 @@

Photos partagées avec moi

diff --git a/target/classes/local/epul4a/fotosharing/controller/AlbumController.class b/target/classes/local/epul4a/fotosharing/controller/AlbumController.class new file mode 100644 index 0000000000000000000000000000000000000000..7b09bf6bb3de4432f7914cc4f951f7f5e64f12ed GIT binary patch literal 7730 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 NDe*V_1OGzv{{U(*IQ9Sl literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/dto/AlbumDTO.class b/target/classes/local/epul4a/fotosharing/dto/AlbumDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..fb4dc4cace3267200af24b44e5553a7fd3b5b4e1 GIT binary patch literal 2646 zcmb7_X;TwH5QcjKNhEGK0-}f)o&k^bzCaYg11l;e$oCByVKmuIZ6;Rvue3_bDnIxG z{85%~&nBDfW+mavPG+Y2>6y2CI)DED`b|WS=v9tVG?b-bi_(-4H2%@~?ATSu-L>DA zKgt~~D6^zorI!T_73a4{=n#!$DQD4PvIJeIdOJ?lmi1=!wqt+rwAa{kdV9_KS9j?g6j<4!kc`iF2 zv1pptbDvd1l~q+~$;-zqnxW%@tcs)MsxKY37c>*VwW>+G#OGea_7-L)#tDl~(kVFA zeXs5-sU77@L03!rUh%y~)CM?B9~U*CGZxL!S?E^ZV?DxqH(_d*R6{Qc8rf94uA`eA z;X!b$aC>S0h#O4hSj*rHuX+_A#!AYSZ<@8T^tYUH6)OdE!ENM%=dHzIy{B-VOZx|C zXASuDuGH(uT%kDMl^BydL9_3gE^E2&8uhDk#dSSxv__Bug4D|1C;NqTr4NBB;AOyj z!+D;H09%ZMTPKpKPv9KNH78hlMNK$9pq=d8v_8XCW+OR)JMv*JTG@|pZ+R?&n z;Z}=1iw8+zx)EqRS&U0Ozm3{?E%lyP*>HTPCbjf&h725xh)23TS{ky?C=8-1Vj-d; z8$?t*(LyDN$iy)?L}k2QJdlbE8DU84NwhE9k&!K?qec6r-Y(pw*6~8~!3Ab+ZqsY} zJMy{WmyvJR_ciWDc&dlc0g1BsqNU+iiW`y{(R0j*9%Du{6*Hnwm=VvM1f4U#&%+B3 zhBEkGz>1AgU`#LkB=OCdT*Q~R34t!*YXt^Wq{o22sN-xUIA4Jc zqpup!HAL?P<>R1yU(oeL&_oKtbi)r)c&b(8Ct+Ax_A(nOV5}gR=1=${FHxV9_cft^%%NG$r_@ z@sEkpjpCQ^uOFN@g3k|%=f@G^c@o7hC*vmu#q*mB@jQv*A1C9d2F3GJ4)HvR;-An; zk~l{P#dC)U@iRU6r?i@cpB)s>jVHvP?7^?mGa5FfSn95v(~KYL>LCBCoS>gQhjq}J YGU$%yI|1hqFeup)hg5~ zAAIz|4`tc2*$SJZ2)s;ZX1jmW{qLUq{rBrPfM?i9Ac7$SQ4=x58O9FzF}G^mKCre+ zhoY<);v3SI>N&$uF26s5VT>3^m`K88Sg1K=Ub94_SzG1SXGb|+mAjInE6TBUxU2Yq zc)hpHkZdYhlO9*1=`t)8&kX!@>Px}v35+6bV9dlgG7O6sh-DZ)5b8~x%NoN(E?+#Y zZ&&F=*L6h`CMGe(5Rnyx*$tp zgv1SWN$o0LKHB09A8cTuV-8xCQ8^U5N%~|uRP+^MnElwam8^?R`&fFCa(rpqj^c`R zq7*ZfV!h-XS?`1`T$+Ij z!t(nh#gp}^a>KUbgkc&IQ7LW?TJ&R-+?qaDA$mj+o27;EU z(%y`wyFtl;APXyfK(pN-b0Fv*?vt!qqcsBRhQ|ww-;wR^oZ*wES{{K&x)pjf7#>hu zjL~Kcoyx7^VL!ZaUc8>THa^*de}u>V@YCnT>p^bgXL|5Y@U$O(_PlugKHB)JJ@_?J HErRv`V`pX! 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 diff --git a/target/classes/local/epul4a/fotosharing/mapper/AlbumMapper.class b/target/classes/local/epul4a/fotosharing/mapper/AlbumMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..e4f4e69ac0ab9e940e31e82582e5d02daf525076 GIT binary patch literal 2836 zcmbVOX;&Ln7=A9>NVq`CDz>&-DP^%tu~l2sVp|Z4rUiv!7q^>afPqOSP9`X>b>Ekt zQop37p5yVG=Xm@J{uPhUok^OBK&Z}#xij~^>+^2+kH7E!3g9e$ilG6G2AU+A(IOCE zQya>3RBpwbORZUHU!diTowNN(fyUvHB?Au#9C6&Va!e~BYGi3^c~j25F#Oq63`*gS&EO-HhdgyaLTDmOq;j=o%hLRt-wJxs`;Lx=*4D z-6Si7WZlF6rW#q&ihCvc&`%F2?y{Q|=&6yn;A@)$i31W3VLvG;F`(>?iYya`LLZhm zsD*Y==(JTxdv@Np-JG`T5s62&lnzR%IcmdW5`#D*&`z!;yI`km$M!9O6SU}lFd3{e z(cq&PHZUSFstqy!BfmgXPGv1^@Z%E4w88B(xT-)yXG$E$gg~eEQu)@DXDRKb!2Sw` zzMZwqq|O9Qu*kmv$`cYN@gzAl2sNAs%9!rJ7()BB#3`H(mCk!^-m@)V*&bmU-y5bY zJ|QhoVbP-<37j!-R$>y*3QX*dkjm#R&y4V13U-)VzRMgIxG}s}d?L(=I>FSX5h11U z0Iu^A7cdpVRqONdI+}M77DD)(#0;JnXl2~yS9N6y?5jkqNQle@%TKgn7B3ihQ6h;; z41Z8#l~Y{>KEus=xfko;EZj9&4LnSAv46}-%;P13MbMm0fkQQ#mW#Qx&KYy2{6W17 zSTt}&VhOJZ^jG!P$Y!g_s=UCda>4}Kw@WMch8=8+;ToUZWe^^h~*q!{+9C zgr~)KlXiiP?qH4eWsB}n2FAZ3@g|gjkq!k2FiN{iXFddnk$##mkYgxba;#3?hgB2Nkr0@xldh5GzE_DSof>3lWLXFt-JLu- zo=D%m;H&gHQ7U^LzhwEVZf0J2?2o>slOwj^7QM7JV{5qL5s$}p1i5v=b$zCa%7?s# zINqhj(diM+(VbGEvjy+R@BuzF@R4p+H}4~`L26V2yEoc#rQb%xs(*h*0Vp$t09{nMjAIoBldij7 z%qJrC!M>u$ab%~4ad9(m{lCLdWqsagp_bK7DaTphkY=LD*<8-@rW{o$SUM@Hv(mtK zybo;yXeVC{{J(*TwNTKHb$pUG8lZ63W1@pEvz&bK}WTH)|5 zLjq)x3-%`AQix{$3yp!$)zRP4EN=Y*h(YghxB^5grO3~ z^yhd9Pw4fjJ9wsqbNX|73l|0M;xe#>mm6>gSGVwb1AarQgv{72>THCzZxWq+x6w|0 z6Kvl1*dEvl;QA&4Z@r=ESW$UEFpgC#sx~c)^r`8{Yg3! zAsP*z{ZYnq?`9ZL6W63YJ?B2>IWPB|A3wi*2e5)w6#)jrb{nQ`@b_&yYZ?cx@3xLi z&vFiprn}E=qhQzD&1B7LS#`^{d>#dZq9cSbgSxd{t`&Al44KM+G&#W&(Ge9q;p%!} zyYyO^uIbRFX>0dYrCb!I>pF%Ir)bGqp|V@5GAzCuIGlzAZmNju7{)DzP{Vc|&M=%x zSB}jS)38mdc(Z=Y8-7m1C~m75(=m=a6#o)Xa@tKw39f z^xzGl(7*kaBHc8@P{nfiM!Q+(-i}$f$x`}DPU(SL&yc8y8LQD)3Em#L;+Rc}k@&M= z4Dq+zKXUiCOph==_ozt4Ke9+@Nlq4+^!xTmHJ+@>LKn`9J%>pqCwodvbEP zsP1yl)-rV0qqL~X+L+ijfFx~;l(Zs1d|d1WAwpzNVVdx1(xym?N9!Q=88&r;wr~0}6eC(eO90yYmbp zTHOnE=te}oSL=&l3E7_WcF%eKEBPkw2hZ@}6hWy>DN<3T@-QS7?HtKd#6;#@&V=+| kKnxk`+9D+-(&?u849^J{zze*Tav6D&VoMp8v9dPy3p$fGn*aa+ literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/model/Album.class b/target/classes/local/epul4a/fotosharing/model/Album.class new file mode 100644 index 0000000000000000000000000000000000000000..18c6b630546e70db3affe9ac9df167cf4ed43a6f GIT binary patch literal 4303 zcmb7``*#yX6vyv0P0}W5X~VOYSD|8C9xH+(v>>G|5KIfUp$e$DNrq(0W;gDmT3`4l z={a&ZN6+yO@GtSN@c6y6OCHl@O`P?{3Ml%-sn zMshSt2Lw%sfdIug`HZ0^jL^eG3KnWes(FqpH zR;62UjHYMU7UNIl=rm0U$~7Ik=@`<}4Mz&PQ0%du$Jh_U)jjDuihnjo)ATMlReW1= zq|OEeO$6R}Mnh^v-l1homoQRF@8xKQW(8%o4c90G=)v^mUZ&MnPH(nU=3!>tx7ddI zXv#&)vOVPicKR4xc*z^8HKpSkt|zUE)CyIoO~+2%la_SgW_43HeF?E4*W+<*r-ues zT-s?Wjl%NETB%TaBItOmjV0Uk8y2%I-!%2IDHF(0LV}pms(E#c68{Q16|20eTRSED zp`|R@DwMh@=ya^`isd(g<-l5Uo0lZ$v%g1 zX>WL-&efDRtZk%(Y|jHRq`=R4{`!8`8Ed|qIj1r5*qM#AmY1VaXT{dh4m$OJ8MTQ?!ZO3 ziO$5E8h#w~>IPPRu2(!&;c*t#q*vhmo0$!EsNIhQO@^gduvAe;iZKrxjk5hxYZV!I zDe%^~cOB{ihTTihDCU>jZ42wdheuug>Jl{f(Xj#q_o8;IntW?KrdeT|VY1zF1YPNE zP;FOtpBiSz!xLcqt-ZJPgq^q^{kD%9%Q8DWI0Vh_pVX1PNjHe_!I@})XE$*QtxB(M zS78hV>7jxULMW&Z9`4i#Bgi_V5a^B}K6J-Wo7qnY8G3-BT|qn^nvaPgD~v#)Gm2Mx zn%osc#tgIXVHoqF#a0wq;7E6w;ZO)m?M6hp@Axt`%Vt{1Q!~4gQuG5W9I<9+|n^*D+%Damg-^BP9CFm2EZqwp3 z61V9N)G=J5<<8*>gmKGjA?_*!JA4o7_gyN`1ISDIl!~Oho_Pg@!5uT$E=I0=tg~{{u8AiE4oz`gsBS9s43}+avVZ`X< z+#huCH@plGL)bFG=eBY(RNf3{KgYkIFX%}O=x7vlxF_goENC(cI@S~PjJ}NV=wuW$ z*%R~?eH{Zj69t{<33^W7#DLC4K~p_JI+YRIXw))M&}yoc6J7dHKK@IZ=7mDR`Od={dIgz3Jk^~c!Rd$@JIW_2i+sY zPwc|KjK@#*iw}BGh(EClZ&D-9`;-0RgH9IWPw&E8WXIvp^o!?yC@92F@4`3f+c^BW ze(^z@4e>L(@D91?Se)C%&dkX$KGD&V_R1XY(1JWj2fZ$Z4!F=>&nOHAHQ+~bYCGPr zYN-7f=Dyx-I8S%mhVw1M-*p)tr0?PD0PU!wfUDvMjDN&$5brVI2cSBOc)p$G#MBeye9u+vFGMuU;?sb N8PpkMCI_%;0RWTZ3j_cF delta 69 zcmeyw^^0o*KMN!GWC0d^AnCy32_(B%Qu(C@2dfqU*MAD~ diff --git a/target/classes/local/epul4a/fotosharing/model/Partage.class b/target/classes/local/epul4a/fotosharing/model/Partage.class index 33151884259959d8d49827199cdcae74b55ee56f..1cc62958fc91a4d585727147a59d47de4156c47b 100644 GIT binary patch literal 2631 zcmb7`Yg5xe7=_Q4UZAunpdzB;1+_&b-fwtAZdMCAT07&%l&&S3CQP$ohJU3qI?njP zAK;I2JevdyB~I#xX0zG%eRgx+vzz|<{o^NqN2unJ!axq`0y4-79R6r-n}%&VE#p<= zqufve*@u>6smB5XrE+};gBZ#oU%)U50vBy}!?X>#<=eMRSfAkJJSnH!m>x z#&?v}mUYXs8n#?;99Nl&ui*(Cr*NONlm_3jt)K(8?o&8?Qj_k$!zPT2%P?B zXf$#5ZS75EeN`a6NDm1ds#=a*_uCEGshLzpV63WLSEtc*KYEx}n---iC6+3*q+U@= zstRp6Rw{E%yS5LEDKHh4qvCAG6l9FEv>Waxu5O3_B@AE`sj_G71_@4cR}JJE^&wlX*ARg=Ly;K zY?yt1fOsttXs{J*Gqc|zz63LrdDX)}9<#jaCF(ioKxGM9@v#iUE!Gf{rADZsSf2=x8r!A`x^K_hLYky`U3`p!;}$ zfk5mB1Zv-8XD@$4uD4V}0qIy65tT}79Xf2Dc^O)pe%fDxhx}s_gD>`r4;>oeb!R{R zF`mTXNBhNxW{>dW2k=j^5Qjh7FFxEb5q{zT{uvhI@RR-G!@U>br+V;dEU_plEC<_P YZ;BQ6SNTix{yARoE+51Oc2d+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 diff --git a/target/classes/local/epul4a/fotosharing/model/Photo$Visibilite.class b/target/classes/local/epul4a/fotosharing/model/Photo$Visibilite.class index 5f8d68f9c5b7814e43e280a4f212345ac18508d9..b4c973c6b39aa0ec0506cb1ebdd5e66d578c2556 100644 GIT binary patch delta 37 ncmaFJ^^j`=6AL5%WM&q9AZg6v2_$P-Qi0@SmS7-h&Z-3fv-t@4 delta 37 ncmaFJ^^j`=6AL5XWM&q9AZg6v2_$P-Qi0@SmS7-h&Z-3fv!n>~ diff --git a/target/classes/local/epul4a/fotosharing/model/Photo.class b/target/classes/local/epul4a/fotosharing/model/Photo.class index dda4a88ac6ce083e9492b46b38af9cf987532ca1..5d756413d45e5dea491f0ebb90dd9da1c1056363 100644 GIT binary patch literal 4118 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 J58%=M<}Y}Y!?OSY literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/repository/PartageRepository.class b/target/classes/local/epul4a/fotosharing/repository/PartageRepository.class index e565f873bcdc96a5c64af37c1412c1b22d4f9ec6..85dfab89c9c87c16cb53cb635e5698873c05afdd 100644 GIT binary patch delta 270 zcmaFLv4@lE)W2Q(7#J9A8RRx{O=g^|&!o!eGkF4&>O=v_$qmeW+Kdc*X_;Ih^3NRky%_)43(U0%_PaAgrpiIFnKQHq{&~H?lW>szQSx-&&a?D zw2hOAfeT3SGcd3)G6*qnFff6ISs59Gfx_HC%*4P0loDa!V}R=bNkMdoG6-T57Gn@c i7z9)aHAn(zkR*c?Scen?1JDwX-AqtfX$BcEPZj`qASeU? delta 171 zcmdnP`ILj})W2Q(7#J9A8KgIIO=g^2!8B>|Tt-z!i^+M6DwEGKar5{Wlw{`TCFWQ& zG9q(yo-H@-U<@ zqzW*UGctH6HF40V%xcqITU{TaOg diff --git a/target/classes/local/epul4a/fotosharing/security/SecurityConfig.class b/target/classes/local/epul4a/fotosharing/security/SecurityConfig.class index c4a7638be6b982710483d758c2a5f3481add7931..7813d2109da9fe252fffebb28fff04ca147cd505 100644 GIT binary patch delta 175 zcmXZU%L)Nu0LAhDAWC2PkOfb`ioLvnva{8=B$Aap1R0sF+qmBu4awFMc?6$Wozt(= zd8J+{yB{h@MjDZLwywAJWJ7OOleuEOQfj3W`GA*+pCD7g08?Trn15j*=wV0<1?w+t z1Rc7Pu7bUv14kbx!I_I=gDkpM=Lh~ delta 176 zcmXYo%L)Nu07lOsYML@e7CZr~nZ3M$*x8RuGRaCFf{e`8{eHhSBwG(8kKh-p?{xak z(|8)^jur~~>B|fl1{f)fnYb^_BV|-(5|Mb?G8?8|HEU%(o3~1ZdNPp{#X=^;QlX2Z z;s~+%imgH$Tg4XQ@D)deCM}hg`wmBZsUBXY%vtfHHM>9UIdKMJ;!)&+E8>dSD-t*E HJcxb(uaYZw diff --git a/target/classes/local/epul4a/fotosharing/service/AlbumService.class b/target/classes/local/epul4a/fotosharing/service/AlbumService.class new file mode 100644 index 0000000000000000000000000000000000000000..d99efff9408d481a64bab63385a865469751dcb8 GIT binary patch literal 1763 zcmbtUU2oGc6ur*c^>fey8{c1JgLbgx1%%KB5)vR)YPCv1@a!gD>ygC4aXP_IDGija-FUE)>wA6fIrg!C{QUME0A7M!0*k<|FI?)|EK2;R)IJhQ#3L$sIJ9FX z$J}N1Yk!agjtNRoAka9bV`}>pYYqp;%vA(xu4GiPw3NW-R(D$BD2=v%zL|D+E9o5-;?6``(vj|TBIGCAql(&|K%CI-(;-7TMP^V75yk`xG5?C6 zio=H?Rf)uZ_8$!nmfV(CdSkS%elqa6JJGh&I)f5t>Eg4nDi4{;-0~v75nX{^S^m^5 z?hzrP?gJ7jdBk8}IWPup73>j_Yqpvc~+o$!( z;a2r!nk?!pv1pdw?2IN{Q&i#>X5OtvOa?rTQ;V-B5gO7o?dRqjMo+51(X@6%>;G(RbzVzDN8`|Beq&U^&edKD?Lup(2 zMw1g+z-La`0!C@~37@JX66vyc+(!;gv)AV7+|y6uDgk_#@c9L(<4anERg6m*H49M2 zPX$L6M-B8tTZc8U()8L2T)^pzI2t&bI4rn?C70n!R#LJ4O0Q#j1FmKbiUh8upx5C> zHie)!5$F~U)9?2D)E&5+t-?Nfm058Q?oS2i=}jCDey6uiPjAD+KdI=|2KW)QGF?bq Z0~^V0)U*SSrzyQFCiMiNb}_PG?-vWolqo$CnlIOX@*S>VA5mcpIpy$qMn73L7IV$0q7{8V+C0l zWPlVW5OV=BHvff$?3=9mm49e^bOpFY=lNp&MH)>ikCkp3e7MD2Yff$?3=9mm3<~TFOpFY=lNp&MH)>ikPkzs=#mF&PiscO#10#bRPze)* FJOD|%3X1>$ diff --git a/target/classes/local/epul4a/fotosharing/service/impl/AlbumServiceImpl.class b/target/classes/local/epul4a/fotosharing/service/impl/AlbumServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..05dc762f192922ecc685dd61835c9cafa00269fa GIT binary patch literal 13024 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 Tc(S-g%v@V0W{EN}7iIqeE$?by diff --git a/target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class b/target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class index 0cd1326cf2cdf2aeba87521a4f958d07b03881c5..934d9ef11f02e49889216a96ce6726dd4fc2f72e 100644 GIT binary patch delta 2310 zcmcIl*>h866hFW0y}50ZbWPHvNz;}tKv~MxVxbnWMY@B~irCP_rUqI_pbAP5L1bS( z1(bp-6mWrxGf+Us7j^UjUvx&NGcw~pfDb<43*)(8Lg+9$I zUo?)aRKCA|<4YoX3|GgLUG_`|nPF04h6QAZ_C}&0pRlXhH7%QadqUm8Xm7O@fTF?* z6=doQg`>TjK?_P&3S!HpHkO=6SXo$eqDOxo^r6*kz#344Jr zLq#UCI94RItrw&(DQ!@YgIqJ5DqL`jpX~vYM}-&p0*-*e4=NF3IfZEr8-~IPd_SDZ=D)mt!Cj5+c!{pxMUT~kg*I24K2 zhQlrWgVDiAbKk0nmPw2`wM4*%EYD&xA;9b z)mqxgq`XV|l!pD5ip_}F5MjrN<~XBbBL;04WXHP--oyK5e4tVlJ``WM zzfL=^U=$b3xTxY1KDsLMd@x)F6$!s5N8I+K1L>%S77AX;elTRF1jqEn_cHCgx#2|FgxA zDr0C?I@vgwW@YfD#{#xf^}K-i5wVjvauup&ushyAFh~5DzdEMD_K`wf8pT3pYM^O! z3Xid6q$)aq8Z06c?WS5RMlG4?5Y5Nqs3Qw~%S4u7siZWKq%?tLctTQ|Ks}>qlqS%? zmLAL5E+T!#eOhRy+43tc`Ev8(RI!X1*7MaMsXmDnlIpL%@_J1dhYZxj$ux5^E##yo zsY$jB;Yt#4p%G1-ss?HV8YNgWS|nJje}MD8Y3`bjsXC?HGBB#&?oDA;?xYs>kPvlR+`_ZNGXbWCSj|2;Hu=SIIU6#SV3%CdVr(oUjU`(W(g|IN&VbN6Rih=uo z94R`wLDw{kb-IDngl`;apejS2r+=<7%joHH8ph!OT}Sp@lhcr8%rcE5Pfu0moA7lw z&3T^d^h;vRo@*$$!cp|l+G)C+jD6hs`*~araQ`3VfjdOAVsx11(GecoqudC`sGW{e z7YW&GZE>1O$%m7Y4<{ubPDoxu3($jJ?%F!4L?74N$XJDVjx7@-=AfUSnh|0$S`Ww9 z56}!l;^6>4OiV`C-&X7SWVKu<5@Ug!*u(SVG?#pY>~x0Qbe3CtMDo`f{y%P+Fx}Jo zlVQ6lrjsL+U-mhf%g0foqjCBZljHI_PsT^k_@$LV3-HmReXKX>Vn+tbuhCDM7LZ!Rxh*6E zhS{gX3-XP@UcAUlwy|#orQjXD-;Q&f&&!Bmm%M*f-tWO{sM{+Yugl;43HLz=X}yV) ccspU8##v~xIJjPWXgfYx?8K+Ig3rkL7r)C_(EtDd delta 1758 zcmcIkT~L%|6n>uFZ@*nXmcLyVSlC^6S(X+Emjns<5lAU1NI}i$2SMalGz+BC3je4O zQSr^0GH1H9?rLlX(W$PSX6mX7FB)gM@TTd?3%Th=JKqbfGfkJZv)_E@{W;Hb&U4QB zuI~P>%lhfz&F=v;^OJ9^Q@K_KNz+R=Ju2cWiCSJ}&`TJTW5tFbPHr3_g%bP}oj8)9x7?GDO?;IbP9!O0L93DyS*grlrIMtYK z@}LC|C%o+EKn@2yd_(OEMLDHTgvvOru7$$6?^t}7$J{*b<$HXeC=-&P%C=0k5^8bH z5Id7SY}KJYD5;cC*T)O0?NIYIU{RW` zh;4jEZrjOayT$M-~Ho{JJ zX?Y?tDqTWqqL43ghuyz|vd+Oy$zH0)ow9VWTVm+pE=~BTbmPop!bz#d6moGC#h8|S zrZl0QB@jy!#<<(gL+{ztc0FR6+A01;n%dCRnNGQif6(s{`j=Me#ql(hkqD^Ui9*r! zw?wh-p8tVy@868{i#{G<9<2Blxs}U!;J`BeByQpnuq-3#5OYaP+ghfJXfQ(I(K=Va z748oj%Unm?U}l{eGy<-GxlF$k4enbk=nc9<;T!mM?au5HgI^1eleWMWG7!L=NO@MQ zd6~R(G9U|xVs+32X(=1)d$y9ufS%$%wCzB6l(d3 z)WjuVrF>N^6P+mFYjW!5>*8a#`|ABZxxaeWCugg}&G5e$Y+t%xf-?+BhPZF6$%Nk> zu=8~2JXbsSGiih?(nz06BVCn7y7C`3(oDLM_vBdir&szZDg1F6Jo}e%3t#p6xqb + + + + Détail album + + + +⬅ Retour aux albums +

+

Description :

+

Propriétaire :

+

Visibilité :

+
+ +

Photos dans l’album

+
+ + + +
+ Retirer +
+ + + + + +
+ +
+ +

Ajouter une photo

+
+ Photo ajoutée ! +
+
+ + + +
+
+

Gestion des partages de l’album

+
+ +
+ +
+ + + + + +
+

Utilisateurs ayant accès :

+ + + + + + + + + + + + +
UtilisateurPermissionActions
+
+ + + +
+
+ Retirer +
+
+ + + Supprimer l’album + +
+ + + + + diff --git a/target/classes/templates/home.html b/target/classes/templates/home.html index a5135cc..3442f17 100644 --- a/target/classes/templates/home.html +++ b/target/classes/templates/home.html @@ -7,6 +7,7 @@

Bienvenue sur FotoSharing

Uploader une photo

Voir mes photos

+

Voir mes albums

Voir la galerie publique

diff --git a/target/classes/templates/mes-albums.html b/target/classes/templates/mes-albums.html new file mode 100644 index 0000000..4f692aa --- /dev/null +++ b/target/classes/templates/mes-albums.html @@ -0,0 +1,70 @@ + + + + + Mes albums + + + +

Mes albums

+ + +

Créer un album

+ + + +
+ +
+ + + +
+
+ + +

Liste de mes albums

+
+ + + + +

+
+ + +
+ + + +
+ +
+ +

Albums partagés avec moi

+
+

Aucun album ne vous a été partagé.

+
+
+
+
+ + + +

+ Partagé par : + +

+
+
+
+ + + + diff --git a/target/classes/templates/mes-photos.html b/target/classes/templates/mes-photos.html index 569bc48..765dd54 100644 --- a/target/classes/templates/mes-photos.html +++ b/target/classes/templates/mes-photos.html @@ -10,7 +10,7 @@

Retour accueil

Mes photos privées

- @@ -26,7 +26,7 @@

Mes photos publiques

- @@ -42,8 +42,8 @@

Mes photos partagées

-
- +
+ @@ -76,6 +76,7 @@

Photos partagées avec moi