package com.recipeapp.recipe; import com.recipeapp.recipe.dto.RecipeSummaryResponse; import com.recipeapp.recipe.entity.Recipe; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.List; import java.util.Optional; import java.util.UUID; public interface RecipeRepository extends JpaRepository { Optional findByIdAndHouseholdIdAndDeletedAtIsNull(UUID id, UUID householdId); List findByHouseholdIdAndDeletedAtIsNull(UUID householdId); @Query(""" SELECT new com.recipeapp.recipe.dto.RecipeSummaryResponse( r.id, r.name, r.serves, r.cookTimeMin, r.effort, r.heroImagePreview) FROM Recipe r WHERE r.household.id = :householdId AND r.deletedAt IS NULL AND (:search IS NULL OR LOWER(r.name) LIKE LOWER(CONCAT('%', CAST(:search AS string), '%'))) AND (:effort IS NULL OR r.effort = CAST(:effort AS string)) AND (:cookTimeMaxMin IS NULL OR r.cookTimeMin <= :cookTimeMaxMin) ORDER BY r.createdAt DESC """) List findFiltered( @Param("householdId") UUID householdId, @Param("search") String search, @Param("effort") String effort, @Param("cookTimeMaxMin") Integer cookTimeMaxMin, @Param("sort") String sort, @Param("limit") int limit, @Param("offset") int offset); @Query(""" SELECT COUNT(r) FROM Recipe r WHERE r.household.id = :householdId AND r.deletedAt IS NULL AND (:search IS NULL OR LOWER(r.name) LIKE LOWER(CONCAT('%', CAST(:search AS string), '%'))) AND (:effort IS NULL OR r.effort = CAST(:effort AS string)) AND (:cookTimeMaxMin IS NULL OR r.cookTimeMin <= :cookTimeMaxMin) """) long countFiltered( @Param("householdId") UUID householdId, @Param("search") String search, @Param("effort") String effort, @Param("cookTimeMaxMin") Integer cookTimeMaxMin); }