From 109cc8065e03142e7cb3a094638031d909afa825 Mon Sep 17 00:00:00 2001 From: Subivas Date: Mon, 1 Dec 2025 22:30:22 +0100 Subject: [PATCH] FEAT : ajout partage simple --- .../controller/PhotoController.java | 45 +++++++++++++++++- .../repository/PartageRepository.java | 15 ++++++ .../fotosharing/security/SecurityService.java | 38 +++++++++++---- .../fotosharing/service/PhotoService.java | 2 + .../service/impl/PhotoServiceImpl.java | 16 ++++++- src/main/resources/templates/mes-photos.html | 27 +++++++---- .../resources/templates/photo-detail.html | 14 ++++++ .../controller/PhotoController.class | Bin 7395 -> 9357 bytes .../repository/PartageRepository.class | Bin 0 -> 838 bytes .../security/SecurityService.class | Bin 2179 -> 2396 bytes .../fotosharing/service/PhotoService.class | Bin 783 -> 827 bytes .../service/impl/PhotoServiceImpl.class | Bin 5731 -> 6750 bytes target/classes/templates/mes-photos.html | 27 +++++++---- target/classes/templates/photo-detail.html | 14 ++++++ 14 files changed, 169 insertions(+), 29 deletions(-) create mode 100644 src/main/java/local/epul4a/fotosharing/repository/PartageRepository.java create mode 100644 target/classes/local/epul4a/fotosharing/repository/PartageRepository.class diff --git a/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java b/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java index b69d74c..9858654 100644 --- a/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java +++ b/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java @@ -1,8 +1,11 @@ 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.service.CommentaireService; import local.epul4a.fotosharing.service.PhotoService; @@ -11,6 +14,7 @@ import org.springframework.core.io.PathResource; 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; @@ -20,6 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.nio.file.Files; import java.nio.file.Path; +import java.util.List; @Controller public class PhotoController { @@ -27,11 +32,15 @@ public class PhotoController { private final PhotoService photoService; private final PhotoRepository photoRepository; private final CommentaireService commentaireService; + private final UtilisateurRepository utilisateurRepository; + private final PartageRepository partageRepository; - public PhotoController(PhotoService photoService, PhotoRepository photoRepository, CommentaireService commentaireService) { + public PhotoController(PhotoService photoService, PhotoRepository photoRepository, CommentaireService commentaireService, UtilisateurRepository utilisateurRepository, PartageRepository partageRepository) { this.photoService = photoService; this.photoRepository = photoRepository; this.commentaireService = commentaireService; + this.utilisateurRepository = utilisateurRepository; + this.partageRepository = partageRepository; } @GetMapping("/upload") @@ -84,7 +93,13 @@ public class PhotoController { @GetMapping("/mes-photos") public String mesPhotos(Model model, Authentication authentication) { String email = authentication.getName(); - model.addAttribute("photos", photoService.listByOwner(email)); + // photos que je possède + List mesPhotos = photoService.listByOwner(email); + // photos partagées avec moi + List photosPartagees = photoService.listSharedWith(email); + model.addAttribute("mesPhotos", mesPhotos); + model.addAttribute("photosPartagees", photosPartagees); + return "mes-photos"; } @@ -95,6 +110,7 @@ public class PhotoController { } @GetMapping("/photo/{id}") + @PreAuthorize("@securityService.canAccessPhoto(authentication, #id)") public String viewPhoto(@PathVariable Long id, Model model, Authentication auth) { @@ -126,5 +142,30 @@ public class PhotoController { return "redirect:/photo/" + id; } + @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); + return "redirect:/photo/" + id + "?shared=ok"; + } + + } diff --git a/src/main/java/local/epul4a/fotosharing/repository/PartageRepository.java b/src/main/java/local/epul4a/fotosharing/repository/PartageRepository.java new file mode 100644 index 0000000..845a5a4 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/repository/PartageRepository.java @@ -0,0 +1,15 @@ +package local.epul4a.fotosharing.repository; + +import local.epul4a.fotosharing.model.Partage; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface PartageRepository extends JpaRepository { + // liste des partages pour une photo + List findByPhoto_Id(Long photoId); + // vérifier si un utilisateur a accès partagé + boolean existsByPhoto_IdAndUtilisateur_Email(Long photoId, String email); + List findByUtilisateur_Email(String email); + +} diff --git a/src/main/java/local/epul4a/fotosharing/security/SecurityService.java b/src/main/java/local/epul4a/fotosharing/security/SecurityService.java index ceb6f8d..39f20fb 100644 --- a/src/main/java/local/epul4a/fotosharing/security/SecurityService.java +++ b/src/main/java/local/epul4a/fotosharing/security/SecurityService.java @@ -1,29 +1,47 @@ package local.epul4a.fotosharing.security; import local.epul4a.fotosharing.model.Photo; +import local.epul4a.fotosharing.repository.PartageRepository; import local.epul4a.fotosharing.repository.PhotoRepository; import org.springframework.stereotype.Service; +import javax.naming.ldap.PagedResultsControl; import java.util.Optional; +import org.springframework.security.core.Authentication; + @Service("securityService") public class SecurityService { private final PhotoRepository photoRepository; + private final PartageRepository partageRepository; - public SecurityService(PhotoRepository photoRepository) { + public SecurityService(PhotoRepository photoRepository, PartageRepository partageRepository) { this.photoRepository = photoRepository; + this.partageRepository = partageRepository; } - public boolean canAccessPhoto(org.springframework.security.core.Authentication authentication, Long photoId) { - if (authentication == null || !authentication.isAuthenticated()) return false; - String username = authentication.getName(); // email - Optional p = photoRepository.findById(photoId); - if (p.isEmpty()) return false; - Photo photo = p.get(); - if (photo.getVisibilite() == Photo.Visibilite.PUBLIC) return true; - if (photo.getProprietaire() != null && photo.getProprietaire().getEmail().equals(username)) return true; - // TODO: vérifier table partage + public boolean canAccessPhoto(Authentication authentication, Long photoId) { + Photo photo = photoRepository.findById(photoId).orElse(null); + if (photo == null) return false; + // PUBLIC → accès total + if (photo.getVisibilite() == Photo.Visibilite.PUBLIC) { + return true; + } + // Pas connecté → rejeter tout sauf PUBLIC + if (authentication == null || !authentication.isAuthenticated()) { + return false; + } + String email = authentication.getName(); + // Propriétaire → OK + if (photo.getProprietaire().getEmail().equals(email)) { + return true; + } + // SHARED → vérifier dans la table PARTAGE + if (photo.getVisibilite() == Photo.Visibilite.SHARED) { + return partageRepository.existsByPhoto_IdAndUtilisateur_Email(photoId, email); + } + // PRIVATE par défaut → refus return false; } } diff --git a/src/main/java/local/epul4a/fotosharing/service/PhotoService.java b/src/main/java/local/epul4a/fotosharing/service/PhotoService.java index e323662..fa34a51 100644 --- a/src/main/java/local/epul4a/fotosharing/service/PhotoService.java +++ b/src/main/java/local/epul4a/fotosharing/service/PhotoService.java @@ -11,5 +11,7 @@ public interface PhotoService { Path loadAsPath(String uuidFile); List listByOwner(String email); List listPublicPhotos(); + List listSharedWith(String email); + } 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 41463b2..af63d93 100644 --- a/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java +++ b/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java @@ -1,7 +1,9 @@ package local.epul4a.fotosharing.service.impl; +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.PhotoService; @@ -24,10 +26,12 @@ public class PhotoServiceImpl implements PhotoService { private final PhotoRepository photoRepository; private final UtilisateurRepository utilisateurRepository; + private final PartageRepository partageRepository; - public PhotoServiceImpl(PhotoRepository photoRepository, UtilisateurRepository utilisateurRepository) { + public PhotoServiceImpl(PhotoRepository photoRepository, UtilisateurRepository utilisateurRepository, PartageRepository partageRepository) { this.photoRepository = photoRepository; this.utilisateurRepository = utilisateurRepository; + this.partageRepository = partageRepository; } @Override @@ -69,4 +73,14 @@ public class PhotoServiceImpl implements PhotoService { 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(); + } + } diff --git a/src/main/resources/templates/mes-photos.html b/src/main/resources/templates/mes-photos.html index 860c13c..ddc7150 100644 --- a/src/main/resources/templates/mes-photos.html +++ b/src/main/resources/templates/mes-photos.html @@ -5,23 +5,34 @@ Mes photos -

Mes photos

- +

Mes photos

Uploader une photo

Retour accueil

- -
+

Vous n'avez pas encore de photos.

- -
    -
  • - Nom du fichier + +

    Photos partagées avec moi

    +
    +

    Aucune photo partagée.

    +
    +
      +
    • + + [SHARED] + — + Voir +
    • +
    + +

    Galerie publique

    diff --git a/src/main/resources/templates/photo-detail.html b/src/main/resources/templates/photo-detail.html index cf951ff..a9beead 100644 --- a/src/main/resources/templates/photo-detail.html +++ b/src/main/resources/templates/photo-detail.html @@ -29,6 +29,20 @@
  • Propriétaire :
+ +

Partager la photo

+
+
+ + + +
+
+
+ Seul le propriétaire peut partager cette photo. +
+ +

Commentaires

diff --git a/target/classes/local/epul4a/fotosharing/controller/PhotoController.class b/target/classes/local/epul4a/fotosharing/controller/PhotoController.class index dcde4f9d3e70be42137288e8e0b388e03e40d8b6..f4ef0c09c4bae2bb3acdfe542edfbd8868d173f3 100644 GIT binary patch literal 9357 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 T@U_yIxVv$Q7#4@cDAL~pW+Z@A delta 2932 zcmZWr3w%@68ULT;CigbEO=zVCeB z_y7LicXIdISC_d?oEd)#K#M3m>e?Zy43rBvcMZf6;T|`p!>6Ot#0*pkG|7|RCK;v!%4p zat2HUaj_h?uktiufsTbH7GbeKmAp=?l5@3di!TvyB_lo2WTZPCYSeM59Mq;ag#;Xt zWHOO-VJR*%(V`r4^+wX|S%Yp|jukpqnrOu;fkl>Y!6H*WQsj|t$EEHoaHWo`Osv6L z+2L60X~Wez+D&v|y}(>rFO?IeCGvU4I`;-#qhq6qP1r1FId7_~N0*6fl|c^;Zr&B` zxiZ?_7mXy{n2C3p*oJq@VP{C}kQ2_}!tJ=ugacuLig{P>4DSv%#-oYG8=|pDV`n(s z*F1lV8{O#95ixNCdKEaz`2NyqGNl*Kj|xl=4-CYj-QjdJ5pPU%rz7cLDxHjk`(3yZ zF&+IT;z-Dc^({slZZeTXO1h1eo?Y0j<7N}@#VrE0xsV+4DWgE{Gdetbu}{Z-6SpFx z0Ln*v*4U%HFYm=fsblq;bb4S-B-|58rVPAapk!4do{q%R!PU{!Kq3`YZt3`dz%(nm zSUBF>xG|lK#(P!P?=W$I*?h5}s^CtQ>$?Q%<)Bd}OI;<#UfgZs9^5M%UH#s@IB4QN zNCEBoL=RnVkqJjx-mi*g10NwH2l^7}L`ot3F%uuhC*)hMC6xv~$?TJB!Kv*}nfNq5 zBky(l*B>Ggd&99vG8!@Pd4b|7K20t^L_%501`Z3D-HHBw#uz5;XzU2Stm7*tzKVzQ zTxu7Uve{g+;!y#2_pW4;!kbf(q=BQL9^i%d9bwHhTq8}r6)ZF46)M!K%i%yTv=8o2g^F; zRpqbALlt+)Bhz~};eP^!o2{~~S>IL@su2cG3zSCVv1mNfT%(8=5BEn}YDKMqGv|R} zx!ov=oCH${Vbg`3DHEDJ<$FUb5SSy+_~zJk;g%DXi!ye2;fBec;YAUqSz`%GIT|3C z7=sPt{EBhZIF|a4LHHYnq5A{FDD(%1QGAr^Hax+1IW>TbC|QF7HWUwPQGz;rovZ$= zKAwc?P&`T5&CrOND$_P=ri|P14bBVglmNHDGeE(oQI+#1$S>0{ORhMLz+aN};`f1d+2adxW#kw(c3JfV610&cnhOIVqJb~?7 zgU9fmkml3IaJ|3-=ZJdyLXO}lc7_~>;RrcLG2nBIB0YvZHh6E-p2Y22?L6v(3(w_0qzi~zQfm&?h@mCQ>k_g8av1=jJ_=-_)3+OQSv z*uk#^I@xH~<2G!-9b8kqT}}|e_Lt}F0lb7?(V7>#@eq?_Azjo%Rc z4usg0RW?-~E{1kmU9{AFI=auY=$twX9j|gZyQbrI2&PL|`Em$a0)EfOhSzW* ziT?nVDwCyz5<-%H)Rt%Q15*X$vFNjf zeCP#UQM}DoZGp{VmSWh29{-u{9l~F7?zMAN)Gf>T zHHHU8-mTA0x#hBiwiECjmP_SXrAe2{a4JK>Pl9FV{oGK%`vt`=RqFxo7b#dw!7t^33qA`o+bs@5%ZQL8;C)2(3#&B@ zDetr8U(31%e-o6Tmp{Pz_~YwF)_DxeNVc^YApMf((5!1Rs;(T(=%WR>0;&rWR*jdC z!isttPw?PTJeSGQtPu9om_a`IS12y!x~O820%d~Fg*o|$#Ui(z_`FU5^(T0zy^%xe z9*(N1*98?SUmMDGNX^2-r;%BYYsfT=V-zgHeAL;C;1=rcAwl-BiSK9gzSW9!arV5) zNb4pet;3tSZdR9zw1~HX;#Rhs(MSEB0>QBR4eB1CZ w3kY>%{F~qZ;iGPyv;6+A_5Q#0ep{%>E4i})ZNlj+z+R5Jvp^WaB~19<0q+S?Q~&?~ diff --git a/target/classes/local/epul4a/fotosharing/repository/PartageRepository.class b/target/classes/local/epul4a/fotosharing/repository/PartageRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..936e85a2d3fcdcdad08fb067fa610f82ffecbf8b GIT binary patch literal 838 zcmbVK%TB{E5L~B}P#)!7?x;xgf-i6iAb|uDC_qKUg-c}`H+6C2$Z>$4`6~{503U_e zB$Pxdh{C~&vfiB;&(7QX%PRmJK+Oh=z@AhcCMgeNxyxu*85Q-I7J*MS4^-Ncj2}xjUjJ5ElmPt%< z8n*<>JnP@cO!x+=UPKyAj{9*rLEE1m`dkp4ZP{`Ewc&|b3xw&`6T4?yD%Kr-DkQG5 zHWtU7Bq*3Y0wp|UjCTq1X~PUyP{F@4BH(8Zj|KC1wE$IYOs*IvBwyCCcbxoVmHk0YNo=j~qbQ|BrfcL0BD#L|x2^AcbsA7m1Kg5XfkoCwl za7(D=IEFgoGpqL4lBrlCtuX|e$Jf<+YB-^8tc9nR*R>Tr`dFy6)HC=f+ihe-Tgmk8 zq@HxZg9Z*S8jWFL#OZ@yLV)80ni;}>Lyfn>M6nD7K?xy_R-D}aGEt=96h|A{jR5mH z%sL$$o#-;k#h9}PrzP}qMA6Qm9Mq|o`*2pmIgWk|7|+CxCOdpM&oN|nv(1hS%*2Ld zT)?n|5sp!eF?3R{fB7gS1Vg(YPwVNytvrgQ(ba*C)pZv$+S{50S#y7FcWZzb3_0nM(WyT|GTdh?qRC4{7XjItVWCZ#f8Jzyu zW&SH^0Ss1LBt1^ItE5HJCCY0sCAbSo3GJfzc|LH0qze|3U$rw?|b3X|k%D5PNu z({!T(`8F(XnT-ToB0FOj$Zx)a+RkA1pzTk}wvta%UO@`&p^T==q53^MldT_N6|=25 z9DjkP9at^d;0N&F9$FZlnoneg8G0=g63L<4ZOP%x6Em)mGq{6Ns#+X!TlSENiO7ms z>LkKM)1IfoO{i*7gE}zd%RC4Uz(GVu`d& Vb#Kv8(^#ef00&)sH0Wx-`w!;Dva$dG delta 787 zcmX|e9rYpvKdZILVy*_n!BhoUguzHLlNpcRv6_%sqDPdfa%a zGO4zx!Ds(+OjLOBThtM-N3_;zHw^?$8Z8dcq=?!-^r$_j`e$1>XmZG+6`#Vll)j&i zY!tG&$W*?NU0q4%6lQjPY&l=pbkV|Li*}AEw8cz8;qUB9mS5!3D~pk-`K8Q4VbJ8L zqFwNV_6w)m<)VWwix6SE*)i_!;h0Ip;y5SlykoVTj#~6`%FbzH-ah(GPFoBRP=v}L z&$Jr*r{;0T88S&&oMG5jdatJFx4-GJ*GVIxDl0bDGixj9<&6EwS#PMkaI+sMzx~J= zZ44w=7t*y1LyQVIKu^Zk}=0XLRx)`7xcMD$tl z&Wm=4c7@)dLgBZVFUvKfBE4v3sZ&KI)tnPAuwTuXyexgLGOFT&*oG1Zfgk7MKD;V{ zJ0-T23h!Zsckn2lVrbi9)+#1LZ!o)esCO`+2lXP&PfE#>)%KB&0V8M>>3l`^a}0gE zff$?3=9mm3^E(Ja+&z~ax#lcf-@3}Qd7b+OEM;xGU+g~PF}>6%)-LR UAUXLSlQff$?3=9mm4AL99a+xM~FljNeOy10t%*DXSAPJOUVvqs=`uz!7 diff --git a/target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class b/target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class index fdb9a56da8aa78410fa42c95fb38301eea30f2bc..0e8cfba62e808c1234e9e066eb137aac28e65028 100644 GIT binary patch delta 2599 zcmaJ@33yyp75>j`@6DS#naQL{J4v&(v`wZ7L+F-HT2g@qilIrHbO}XpNG8dnlbJX( zsT3(=T~QGzSJ`CMDvMgX&}7nDs9K8RQgLAutB4zdT6aM#ocrFiM)>s0yt((Cciw;g z^WSsM0{u2-nD12+M@YsQ%x zq5@~3MP?j}s++MuU?JuZ^jx|pmoZaAAvtk)n!S8FR=?#goco zRNy_zql7)yjhO>Q7Xw-3G>i#s!FvhQWxY0C9{0@EO>7mo8t;=rYbn`=Yc=Er-jD6- zB-eP(kcTy&yjtsJzYhw02p^VDX{$;;it99dOyJ}A1Ys%rg?H@o$%Ud^4(iK&pHw2= zK&WkKlyB(OegijQhlZO4Bt9jd(feGt5F-3mt-QzUGZgFF1a8M2()4ze+=;t1+%0eq z?jA)_zo!!CS9!)}2+ z*hyGqLx}uaE0gsO(d&i_2Lt*W5-VOt0eObQ&pL4rFzI+{;%8?hu)UKkup^{bYMb`&?< zOo#A@hDQYs<7-Ute}EI5Bk@r}Ys3FVn;I+IYSB8yP6hggz!5yg>EzOOUZMYDr)+IH z9+zR?OxL#v%}Pjlx6tJ!zH1#1HP{oON(Mw*aX5HviTAaO#~rdN(0&0U^bE%{iGdAf zZkT(sI9RgWfK!NDfe00y>Hc_feLQ2vuSh0(w~i)y)rJt0HG!5Qw(JQ=<2BBonkk6a z<%vM$oRbC*uQvq#g1-jU=iY#uoCdkbt&vBNMmk|Gldmhc`7x29M6P={ol6rM8su62 zd0LPRLbuAP{#2x>zo9hXAz_f8N;C@aETN!m3?2zk$e=Qsrct?|3Yxy}^zlzaNczQi-4Fr@-UV<4`F!$?J-Z-!`qbwTyO{c*8buG zx;BJ8VfQ3@9EfQQ)JF(wu0wcNpK~uR?aF3b0ITxp;;5k;l z^El%OYA_$o{1?NS=;j}pO=#h%x`5~8LTu-ZuES!UX-hc$R_w-7Oz;sap$BbkP79qs zil^}m3&?`uS*`-5^ie#=J0}Nu06*cKiv!(`=XvMmfY;-vIL;z(!e;!8cNz!n#Lw{p z*Z6Ke=3n4NKHy(6P5_RwlUSx0wut$D+N$%B#ZmKAl$xzhSy$#c>ngDEQxEr(GmyFT(rsN^Azc@9n@V zrvUp-1N-pORN$8w_;(hgmpQ;Ic#MG+|0TRCQT+;kFFrqs2j3pyB0Q<`7q(|HgpKxl zw*BEW-R+F#WY2m=D`mD{cHrWsN$e#a-UVP1U*$=TuahN?T`YFHb#a@l;WJswlJ{`q zt+8^dv%yqA6`yg7NvZ#7{)iJC?N4k~yll&#*`nHxm7J1r&`<-7om9fJEKI<#y6q@; zn>r}63fDfURzCW_vCV|Kw{X&r3CWUZqk7`WOC9P&* Q8%zqX2va4^q#A_Z1bG=b1poj5 delta 1765 zcmZXUcXU)m6vltE?Y-TdO~NJt7gA_~2?;@I5kUhMOFk2$pQOTqGVcRX|m~PmZ|bVrzkR~*UYaeNj8*>9y@A5ZDLkqvZ3ClvqD!SYo{d> zbGpt?)+Iu8B1hvVSCMVjhO)xr9JG8*SGt+ro|146dRm;S=|yi-&#kfi7cixH*llrYmZL5nOiJw)hyvQ#Sr0+nbr2h zz#Wb#cN!J!8D7fW7RxmEaIfhXjQj3a6w1DQ^FlBpSPy6(qc$_Li@uE~$SjLy6y*!t7Qm$dNIHRPKA!9%m{H&J` zHpnb4qgTfC!Y!!6KAW)$i#8KkFD?%orH|s1K1cdog5;4#KAXhTwf!?T)0~p2AhTFEu7X& z-TyR+|5c9V()u&qGff76Gc#g#3-!%3#_XaN7Bq9ckVT4Hxyi#;Zii;> z+QogPLD?Q`#>lD_vs+p2VONU8I?2WB>UEZzYY#HzNywu&#S~CVAyx7uOpw`ZN?0T> z!i|#B?VQ2Aa^6i0kb@d1f(>@Hozkw2qpjeIN)p00(a*77kyG}#)^@SH!tqRs9b)^P$lX1%&+?3?w#1TFY9A@8%!24wJ9cdok6@vG8Uo0nq z!7@70MI3?+Jle{WCsS0oq3iaI#~9kdKFA0;7nla+qIH+BonOc;Bp=AZF{;C#+OzT(I+|3Z0ke;*O!5B}mGV*djscVj*P diff --git a/target/classes/templates/mes-photos.html b/target/classes/templates/mes-photos.html index 860c13c..ddc7150 100644 --- a/target/classes/templates/mes-photos.html +++ b/target/classes/templates/mes-photos.html @@ -5,23 +5,34 @@ Mes photos -

Mes photos

- +

Mes photos

Uploader une photo

Retour accueil

- -
+

Vous n'avez pas encore de photos.

- -
    -
  • - Nom du fichier + +

    Photos partagées avec moi

    +
    +

    Aucune photo partagée.

    +
    +
      +
    • + + [SHARED] + — + Voir +
    • +
    + +

    Galerie publique

    diff --git a/target/classes/templates/photo-detail.html b/target/classes/templates/photo-detail.html index cf951ff..a9beead 100644 --- a/target/classes/templates/photo-detail.html +++ b/target/classes/templates/photo-detail.html @@ -29,6 +29,20 @@
  • Propriétaire :
+ +

Partager la photo

+
+
+ + + +
+
+
+ Seul le propriétaire peut partager cette photo. +
+ +

Commentaires