bstlboard-back/src/main/java/de/bstly/board/businesslogic/EntryManager.java

628 lines
20 KiB
Java
Raw Normal View History

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 ("
+ 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 ("
+ 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 ("
+ 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
* @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
*/
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
* @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
*/
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
* @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
*/
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
* @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
*/
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,
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
* @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
*/
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");
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
* @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
*/
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++) {
tagsString += "'" + filter.getTags().get(index) + "'";
2021-12-02 19:30:54 +01:00
if (index < filter.getTags().size() - 1) {
tagsString += ",";
}
}
}
if (StringUtils.hasText(tagsString)) {
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-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++) {
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 ("
+ 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())) {
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++) {
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 ("
+ excludedTagsString + "))";
2021-12-01 19:00:50 +01: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++) {
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 ("
+ fixedExcludedTagsString + "))";
2021-12-03 23:47:17 +01:00
}
2021-12-01 19:00:50 +01:00
if (StringUtils.hasText(orderBy)) {
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
* @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++) {
tagsString += "'" + filter.getTags().get(index) + "'";
2021-12-02 19:30:54 +01:00
if (index < filter.getTags().size() - 1) {
tagsString += ",";
}
}
}
if (StringUtils.hasText(tagsString)) {
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())) {
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++) {
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 ("
+ 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
* @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"));
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
.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
* @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
* @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")) {
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")) {
entry.getMetadata().put("bookmark", !bookmarksManager.hasEntry(username, entry.getId()));
2021-10-07 14:00:40 +02:00
}
if (!ignore.contains("removeBookmark")) {
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",
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",
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")) {
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")) {
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")) {
entry.getMetadata().put("flagged", flagManager.getFlags(entry.getId(), Types.entry) > 0);
2021-10-07 14:35:15 +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
* @param karma the karma
* @param entries the entries
* @param ignore the ignore
2021-10-03 17:17:00 +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) {
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.
*
* @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
}