79 lines
2.9 KiB
C#
Raw Normal View History

using System;
using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;
2020-10-26 17:06:29 +02:00
using MalwareMultiScan.Api.Attributes;
using MalwareMultiScan.Api.Data.Models;
2020-10-29 12:17:09 +02:00
using MalwareMultiScan.Api.Services.Interfaces;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace MalwareMultiScan.Api.Controllers
{
2020-10-29 16:09:56 +02:00
/// <summary>
/// Queue controller.
/// </summary>
[ApiController]
2020-10-27 09:57:39 +02:00
[Route("api/queue")]
[Produces("application/json")]
public class QueueController : Controller
{
2020-10-29 12:17:09 +02:00
private readonly IScanResultService _scanResultService;
2020-10-29 16:09:56 +02:00
/// <summary>
/// Initialize queue controller.
/// </summary>
/// <param name="scanResultService">Scan result service.</param>
2020-10-29 12:17:09 +02:00
public QueueController(IScanResultService scanResultService)
{
_scanResultService = scanResultService;
}
2020-10-26 17:06:29 +02:00
2020-10-29 16:09:56 +02:00
/// <summary>
/// Queue file for scanning.
/// </summary>
/// <param name="file">File from form data.</param>
/// <param name="callbackUrl">Optional callback URL.</param>
[HttpPost("file")]
2020-10-26 17:06:29 +02:00
[ProducesResponseType(typeof(ScanResult), StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<IActionResult> ScanFile(
[Required] [MaxFileSize] IFormFile file,
[FromForm] [IsHttpUrl(false)] string callbackUrl = null)
{
var result = await _scanResultService.CreateScanResult(
string.IsNullOrEmpty(callbackUrl) ? null : new Uri(callbackUrl));
string storedFileId;
await using (var uploadFileStream = file.OpenReadStream())
2020-10-29 16:09:56 +02:00
{
2020-10-29 12:17:09 +02:00
storedFileId = await _scanResultService.StoreFile(file.FileName, uploadFileStream);
2020-10-29 16:09:56 +02:00
}
2020-10-26 17:06:29 +02:00
await _scanResultService.QueueUrlScan(result, Url.Action("Index", "Download", new {id = storedFileId},
2020-10-29 12:17:09 +02:00
Request?.Scheme, Request?.Host.Value));
return CreatedAtAction("Index", "ScanResults", new {id = result.Id}, result);
}
2020-10-26 17:06:29 +02:00
2020-10-29 16:09:56 +02:00
/// <summary>
/// Queue URL for scanning.
/// </summary>
/// <param name="url">URL from form data.</param>
/// <param name="callbackUrl">Optional callback URL.</param>
[HttpPost("url")]
2020-10-26 17:06:29 +02:00
[ProducesResponseType(typeof(ScanResult), StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<IActionResult> ScanUrl(
[FromForm] [Required] [IsHttpUrl] string url,
[FromForm] [IsHttpUrl(false)] string callbackUrl = null)
{
var result = await _scanResultService.CreateScanResult(
string.IsNullOrEmpty(callbackUrl) ? null : new Uri(callbackUrl));
2020-10-26 17:06:29 +02:00
await _scanResultService.QueueUrlScan(result, url);
return CreatedAtAction("Index", "ScanResults", new {id = result.Id}, result);
}
}
}