This repository has been archived on 2026-05-07. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
codiki-old/src/main/java/org/codiki/posts/PostService.java
T

184 lines
6.4 KiB
Java
Executable File

package org.codiki.posts;
import java.io.IOException;
import java.security.Principal;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.codiki.core.entities.business.SearchEntity;
import org.codiki.core.entities.dto.PostDTO;
import org.codiki.core.entities.persistence.Category;
import org.codiki.core.entities.persistence.Post;
import org.codiki.core.entities.persistence.User;
import org.codiki.core.repositories.CategoryRepository;
import org.codiki.core.repositories.PostRepository;
import org.codiki.core.services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PostService {
static final int SCORE_TITLE = 50;
static final int SCORE_DESCRIPTION = 5;
static final int SCORE_TEXT = 1;
static final int SCORE_CATEGORY = 30;
static final int SCORE_AUTHOR_NAME = 40;
static final int SCORE_AUTHOR_EMAIL = 40;
@Autowired
private PostRepository postRepository;
@Autowired
private CategoryRepository categoryRepository;
@Autowired
private UserService userService;
public Optional<Post> insert(final PostDTO pPost, final HttpServletRequest pRequest,
final HttpServletResponse pResponse, final Principal pPrincipal) {
Optional<Post> result = Optional.empty();
final Optional<User> user = userService.getUserByPrincipal(pPrincipal);
if(user.isPresent()) {
final Post postToSave = new Post(pPost);
postToSave.setAuthor(user.get());
postRepository.save(postToSave);
result = Optional.of(postToSave);
} else {
pResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
}
return result;
}
public void update(final Post pPost, final HttpServletRequest pRequest,
final HttpServletResponse pResponse, final Principal pPrincipal) throws IOException {
final Optional<User> connectedUser = userService.getUserByPrincipal(pPrincipal);
if(connectedUser.isPresent() && connectedUser.get().getKey().equals(pPost.getAuthor().getKey())) {
final Optional<Post> postOpt = postRepository.getByKey(pPost.getKey());
if(postOpt.isPresent()) {
final Optional<Category> category = categoryRepository.findById(pPost.getCategory().getId());
if(category.isPresent()) {
final Post post = postOpt.get();
post.setTitle(pPost.getTitle());
post.setImage(pPost.getImage());
post.setDescription(pPost.getDescription());
post.setCreationDate(new Date());
post.setText(pPost.getText());
post.setCategory(category.get());
postRepository.save(post);
} else {
pResponse.sendError(HttpServletResponse.SC_BAD_REQUEST);
}
} else {
pResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
}
} else {
pResponse.sendError(HttpServletResponse.SC_FORBIDDEN);
}
}
public void delete(final String pPostKey, final HttpServletRequest pRequest,
final HttpServletResponse pResponse, final Principal pPrincipal) throws IOException {
final Optional<Post> postToDelete = postRepository.getByKey(pPostKey);
if(postToDelete.isPresent()) {
final Optional<User> connectedUser = userService.getUserByPrincipal(pPrincipal);
if(connectedUser.isPresent()) {
if(connectedUser.get().getKey().equals(postToDelete.get().getAuthor().getKey())) {
postRepository.delete(postToDelete.get());
} else {
pResponse.sendError(HttpServletResponse.SC_FORBIDDEN);
}
} else {
pResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
} else {
pResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
public List<Post> search(String pSearchCriteria) {
final String[] criteriasArray = pSearchCriteria.split(" ");
final List<SearchEntity> listSearchEntities = new LinkedList<>();
postRepository.search(criteriasArray).stream().map(SearchEntity::new).forEach(e -> {
calculateScore(e, criteriasArray);
listSearchEntities.add(e);
});
Collections.sort(listSearchEntities, (e1, e2) -> e2.getScore() - e1.getScore());
return listSearchEntities.stream().map(SearchEntity::getPost).collect(Collectors.toList());
}
void calculateScore(final SearchEntity searchPost, final String[] pCriteriasArray) {
for(final String criteria : pCriteriasArray) {
String formattedCriteria = formatForComp(criteria);
calculateScoreForTitle(searchPost, formattedCriteria);
calculateScoreForDescription(searchPost, formattedCriteria);
calculateScoreForText(searchPost, formattedCriteria);
calculateScoreForCategory(searchPost, formattedCriteria);
calculateScoreForAuthorName(searchPost, formattedCriteria);
calculateScoreForAuthorEmail(searchPost, formattedCriteria);
}
}
String formatForComp(final String pElem) {
return StringUtils.stripAccents(pElem.toLowerCase());
}
void calculateScoreForTitle(final SearchEntity pSearchPost, final String pCriteria) {
if(formatForComp(pSearchPost.getPost().getTitle()).contains(pCriteria)) {
pSearchPost.increaseScore(SCORE_TITLE);
}
}
void calculateScoreForDescription(final SearchEntity pSearchPost, final String pCriteria) {
final int criteriaOccurence = StringUtils.countMatches(formatForComp(pSearchPost.getPost().getDescription()),
pCriteria);
pSearchPost.increaseScore(criteriaOccurence * SCORE_DESCRIPTION);
}
void calculateScoreForText(final SearchEntity pSearchPost, final String pCriteria) {
final int criteriaOccurence = StringUtils.countMatches(formatForComp(pSearchPost.getPost().getText()),
pCriteria);
pSearchPost.increaseScore(criteriaOccurence * SCORE_TEXT);
}
void calculateScoreForCategory(final SearchEntity pSearchPost, final String pCriteria) {
if(formatForComp(pSearchPost.getPost().getCategory().getName()).contains(pCriteria)) {
pSearchPost.increaseScore(SCORE_CATEGORY);
}
}
void calculateScoreForAuthorName(final SearchEntity pSearchPost, final String pCriteria) {
if(formatForComp(pSearchPost.getPost().getAuthor().getName()).contains(pCriteria)) {
pSearchPost.increaseScore(SCORE_AUTHOR_NAME);
}
}
void calculateScoreForAuthorEmail(final SearchEntity pSearchPost, final String pCriteria) {
if(formatForComp(pSearchPost.getPost().getAuthor().getEmail()).contains(pCriteria)) {
pSearchPost.increaseScore(SCORE_AUTHOR_EMAIL);
}
}
}