using System; using System.Threading.Tasks; using API.Controllers; using API.Data; using API.SignalR.Presence; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Logging; namespace API.Middleware; /// /// Middleware that will track any API calls as updating the authenticated (ApiKey) user's LastActive and inform /// [AttributeUsage(AttributeTargets.Class)] public class OpdsActiveUserMiddlewareAttribute(IUnitOfWork unitOfWork, IPresenceTracker presenceTracker, ILogger logger) : ActionFilterAttribute { public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { try { if (!context.ActionArguments.TryGetValue("apiKey", out var apiKeyObj) || apiKeyObj is not string apiKey) { await next(); return; } var userId = await unitOfWork.UserRepository.GetUserIdByApiKeyAsync(apiKey); if (userId == 0) { context.Result = new UnauthorizedResult(); return; } await unitOfWork.UserRepository.UpdateUserAsActive(userId); } catch (Exception ex) { logger.LogError(ex, "Failed to count User as active during OPDS request"); await next(); return; } await next(); } }