using LightlessSync.API.Routes; using LightlessSyncStaticFilesServer.Services; using LightlessSyncStaticFilesServer.Utils; using Microsoft.AspNetCore.Mvc; namespace LightlessSyncStaticFilesServer.Controllers; [Route(LightlessFiles.Cache)] public class CacheController : ControllerBase { private readonly RequestFileStreamResultFactory _requestFileStreamResultFactory; private readonly CachedFileProvider _cachedFileProvider; private readonly RequestQueueService _requestQueue; private readonly FileStatisticsService _fileStatisticsService; public CacheController(ILogger logger, RequestFileStreamResultFactory requestFileStreamResultFactory, CachedFileProvider cachedFileProvider, RequestQueueService requestQueue, FileStatisticsService fileStatisticsService) : base(logger) { _requestFileStreamResultFactory = requestFileStreamResultFactory; _cachedFileProvider = cachedFileProvider; _requestQueue = requestQueue; _fileStatisticsService = fileStatisticsService; } [HttpGet(LightlessFiles.Cache_Get)] public async Task GetFiles(Guid requestId) { _logger.LogDebug($"GetFile:{LightlessUser}:{requestId}"); if (!_requestQueue.IsActiveProcessing(requestId, LightlessUser, out var request)) return BadRequest(); _requestQueue.ActivateRequest(requestId); Response.ContentType = "application/octet-stream"; long requestSize = 0; List substreams = new(); foreach (var fileHash in request.FileIds) { var fs = await _cachedFileProvider.DownloadAndGetLocalFileInfo(fileHash).ConfigureAwait(false); if (fs == null) continue; substreams.Add(new(fs)); requestSize += fs.Length; } _fileStatisticsService.LogRequest(requestSize); return _requestFileStreamResultFactory.Create(requestId, new BlockFileDataStream(substreams)); } }