using Microsoft.AspNetCore.Mvc; using OI.Metrology.Server.Models; using OI.Metrology.Shared.Models; using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Services; using System.Net; namespace OI.Metrology.Server.ApiControllers; [ApiController] [Route("api/[controller]")] public partial class InboundController : ControllerBase, IInboundController { private readonly ILogger _Logger; private readonly AppSettings _AppSettings; private readonly IInboundRepository _InboundRepository; private readonly IAttachmentsService _AttachmentsService; private readonly IInboundDataService _InboundDataService; private readonly IMetrologyRepository _MetrologyRepository; public InboundController(AppSettings appSettings, ILogger logger, IMetrologyRepository metrologyRepository, IInboundRepository inboundRepository, IInboundDataService inboundDataService, IAttachmentsService attachmentsService) { _Logger = logger; _AppSettings = appSettings; _InboundRepository = inboundRepository; _AttachmentsService = attachmentsService; _InboundDataService = inboundDataService; _MetrologyRepository = metrologyRepository; } private static string? GetJson(Stream stream) { string? result; if (!stream.CanRead) result = null; else { Task task = new StreamReader(stream).ReadToEndAsync(); result = task.Result; } return result; } [HttpPost] [Route("{tooltype}")] public IActionResult Post(string tooltype) { IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress; if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP)) { _Logger.LogInformation($"Rejected remote IP: {remoteIP}"); return Unauthorized("Remote IP is not on allowed list"); } else { string? json = GetJson(Request.Body); DataResponse dataResponse = _InboundRepository.Data(_MetrologyRepository, _InboundDataService, tooltype, json); if (!dataResponse.Errors.Any()) return Ok(dataResponse); else return BadRequest(dataResponse); } } [HttpPost] [Route("{tooltype}/attachment")] public IActionResult AttachFile(string tooltype, [FromQuery] long headerid, [FromQuery] string datauniqueid = "") { IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress; if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP)) { _Logger.LogInformation($"Rejected remote IP: {remoteIP}"); return Unauthorized("Remote IP is not on allowed list"); } else { if (Request.Form is null) return BadRequest($"Invalid form"); if (Request.Form.Files.Count != 1) return BadRequest($"Invalid file count"); IFormFile formFile = Request.Form.Files[0]; string? message = _InboundRepository.AttachFile(_MetrologyRepository, _AttachmentsService, tooltype, headerid, datauniqueid, formFile.FileName, formFile); if (message is null) return Ok(); else return BadRequest(message); } } }