80 lines
2.2 KiB
Java
80 lines
2.2 KiB
Java
package com.krylov.refound.service;
|
|
|
|
import com.krylov.refound.entity.Favorite;
|
|
import com.krylov.refound.entity.Post;
|
|
import com.krylov.refound.entity.User;
|
|
import com.krylov.refound.enums.ErrorCode;
|
|
import com.krylov.refound.exception.ApiException;
|
|
import com.krylov.refound.repository.FavoriteRepository;
|
|
import com.krylov.refound.repository.PostRepository;
|
|
import java.util.List;
|
|
import lombok.RequiredArgsConstructor;
|
|
import org.springframework.http.HttpStatus;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
@Service
|
|
@RequiredArgsConstructor
|
|
public class FavoriteService {
|
|
private final FavoriteRepository repository;
|
|
private final PostRepository postRepository;
|
|
private final UserService userService;
|
|
|
|
public void addToFavorites(Long postId) {
|
|
|
|
User user = userService.getCurrentUser();
|
|
|
|
Post post = postRepository.findById(postId)
|
|
.orElseThrow(() -> new ApiException(ErrorCode.NOT_FOUND, "Post not found", HttpStatus.NOT_FOUND));
|
|
|
|
if (repository.existsByUserAndPost(user, post)) {
|
|
return; // уже есть
|
|
}
|
|
|
|
Favorite favorite = new Favorite();
|
|
favorite.setUser(user);
|
|
favorite.setPost(post);
|
|
|
|
repository.save(favorite);
|
|
}
|
|
|
|
public void removeFromFavorites(Long postId) {
|
|
|
|
User user = userService.getCurrentUser();
|
|
|
|
Post post = postRepository.findById(postId)
|
|
.orElseThrow(() -> new ApiException(ErrorCode.NOT_FOUND, "Post not found", HttpStatus.NOT_FOUND));
|
|
|
|
repository.deleteByUserAndPost(user, post);
|
|
}
|
|
|
|
public List<Post> getFavorites() {
|
|
User user = userService.getCurrentUser();
|
|
|
|
return repository.findByUser(user)
|
|
.stream()
|
|
.map(Favorite::getPost)
|
|
.toList();
|
|
}
|
|
|
|
public void toggle(Long postId) {
|
|
|
|
User user = userService.getCurrentUser();
|
|
|
|
Post post = postRepository.findById(postId)
|
|
.orElseThrow(() -> new ApiException(
|
|
ErrorCode.NOT_FOUND,
|
|
"Post not found",
|
|
HttpStatus.NOT_FOUND
|
|
));
|
|
|
|
if (repository.existsByUserAndPost(user, post)) {
|
|
repository.deleteByUserAndPost(user, post);
|
|
} else {
|
|
Favorite f = new Favorite();
|
|
f.setUser(user);
|
|
f.setPost(post);
|
|
repository.save(f);
|
|
}
|
|
}
|
|
}
|