using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using MalwareMultiScan.Api.Attributes; using MalwareMultiScan.Api.Data.Models; using MalwareMultiScan.Api.Services.Interfaces; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace MalwareMultiScan.Api.Controllers { /// /// Queue controller. /// [ApiController] [Route("api/queue")] [Produces("application/json")] public class QueueController : Controller { private readonly IScanResultService _scanResultService; /// /// Initialize queue controller. /// /// Scan result service. public QueueController(IScanResultService scanResultService) { _scanResultService = scanResultService; } /// /// Queue file for scanning. /// /// File from form data. [HttpPost("file")] [ProducesResponseType(typeof(ScanResult), StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task ScanFile( [Required] [MaxFileSize] IFormFile file) { var result = await _scanResultService.CreateScanResult(); string storedFileId; await using (var uploadFileStream = file.OpenReadStream()) { storedFileId = await _scanResultService.StoreFile(file.FileName, uploadFileStream); } await _scanResultService.QueueUrlScan(result, Url.Action("Index", "Download", new {id = storedFileId}, Request?.Scheme, Request?.Host.Value)); return CreatedAtAction("Index", "ScanResults", new {id = result.Id}, result); } /// /// Queue URL for scanning. /// /// URL from form data. [HttpPost("url")] [ProducesResponseType(typeof(ScanResult), StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task ScanUrl( [FromForm] [Required] [IsHttpUrl] string url) { var result = await _scanResultService.CreateScanResult(); await _scanResultService.QueueUrlScan(result, url); return CreatedAtAction("Index", "ScanResults", new {id = result.Id}, result); } } }