package com.openisle.repository; import com.openisle.model.Comment; import com.openisle.model.Post; import com.openisle.model.Reaction; import com.openisle.model.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.data.domain.Pageable; import java.util.List; import java.util.Optional; public interface ReactionRepository extends JpaRepository { Optional findByUserAndPostAndType(User user, Post post, com.openisle.model.ReactionType type); Optional findByUserAndCommentAndType(User user, Comment comment, com.openisle.model.ReactionType type); List findByPost(Post post); List findByComment(Comment comment); @Query("SELECT r.post.id FROM Reaction r WHERE r.post IS NOT NULL AND r.post.author.username = :username AND r.type = com.openisle.model.ReactionType.LIKE GROUP BY r.post.id ORDER BY COUNT(r.id) DESC") List findTopPostIds(@Param("username") String username, Pageable pageable); @Query("SELECT r.comment.id FROM Reaction r WHERE r.comment IS NOT NULL AND r.comment.author.username = :username AND r.type = com.openisle.model.ReactionType.LIKE GROUP BY r.comment.id ORDER BY COUNT(r.id) DESC") List findTopCommentIds(@Param("username") String username, Pageable pageable); @Query("SELECT COUNT(r) FROM Reaction r WHERE r.user.username = :username AND r.type = com.openisle.model.ReactionType.LIKE") long countLikesSent(@Param("username") String username); @Query("SELECT COUNT(r) FROM Reaction r WHERE r.user.username = :username AND r.createdAt >= :start") long countByUserAfter(@Param("username") String username, @Param("start") java.time.LocalDateTime start); @Query("SELECT COUNT(r) FROM Reaction r WHERE r.type = com.openisle.model.ReactionType.LIKE AND ((r.post IS NOT NULL AND r.post.author.username = :username) OR (r.comment IS NOT NULL AND r.comment.author.username = :username))") long countLikesReceived(@Param("username") String username); }