FavoriteService.java

package com.oliwier.listmebackend.domain.service;

import com.oliwier.listmebackend.api.dto.CreateFavoriteRequest;
import com.oliwier.listmebackend.domain.model.Device;
import com.oliwier.listmebackend.domain.model.Favorite;
import com.oliwier.listmebackend.domain.repository.FavoriteRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.server.ResponseStatusException;

import java.util.List;
import java.util.UUID;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class FavoriteService {

    private final FavoriteRepository favoriteRepository;

    public List<Favorite> getMyFavorites(Device device) {
        return favoriteRepository.findByDeviceIdOrderByCreatedAtDesc(device.getId())
                .stream().limit(10).toList();
    }

    @Transactional
    public Favorite create(Device device, CreateFavoriteRequest req) {
        if (favoriteRepository.existsByDeviceIdAndItemName(device.getId(), req.itemName())) {
            return favoriteRepository.findByDeviceIdOrderByCreatedAtDesc(device.getId())
                    .stream()
                    .filter(f -> f.getItemName().equals(req.itemName()))
                    .findFirst()
                    .orElseThrow();
        }
        Favorite favorite = new Favorite();
        favorite.setDevice(device);
        favorite.setItemName(req.itemName());
        favorite.setEmoji(req.emoji());
        return favoriteRepository.save(favorite);
    }

    @Transactional
    public void delete(UUID favoriteId, Device device) {
        Favorite favorite = favoriteRepository.findById(favoriteId)
                .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Favorite not found"));
        if (!favorite.getDevice().getId().equals(device.getId())) {
            throw new ResponseStatusException(HttpStatus.FORBIDDEN, "Not your favorite");
        }
        favoriteRepository.delete(favorite);
    }
}