From bea04f5b8528d1641daaef83fb2b9df56f278c11 Mon Sep 17 00:00:00 2001 From: JonayKB Date: Tue, 29 Apr 2025 20:11:30 +0200 Subject: [PATCH 1/5] feat(Comment): Added comments --- .../IActivityEntityRepository.java | 19 ++-- .../routinefights/comment/domain/Comment.java | 102 ++++++++++++++++++ .../domain/ports/primary/ICommentService.java | 14 +++ .../ports/secondary/ICommentRepository.java | 12 +++ .../domain/services/CommentService.java | 51 +++++++++ .../v2/controllers/CommentControllerV2.java | 46 ++++++++ .../primary/v2/dtos/CommentInputV2.java | 5 + .../primary/v2/dtos/CommentOutputV2.java | 9 ++ .../v2/mapper/CommentOutputV2Mapper.java | 18 ++++ .../secondary/entities/CommentEntity.java | 16 +-- .../mappers/CommentEntityMapper.java | 25 +++++ .../ICommentEntityRepository.java | 16 +++ .../services/CommentEntityService.java | 38 +++++++ .../post/commons/PostCommons.java | 5 + .../ports/secondary/IPostRepository.java | 1 + .../secondary/services/PostEntityService.java | 7 +- .../shared/tasks/ImagesTasks.java | 2 + .../user/common/IUserCommon.java | 1 + .../routinefights/user/domain/User.java | 9 ++ .../ports/secondary/IUserRepository.java | 2 +- .../repositories/IUserEntityRepository.java | 2 +- API/src/main/resources/application.properties | 5 +- .../main/resources/graphql/schema.graphqls | 22 +++- .../secondary/entities/CommentEntityTest.java | 6 +- 24 files changed, 406 insertions(+), 27 deletions(-) create mode 100644 API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/Comment.java create mode 100644 API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/ports/primary/ICommentService.java create mode 100644 API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/ports/secondary/ICommentRepository.java create mode 100644 API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/services/CommentService.java create mode 100644 API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/controllers/CommentControllerV2.java create mode 100644 API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/dtos/CommentInputV2.java create mode 100644 API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/dtos/CommentOutputV2.java create mode 100644 API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/mapper/CommentOutputV2Mapper.java create mode 100644 API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/mappers/CommentEntityMapper.java create mode 100644 API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/repositories/ICommentEntityRepository.java create mode 100644 API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/services/CommentEntityService.java diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/activity/infrastructure/adapters/secondary/repositories/IActivityEntityRepository.java b/API/src/main/java/es/iespuertodelacruz/routinefights/activity/infrastructure/adapters/secondary/repositories/IActivityEntityRepository.java index e9eb7641f..f4715216a 100644 --- a/API/src/main/java/es/iespuertodelacruz/routinefights/activity/infrastructure/adapters/secondary/repositories/IActivityEntityRepository.java +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/activity/infrastructure/adapters/secondary/repositories/IActivityEntityRepository.java @@ -38,7 +38,8 @@ WHERE NOT (x)-[:Participated]->(a) AND lower(a.name) CONTAINS lower($activityNam RETURN a,c,u SKIP $offset LIMIT $limit """) - List getPaginationNotSubscribed(@Param("offset") int offset, @Param("limit")int limit,@Param("userID") String userID, @Param("activityName") String activityName); + List getPaginationNotSubscribed(@Param("offset") int offset, @Param("limit") int limit, + @Param("userID") String userID, @Param("activityName") String activityName); @Query(""" MATCH (u:User) @@ -50,20 +51,24 @@ WHERE elementId(u) = $userID List getSubscribedActivities(@Param("userID") String userID); @Query(""" - MATCH (u:User)-[:Participated]->(a:Activity)<-[:`Related-To`]-(p:Post) - WHERE elementId(u)=$userID - SET a.streak=p.streak - RETURN a; + MATCH (u:User)-[:Participated]->(a:Activity) + WHERE elementId(u) = $userID + OPTIONAL MATCH (a)<-[:`Related-To`]-(p:Post) + WITH a, p + SET a.streak = coalesce(p.streak, 0) + RETURN DISTINCT a; """) List getSubscribedActivitiesWithStreak(@Param("userID") String userID); @Query(""" - MATCH (u:User)-[:Participated]->(a:Activity)<-[:`Related-To`]-(p:Post) + MATCH (u:User)-[:Participated]->(a:Activity) WHERE elementId(u) = $userID AND lower(a.name) CONTAINS lower($activityName) + OPTIONAL MATCH (a)<-[:`Related-To`]-(p:Post) + WITH a, p + SET a.streak = coalesce(p.streak, 0) SET a.streak = p.streak RETURN DISTINCT a; - """) List getSubscribedActivitiesWithStreak(@Param("userID") String userID, @Param("activityName") String activityName); diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/Comment.java b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/Comment.java new file mode 100644 index 000000000..43d457397 --- /dev/null +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/Comment.java @@ -0,0 +1,102 @@ +package es.iespuertodelacruz.routinefights.comment.domain; + +import java.time.LocalDateTime; +import java.util.Objects; + +import es.iespuertodelacruz.routinefights.post.domain.Post; +import es.iespuertodelacruz.routinefights.shared.utils.EntitiesTimestamps; +import es.iespuertodelacruz.routinefights.user.domain.User; + +public class Comment extends EntitiesTimestamps { + private String id; + private String message; + private Post post; + private User user; + private Comment replingComment; + + public Comment() { + } + + public Comment(String id) { + this.id = id; + } + + public Comment(String id, String message, LocalDateTime createdAt, LocalDateTime updatedAt, + LocalDateTime deletedAt, Post post, User user, Comment comment) { + super(createdAt, updatedAt, deletedAt); + this.id = id; + this.message = message; + this.post = post; + this.user = user; + this.replingComment = comment; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Post getPost() { + return post; + } + + public void setPost(Post post) { + this.post = post; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Comment getReplingComment() { + return replingComment; + } + + public void setReplingComment(Comment comment) { + this.replingComment = comment; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof Comment)) + return false; + Comment comment1 = (Comment) o; + return Objects.equals(id, comment1.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + + @Override + public String toString() { + return "Comment{" + + "id='" + id + '\'' + + ", message='" + message + '\'' + + ", createdAt=" + getCreatedAt() + + ", updatedAt=" + getUpdatedAt() + + ", deletedAt=" + getDeletedAt() + + ", post=" + post + + ", user=" + user + + ", comment=" + replingComment + + '}'; + } +} diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/ports/primary/ICommentService.java b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/ports/primary/ICommentService.java new file mode 100644 index 000000000..d4989d386 --- /dev/null +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/ports/primary/ICommentService.java @@ -0,0 +1,14 @@ +package es.iespuertodelacruz.routinefights.comment.domain.ports.primary; + + +import java.util.List; + +import es.iespuertodelacruz.routinefights.comment.domain.Comment; +import es.iespuertodelacruz.routinefights.user.domain.User; + +public interface ICommentService { + + Comment save(String message, User user, String postID, String replingID); + List findByPostID(String postID); + +} diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/ports/secondary/ICommentRepository.java b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/ports/secondary/ICommentRepository.java new file mode 100644 index 000000000..02ba940d1 --- /dev/null +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/ports/secondary/ICommentRepository.java @@ -0,0 +1,12 @@ +package es.iespuertodelacruz.routinefights.comment.domain.ports.secondary; + +import java.util.List; + +import es.iespuertodelacruz.routinefights.comment.domain.Comment; + +public interface ICommentRepository { + Comment comment(Comment comment); + List findByPostID(String postID); + Comment findById(String commentID); + +} diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/services/CommentService.java b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/services/CommentService.java new file mode 100644 index 000000000..06fce701b --- /dev/null +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/domain/services/CommentService.java @@ -0,0 +1,51 @@ +package es.iespuertodelacruz.routinefights.comment.domain.services; + +import java.time.LocalDateTime; +import java.util.List; + +import org.springframework.stereotype.Service; + +import es.iespuertodelacruz.routinefights.comment.domain.Comment; +import es.iespuertodelacruz.routinefights.comment.domain.ports.primary.ICommentService; +import es.iespuertodelacruz.routinefights.comment.domain.ports.secondary.ICommentRepository; +import es.iespuertodelacruz.routinefights.post.domain.Post; +import es.iespuertodelacruz.routinefights.post.domain.ports.secondary.IPostRepository; +import es.iespuertodelacruz.routinefights.user.domain.User; +@Service +public class CommentService implements ICommentService { + + private ICommentRepository commentRepository; + private IPostRepository postRepository; + + public CommentService(ICommentRepository commentRepository, IPostRepository postRepository) { + this.commentRepository = commentRepository; + this.postRepository = postRepository; + } + + @Override + public Comment save(String message, User user, String postID, String replingID) { + Comment comment = new Comment(); + comment.setMessage(message); + comment.setCreatedAt(LocalDateTime.now()); + comment.setUser(user); + Post post = postRepository.findById(postID); + if (post == null) { + throw new IllegalArgumentException("Post not found"); + } + comment.setPost(post); + if (replingID != null) { + Comment replingComment = commentRepository.findById(replingID); + if (replingComment == null) { + throw new IllegalArgumentException("Repling comment not found"); + } + comment.setReplingComment(replingComment); + } + + return commentRepository.comment(comment); + } + + @Override + public List findByPostID(String postID) { + return commentRepository.findByPostID(postID); + } +} diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/controllers/CommentControllerV2.java b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/controllers/CommentControllerV2.java new file mode 100644 index 000000000..ad9889a92 --- /dev/null +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/controllers/CommentControllerV2.java @@ -0,0 +1,46 @@ +package es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.primary.v2.controllers; + +import java.util.List; + +import org.springframework.graphql.data.method.annotation.Argument; +import org.springframework.graphql.data.method.annotation.MutationMapping; +import org.springframework.graphql.data.method.annotation.QueryMapping; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; + +import es.iespuertodelacruz.routinefights.comment.domain.ports.primary.ICommentService; +import es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.primary.v2.dtos.CommentInputV2; +import es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.primary.v2.dtos.CommentOutputV2; +import es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.primary.v2.mapper.CommentOutputV2Mapper; +import es.iespuertodelacruz.routinefights.user.domain.User; +import es.iespuertodelacruz.routinefights.user.domain.ports.primary.IUserService; + +@Controller +@CrossOrigin +public class CommentControllerV2 { + + private ICommentService commentService; + private CommentOutputV2Mapper commentOutputV2Mapper; + private IUserService userService; + + public CommentControllerV2(ICommentService commentService, + CommentOutputV2Mapper commentOutputV2Mapper, IUserService userService) { + this.commentService = commentService; + this.commentOutputV2Mapper = commentOutputV2Mapper; + this.userService = userService; + } + + @MutationMapping("postComment") + public CommentOutputV2 postComment(@Argument("commentInput") CommentInputV2 commentInput) { + User user = userService.findByEmailOnlyBase(SecurityContextHolder.getContext().getAuthentication().getName()); + return commentOutputV2Mapper.toDTO(commentService.save(commentInput.message(), user, + commentInput.postID(), commentInput.replingID())); + } + + @QueryMapping("getComments") + public List getComments(@Argument("postID") String postID) { + return commentOutputV2Mapper.toDTO(commentService.findByPostID(postID)); + } + +} diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/dtos/CommentInputV2.java b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/dtos/CommentInputV2.java new file mode 100644 index 000000000..8215eef5d --- /dev/null +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/dtos/CommentInputV2.java @@ -0,0 +1,5 @@ +package es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.primary.v2.dtos; + +public record CommentInputV2(String message, String postID, String replingID) { + +} diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/dtos/CommentOutputV2.java b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/dtos/CommentOutputV2.java new file mode 100644 index 000000000..1fcfa52b4 --- /dev/null +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/dtos/CommentOutputV2.java @@ -0,0 +1,9 @@ +package es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.primary.v2.dtos; + +import java.time.LocalDateTime; + +import es.iespuertodelacruz.routinefights.user.infrastructure.adapters.primary.v2.dtos.UserOutputDTOV2; + +public record CommentOutputV2(String id, String message, LocalDateTime createdAt, UserOutputDTOV2 user) { + +} diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/mapper/CommentOutputV2Mapper.java b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/mapper/CommentOutputV2Mapper.java new file mode 100644 index 000000000..7645ae8ec --- /dev/null +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/primary/v2/mapper/CommentOutputV2Mapper.java @@ -0,0 +1,18 @@ +package es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.primary.v2.mapper; + +import java.util.List; + +import org.mapstruct.Mapper; + +import es.iespuertodelacruz.routinefights.comment.domain.Comment; +import es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.primary.v2.dtos.CommentOutputV2; +import es.iespuertodelacruz.routinefights.user.infrastructure.adapters.primary.v2.mappers.UserOutputV2Mapper; + +@Mapper(componentModel = "spring",uses = UserOutputV2Mapper.class) +public interface CommentOutputV2Mapper { + + CommentOutputV2 toDTO(Comment comment); + + List toDTO(List comment); + +} diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/entities/CommentEntity.java b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/entities/CommentEntity.java index 23b17fd6d..4d00ecc40 100644 --- a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/entities/CommentEntity.java +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/entities/CommentEntity.java @@ -6,6 +6,7 @@ import org.springframework.data.neo4j.core.schema.Id; import org.springframework.data.neo4j.core.schema.Node; import org.springframework.data.neo4j.core.schema.Relationship; +import org.springframework.data.neo4j.core.schema.TargetNode; import es.iespuertodelacruz.routinefights.post.infrastructure.adapters.secondary.entities.PostEntity; import es.iespuertodelacruz.routinefights.shared.utils.EntitiesTimestamps; @@ -29,7 +30,8 @@ public class CommentEntity extends EntitiesTimestamps { private UserEntity user; @Relationship(type = "Replied_To", direction = Relationship.Direction.OUTGOING) - private CommentEntity comment; + @TargetNode() + private CommentEntity replingComment; public CommentEntity() { } @@ -41,7 +43,7 @@ public CommentEntity(String id, String message, LocalDateTime createdAt, LocalDa this.message = message; this.post = post; this.user = user; - this.comment = comment; + this.replingComment = comment; } public String getId() { @@ -76,12 +78,12 @@ public void setUser(UserEntity user) { this.user = user; } - public CommentEntity getComment() { - return this.comment; + public CommentEntity getReplingComment() { + return this.replingComment; } - public void setComment(CommentEntity comment) { - this.comment = comment; + public void setReplingComment(CommentEntity comment) { + this.replingComment = comment; } @Override @@ -110,7 +112,7 @@ public String toString() { ", deletedAt='" + getDeletedAt() + "'" + ", post='" + getPost() + "'" + ", user='" + getUser() + "'" + - ", comment='" + getComment() + "'" + + ", comment='" + getReplingComment() + "'" + "}"; } diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/mappers/CommentEntityMapper.java b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/mappers/CommentEntityMapper.java new file mode 100644 index 000000000..c3811e168 --- /dev/null +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/mappers/CommentEntityMapper.java @@ -0,0 +1,25 @@ +package es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.secondary.mappers; + +import java.util.List; + +import org.mapstruct.Mapper; + +import es.iespuertodelacruz.routinefights.comment.domain.Comment; +import es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.secondary.entities.CommentEntity; +import es.iespuertodelacruz.routinefights.post.infrastructure.adapters.secondary.mappers.PostEntityMapper; +import es.iespuertodelacruz.routinefights.user.infrastructure.adapters.secondary.mappers.IUserEntityMapper; + +@Mapper(componentModel = "spring", + uses = {IUserEntityMapper.class, PostEntityMapper.class}) +public interface CommentEntityMapper { + + CommentEntity toEntity(Comment comment); + + List toEntity(List comment); + + Comment toDomain(CommentEntity commentEntity); + + List toDomain(List commentEntity); + + +} diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/repositories/ICommentEntityRepository.java b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/repositories/ICommentEntityRepository.java new file mode 100644 index 000000000..653e7023c --- /dev/null +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/repositories/ICommentEntityRepository.java @@ -0,0 +1,16 @@ +package es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.secondary.repositories; + +import java.time.LocalDateTime; +import java.util.List; + +import org.springframework.data.neo4j.repository.Neo4jRepository; +import org.springframework.data.neo4j.repository.query.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.secondary.entities.CommentEntity; + +@Repository +public interface ICommentEntityRepository extends Neo4jRepository { + List findByPostId(String postID); +} diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/services/CommentEntityService.java b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/services/CommentEntityService.java new file mode 100644 index 000000000..4e88eb5ad --- /dev/null +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/services/CommentEntityService.java @@ -0,0 +1,38 @@ +package es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.secondary.services; + +import java.util.List; + +import org.springframework.stereotype.Service; + +import es.iespuertodelacruz.routinefights.comment.domain.Comment; +import es.iespuertodelacruz.routinefights.comment.domain.ports.secondary.ICommentRepository; +import es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.secondary.mappers.CommentEntityMapper; +import es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.secondary.repositories.ICommentEntityRepository; + +@Service +public class CommentEntityService implements ICommentRepository { + + private ICommentEntityRepository commentRepository; + private CommentEntityMapper commentEntityMapper; + + public CommentEntityService(ICommentEntityRepository commentRepository, CommentEntityMapper commentEntityMapper) { + this.commentEntityMapper = commentEntityMapper; + this.commentRepository = commentRepository; + } + + @Override + public Comment comment(Comment comment) { + return commentEntityMapper.toDomain(commentRepository.save(commentEntityMapper.toEntity(comment))); + } + + @Override + public List findByPostID(String postID) { + return commentEntityMapper.toDomain(commentRepository.findByPostId(postID)); + } + + @Override + public Comment findById(String id) { + return commentEntityMapper.toDomain(commentRepository.findById(id).orElse(null)); + } + +} diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/post/commons/PostCommons.java b/API/src/main/java/es/iespuertodelacruz/routinefights/post/commons/PostCommons.java index 5991c6eff..cea0b9f53 100644 --- a/API/src/main/java/es/iespuertodelacruz/routinefights/post/commons/PostCommons.java +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/post/commons/PostCommons.java @@ -2,10 +2,15 @@ import java.time.LocalDateTime; +import org.springframework.data.annotation.Transient; + import es.iespuertodelacruz.routinefights.shared.utils.EntitiesTimestamps; + public abstract class PostCommons extends EntitiesTimestamps { private String image; + + @Transient private Integer streak; private Integer pointsToAdd; private LocalDateTime filedAt; diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/post/domain/ports/secondary/IPostRepository.java b/API/src/main/java/es/iespuertodelacruz/routinefights/post/domain/ports/secondary/IPostRepository.java index 418e309df..cabd256bf 100644 --- a/API/src/main/java/es/iespuertodelacruz/routinefights/post/domain/ports/secondary/IPostRepository.java +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/post/domain/ports/secondary/IPostRepository.java @@ -15,4 +15,5 @@ public interface IPostRepository { List getPaginationFollowing(LocalDateTime lastDate, int limit, String userID); List getPaginationSubscribedActivities(LocalDateTime lastDate, int limit, String userID); List findAllImages(); + Post findById(String postID); } diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/post/infrastructure/adapters/secondary/services/PostEntityService.java b/API/src/main/java/es/iespuertodelacruz/routinefights/post/infrastructure/adapters/secondary/services/PostEntityService.java index 96820e501..59e554f30 100644 --- a/API/src/main/java/es/iespuertodelacruz/routinefights/post/infrastructure/adapters/secondary/services/PostEntityService.java +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/post/infrastructure/adapters/secondary/services/PostEntityService.java @@ -68,6 +68,11 @@ public List getPaginationSubscribedActivities(LocalDateTime lastDate, int public List findAllImages() { return postEntityRepository.findAllImages(); } - + + @Override + public Post findById(String id) { + return postEntityMapper.toDomain(postEntityRepository.findById(id).orElse(null)); + } + } diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/shared/tasks/ImagesTasks.java b/API/src/main/java/es/iespuertodelacruz/routinefights/shared/tasks/ImagesTasks.java index fdcaf3f1c..e06c5aec1 100644 --- a/API/src/main/java/es/iespuertodelacruz/routinefights/shared/tasks/ImagesTasks.java +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/shared/tasks/ImagesTasks.java @@ -36,6 +36,8 @@ List deleteNotUsedImages() { List images = new ArrayList<>(imageService.getAll()); userService.findAllImages().forEach(images::remove); postService.findAllImages().forEach(images::remove); + + //ADD COMUNITY EVENT, BADGES AND ACTIVITY IMAGES logger.log(Level.INFO, "Deleted not used images: {0} images going to be deleted", images.size()); images.forEach(image -> imageService.delete(image)); logger.log(Level.INFO, "Deleted images executed successfully at {0}", LocalDateTime.now()); diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/user/common/IUserCommon.java b/API/src/main/java/es/iespuertodelacruz/routinefights/user/common/IUserCommon.java index eb207810e..7a176cb43 100644 --- a/API/src/main/java/es/iespuertodelacruz/routinefights/user/common/IUserCommon.java +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/user/common/IUserCommon.java @@ -101,4 +101,5 @@ public interface IUserCommon extends ICRUD { public Boolean unLikePost(String id, String postId); + } diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/user/domain/User.java b/API/src/main/java/es/iespuertodelacruz/routinefights/user/domain/User.java index 71098a9af..bc73d0709 100644 --- a/API/src/main/java/es/iespuertodelacruz/routinefights/user/domain/User.java +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/user/domain/User.java @@ -20,6 +20,15 @@ public class User extends UserCommon { public User() { } + /** + * Constructor with id + * + * @param id The id of the user + */ + public User(String id) { + this.id = id; + } + /** * Constructor with values * diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/user/domain/ports/secondary/IUserRepository.java b/API/src/main/java/es/iespuertodelacruz/routinefights/user/domain/ports/secondary/IUserRepository.java index df7646ff7..d90ee552c 100644 --- a/API/src/main/java/es/iespuertodelacruz/routinefights/user/domain/ports/secondary/IUserRepository.java +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/user/domain/ports/secondary/IUserRepository.java @@ -31,5 +31,5 @@ public interface IUserRepository extends IUserCommon { */ public User update(User user); - + } diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/user/infrastructure/adapters/secondary/repositories/IUserEntityRepository.java b/API/src/main/java/es/iespuertodelacruz/routinefights/user/infrastructure/adapters/secondary/repositories/IUserEntityRepository.java index a11752489..7bb8edc04 100644 --- a/API/src/main/java/es/iespuertodelacruz/routinefights/user/infrastructure/adapters/secondary/repositories/IUserEntityRepository.java +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/user/infrastructure/adapters/secondary/repositories/IUserEntityRepository.java @@ -44,7 +44,7 @@ public List findFollowersByEmail(@Param("email") String email, @Query("MATCH (u: User {email:$userMail}) MATCH (a: Activity) WHERE elementId(a) = $activityID MATCH (u)-[r:Participated]->(a) DELETE r RETURN COUNT(*) > 0") public boolean unSusbcribeActivity(@Param("userMail") String userEmail, @Param("activityID") String activityID); - @Query("MATCH (u: User) WHERE u.username CONTAINS $userName AND elementId(u) != $userID RETURN u SKIP $offset LIMIT $limit") + @Query("MATCH (u: User) WHERE u.username CONTAINS $userName AND elementId(u) <> $userID RETURN u SKIP $offset LIMIT $limit") public List getPaginationByName(@Param("offset") int offset, @Param("limit") int limit, @Param("userName") String userName, @Param("userID") String userID); diff --git a/API/src/main/resources/application.properties b/API/src/main/resources/application.properties index 324fd3805..ec71d7e6b 100644 --- a/API/src/main/resources/application.properties +++ b/API/src/main/resources/application.properties @@ -10,7 +10,7 @@ spring.security.user.name=admin spring.security.user.password=admin spring.graphql.schema.printer.enabled=true jwt.secret = secret -jwt.expiration = 86400000 +jwt.expiration = 2592000000 spring.sendgrid.api-key=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 sendgrid.api-key=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 sendgrid.from-email=routinefights@gmail.com @@ -20,4 +20,5 @@ server.ssl.enabled=true server.ssl.key-store-type=PKCS12 server.ssl.key-store=classpath:keystore/routinefights.p12 server.ssl.key-store-password=1q2w3e4r -server.ssl.key-alias=routinefights \ No newline at end of file +server.ssl.key-alias=routinefights + diff --git a/API/src/main/resources/graphql/schema.graphqls b/API/src/main/resources/graphql/schema.graphqls index 8ec9305a1..b4cf6e6ca 100644 --- a/API/src/main/resources/graphql/schema.graphqls +++ b/API/src/main/resources/graphql/schema.graphqls @@ -2,8 +2,6 @@ type Query { usersV3: [UserOutputV3] userV3(id: ID!): UserOutputV3 - usersV2(regex: String!): [Followers] - userV2(id: ID!): UserOutputV2 getUserPaginationByName( page: Int! perPage: Int! @@ -24,12 +22,11 @@ type Query { postsFollowingV2(lastDate: String!, limit: Int): [PostOutputV2] postsSubscribedActivitiesV2(lastDate: String!, limit: Int): [PostOutputV2] - paginationActivitiesV2(page: Int!, perPage: Int): [ActivityOutputV2] paginationActivitiesNotSubscribed(page: Int!, perPage: Int,activityName:String): [ActivityOutputV2] getOwnUser: UserOutputV2 - getSubscribedActivities: [ActivityOutputV2] getSubscribedActivitiesWithStreakByName(activityName:String!): [ActivityOutputV2Streak] - getSubscribedActivitiesWithStreaks: [ActivityOutputV2Streak] + getComments(postID: String!): [CommentOutputV2] + } type Mutation { @@ -51,6 +48,21 @@ type Mutation { uploadPost(image: String!, activityID: String!): PostOutputV2 createActivity(activityInput: ActivityInputV2!): ActivityOutputV2 + + postComment(commentInput: CommentInputV2!): CommentOutputV2 +} +input CommentInputV2 { + message: String! + postID: String! + replingID: String +} + +type CommentOutputV2 { + id: ID + message: String + postID: String + user: UserOutputV2 + createdAt: String } type ActivityOutputV2 { id: ID diff --git a/API/src/test/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/entities/CommentEntityTest.java b/API/src/test/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/entities/CommentEntityTest.java index b8a0b0a35..c27ecb9da 100644 --- a/API/src/test/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/entities/CommentEntityTest.java +++ b/API/src/test/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/entities/CommentEntityTest.java @@ -46,7 +46,7 @@ void testSettersAndGetters() { comment.setMessage(MESSAGE); comment.setPost(createDummyPost()); comment.setUser(createDummyUser()); - comment.setComment(createDummyNestedComment()); + comment.setReplingComment(createDummyNestedComment()); comment.setCreatedAt(CREATED_AT); comment.setUpdatedAt(UPDATED_AT); comment.setDeletedAt(DELETED_AT); @@ -55,7 +55,7 @@ void testSettersAndGetters() { assertEquals(MESSAGE, comment.getMessage()); assertEquals(createDummyPost().toString(), comment.getPost().toString()); assertEquals(createDummyUser().toString(), comment.getUser().toString()); - assertEquals(createDummyNestedComment().toString(), comment.getComment().toString()); + assertEquals(createDummyNestedComment().toString(), comment.getReplingComment().toString()); assertEquals(CREATED_AT, comment.getCreatedAt()); assertEquals(UPDATED_AT, comment.getUpdatedAt()); assertEquals(DELETED_AT, comment.getDeletedAt()); @@ -72,7 +72,7 @@ void testConstructorAndGetters() { assertEquals(MESSAGE, comment.getMessage()); assertEquals(post.toString(), comment.getPost().toString()); assertEquals(user.toString(), comment.getUser().toString()); - assertEquals(nestedComment.toString(), comment.getComment().toString()); + assertEquals(nestedComment.toString(), comment.getReplingComment().toString()); assertEquals(CREATED_AT, comment.getCreatedAt()); assertEquals(UPDATED_AT, comment.getUpdatedAt()); assertEquals(DELETED_AT, comment.getDeletedAt()); From 8ddec259d4fea0d9a2573852a6e0f5b1775718ee Mon Sep 17 00:00:00 2001 From: JonayKB Date: Wed, 30 Apr 2025 09:55:05 +0200 Subject: [PATCH 2/5] test(Comment): Added Comment Domain test --- .../ICommentEntityRepository.java | 3 - .../comment/domain/CommentTest.java | 89 +++++++++++++++++++ 2 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/CommentTest.java diff --git a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/repositories/ICommentEntityRepository.java b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/repositories/ICommentEntityRepository.java index 653e7023c..d7289a9b3 100644 --- a/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/repositories/ICommentEntityRepository.java +++ b/API/src/main/java/es/iespuertodelacruz/routinefights/comment/infrastructure/adapters/secondary/repositories/ICommentEntityRepository.java @@ -1,11 +1,8 @@ package es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.secondary.repositories; -import java.time.LocalDateTime; import java.util.List; import org.springframework.data.neo4j.repository.Neo4jRepository; -import org.springframework.data.neo4j.repository.query.Query; -import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import es.iespuertodelacruz.routinefights.comment.infrastructure.adapters.secondary.entities.CommentEntity; diff --git a/API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/CommentTest.java b/API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/CommentTest.java new file mode 100644 index 000000000..af199dba5 --- /dev/null +++ b/API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/CommentTest.java @@ -0,0 +1,89 @@ +package es.iespuertodelacruz.routinefights.comment.domain; + +import static org.junit.jupiter.api.Assertions.*; +import java.time.LocalDateTime; +import org.junit.jupiter.api.Test; +import es.iespuertodelacruz.routinefights.post.domain.Post; +import es.iespuertodelacruz.routinefights.user.domain.User; + +class CommentTest { + + @Test + void testConstructorAndGetters() { + LocalDateTime createdAt = LocalDateTime.now(); + LocalDateTime updatedAt = LocalDateTime.now(); + LocalDateTime deletedAt = LocalDateTime.now(); + Post post = new Post(); + User user = new User(); + Comment replyingComment = new Comment("replyId"); + + Comment comment = new Comment("id", "message", createdAt, updatedAt, deletedAt, post, user, replyingComment); + + assertEquals("id", comment.getId()); + assertEquals("message", comment.getMessage()); + assertEquals(createdAt, comment.getCreatedAt()); + assertEquals(updatedAt, comment.getUpdatedAt()); + assertEquals(deletedAt, comment.getDeletedAt()); + assertEquals(post, comment.getPost()); + assertEquals(user, comment.getUser()); + assertEquals(replyingComment, comment.getReplingComment()); + } + + @Test + void testSetters() { + Comment comment = new Comment(); + LocalDateTime createdAt = LocalDateTime.now(); + LocalDateTime updatedAt = LocalDateTime.now(); + LocalDateTime deletedAt = LocalDateTime.now(); + Post post = new Post(); + User user = new User(); + Comment replyingComment = new Comment("replyId"); + + comment.setId("id"); + comment.setMessage("message"); + comment.setCreatedAt(createdAt); + comment.setUpdatedAt(updatedAt); + comment.setDeletedAt(deletedAt); + comment.setPost(post); + comment.setUser(user); + comment.setReplingComment(replyingComment); + + assertEquals("id", comment.getId()); + assertEquals("message", comment.getMessage()); + assertEquals(createdAt, comment.getCreatedAt()); + assertEquals(updatedAt, comment.getUpdatedAt()); + assertEquals(deletedAt, comment.getDeletedAt()); + assertEquals(post, comment.getPost()); + assertEquals(user, comment.getUser()); + assertEquals(replyingComment, comment.getReplingComment()); + } + + @Test + void testEqualsAndHashCode() { + Comment comment1 = new Comment("id"); + Comment comment2 = new Comment("id"); + Comment comment3 = new Comment("differentId"); + + assertEquals(comment1, comment2); + assertNotEquals(comment1, comment3); + assertEquals(comment1.hashCode(), comment2.hashCode()); + assertNotEquals(comment1.hashCode(), comment3.hashCode()); + } + + @Test + void testToString() { + LocalDateTime createdAt = LocalDateTime.now(); + LocalDateTime updatedAt = LocalDateTime.now(); + LocalDateTime deletedAt = LocalDateTime.now(); + Post post = new Post(); + User user = new User(); + Comment replyingComment = new Comment("replyId"); + + Comment comment = new Comment("id", "message", createdAt, updatedAt, deletedAt, post, user, replyingComment); + + String expected = "Comment{id='id', message='message', createdAt=" + createdAt + + ", updatedAt=" + updatedAt + ", deletedAt=" + deletedAt + + ", post=" + post + ", user=" + user + ", comment=" + replyingComment + "}"; + assertEquals(expected, comment.toString()); + } +} From 1b3b7ff8f4af1e255259afaa3f6f57a9715ad6dc Mon Sep 17 00:00:00 2001 From: JonayKB Date: Wed, 30 Apr 2025 10:01:20 +0200 Subject: [PATCH 3/5] fix: Fixed tests --- .../routinefights/comment/domain/CommentTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/CommentTest.java b/API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/CommentTest.java index af199dba5..6a2801bca 100644 --- a/API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/CommentTest.java +++ b/API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/CommentTest.java @@ -2,6 +2,8 @@ import static org.junit.jupiter.api.Assertions.*; import java.time.LocalDateTime; +import java.util.ArrayList; + import org.junit.jupiter.api.Test; import es.iespuertodelacruz.routinefights.post.domain.Post; import es.iespuertodelacruz.routinefights.user.domain.User; @@ -77,6 +79,8 @@ void testToString() { LocalDateTime deletedAt = LocalDateTime.now(); Post post = new Post(); User user = new User(); + user.setFollowers(new ArrayList<>()); + user.setFollowing(new ArrayList<>()); Comment replyingComment = new Comment("replyId"); Comment comment = new Comment("id", "message", createdAt, updatedAt, deletedAt, post, user, replyingComment); From 01abefdd91e00ce126376cb00035d59210f8e4b1 Mon Sep 17 00:00:00 2001 From: JonayKB Date: Sat, 3 May 2025 22:19:35 +0200 Subject: [PATCH 4/5] test(Comment): Added service tests --- .../domain/services/CommentServiceTest.java | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/services/CommentServiceTest.java diff --git a/API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/services/CommentServiceTest.java b/API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/services/CommentServiceTest.java new file mode 100644 index 000000000..21dedea6f --- /dev/null +++ b/API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/services/CommentServiceTest.java @@ -0,0 +1,115 @@ +package es.iespuertodelacruz.routinefights.comment.domain.services; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import java.time.LocalDateTime; +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import es.iespuertodelacruz.routinefights.comment.domain.Comment; +import es.iespuertodelacruz.routinefights.comment.domain.ports.secondary.ICommentRepository; +import es.iespuertodelacruz.routinefights.post.domain.Post; +import es.iespuertodelacruz.routinefights.post.domain.ports.secondary.IPostRepository; +import es.iespuertodelacruz.routinefights.user.domain.User; + +public class CommentServiceTest { + + private static final String POST_ID = "postId"; + + private static final String MESSAGE = "message"; + + @Mock + private ICommentRepository commentRepository; + + @Mock + private IPostRepository postRepository; + + private CommentService commentService; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + commentService = new CommentService(commentRepository, postRepository); + } + + @Test + void saveTest() { + Post post = new Post(); + post.setId(POST_ID); + when(postRepository.findById(POST_ID)).thenReturn(post); + Comment expectedComment = new Comment(); + expectedComment.setMessage(MESSAGE); + expectedComment.setPost(post); + expectedComment.setUser(new User()); + expectedComment.setCreatedAt(LocalDateTime.now()); + expectedComment.setReplingComment(null); + when(commentRepository.comment(any(Comment.class))).thenReturn(expectedComment); + + Comment comment = commentService.save(MESSAGE, new User(), POST_ID, null); + + assertNotNull(comment); + assertEquals(MESSAGE, comment.getMessage()); + assertEquals(post, comment.getPost()); + assertEquals(new User(), comment.getUser()); + assertNotNull(comment.getCreatedAt()); + } + + @Test + void saveTestWithNullPost() { + when(postRepository.findById(POST_ID)).thenReturn(null); + + try { + commentService.save(MESSAGE, new User(), POST_ID, null); + } catch (IllegalArgumentException e) { + assertEquals("Post not found", e.getMessage()); + } + } + + @Test + void saveTestWithReplingComment() { + Post post = new Post(); + post.setId(POST_ID); + when(postRepository.findById(POST_ID)).thenReturn(post); + Comment replingComment = new Comment(); + replingComment.setId("replingId"); + when(commentRepository.findById("replingId")).thenReturn(replingComment); + Comment expectedComment = new Comment(); + expectedComment.setMessage(MESSAGE); + expectedComment.setPost(post); + expectedComment.setUser(new User()); + expectedComment.setCreatedAt(LocalDateTime.now()); + expectedComment.setReplingComment(replingComment); + when(commentRepository.comment(any(Comment.class))).thenReturn(expectedComment); + + Comment comment = commentService.save(MESSAGE, new User(), POST_ID, "replingId"); + + assertNotNull(comment); + assertEquals(MESSAGE, comment.getMessage()); + assertEquals(post, comment.getPost()); + assertEquals(new User(), comment.getUser()); + assertNotNull(comment.getCreatedAt()); + } + + @Test + void findByPostIDTest() { + Post post = new Post(); + post.setId(POST_ID); + Comment comment = new Comment(); + comment.setPost(post); + when(commentRepository.findByPostID(POST_ID)).thenReturn(List.of(comment)); + + List comments = commentService.findByPostID(POST_ID); + + assertNotNull(comments); + assertEquals(1, comments.size()); + assertEquals(post, comments.get(0).getPost()); + } + +} From 1fdb77e7dc5e0d62b39c4e028fa2facb1cede096 Mon Sep 17 00:00:00 2001 From: JonayKB Date: Sat, 3 May 2025 22:22:17 +0200 Subject: [PATCH 5/5] test(Comment): Removed public --- .../comment/domain/services/CommentServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/services/CommentServiceTest.java b/API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/services/CommentServiceTest.java index 21dedea6f..a33b00e10 100644 --- a/API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/services/CommentServiceTest.java +++ b/API/src/test/java/es/iespuertodelacruz/routinefights/comment/domain/services/CommentServiceTest.java @@ -19,7 +19,7 @@ import es.iespuertodelacruz.routinefights.post.domain.ports.secondary.IPostRepository; import es.iespuertodelacruz.routinefights.user.domain.User; -public class CommentServiceTest { +class CommentServiceTest { private static final String POST_ID = "postId";