From 96c060e206e38bae7eb84628e54cdc4f50529980 Mon Sep 17 00:00:00 2001 From: Subivas Date: Wed, 3 Dec 2025 14:36:52 +0100 Subject: [PATCH] =?UTF-8?q?FEAT=20:=20ajout=20de=20la=20suppression=20en?= =?UTF-8?q?=20cascade=20d'une=20photo=20(suppression=20de=20ses=20commenta?= =?UTF-8?q?ires,=20partage,=20pr=C3=A9sence=20dans=20des=20albums,=20et=20?= =?UTF-8?q?du=20fichier=20/opt/........?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PhotoController.java | 20 +++++++++++++- .../local/epul4a/fotosharing/model/Album.java | 2 ++ .../local/epul4a/fotosharing/model/Photo.java | 3 ++ .../fotosharing/service/PhotoService.java | 2 ++ .../service/impl/PhotoServiceImpl.java | 26 ++++++++++++++++++ .../resources/templates/photo-detail.html | 11 ++++++++ .../controller/PhotoController.class | Bin 11295 -> 12049 bytes .../fotosharing/model/Album$Visibilite.class | Bin 1389 -> 1389 bytes .../epul4a/fotosharing/model/Photo.class | Bin 4401 -> 4924 bytes .../fotosharing/service/PhotoService.class | Bin 1323 -> 1378 bytes .../service/impl/PhotoServiceImpl.class | Bin 11714 -> 12801 bytes target/classes/templates/photo-detail.html | 11 ++++++++ 12 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java b/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java index d906e75..7ed7633 100644 --- a/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java +++ b/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java @@ -163,7 +163,10 @@ public class PhotoController { model.addAttribute("partages", partageService.getPartagesForPhoto(id)); - + boolean isOwner = auth != null && + photo.getProprietaire() != null && + auth.getName().equals(photo.getProprietaire().getEmail()); + model.addAttribute("isOwner", isOwner); return "photo-detail"; } @@ -230,6 +233,21 @@ public class PhotoController { return ResponseEntity.ok().contentType(MediaType.IMAGE_JPEG).body(r); } + /* ========================== SUPPRESSION PHOTO ========================== */ + @PostMapping("/photo/{id}/delete") + @PreAuthorize("@securityService.canAccessPhoto(authentication, #id)") + public String deletePhoto( + @PathVariable Long id, + Authentication auth) { + PhotoDTO p = photoService.getPhotoById(id); + if (p == null || !p.getProprietaire().getEmail().equals(auth.getName())) { + return "redirect:/mes-photos?error=forbidden"; + } + photoService.deletePhoto(id); + return "redirect:/mes-photos?deleted"; + } + + } \ No newline at end of file diff --git a/src/main/java/local/epul4a/fotosharing/model/Album.java b/src/main/java/local/epul4a/fotosharing/model/Album.java index 66a0c73..4014680 100644 --- a/src/main/java/local/epul4a/fotosharing/model/Album.java +++ b/src/main/java/local/epul4a/fotosharing/model/Album.java @@ -44,6 +44,8 @@ public class Album { private Set partages = new HashSet<>(); + + public enum Visibilite { PRIVATE, SHARED, diff --git a/src/main/java/local/epul4a/fotosharing/model/Photo.java b/src/main/java/local/epul4a/fotosharing/model/Photo.java index ef6872a..58a7896 100644 --- a/src/main/java/local/epul4a/fotosharing/model/Photo.java +++ b/src/main/java/local/epul4a/fotosharing/model/Photo.java @@ -35,6 +35,9 @@ public class Photo { @OneToMany(mappedBy = "photo", cascade = CascadeType.ALL, orphanRemoval = true) private Set partages = new HashSet<>(); + @OneToMany(mappedBy = "photo", cascade = CascadeType.ALL, orphanRemoval = true) + private Set commentaires = new HashSet<>(); + @Column private String uuidThumbnail; } diff --git a/src/main/java/local/epul4a/fotosharing/service/PhotoService.java b/src/main/java/local/epul4a/fotosharing/service/PhotoService.java index 16dfc55..4f0a9fa 100644 --- a/src/main/java/local/epul4a/fotosharing/service/PhotoService.java +++ b/src/main/java/local/epul4a/fotosharing/service/PhotoService.java @@ -19,6 +19,8 @@ public interface PhotoService { Page listSharedWith(String email, int page, int size); Page listSharedPhotos(String email, int page, int size); List listAllPhotosOfUser(String email); + void deletePhoto(Long id); + 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 b106a90..6478337 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 jakarta.transaction.Transactional; import local.epul4a.fotosharing.dto.PhotoDTO; import local.epul4a.fotosharing.mapper.PhotoMapper; +import local.epul4a.fotosharing.model.Album; import local.epul4a.fotosharing.model.Partage; import local.epul4a.fotosharing.model.Photo; import local.epul4a.fotosharing.model.Utilisateur; @@ -185,4 +187,28 @@ public class PhotoServiceImpl implements PhotoService { .toList(); } + //============= DELETE PHOTO ============================= + @Override + @Transactional + public void deletePhoto(Long id) { + Photo photo = photoRepository.findById(id) + .orElseThrow(() -> new RuntimeException("Photo introuvable")); + //Retirer la photo de tous ses albums + for (Album album : photo.getAlbums()) { + album.getPhotos().remove(photo); + } + //Supprimer les fichiers (original + miniature) + try { + Path original = Paths.get(uploadDir).resolve(photo.getUuidFichier()); + Path thumb = Paths.get(uploadDir).resolve(photo.getUuidThumbnail()); + Files.deleteIfExists(original); + Files.deleteIfExists(thumb); + } catch (IOException ex) { + throw new RuntimeException("Erreur suppression fichiers", ex); + } + //Supprimer la photo en base & supprime aussi commentaires + partages via cascade + photoRepository.delete(photo); + } + + } \ No newline at end of file diff --git a/src/main/resources/templates/photo-detail.html b/src/main/resources/templates/photo-detail.html index 0683902..9ca2aa5 100644 --- a/src/main/resources/templates/photo-detail.html +++ b/src/main/resources/templates/photo-detail.html @@ -29,6 +29,17 @@
  • Visibilité :
  • Propriétaire :
  • + +
    +
    + + +
    +
    + diff --git a/target/classes/local/epul4a/fotosharing/controller/PhotoController.class b/target/classes/local/epul4a/fotosharing/controller/PhotoController.class index 1e55b3536f975c5511733937dcc8186c72f97e2d..fada8ab6a67fb2856dc21439857474d838c44a10 100644 GIT binary patch delta 3441 zcma)8YjhOl8Ghc`%j{*cn{3EsH%m6ekdSOPi;|!r0fHD}0~KfpB2;Q%*RYsm<8C6Y z)~;IY#nRL`&{peFe<}9#M--dGa!z~N+R}6U)4Od^x_G776a+2y5^3M>n`N@;fu8>O zX1@7m-tT*!=e^C-+a`CqUb%GahX7X66EC>VYBetO;MW>{gWnRogYmIVspM!X5g!{! zq~e6=68*d-6zU&K3?5>h5J58N7 zBu5528n-%V0U>zBjSb_Nz*VkM1y$B)JGRyuzr)USf8w}cGYc2Chr;_Rq5OMM0LO01A>jNfkJiq+3GMY z)&rrCx1Qs>6*j&GsDYN~H;2NRMt&->!p%1?k5V2LJcyc5Bg}ao;mwHe7N38LZwf8u zt6eTFBeADuycT=1Wtdm^d}`(q*#SyZ3(umo6jr(2^RTit(Ae}6RQ*Eex{TPbT;l44 z4=YiIRSaS^>d__lU&Y^7z(?28b@Ho5<0P>MEu&U>dLy;bawu}`db$A?IcujCd};^J z8E?PJ-y3{s83S$OaXpWo_5#$MbEs)0+tpZkVU<`+vyqr8V%kQl)6~W9*_77MjjVQ^ z{$9-vR(jo{Xhx{g#5{ps6KgN6rJES5o0&~fH)E|w9j&7tSR_IZlvz}&=$S=G#U_c= zMzoesxS2On=o43vwpW5w*+H~kV%b2SgjKlx;-dE%%<0%i$@W3E^^hhGznPj)a&ZWO5|Lw8M#4X(LOm!jI#4gf_u}Moi-X&zxw-vzXwS z3%xjmM|tMXpbrP|7;T0|pW=-~1RAD&rfHvP+Gm>fu~LTR7Pb_A^V@NdZ%^`gipMjo zjPPHf`{shKUn+C09qoqy*k4DuPu{)ZHM1(4nM+SoWS!qgYQbdqsCb#-8}(@i4F6&Y>`lefTlYoH&u;I`9ThU8Zb? z=}y>Xt^{G5#R8ctYgF9ZrQ)?q$nce@i=?n6R+%|M+`<^C;5?d(kXp1Zo?e09<%O!NK7{w$&uZ01Y8Hv710OQ9v-6@fsYY1j$Yy#Q)jBJH1EL{J= zi}>&;{&`H4?fRIC6g}$<-JpCMBOq$!AcKh&eCU@}UCpWoOKV&0gt@B9WGc zFO2J5_Pi@58mls-N?%+dN?vEZPf92Sy_i{uu55G&F%uIkcl#k>%ctDbb>vr^%&HG(}}4tme88yv1t1jdHw$5dUsQ za2m@wA6Daxq-9ja&8EVe^R(Ppmv4NLd5zBt%Ph({nH~SL^JV_)uVO@cp`i7ZP%a0}PQ@(7nkE{4srG;&FN0%|E0NtWR(c@>mWsYq%gJ&a$H3(WNc z)Z)Vo_v?#TijN9NwwfecP2aUjKPhb1$UlqSyqWm_aEk6;%OuUZFB~XJlZdbRnQ-@f zzd4OS%kX!_iuk4ExD(;OlR1j;4~E%AWg-W}JxhKCM{y`i3%Rzx!0(M8Hlsu(P=&n( zc@Q)S1Z9gBg(4_nizFM9*5eYQy_b)@hw<*?#cF=}Ff;os-Anh=0e+K_*9YbGi}V3$g6#mX^ubp}AbOvZU(`h?EX_-#jQ9+af0xDKo6e{3`qJ@^yiY>Oq1(y*+ zVq%O@AO5mI;txdP4;Iq^i3@x7RiusL|3C=d~or&-9gEgt-bOS$`_!;k6D@#h-@QaCG z5f_wncMUDy(9^kW?S^Yt^%0*RE%?pE@A!jA_;F#UAUrj(sJG+#j?}u2zV6hb{=V*6 z0UQu9#U*ZQW~esc6`vu7DFsrvw>Px8pwy5S2G2Py9UAEA>)v}jGTUVh$J$-8-ugV& zU4OM;!qmLji&yn_tsa_{xH#yQRelu6YEv$i%Sxonx}`F;rdtpi=<4hl;G*V~rZvSq zdju8#n4YU??3~koO@Uk^i2QRw*T6vkz#Iws2RDY1*GvOnQbn zQ_KM4IL5Dl49WyrrBViu4)-WL^ac|3kHfIGPdtt24o|E|t4L?@OBupaE)k70VaHUf zB`OtqpM=Du5-vSgCDm|iD=rfme-dpXTW)Z@otZ=lDaKL75$70#H#rASYUq}XdpI*i z%?{E@nJ#6;w00DLcA_BNVS0o zp21ym1`3eC2=1m;h?&@qduaL5iU)8ntw0(}aX0RlGhxb122!$|#^^dlPS z8he$4bR=7h^wgM@{v%pzrT>UV?_mq?)TQc03U|sm%)^Jva3!A8`gdb7o{)1X;s(se zAzFn_miGDu@TGNahv6Q@cwO7`4Q!le$a!O(sOno$kgsGJt35}<`Ld8Xv*}v3q@}7O z?P6Dbsl_B_Qu~^;*|eaOw5akeueYv96s2GBAb9|90E!;_q~a+^dpAPZlP6`lLr}Rx zP`ND1o-E}yK^l3HTNLs|S>$8l<<5@_G}xe<5GRbG<&OM$p)A(b^;;sAe%q^%Wr(cV zn~ZozaBL6W--k~R;46hz9k3CW&=HnPt`MK%fqam&hY-Wl8ofFpWBP<#qMNnJ$)m~1 zqe-`|%DPF~nUNAY-K0};j>yXm9LX1E2JyD%rKp6-rFhX_g_)2qj7oG0ci@{h`!`u# zmT_0LZ+`}{|h>~xb5Pk6n0Vy+bNB8k`hEA9up&1LQAz6MXHf( zE$rtqUsj6YWJMZ3YAybyN)D6nw=|Tzds62Xb)ZBYcB2lv(JZ;D(L)|xFDEB-nz|F0 z|360M;_Qvn(@u#@uUU|D1f6V#W7UleKhjV z*$jNhi|8YrmVJ)3I}EpH(+c3c>{Zp6yQ-{s<9PiC;Xf~@OEl|ams5#L{Y9bz>fggk zwx=qDSdw5zRW+#heqmSc!vp)p@~ diff --git a/target/classes/local/epul4a/fotosharing/model/Photo.class b/target/classes/local/epul4a/fotosharing/model/Photo.class index 5b34ff3d27e4806e7213981418df3387e2ca6ce3..807d37e189c37de30a8d954d4f0404e34d0c55ec 100644 GIT binary patch literal 4924 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 GgAxE+C<+Gv diff --git a/target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class b/target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class index 5d7f3ea3a6176b62d731cc1d3d5c28abf44f1356..7d45d55c14761bc5359d7124f6f589dd5ecc1b42 100644 GIT binary patch delta 3203 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 ICVxT9zp`a--v9sr diff --git a/target/classes/templates/photo-detail.html b/target/classes/templates/photo-detail.html index 0683902..9ca2aa5 100644 --- a/target/classes/templates/photo-detail.html +++ b/target/classes/templates/photo-detail.html @@ -29,6 +29,17 @@
  • Visibilité :
  • Propriétaire :
  • + +
    +
    + + +
    +
    +