using System.Collections.Generic; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; using FluentResults; using MediatR; using Microsoft.AspNetCore.Http; using NexusReader.Application.Queries.Recommendations; using NexusReader.UI.Shared.Services; namespace NexusReader.Web.Services; /// /// Server-side implementation of that executes /// the MediatR query directly inside the Web Server's request context. /// public sealed class ServerRecommendationService : IRecommendationService { private readonly IMediator _mediator; private readonly IHttpContextAccessor _httpContextAccessor; public ServerRecommendationService(IMediator mediator, IHttpContextAccessor httpContextAccessor) { _mediator = mediator; _httpContextAccessor = httpContextAccessor; } public async Task?> GetRecommendationsAsync(CancellationToken cancellationToken = default) { var httpContext = _httpContextAccessor.HttpContext; if (httpContext?.User == null) { return new List(); } var userId = httpContext.User.FindFirstValue(ClaimTypes.NameIdentifier); if (string.IsNullOrEmpty(userId)) { return new List(); } var result = await _mediator.Send(new GetContextualRecommendationsQuery(userId), cancellationToken); if (result.IsSuccess && result.Value != null) { return result.Value.Recommendations; } return new List(); } }