diff --git a/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java b/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java index 8e3b2c5..a0dfabd 100644 --- a/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java +++ b/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java @@ -18,6 +18,9 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + @Controller public class PhotoController { @@ -181,8 +184,13 @@ public class PhotoController { @RequestParam String permission, Authentication auth) { - partageService.share(id, email, permission, auth.getName()); - return "redirect:/photo/" + id + "?shared=ok"; + try { + partageService.share(id, email, permission, auth.getName()); + return "redirect:/photo/" + id + "?shared=ok"; + } catch (RuntimeException ex) { + return "redirect:/photo/" + id + "?error=" + URLEncoder.encode(ex.getMessage(), StandardCharsets.UTF_8); + } + } @@ -193,4 +201,18 @@ public class PhotoController { partageService.unshare(id, email); return "redirect:/photo/" + id; } + + /* ========================== MAJ MODE PARTAGE ========================== */ + @PostMapping("/photo/{id}/share/update") + @PreAuthorize("@securityService.canAccessPhoto(authentication, #id)") + public String updateShare( + @PathVariable Long id, + @RequestParam String email, + @RequestParam String permission, + Authentication auth + ) { + partageService.updatePermission(id, email, permission, auth.getName()); + return "redirect:/photo/" + id; + } + } \ No newline at end of file diff --git a/src/main/java/local/epul4a/fotosharing/mapper/PartageMapper.java b/src/main/java/local/epul4a/fotosharing/mapper/PartageMapper.java index d7b59c8..57cdfb2 100644 --- a/src/main/java/local/epul4a/fotosharing/mapper/PartageMapper.java +++ b/src/main/java/local/epul4a/fotosharing/mapper/PartageMapper.java @@ -4,17 +4,17 @@ 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.setPermission(p.getPermission().name()); 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/service/PartageService.java b/src/main/java/local/epul4a/fotosharing/service/PartageService.java index 6a4a4e4..1e36711 100644 --- a/src/main/java/local/epul4a/fotosharing/service/PartageService.java +++ b/src/main/java/local/epul4a/fotosharing/service/PartageService.java @@ -13,5 +13,5 @@ public interface PartageService { boolean canView(Long photoId, String email); boolean canComment(Long photoId, String email); boolean canAdmin(Long photoId, String email); - + void updatePermission(Long photoId, String targetEmail, String newPermission, String ownerEmail); } 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 e37e73e..c4bad8d 100644 --- a/src/main/java/local/epul4a/fotosharing/service/impl/PartageServiceImpl.java +++ b/src/main/java/local/epul4a/fotosharing/service/impl/PartageServiceImpl.java @@ -40,29 +40,25 @@ public class PartageServiceImpl implements PartageService { @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; - + // Nouveauté ici : renvoyer un message explicite + if (partageRepository.existsByPhoto_IdAndUtilisateur_Email(photoId, targetEmail)) { + throw new RuntimeException("Cet utilisateur a déjà accès à cette photo"); + } 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) { @@ -121,4 +117,28 @@ public class PartageServiceImpl implements PartageService { return partage.getPermission() == Partage.Permission.ADMIN; } + @Override + 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 + 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) { + 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); + partageRepository.save(partage); + } + + } diff --git a/src/main/resources/templates/photo-detail.html b/src/main/resources/templates/photo-detail.html index 674152a..0683902 100644 --- a/src/main/resources/templates/photo-detail.html +++ b/src/main/resources/templates/photo-detail.html @@ -31,21 +31,34 @@ -

Partagée avec :

- - - +
+

Partagée avec :

+

Partager la photo

+
+ +
+
+ Partage effectué avec succès ! +
diff --git a/target/classes/local/epul4a/fotosharing/controller/PhotoController.class b/target/classes/local/epul4a/fotosharing/controller/PhotoController.class index 4ee2d5a..9485a1e 100644 Binary files a/target/classes/local/epul4a/fotosharing/controller/PhotoController.class and b/target/classes/local/epul4a/fotosharing/controller/PhotoController.class differ diff --git a/target/classes/local/epul4a/fotosharing/mapper/PartageMapper.class b/target/classes/local/epul4a/fotosharing/mapper/PartageMapper.class index cbf2e4c..14f05df 100644 Binary files a/target/classes/local/epul4a/fotosharing/mapper/PartageMapper.class and b/target/classes/local/epul4a/fotosharing/mapper/PartageMapper.class differ diff --git a/target/classes/local/epul4a/fotosharing/service/PartageService.class b/target/classes/local/epul4a/fotosharing/service/PartageService.class index f8a7628..58de303 100644 Binary files a/target/classes/local/epul4a/fotosharing/service/PartageService.class and b/target/classes/local/epul4a/fotosharing/service/PartageService.class differ diff --git a/target/classes/local/epul4a/fotosharing/service/impl/PartageServiceImpl.class b/target/classes/local/epul4a/fotosharing/service/impl/PartageServiceImpl.class index c76cfe2..57dbd95 100644 Binary files a/target/classes/local/epul4a/fotosharing/service/impl/PartageServiceImpl.class and b/target/classes/local/epul4a/fotosharing/service/impl/PartageServiceImpl.class differ diff --git a/target/classes/templates/photo-detail.html b/target/classes/templates/photo-detail.html index 674152a..0683902 100644 --- a/target/classes/templates/photo-detail.html +++ b/target/classes/templates/photo-detail.html @@ -31,21 +31,34 @@ -

Partagée avec :

- - - +
+

Partagée avec :

+
    +
  • + + + + + + +
  • + + Retirer + +

Partager la photo

+
+ +
+
+ Partage effectué avec succès ! +