package com.srh.api.service; import com.srh.api.algorithms.AlgorithmCalc; import com.srh.api.algorithms.AlgorithmStrategy; import com.srh.api.algorithms.structure.RecommendationsByUser; import com.srh.api.dto.resource.RecommendationForm; import com.srh.api.model.*; import com.srh.api.repository.ItemRepository; import com.srh.api.repository.RecommendationRepository; import com.srh.api.utils.PageUtil; import org.hibernate.ObjectNotFoundException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Optional; @Service public class RecommendationService { @Autowired private RecommendationRepository recommendationRepository; @Autowired private ItemRepository itemRepository; @Autowired private TagService tagService; @Autowired private AlgorithmService algorithmService; public Recommendation find(Integer id) { Optional recommendation = recommendationRepository.findById(id); if (recommendation.isPresent()) return recommendation.get(); throw new ObjectNotFoundException(id, Recommendation.class.getName()); } public Page findAll(Pageable pageInfo) { return recommendationRepository.findAll(pageInfo); } public Recommendation save(Recommendation recommendation) { return recommendationRepository.save(recommendation); } public Recommendation update(Recommendation recommendation) { find(recommendation.getId()); return recommendationRepository.save(recommendation); } public void delete(Integer id) { find(id); recommendationRepository.deleteById(id); } public List generateRecommendation(RecommendationForm recommendationInfo) { AlgorithmCalc algorithm = AlgorithmStrategy.findInstance(recommendationInfo.getAlgorithmId()); return algorithm.calc(recommendationInfo); } public Page listRecommendationsByAlgorithm(Integer algorithmId, Pageable pageInfo) { Algorithm algorithm = algorithmService.find(algorithmId); List recommendations = recommendationRepository.findByAlgorithm(algorithm); PageUtil pageUtil = new PageUtil<>(pageInfo, recommendations); return pageUtil.getPage(); } public Page listRecommendationsByMatrixId(Integer matrixId, Pageable pageInfo) { List recommendations = recommendationRepository.findByMatrixId(matrixId); PageUtil pageUtil = new PageUtil<>(pageInfo, recommendations); return pageUtil.getPage(); } public Page listRecommendationsByTag(Integer tagId, Pageable pageInfo) { Tag tag = tagService.find(tagId); List itens = itemRepository.findByTags(tag); List recommendations = new ArrayList<>(); for (Item item : itens) { recommendations.addAll(item.getRecommendations()); } PageUtil pageUtil = new PageUtil<>(pageInfo, recommendations); return pageUtil.getPage(); } }