package com.izouma.nineth.service; import com.izouma.nineth.domain.Collection; import com.izouma.nineth.domain.Follow; import com.izouma.nineth.domain.Like; import com.izouma.nineth.domain.User; import com.izouma.nineth.dto.CollectionDTO; import com.izouma.nineth.dto.PageQuery; import com.izouma.nineth.dto.UserDTO; import com.izouma.nineth.repo.CollectionRepo; import com.izouma.nineth.repo.LikeRepo; import com.izouma.nineth.utils.JpaUtils; import com.izouma.nineth.utils.SecurityUtils; import lombok.AllArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.stereotype.Service; import java.util.List; import java.util.stream.Collectors; @Service @AllArgsConstructor public class CollectionService { private CollectionRepo collectionRepo; private LikeRepo likeRepo; public Page all(PageQuery pageQuery) { return collectionRepo.findAll(JpaUtils.toSpecification(pageQuery, Collection.class), JpaUtils.toPageRequest(pageQuery)); } public CollectionDTO toDTO(Collection collection) { return toDTO(collection, true); } public CollectionDTO toDTO(Collection collection, boolean join) { CollectionDTO collectionDTO = new CollectionDTO(); BeanUtils.copyProperties(collection, collectionDTO); if (join) { if (SecurityUtils.getAuthenticatedUser() != null) { List list = likeRepo.findByUserIdAndCollectionId(SecurityUtils.getAuthenticatedUser().getId(), collection.getId()); collectionDTO.setLiked(!list.isEmpty()); } } return collectionDTO; } public List toDTO(List collections) { return collections.stream().parallel().map(collection -> { CollectionDTO dto = toDTO(collection, false); if (SecurityUtils.getAuthenticatedUser() != null) { List likes = likeRepo.findByUserId(SecurityUtils.getAuthenticatedUser().getId()); dto.setLiked(likes.stream().anyMatch(l -> l.getCollectionId().equals(collection.getId()))); } return dto; }).collect(Collectors.toList()); } public Page toDTO(Page collections) { List userDTOS = toDTO(collections.getContent()); return new PageImpl<>(userDTOS, collections.getPageable(), collections.getTotalElements()); } }