using System.Threading.Channels; using ErsatzTV.Application; using ErsatzTV.Application.Search; using ErsatzTV.Core.Interfaces.Metadata; using ErsatzTV.Filters; using Microsoft.AspNetCore.Mvc; namespace ErsatzTV.Controllers.Api; [ApiController] [ApiExplorerSettings(IgnoreApi = true)] [SkipApiKeyAuthorization] [Route("api/scan/{scanId:guid}")] public class ScannerController( IScannerProxyService scannerProxyService, ChannelWriter channelWriter) { [HttpPost("progress")] [EndpointSummary("Scanner progress update")] public async Task Progress(Guid scanId, [FromBody] decimal percentComplete) { await scannerProxyService.Progress(scanId, percentComplete); return new OkResult(); } [HttpPost("items/reindex")] [EndpointSummary("Scanner reindex items in search index")] public async Task UpdateItems( Guid scanId, [FromBody] List itemsToUpdate, CancellationToken cancellationToken) { if (scannerProxyService.IsActive(scanId)) { await channelWriter.WriteAsync(new ReindexMediaItems(itemsToUpdate), cancellationToken); } return new OkResult(); } [HttpPost("items/remove")] [EndpointSummary("Scanner remove items from search index")] public async Task RemoveItems( Guid scanId, [FromBody] List itemsToRemove, CancellationToken cancellationToken) { if (scannerProxyService.IsActive(scanId)) { await channelWriter.WriteAsync(new RemoveMediaItems(itemsToRemove), cancellationToken); } return new OkResult(); } }