diff --git a/src/main/java/com/lions/dev/dto/request/social/SocialPostUpdateRequestDTO.java b/src/main/java/com/lions/dev/dto/request/social/SocialPostUpdateRequestDTO.java new file mode 100644 index 0000000..685a31a --- /dev/null +++ b/src/main/java/com/lions/dev/dto/request/social/SocialPostUpdateRequestDTO.java @@ -0,0 +1,25 @@ +package com.lions.dev.dto.request.social; + +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; + +/** + * DTO pour la mise à jour d'un post social. + * + * Utilisé dans les requêtes PUT /posts/{id} avec un body JSON + * (content, imageUrl) envoyé par le client Flutter. + */ +@Getter +@Setter +public class SocialPostUpdateRequestDTO { + + @Size(max = 2000, message = "Le contenu ne peut pas dépasser 2000 caractères.") + private String content; + + @Size(max = 500, message = "L'URL de l'image ne peut pas dépasser 500 caractères.") + private String imageUrl; + + public SocialPostUpdateRequestDTO() { + } +} diff --git a/src/main/java/com/lions/dev/dto/response/social/SocialPostResponseDTO.java b/src/main/java/com/lions/dev/dto/response/social/SocialPostResponseDTO.java index 734371e..fbf682e 100644 --- a/src/main/java/com/lions/dev/dto/response/social/SocialPostResponseDTO.java +++ b/src/main/java/com/lions/dev/dto/response/social/SocialPostResponseDTO.java @@ -31,6 +31,8 @@ public class SocialPostResponseDTO { private int likesCount; private int commentsCount; private int sharesCount; + /** Indique si l'utilisateur courant a liké ce post (attendu par le client Flutter). */ + private boolean isLikedByCurrentUser = false; /** * Constructeur à partir d'une entité SocialPost (v2.0). @@ -51,6 +53,7 @@ public class SocialPostResponseDTO { this.likesCount = post.getLikesCount(); this.commentsCount = post.getCommentsCount(); this.sharesCount = post.getSharesCount(); + this.isLikedByCurrentUser = false; // À enrichir si on passe le userId courant (table post_likes) } } } diff --git a/src/main/java/com/lions/dev/resource/SocialPostResource.java b/src/main/java/com/lions/dev/resource/SocialPostResource.java index 6a446e1..888d845 100644 --- a/src/main/java/com/lions/dev/resource/SocialPostResource.java +++ b/src/main/java/com/lions/dev/resource/SocialPostResource.java @@ -1,6 +1,7 @@ package com.lions.dev.resource; import com.lions.dev.dto.request.social.SocialPostCreateRequestDTO; +import com.lions.dev.dto.request.social.SocialPostUpdateRequestDTO; import com.lions.dev.dto.response.social.SocialPostResponseDTO; import com.lions.dev.entity.social.SocialPost; import com.lions.dev.exception.UserNotFoundException; @@ -139,8 +140,7 @@ public class SocialPostResource { * Met à jour un post. * * @param postId L'ID du post - * @param content Le nouveau contenu - * @param imageUrl La nouvelle URL d'image (optionnel) + * @param requestDTO Body JSON contenant content et/ou imageUrl (compatible client Flutter) * @return Le post mis à jour */ @PUT @@ -148,15 +148,24 @@ public class SocialPostResource { @Transactional @Operation( summary = "Mettre à jour un post", - description = "Met à jour le contenu et/ou l'image d'un post existant") + description = "Met à jour le contenu et/ou l'image d'un post existant (body JSON)") public Response updatePost( @PathParam("id") UUID postId, - @QueryParam("content") String content, - @QueryParam("imageUrl") String imageUrl) { + SocialPostUpdateRequestDTO requestDTO) { LOG.info("[LOG] Mise à jour du post ID : " + postId); + if (requestDTO == null) { + return Response.status(Response.Status.BAD_REQUEST) + .entity("{\"message\": \"Body JSON requis (content, imageUrl).\"}") + .build(); + } + try { - SocialPost post = socialPostService.updatePost(postId, content, imageUrl); + SocialPost post = socialPostService.updatePost( + postId, + requestDTO.getContent(), + requestDTO.getImageUrl() + ); SocialPostResponseDTO responseDTO = new SocialPostResponseDTO(post); return Response.ok(responseDTO).build(); } catch (IllegalArgumentException e) { diff --git a/src/main/java/com/lions/dev/service/SocialPostService.java b/src/main/java/com/lions/dev/service/SocialPostService.java index 704347d..5225232 100644 --- a/src/main/java/com/lions/dev/service/SocialPostService.java +++ b/src/main/java/com/lions/dev/service/SocialPostService.java @@ -172,7 +172,10 @@ public class SocialPostService { throw new IllegalArgumentException("Post non trouvé avec l'ID : " + postId); } - post.setContent(content); + // Ne pas écraser par null (mise à jour partielle / body JSON) + if (content != null && !content.isBlank()) { + post.setContent(content); + } if (imageUrl != null) { post.setImageUrl(imageUrl); } diff --git a/src/main/resources/db/migration/V15__Create_Social_Posts_Table.sql b/src/main/resources/db/migration/V15__Create_Social_Posts_Table.sql index 6a39e39..f8feda3 100644 --- a/src/main/resources/db/migration/V15__Create_Social_Posts_Table.sql +++ b/src/main/resources/db/migration/V15__Create_Social_Posts_Table.sql @@ -33,6 +33,6 @@ $$ LANGUAGE plpgsql; CREATE TRIGGER trigger_update_social_posts_updated_at BEFORE UPDATE ON social_posts FOR EACH ROW - EXECUTE FUNCTION update_social_posts_updated_at(); + EXECUTE PROCEDURE update_social_posts_updated_at(); COMMENT ON TABLE social_posts IS 'Publications (posts) sociaux du fil AfterWork';