public async Task <Validation> SubmitAsync(FileInfo fileInfo, MediaTypeHeaderValue contentType = default, QualityLevelName quality = default, DeduplicationMode deduplication = default, WaitingStrategy waitingStrategy = default, CancellationToken cancellationToken = default)
        {
            if (fileInfo == null)
            {
                throw new ArgumentNullException(nameof(fileInfo));
            }

            using var request = new FileValidationRequest(fileInfo, contentType, quality, deduplication);

            return(await SubmitAsync(request,
                                     waitingStrategy,
                                     cancellationToken)
                   .ConfigureAwait(false));
        }
        public virtual SubmitResult ValidateFile(FileValidationRequest req)
        {
            var res = new SubmitResult();
            var cat = unit.AttachmentCategoryRepository.FindSingle(req.AttachmentType);

            if (cat == null)
            {
                return(new SubmitResult(1, "MSG_unknown_category"));
            }

            if (!cat.ValidateFile(req, out ValidationResult val))
            {
                return(new SubmitResult(1, val.ErrorMessage));
            }
            return(res);
        }
 public virtual SubmitResult ValidateFile([FromBody] FileValidationRequest req) => service.ValidateFile(req);
        public async Task <Validation> SubmitAsync(FileValidationRequest request, WaitingStrategy waitingStrategy = default, CancellationToken cancellationToken = default)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            var restClient = _restClientFactory.Build();

            // Serialize the validation request (settings only) to JSON

            var settingsContent = restClient
                                  .Serialize(new
            {
                quality       = request.Quality?.NameOrGuid,
                deduplication = request.Deduplication?.NameOrGuid,
                priority      = request.Priority?.Value,
                name          = request.Name,
                // Strips the milliseconds portion from the specified retention period, if any
                retention = request.Retention == null
                        ? null
                        : new TimeSpan(request.Retention.Value.Days,
                                       request.Retention.Value.Hours,
                                       request.Retention.Value.Minutes,
                                       request.Retention.Value.Seconds)
                            .ToString(),
                callback = request.CompletionCallback == null
                        ? null
                        : new
                {
                    url = request.CompletionCallback.ToString()
                },

                // File-specific

                startingRow = request.StartingRow,
                endingRow   = request.EndingRow,
                column      = request.Column,
                sheet       = request.Sheet,
                lineEnding  = request.LineEnding,
                delimiter   = request.Delimiter,
            });

            // Send the request to the Verifalia servers

            using (var postedFileContent = new StreamContent(request.File))
                using (var postedSettingsContent = new StringContent(settingsContent, Encoding.UTF8, WellKnownMimeContentTypes.ApplicationJson))
                {
                    postedFileContent.Headers.ContentType     = request.ContentType;
                    postedSettingsContent.Headers.ContentType = new MediaTypeHeaderValue(WellKnownMimeContentTypes.ApplicationJson);

                    return(await SubmitAsync(restClient,
                                             contentFactory : _ =>
                    {
                        var postedContent = new MultipartFormDataContent();

                        postedContent.Add(postedFileContent, "inputFile",
                                          // HACK: Must send a filename, as the backend expects one
                                          // see https://github.com/dotnet/aspnetcore/blob/425c196cba530b161b120a57af8f1dd513b96f67/src/Http/Headers/src/ContentDispositionHeaderValueIdentityExtensions.cs#L27
                                          "dummy");
                        postedContent.Add(postedSettingsContent, "settings");

                        return Task.FromResult <HttpContent>(postedContent);
                    },
                                             waitingStrategy,
                                             cancellationToken)
                           .ConfigureAwait(false));
                }
        }