using System; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Collections.Generic; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using DigitalData.Modules.Interfaces; using DigitalData.Modules.Logging; namespace ZUGFeRDRESTService.Controllers { [Route("api/[controller]")] [ApiController] public class ValidationController : ControllerBase { public static string RESPONSE_OK = "OK"; public static string RESPONSE_ERROR = "ERROR"; private readonly ZUGFeRDInterface _zugferd; private readonly IDatabase _database; private readonly DigitalData.Modules.Logging.LogConfig _logConfig; private readonly DigitalData.Modules.Logging.Logger _logger; private readonly PropertyValues _props; private readonly Dictionary _propertyMap; public class ValidationResponse { public string status; public string message; public List errors; public ValidationResponse() { status = RESPONSE_OK; message = String.Empty; errors = new List(); } } public ValidationController(ILogging logging, IDatabase database) { _logConfig = logging.LogConfig; _logger = _logConfig.GetLogger(); _logger.Debug("Validation Controller initializing"); _database = database; var oGDPictureKey = database.GetGDPictureKey(); var oPropertyMap = database.GetPropertyMap(); _propertyMap = oPropertyMap; _zugferd = new ZUGFeRDInterface(_logConfig, oGDPictureKey); _props = new PropertyValues(_logConfig); _logger.Debug("Validation Controller initialized!"); } /// /// POST: api/Validation /// /// This parameter's name needs to correspond to the html form's file-input name [HttpPost] public async Task Post(IFormFile file, string user_id) { string oFilePath; string oFileName; oFilePath = Path.Combine(Path.GetTempPath(), file.FileName); oFileName = file.FileName; using FileStream oStream = new FileStream(oFilePath, FileMode.Create); await file.CopyToAsync(oStream); CrossIndustryDocumentType oDocument; try { oDocument = _zugferd.ExtractZUGFeRDFileWithGDPicture(oFilePath); } catch (Exception ex) { _logger.Error(ex); return new ValidationResponse() { status = RESPONSE_ERROR, message = "The uploaded file is not a valid ZUGFeRD Invoice!" }; } try { PropertyValues.CheckPropertyValuesResult oResult = _props.CheckPropertyValues(oDocument, _propertyMap, "MESSAGEID"); if (oResult.MissingProperties.Count > 0) { return new ValidationResponse() { status = RESPONSE_ERROR, message = "The uploaded file is a valid ZUGFeRD Invoice but missing some properties!", errors = oResult.MissingProperties }; } } catch (Exception ex) { _logger.Error(ex); return new ValidationResponse() { status = RESPONSE_ERROR, message = "The uploaded file is not a valid ZUGFeRD Invoice!" }; } return new ValidationResponse() { status = RESPONSE_OK, message = "The uploaded files is a valid ZUGFeRD Invoice!" }; } } }