2021-10-03 17:17:00 +02:00
/ * *
*
* /
package de.bstly.board.businesslogic ;
2021-11-21 16:43:19 +01:00
import java.math.BigInteger ;
2021-10-03 17:17:00 +02:00
import java.time.Instant ;
import java.util.List ;
2021-11-21 16:43:19 +01:00
import javax.persistence.EntityManager ;
import javax.persistence.Query ;
2021-10-03 17:17:00 +02:00
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.data.domain.Page ;
2021-10-07 14:35:15 +02:00
import org.springframework.data.domain.PageImpl ;
2021-10-03 17:17:00 +02:00
import org.springframework.data.domain.PageRequest ;
import org.springframework.data.domain.Sort ;
import org.springframework.data.domain.Sort.Order ;
import org.springframework.stereotype.Component ;
2021-12-01 19:00:50 +01:00
import org.springframework.util.StringUtils ;
2021-10-03 17:17:00 +02:00
2021-10-04 13:02:40 +02:00
import com.google.common.collect.Lists ;
2021-10-07 14:35:15 +02:00
import com.querydsl.core.types.OrderSpecifier ;
import com.querydsl.jpa.impl.JPAQuery ;
import com.querydsl.jpa.impl.JPAQueryFactory ;
2021-10-04 13:02:40 +02:00
2021-12-02 19:30:54 +01:00
import de.bstly.board.controller.model.EntryFilter ;
2021-10-04 13:02:40 +02:00
import de.bstly.board.model.Bookmarks ;
2021-10-03 17:17:00 +02:00
import de.bstly.board.model.Entry ;
import de.bstly.board.model.QEntry ;
2021-10-07 14:35:15 +02:00
import de.bstly.board.model.QFlag ;
2021-10-03 17:17:00 +02:00
import de.bstly.board.model.QVote ;
2021-12-03 23:47:17 +01:00
import de.bstly.board.model.support.FlaggedStatus ;
import de.bstly.board.model.support.Types ;
import de.bstly.board.model.support.VoteType ;
2021-10-03 17:17:00 +02:00
import de.bstly.board.repository.EntryRepository ;
import de.bstly.board.repository.VoteRepository ;
/ * *
2021-10-04 13:02:40 +02:00
* The Class EntryManager .
2021-10-03 17:17:00 +02:00
* /
@Component
public class EntryManager {
@Autowired
private EntryRepository entryRepository ;
@Autowired
2021-12-01 19:00:50 +01:00
private TagManager tagManager ;
@Autowired
2021-10-03 17:17:00 +02:00
private CommentManager commentManager ;
@Autowired
private VoteManager voteManager ;
@Autowired
private VoteRepository voteRepository ;
2021-10-04 13:02:40 +02:00
@Autowired
private BookmarksManager bookmarksManager ;
2021-10-06 18:58:26 +02:00
@Autowired
private SettingsManager settingsManager ;
2021-10-07 14:00:40 +02:00
@Autowired
private FlagManager flagManager ;
2021-10-07 14:35:15 +02:00
@Autowired
private JPAQueryFactory jpaQueryFactory ;
2021-11-21 16:43:19 +01:00
@Autowired
private EntityManager em ;
2021-10-04 13:02:40 +02:00
2021-10-03 17:17:00 +02:00
private QEntry qEntry = QEntry . entry ;
private QVote qVote = QVote . vote ;
2021-10-07 14:35:15 +02:00
private QFlag qFlag = QFlag . flag ;
2021-10-03 17:17:00 +02:00
2021-12-02 19:30:54 +01:00
static final String UPVOTES_QUERY = " SELECT DISTINCT upvote.target,COUNT(upvote.id) AS count FROM votes as upvote WHERE upvote.type = 0 AND upvote.target_type = 1 GROUP BY upvote.target " ;
2021-11-21 16:43:19 +01:00
2021-12-02 19:30:54 +01:00
static final String DOWNVOTES_QUERY = " SELECT DISTINCT downvote.target,COUNT(downvote.id) AS count FROM votes as downvote WHERE downvote.type = 1 AND downvote.target_type = 1 GROUP BY downvote.target " ;
2021-11-21 16:43:19 +01:00
2021-12-02 19:30:54 +01:00
static final String COMMENTS_QUERY = " SELECT DISTINCT comment.target,MAX(comment.created) as last,COUNT(comment.id) AS count FROM comments as comment WHERE comment.flagged_status = :flag GROUP BY comment.target " ;
2021-11-21 16:43:19 +01:00
2021-12-02 19:30:54 +01:00
static final String RANK_CALCULATION_QUERY = " SELECT DISTINCT entry.*, (IFNULL(upvote.count,0) - IFNULL(downvote.count,0)) as points, (IFNULL(upvote.count,0) - IFNULL(downvote.count,0)) / IF(:gravity > 0, POW(TIMESTAMPDIFF(HOUR, entry.created, :before)+2,:gravity), 1) AS ranking FROM entries AS entry LEFT JOIN ( "
2022-04-13 16:50:35 +02:00
+ UPVOTES_QUERY + " ) AS upvote ON upvote.target = entry.id LEFT JOIN ( " + DOWNVOTES_QUERY
2021-12-01 19:00:50 +01:00
+ " ) AS downvote ON downvote.target = entry.id %s " ;
2021-12-02 19:30:54 +01:00
static final String DATE_QUERY = " SELECT DISTINCT entry.* FROM entries AS entry %s " ;
2021-11-21 16:43:19 +01:00
2021-12-02 19:30:54 +01:00
static final String USER_QUERY = " SELECT DISTINCT entry.* FROM entries AS entry %s ORDER BY entry.created :order " ;
2021-11-21 16:43:19 +01:00
2021-12-02 19:30:54 +01:00
static final String COMMENT_CALCULATION_QUERY = " SELECT DISTINCT entry.*, IFNULL(comment.count,0) as comments, IFNULL(comment.count,0) / IF(:gravity > 0, POW(TIMESTAMPDIFF(HOUR, comment.last, :before)+2,:gravity), 1) AS ranking FROM entries AS entry LEFT JOIN ( "
2022-04-13 16:50:35 +02:00
+ COMMENTS_QUERY + " ) AS comment ON comment.target = entry.id %s " ;
2021-11-21 16:43:19 +01:00
2021-12-02 19:30:54 +01:00
static final String LAST_COMMENT_QUERY = " SELECT DISTINCT entry.* FROM entries AS entry LEFT JOIN ( "
2022-04-13 16:50:35 +02:00
+ COMMENTS_QUERY + " ) AS comment ON comment.target = entry.id %s " ;
2021-11-21 16:43:19 +01:00
2021-12-01 19:00:50 +01:00
static final String COUNT_QUERY = " SELECT count(entry.id) FROM entries as entry %s " ;
2021-11-21 16:43:19 +01:00
2021-10-03 17:17:00 +02:00
/ * *
2021-10-04 16:57:20 +02:00
* Fetch by ranking .
2021-10-04 13:02:40 +02:00
*
2021-12-02 19:30:54 +01:00
* @param username the username
2022-04-13 16:50:35 +02:00
* @param filter the filter
* @param gravity the gravity
* @param page the page
* @param size the size
* @param asc the asc
2021-10-04 13:02:40 +02:00
* @return the page
2021-10-03 17:17:00 +02:00
* /
2022-04-13 16:50:35 +02:00
public Page < Entry > fetchByRanking ( String username , EntryFilter filter , float gravity , int page , int size ,
boolean asc ) {
2021-12-02 19:30:54 +01:00
Query query = createEntryQuery ( RANK_CALCULATION_QUERY , username , filter ,
asc ? " ranking ASC, entry.created ASC " : " ranking DESC, entry.created DESC " ) ;
2021-11-21 16:43:19 +01:00
query . setParameter ( " gravity " , gravity ) ;
query . setFirstResult ( ( page ) * size ) ;
query . setMaxResults ( size ) ;
@SuppressWarnings ( " unchecked " )
List < Entry > list = query . getResultList ( ) ;
2021-12-02 19:30:54 +01:00
Query queryTotal = createCountQuery ( COUNT_QUERY , username , filter ) ;
2021-11-21 16:43:19 +01:00
long countResult = ( ( BigInteger ) queryTotal . getSingleResult ( ) ) . longValue ( ) ;
return new PageImpl < Entry > ( list , PageRequest . of ( page , size ) , countResult ) ;
}
/ * *
* Fetch by date .
*
2021-12-02 19:30:54 +01:00
* @param username the username
2022-04-13 16:50:35 +02:00
* @param filter the filter
* @param page the page
* @param size the size
* @param asc the asc
2021-11-21 16:43:19 +01:00
* @return the page
* /
2022-04-13 16:50:35 +02:00
public Page < Entry > fetchByDate ( String username , EntryFilter filter , int page , int size , boolean asc ) {
Query query = createEntryQuery ( DATE_QUERY , username , filter , asc ? " entry.created ASC " : " entry.created DESC " ) ;
2021-11-21 16:43:19 +01:00
query . setFirstResult ( ( page ) * size ) ;
query . setMaxResults ( size ) ;
@SuppressWarnings ( " unchecked " )
List < Entry > list = query . getResultList ( ) ;
2021-12-02 19:30:54 +01:00
Query queryTotal = createCountQuery ( COUNT_QUERY , username , filter ) ;
2021-11-21 16:43:19 +01:00
long countResult = ( ( BigInteger ) queryTotal . getSingleResult ( ) ) . longValue ( ) ;
return new PageImpl < Entry > ( list , PageRequest . of ( page , size ) , countResult ) ;
2021-10-03 17:17:00 +02:00
}
2021-10-05 14:39:49 +02:00
/ * *
* Fetch by comments .
*
2021-12-02 19:30:54 +01:00
* @param username the username
2022-04-13 16:50:35 +02:00
* @param filter the filter
* @param gravity the gravity
* @param page the page
* @param size the size
* @param asc the asc
2021-10-05 14:39:49 +02:00
* @return the page
* /
2022-04-13 16:50:35 +02:00
public Page < Entry > fetchByComments ( String username , EntryFilter filter , float gravity , int page , int size ,
boolean asc ) {
2021-12-02 19:30:54 +01:00
Query query = createEntryQuery ( COMMENT_CALCULATION_QUERY , username , filter ,
2021-12-01 19:00:50 +01:00
asc ? " ranking ASC, entry.created ASC " : " ranking DESC, entry.created DESC " ) ;
2021-11-21 16:43:19 +01:00
query . setParameter ( " gravity " , gravity ) ;
query . setFirstResult ( ( page ) * size ) ;
query . setMaxResults ( size ) ;
@SuppressWarnings ( " unchecked " )
List < Entry > list = query . getResultList ( ) ;
2021-12-02 19:30:54 +01:00
Query queryTotal = createCountQuery ( COUNT_QUERY , username , filter ) ;
2021-11-21 16:43:19 +01:00
long countResult = ( ( BigInteger ) queryTotal . getSingleResult ( ) ) . longValue ( ) ;
return new PageImpl < Entry > ( list , PageRequest . of ( page , size ) , countResult ) ;
2021-10-05 14:39:49 +02:00
}
2021-10-06 09:47:50 +02:00
/ * *
2021-10-06 09:48:30 +02:00
* Fetch by last comment .
2021-10-06 09:47:50 +02:00
*
2021-12-02 19:30:54 +01:00
* @param username the username
2022-04-13 16:50:35 +02:00
* @param filter the filter
* @param page the page
* @param size the size
* @param asc the asc
2021-10-06 09:47:50 +02:00
* @return the page
* /
2022-04-13 16:50:35 +02:00
public Page < Entry > fetchByLastComment ( String username , EntryFilter filter , int page , int size , boolean asc ) {
2021-12-02 19:30:54 +01:00
Query query = createEntryQuery ( LAST_COMMENT_QUERY , username , filter ,
2022-04-13 16:50:35 +02:00
asc ? " comment.last ASC, entry.created ASC " : " comment.last DESC, entry.created DESC " ) ;
2021-12-01 19:00:50 +01:00
query . setFirstResult ( ( page ) * size ) ;
query . setMaxResults ( size ) ;
@SuppressWarnings ( " unchecked " )
List < Entry > list = query . getResultList ( ) ;
2021-12-02 19:30:54 +01:00
Query queryTotal = createCountQuery ( COUNT_QUERY , username , filter ) ;
2021-12-01 19:00:50 +01:00
long countResult = ( ( BigInteger ) queryTotal . getSingleResult ( ) ) . longValue ( ) ;
return new PageImpl < Entry > ( list , PageRequest . of ( page , size ) , countResult ) ;
}
/ * *
* Fetch by user .
*
2021-12-02 19:30:54 +01:00
* @param fromUser the from user
* @param username the username
2022-04-13 16:50:35 +02:00
* @param filter the filter
* @param page the page
* @param size the size
* @param asc the asc
2021-12-01 19:00:50 +01:00
* @return the page
* /
2022-04-13 16:50:35 +02:00
public Page < Entry > fetchByUser ( String fromUser , String username , EntryFilter filter , int page , int size ,
boolean asc ) {
2021-12-02 19:30:54 +01:00
filter . setAdditional ( " AND entry.author = :username " ) ;
2022-04-13 16:50:35 +02:00
Query query = createEntryQuery ( DATE_QUERY , username , filter , asc ? " entry.created ASC " : " entry.created DESC " ) ;
2021-12-01 19:00:50 +01:00
query . setParameter ( " username " , username ) ;
2021-11-21 16:43:19 +01:00
query . setFirstResult ( ( page ) * size ) ;
query . setMaxResults ( size ) ;
@SuppressWarnings ( " unchecked " )
List < Entry > list = query . getResultList ( ) ;
2021-12-02 19:30:54 +01:00
Query queryTotal = createCountQuery ( COUNT_QUERY , username , filter ) ;
2021-12-01 19:00:50 +01:00
queryTotal . setParameter ( " username " , username ) ;
2021-11-21 16:43:19 +01:00
long countResult = ( ( BigInteger ) queryTotal . getSingleResult ( ) ) . longValue ( ) ;
return new PageImpl < Entry > ( list , PageRequest . of ( page , size ) , countResult ) ;
2021-10-06 09:47:50 +02:00
}
2021-10-03 17:17:00 +02:00
/ * *
2021-11-21 16:43:19 +01:00
* Creates the entry query .
2021-10-04 13:02:40 +02:00
*
2021-12-02 19:30:54 +01:00
* @param rawQuery the raw query
* @param username the username
2022-04-13 16:50:35 +02:00
* @param filter the filter
* @param orderBy the order by
2021-11-21 16:43:19 +01:00
* @return the query
2021-10-03 17:17:00 +02:00
* /
2022-04-13 16:50:35 +02:00
protected Query createEntryQuery ( String rawQuery , String username , EntryFilter filter , String orderBy ) {
2021-11-21 16:43:19 +01:00
String filterString = " " ;
2021-12-02 19:30:54 +01:00
String tagsString = " " ;
if ( filter . getTags ( ) ! = null & & ! filter . getTags ( ) . isEmpty ( ) ) {
for ( int index = 0 ; index < filter . getTags ( ) . size ( ) ; index + + ) {
2022-04-13 16:50:35 +02:00
tagsString + = " ' " + filter . getTags ( ) . get ( index ) + " ' " ;
2021-12-02 19:30:54 +01:00
if ( index < filter . getTags ( ) . size ( ) - 1 ) {
tagsString + = " , " ;
}
}
}
if ( StringUtils . hasText ( tagsString ) ) {
2022-04-13 16:50:35 +02:00
filterString + = " INNER JOIN tags as tag ON entry.id = tag.target AND tag.tag IN ( " + tagsString + " ) " ;
2021-12-01 19:00:50 +01:00
}
2022-04-13 16:50:35 +02:00
2021-12-03 23:47:17 +01:00
String fixedTagsString = " " ;
if ( filter . getFixedTags ( ) ! = null & & ! filter . getFixedTags ( ) . isEmpty ( ) ) {
for ( int index = 0 ; index < filter . getFixedTags ( ) . size ( ) ; index + + ) {
2022-04-13 16:50:35 +02:00
fixedTagsString + = " ' " + filter . getFixedTags ( ) . get ( index ) + " ' " ;
2021-12-03 23:47:17 +01:00
if ( index < filter . getFixedTags ( ) . size ( ) - 1 ) {
fixedTagsString + = " , " ;
}
}
}
if ( StringUtils . hasText ( fixedTagsString ) ) {
filterString + = " INNER JOIN tags as fixedTag ON entry.id = fixedTag.target AND fixedTag.tag IN ( "
2022-04-13 16:50:35 +02:00
+ fixedTagsString + " ) " ;
2021-12-03 23:47:17 +01:00
}
2021-12-01 19:00:50 +01:00
2021-11-21 16:43:19 +01:00
boolean author = false ;
2021-12-02 19:30:54 +01:00
if ( filter . getDate ( ) ! = null ) {
2021-12-01 19:00:50 +01:00
filterString + = " WHERE entry.created < :before " ;
2021-11-21 16:43:19 +01:00
} else {
2021-12-02 19:30:54 +01:00
filter . setDate ( Instant . now ( ) ) ;
2021-11-21 16:43:19 +01:00
author = true ;
2021-12-01 19:00:50 +01:00
filterString + = " WHERE (entry.created < :before OR entry.author = :author) " ;
2021-11-21 16:43:19 +01:00
}
2021-12-02 19:30:54 +01:00
if ( filter . getFlaggedStatus ( ) = = null ) {
filter . setFlaggedStatus ( FlaggedStatus . NORMAL ) ;
}
2021-11-21 16:43:19 +01:00
filterString + = " AND entry.flagged_status = :flag " ;
2021-12-02 19:30:54 +01:00
if ( filter . getEntryType ( ) ! = null ) {
filterString + = " AND entry.entry_type = :type " ;
}
if ( StringUtils . hasText ( filter . getAdditional ( ) ) ) {
2022-04-13 16:50:35 +02:00
filterString + = " " + filter . getAdditional ( ) ;
2021-12-02 19:30:54 +01:00
}
String excludedTagsString = " " ;
if ( filter . getExcludedTags ( ) ! = null & & ! filter . getExcludedTags ( ) . isEmpty ( ) ) {
for ( int index = 0 ; index < filter . getExcludedTags ( ) . size ( ) ; index + + ) {
2022-04-13 16:50:35 +02:00
excludedTagsString + = " ' " + filter . getExcludedTags ( ) . get ( index ) + " ' " ;
2021-12-02 19:30:54 +01:00
if ( index < filter . getExcludedTags ( ) . size ( ) - 1 ) {
excludedTagsString + = " , " ;
}
}
}
if ( StringUtils . hasText ( excludedTagsString ) ) {
filterString + = " AND NOT EXISTS (SELECT * FROM tags as excludedTag WHERE entry.id = excludedTag.target AND excludedTag.tag IN ( "
2022-04-13 16:50:35 +02:00
+ excludedTagsString + " )) " ;
2021-12-01 19:00:50 +01:00
}
2022-04-13 16:50:35 +02:00
2021-12-03 23:47:17 +01:00
String fixedExcludedTagsString = " " ;
if ( filter . getFixedExcludedTags ( ) ! = null & & ! filter . getFixedExcludedTags ( ) . isEmpty ( ) ) {
for ( int index = 0 ; index < filter . getFixedExcludedTags ( ) . size ( ) ; index + + ) {
2022-04-13 16:50:35 +02:00
fixedExcludedTagsString + = " ' " + filter . getFixedExcludedTags ( ) . get ( index ) + " ' " ;
2021-12-03 23:47:17 +01:00
if ( index < filter . getFixedExcludedTags ( ) . size ( ) - 1 ) {
fixedExcludedTagsString + = " , " ;
}
}
}
if ( StringUtils . hasText ( fixedExcludedTagsString ) ) {
filterString + = " AND NOT EXISTS (SELECT * FROM tags as fixedExcludedTag WHERE entry.id = fixedExcludedTag.target AND fixedExcludedTag.tag IN ( "
2022-04-13 16:50:35 +02:00
+ fixedExcludedTagsString + " )) " ;
2021-12-03 23:47:17 +01:00
}
2021-12-01 19:00:50 +01:00
if ( StringUtils . hasText ( orderBy ) ) {
2022-04-13 16:50:35 +02:00
filterString + = " ORDER BY " + orderBy ;
2021-12-01 19:00:50 +01:00
}
2021-11-21 16:43:19 +01:00
Query query = em . createNativeQuery ( String . format ( rawQuery , filterString ) , Entry . class ) ;
2021-12-02 19:30:54 +01:00
query . setParameter ( " before " , filter . getDate ( ) ) ;
2021-11-21 16:43:19 +01:00
if ( author ) {
query . setParameter ( " author " , username ) ;
}
2021-12-01 19:00:50 +01:00
2021-12-02 19:30:54 +01:00
if ( filter . getEntryType ( ) ! = null ) {
query . setParameter ( " type " , filter . getEntryType ( ) . toString ( ) ) ;
}
query . setParameter ( " flag " , filter . getFlaggedStatus ( ) . toString ( ) ) ;
2021-11-21 16:43:19 +01:00
return query ;
}
/ * *
* Creates the count query .
*
2021-12-02 19:30:54 +01:00
* @param rawQuery the raw query
* @param username the username
2022-04-13 16:50:35 +02:00
* @param filter the filter
2021-11-21 16:43:19 +01:00
* @return the query
* /
2021-12-02 19:30:54 +01:00
protected Query createCountQuery ( String rawQuery , String username , EntryFilter filter ) {
2021-11-21 16:43:19 +01:00
String filterString = " " ;
2021-12-02 19:30:54 +01:00
String tagsString = " " ;
if ( filter . getTags ( ) ! = null & & ! filter . getTags ( ) . isEmpty ( ) ) {
for ( int index = 0 ; index < filter . getTags ( ) . size ( ) ; index + + ) {
2022-04-13 16:50:35 +02:00
tagsString + = " ' " + filter . getTags ( ) . get ( index ) + " ' " ;
2021-12-02 19:30:54 +01:00
if ( index < filter . getTags ( ) . size ( ) - 1 ) {
tagsString + = " , " ;
}
}
}
if ( StringUtils . hasText ( tagsString ) ) {
2022-04-13 16:50:35 +02:00
filterString + = " INNER JOIN tags as tag ON entry.id = tag.target AND tag.tag IN ( " + tagsString + " ) " ;
2021-12-01 19:00:50 +01:00
}
2021-11-21 16:43:19 +01:00
boolean author = false ;
2021-12-02 19:30:54 +01:00
if ( filter . getDate ( ) ! = null ) {
filterString + = " WHERE entry.created < :before " ;
2021-11-21 16:43:19 +01:00
} else {
2021-12-02 19:30:54 +01:00
filter . setDate ( Instant . now ( ) ) ;
2021-11-21 16:43:19 +01:00
author = true ;
2021-12-02 19:30:54 +01:00
filterString + = " WHERE (entry.created < :before OR entry.author = :author) " ;
}
if ( filter . getFlaggedStatus ( ) = = null ) {
filter . setFlaggedStatus ( FlaggedStatus . NORMAL ) ;
2021-11-21 16:43:19 +01:00
}
filterString + = " AND entry.flagged_status = :flag " ;
2021-12-02 19:30:54 +01:00
if ( filter . getEntryType ( ) ! = null ) {
filterString + = " AND entry.entry_type = :type " ;
}
if ( StringUtils . hasText ( filter . getAdditional ( ) ) ) {
2022-04-13 16:50:35 +02:00
filterString + = " " + filter . getAdditional ( ) ;
2021-12-02 19:30:54 +01:00
}
String excludedTagsString = " " ;
if ( filter . getExcludedTags ( ) ! = null & & ! filter . getExcludedTags ( ) . isEmpty ( ) ) {
for ( int index = 0 ; index < filter . getExcludedTags ( ) . size ( ) ; index + + ) {
2022-04-13 16:50:35 +02:00
excludedTagsString + = " ' " + filter . getExcludedTags ( ) . get ( index ) + " ' " ;
2021-12-02 19:30:54 +01:00
if ( index < filter . getExcludedTags ( ) . size ( ) - 1 ) {
excludedTagsString + = " , " ;
}
}
}
if ( StringUtils . hasText ( excludedTagsString ) ) {
filterString + = " AND NOT EXISTS (SELECT * FROM tags as excludedTag WHERE entry.id = excludedTag.target AND excludedTag.tag IN ( "
2022-04-13 16:50:35 +02:00
+ excludedTagsString + " )) " ;
2021-12-01 19:00:50 +01:00
}
2021-11-21 16:43:19 +01:00
Query query = em . createNativeQuery ( String . format ( rawQuery , filterString ) ) ;
2021-12-02 19:30:54 +01:00
query . setParameter ( " before " , filter . getDate ( ) ) ;
2021-11-21 16:43:19 +01:00
if ( author ) {
query . setParameter ( " author " , username ) ;
}
2021-12-02 19:30:54 +01:00
if ( filter . getEntryType ( ) ! = null ) {
query . setParameter ( " type " , filter . getEntryType ( ) . toString ( ) ) ;
}
query . setParameter ( " flag " , filter . getFlaggedStatus ( ) . toString ( ) ) ;
2021-11-21 16:43:19 +01:00
return query ;
2021-10-03 17:17:00 +02:00
}
2021-10-07 14:00:40 +02:00
/ * *
* Fetch flagged .
*
* @param page the page
* @param size the size
2022-04-13 16:50:35 +02:00
* @param asc the asc
2021-10-07 14:00:40 +02:00
* @return the page
* /
public Page < Entry > fetchFlagged ( int page , int size , boolean asc ) {
Sort sort = Sort . by ( asc ? Order . asc ( " created " ) : Order . desc ( " created " ) ) ;
2022-04-13 16:50:35 +02:00
JPAQuery < Entry > query = jpaQueryFactory . selectFrom ( qEntry ) . leftJoin ( qFlag ) . on ( qEntry . id . eq ( qFlag . target ) )
. where ( qFlag . targetType . eq ( Types . entry ) ) . groupBy ( qFlag . target ) ;
JPAQuery < Long > countQuery = query . clone ( ) . select ( qEntry . id . countDistinct ( ) ) ;
2022-04-13 21:43:26 +02:00
Long count = countQuery . fetchOne ( ) ;
if ( count = = null ) {
count = 0L ;
}
2021-10-07 14:35:15 +02:00
return new PageImpl < Entry > ( query
2022-04-13 16:50:35 +02:00
. orderBy ( new OrderSpecifier < > (
asc ? com . querydsl . core . types . Order . ASC : com . querydsl . core . types . Order . DESC , qEntry . created ) )
2022-04-13 21:43:26 +02:00
. limit ( size ) . offset ( page * size ) . fetch ( ) , PageRequest . of ( page , size , sort ) , count ) ;
2021-10-07 14:00:40 +02:00
}
2021-10-04 16:57:20 +02:00
/ * *
* Fetch by bookmarks .
2021-10-04 13:02:40 +02:00
*
* @param username the username
2022-04-13 16:50:35 +02:00
* @param page the page
* @param size the size
2021-10-04 16:57:20 +02:00
* @return the page
2021-10-03 17:17:00 +02:00
* /
2021-10-04 13:02:40 +02:00
public Page < Entry > fetchByBookmarks ( String username , int page , int size ) {
Bookmarks bookmarks = bookmarksManager . get ( username ) ;
if ( bookmarks . getEntries ( ) = = null ) {
bookmarks . setEntries ( Lists . newArrayList ( ) ) ;
}
return entryRepository . findAll ( qEntry . id . in ( bookmarks . getEntries ( ) ) ,
PageRequest . of ( page , size , Sort . by ( Order . desc ( " created " ) ) ) ) ;
2021-10-03 17:17:00 +02:00
}
/ * *
2021-10-04 13:02:40 +02:00
* Apply metadata .
*
* @param username the username
2022-04-13 16:50:35 +02:00
* @param karma the karma
* @param entry the entry
* @param ignore the ignore
2021-10-03 17:17:00 +02:00
* /
2021-10-05 08:41:57 +02:00
public void applyMetadata ( String username , long karma , Entry entry , List < String > ignore ) {
2021-12-01 19:00:50 +01:00
entry . setTags ( tagManager . getForTarget ( entry . getId ( ) ) ) ;
2021-10-05 08:41:57 +02:00
ignore . addAll ( entry . getMetadata ( ) . keySet ( ) ) ;
2021-12-01 19:00:50 +01:00
if ( ! ignore . contains ( " author " ) ) {
entry . getMetadata ( ) . put ( " author " , entry . getAuthor ( ) . equals ( username ) ) ;
}
if ( ! ignore . contains ( " edit " ) ) {
2022-04-13 16:50:35 +02:00
entry . getMetadata ( ) . put ( " edit " ,
entry . getAuthor ( ) . equals ( username ) & & entry . getCreated ( ) . isAfter ( Instant . now ( ) ) ) ;
2021-12-01 19:00:50 +01:00
}
2021-10-05 08:41:57 +02:00
if ( ! ignore . contains ( " comments " ) ) {
2021-10-03 17:17:00 +02:00
entry . getMetadata ( ) . put ( " comments " , commentManager . count ( entry . getId ( ) ) ) ;
}
2021-10-04 13:02:40 +02:00
2021-10-05 08:41:57 +02:00
if ( ! ignore . contains ( " points " ) ) {
2021-10-03 17:17:00 +02:00
entry . getMetadata ( ) . put ( " points " , voteManager . getPoints ( entry . getId ( ) , Types . entry ) ) ;
}
2021-10-04 13:02:40 +02:00
2021-10-07 14:00:40 +02:00
if ( ! ignore . contains ( " bookmark " ) ) {
2022-04-13 16:50:35 +02:00
entry . getMetadata ( ) . put ( " bookmark " , ! bookmarksManager . hasEntry ( username , entry . getId ( ) ) ) ;
2021-10-07 14:00:40 +02:00
}
if ( ! ignore . contains ( " removeBookmark " ) ) {
2022-04-13 16:50:35 +02:00
entry . getMetadata ( ) . put ( " removeBookmark " , bookmarksManager . hasEntry ( username , entry . getId ( ) ) ) ;
2021-10-04 13:02:40 +02:00
}
2021-10-05 08:41:57 +02:00
if ( ! ignore . contains ( " upvoted " ) ) {
2021-10-04 11:40:51 +02:00
entry . getMetadata ( ) . put ( " upvoted " ,
2022-04-13 16:50:35 +02:00
voteRepository . exists ( qVote . target . eq ( entry . getId ( ) ) . and ( qVote . targetType . eq ( Types . entry ) )
. and ( qVote . type . eq ( VoteType . up ) ) . and ( qVote . author . equalsIgnoreCase ( username ) ) ) ) ;
2021-10-03 17:17:00 +02:00
}
2021-10-04 13:02:40 +02:00
2021-10-05 08:41:57 +02:00
if ( ! ignore . contains ( " downvoted " ) ) {
2021-10-04 11:40:51 +02:00
entry . getMetadata ( ) . put ( " downvoted " ,
2022-04-13 16:50:35 +02:00
voteRepository . exists ( qVote . target . eq ( entry . getId ( ) ) . and ( qVote . targetType . eq ( Types . entry ) )
. and ( qVote . type . eq ( VoteType . down ) ) . and ( qVote . author . equalsIgnoreCase ( username ) ) ) ) ;
2021-10-03 17:17:00 +02:00
}
2021-10-04 13:02:40 +02:00
2021-10-07 14:00:40 +02:00
if ( ! username . equals ( entry . getAuthor ( ) ) & & ! ignore . contains ( " flag " ) ) {
2022-04-13 16:50:35 +02:00
entry . getMetadata ( ) . put ( " flag " , flagManager . get ( username , entry . getId ( ) , Types . entry ) = = null ) ;
2021-10-07 14:00:40 +02:00
}
if ( ! username . equals ( entry . getAuthor ( ) ) & & ! ignore . contains ( " unflag " ) ) {
2022-04-13 16:50:35 +02:00
entry . getMetadata ( ) . put ( " unflag " , flagManager . get ( username , entry . getId ( ) , Types . entry ) ! = null ) ;
2021-10-07 14:00:40 +02:00
}
2021-10-07 14:35:15 +02:00
if ( ! ignore . contains ( " flagged " ) ) {
2022-04-13 16:50:35 +02:00
entry . getMetadata ( ) . put ( " flagged " , flagManager . getFlags ( entry . getId ( ) , Types . entry ) > 0 ) ;
2021-10-07 14:35:15 +02:00
}
2022-04-13 16:50:35 +02:00
if ( voteRepository . exists ( qVote . target . eq ( entry . getId ( ) ) . and ( qVote . targetType . eq ( Types . entry ) )
. and ( qVote . author . equalsIgnoreCase ( username ) ) ) ) {
2021-10-05 08:41:57 +02:00
if ( ! ignore . contains ( " unvote " ) ) {
entry . getMetadata ( ) . put ( " unvote " , true ) ;
}
} else {
if ( ! ignore . contains ( " vote " ) ) {
entry . getMetadata ( ) . put ( " vote " , true ) ;
}
2021-10-06 18:58:26 +02:00
if ( ! ignore . contains ( " downvote " ) & & karma > = settingsManager . getUnvoteThresh ( ) ) {
2021-10-05 08:47:21 +02:00
entry . getMetadata ( ) . put ( " downvote " , true ) ;
2021-10-05 08:41:57 +02:00
}
2021-10-03 17:17:00 +02:00
}
}
/ * *
2021-10-04 13:02:40 +02:00
* Apply metadata .
*
* @param username the username
2022-04-13 16:50:35 +02:00
* @param karma the karma
* @param entries the entries
* @param ignore the ignore
2021-10-03 17:17:00 +02:00
* /
2022-04-13 16:50:35 +02:00
public void applyMetadata ( String username , long karma , List < Entry > entries , List < String > ignore ) {
2021-10-03 17:17:00 +02:00
for ( Entry entry : entries ) {
2021-10-05 08:41:57 +02:00
applyMetadata ( username , karma , entry , ignore ) ;
2021-10-03 17:17:00 +02:00
}
}
/ * *
2021-10-04 13:02:40 +02:00
* Exists .
*
* @param id the id
* @return true , if successful
2021-10-03 17:17:00 +02:00
* /
public boolean exists ( Long id ) {
return entryRepository . existsById ( id ) ;
}
/ * *
2021-10-04 13:02:40 +02:00
* Gets the .
*
* @param id the id
* @return the entry
2021-10-03 17:17:00 +02:00
* /
public Entry get ( Long id ) {
return entryRepository . findById ( id ) . orElse ( null ) ;
}
/ * *
2021-10-04 13:02:40 +02:00
* Save .
*
* @param entry the entry
* @return the entry
2021-10-03 17:17:00 +02:00
* /
public Entry save ( Entry entry ) {
2021-12-02 19:30:54 +01:00
List < String > tags = Lists . newArrayList ( ) ;
if ( entry . getTags ( ) ! = null ) {
tags = Lists . newArrayList ( entry . getTags ( ) ) ;
2021-12-01 19:25:33 +01:00
2021-12-02 19:30:54 +01:00
if ( tags . size ( ) > settingsManager . getMaxTags ( ) ) {
tags = tags . subList ( 0 , settingsManager . getMaxTags ( ) - 1 ) ;
}
2021-12-01 19:25:33 +01:00
}
2021-12-01 19:00:50 +01:00
entry = entryRepository . save ( entry ) ;
tagManager . setForTarget ( entry . getId ( ) , tags ) ;
return entry ;
2021-10-03 17:17:00 +02:00
}
2021-10-03 20:23:26 +02:00
/ * *
2021-10-04 13:02:40 +02:00
* Delete .
*
* @param entry the entry
2021-10-03 20:23:26 +02:00
* /
public void delete ( Entry entry ) {
2021-12-01 19:00:50 +01:00
tagManager . deleteByTarget ( entry . getId ( ) ) ;
2021-10-03 20:23:26 +02:00
commentManager . deleteByTarget ( entry . getId ( ) ) ;
voteManager . deleteByTarget ( entry . getId ( ) , Types . entry ) ;
2021-11-21 16:43:19 +01:00
bookmarksManager . removeEntry ( entry . getId ( ) ) ;
flagManager . deleteByTarget ( entry . getId ( ) , Types . entry ) ;
2021-10-03 20:23:26 +02:00
entryRepository . delete ( entry ) ;
}
2021-10-03 17:17:00 +02:00
/ * *
2021-10-04 13:02:40 +02:00
* Gets the points .
*
* @param entryId the entry id
* @return the points
2021-10-03 17:17:00 +02:00
* /
public long getPoints ( Long entryId ) {
2022-04-13 16:50:35 +02:00
long upvotes = voteRepository
. count ( qVote . targetType . eq ( Types . entry ) . and ( qVote . type . eq ( VoteType . up ) ) . and ( qVote . target . eq ( entryId ) ) ) ;
long downvotes = voteRepository . count (
qVote . targetType . eq ( Types . entry ) . and ( qVote . type . eq ( VoteType . down ) ) . and ( qVote . target . eq ( entryId ) ) ) ;
2021-10-03 17:17:00 +02:00
return upvotes - downvotes ;
}
2021-10-04 18:29:04 +02:00
/ * *
* Gets the user points .
*
2022-04-13 16:50:35 +02:00
* @param entryId the entry id
2021-10-04 18:29:04 +02:00
* @param username the username
* @return the user points
* /
public long getUserPoints ( Long entryId , String username ) {
long upvotes = voteRepository . count ( qVote . targetType . eq ( Types . entry )
2021-10-04 19:55:53 +02:00
. and ( qVote . type . eq ( VoteType . up ) . and ( qVote . author . notEqualsIgnoreCase ( username ) ) )
2021-10-04 18:29:04 +02:00
. and ( qVote . target . eq ( entryId ) ) ) ;
long downvotes = voteRepository . count ( qVote . targetType . eq ( Types . entry )
2021-10-04 19:55:53 +02:00
. and ( qVote . type . eq ( VoteType . down ) . and ( qVote . author . notEqualsIgnoreCase ( username ) ) )
2021-10-04 18:29:04 +02:00
. and ( qVote . target . eq ( entryId ) ) ) ;
return upvotes - downvotes ;
}
2021-10-03 17:17:00 +02:00
}