using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using LanMontainDesktop.RecommendationBackend.Models; namespace LanMontainDesktop.RecommendationBackend.Services; public sealed record DailyQuoteQuery( string? Locale = null, bool ForceRefresh = false); public sealed record DailyPoetryQuery( string? Locale = null, bool ForceRefresh = false); public sealed record DailyMovieQuery( string? Locale = null, int CandidateCount = 20, bool ForceRefresh = false); public sealed record DailyArtworkQuery( string? Locale = null, int CandidateCount = 50, bool ForceRefresh = false); public sealed record HotSearchQuery( string Provider = "Baidu", int Limit = 10, bool ForceRefresh = false); public sealed record RecommendationFeedQuery( string? Locale = null, int HotSearchLimit = 10, bool ForceRefresh = false); public sealed record RecommendationQueryResult( bool Success, T? Data, string? ErrorCode = null, string? ErrorMessage = null) { public static RecommendationQueryResult Ok(T data) { return new RecommendationQueryResult(true, data); } public static RecommendationQueryResult Fail(string errorCode, string errorMessage) { return new RecommendationQueryResult(false, default, errorCode, errorMessage); } } public interface IRecommendationInfoService { Task> GetDailyQuoteAsync( DailyQuoteQuery query, CancellationToken cancellationToken = default); Task> GetDailyPoetryAsync( DailyPoetryQuery query, CancellationToken cancellationToken = default); Task> GetDailyMovieAsync( DailyMovieQuery query, CancellationToken cancellationToken = default); Task> GetDailyArtworkAsync( DailyArtworkQuery query, CancellationToken cancellationToken = default); Task>> GetHotSearchAsync( HotSearchQuery query, CancellationToken cancellationToken = default); } public interface IRecommendationDataService : IRecommendationInfoService { Task> GetFeedAsync( RecommendationFeedQuery query, CancellationToken cancellationToken = default); void ClearCache(); }