private void ValidateRequestbody(DocumentTranslationRequestModel model)
        {
            var errors = new List <string>();

            if (model.Inputs == null || model.Inputs.Count() == 0)
            {
                errors.Add("Inputs is required.");
            }

            if (model.Inputs.Any(x => string.IsNullOrWhiteSpace(x.Source.SourceUrl)))
            {
                errors.Add("Source url is required.");
            }

            if (model.Inputs.Any(x => x.Targets.Any(y => string.IsNullOrWhiteSpace(y.TargetUrl))))
            {
                errors.Add("Target url is required.");
            }

            if (errors.Count > 0)
            {
                throw new ApiHttpStatusException <IEnumerable <string> >(HttpStatusCode.BadRequest, errors.FirstOrDefault(), errors);
            }
        }
        public async Task <IActionResult> TranslateAsync(TranslateRequestModel model)
        {
            var message = "";

            try
            {
                if (!ModelState.IsValid)
                {
                    message = "Request body is invalid.";
                    throw new ApiHttpStatusException <ErrorModel <int> >(HttpStatusCode.BadRequest, message, new ErrorModel <int>
                    {
                        Code    = (int)HttpStatusCode.BadRequest,
                        Message = message,
                    });
                }

                //var result = await storageService.FindByNameAsync(model.Name);


                //var containerSasUri = storageService.GenerateContainerSasUri();

                var nameTokens = model.Name.Split('.');
                var namePart   = string.Join(".", nameTokens.Take(nameTokens.Length - 1));

                var containerSasUri = "https://chtranslatorstroage.blob.core.windows.net/document-translation?sp=rwl&st=2021-08-03T07:46:05Z&se=2021-08-03T15:46:05Z&spr=https&sv=2020-08-04&sr=c&sig=D8uNMCPgOpEN9AGG6d%2BCS1TOAnEhXON1NNliUtpM174%3D";

                var documentTranslationRequestModel = new DocumentTranslationRequestModel
                {
                    Inputs = new BatchInput[]
                    {
                        new BatchInput
                        {
                            Source = new SourceInput
                            {
                                //SourceUrl = storageService.GenerateBlobSasUri(model.Name, BlobSasPermissions.List | BlobSasPermissions.Read, DateTimeOffset.UtcNow + TimeSpan.FromDays(3)),
                                //SourceUrl = storageService.GenerateContainerSasUri(BlobContainerSasPermissions.All, DateTimeOffset.UtcNow + TimeSpan.FromDays(3)),
                                SourceUrl     = containerSasUri,
                                StorageSource = StorageSources.AzureBlob,

                                Filter = new Filter
                                {
                                    //Prefix = namePart,
                                    //Suffix = ".html",
                                    Suffix = model.Name,
                                },
                                Language = model.CriteriaLanguage,
                            },
                            //StorageType =  StorageInputTypes.File,
                            StorageType = StorageInputTypes.Folder,
                            Targets     = model.TargetLanguages.Select(language => new TargetInput
                            {
                                //TargetUrl = storageService.GenerateBlobSasUri(documentNamingStrategy.GetTranslatedDocumentName(model.Name,language), BlobSasPermissions.List | BlobSasPermissions.Write | BlobSasPermissions.Create , DateTimeOffset.UtcNow + TimeSpan.FromDays(3)),
                                //TargetUrl = storageService.GenerateContainerSasUri(BlobContainerSasPermissions.All, DateTimeOffset.UtcNow + TimeSpan.FromDays(3)),
                                //TargetUrl="https://chtranslatorstroage.blob.core.windows.net/document-translation?sp=rw&st=2021-08-03T07:46:05Z&se=2021-08-03T15:46:05Z&spr=https&sv=2020-08-04&sr=c&sig=7%2FxohLKKDT2qywxgiFgpqVGdMXOm7lo5opITh1V2Vr4%3D",
                                TargetUrl     = containerSasUri,
                                Language      = language,
                                StorageSource = StorageSources.AzureBlob,
                            }),
                        },
                    },
                };

                var translationRequestResult = await documentTranslationService.RequestTranslation(documentTranslationRequestModel);

                return(StatusCode(HttpStatusCode.Accepted, translationRequestResult));
            }
            catch (ApiException ex)
            {
                return(StatusCode(ex.StatusCode, ex.Message, ex.GetDetails()));
            }
            catch (Exception ex)
            {
                logger.LogError(ex, ex.Message);

                return(StatusCode(HttpStatusCode.InternalServerError, ex.Message));
            }
        }
        public async Task <DocumentTranslationResponseModel> RequestTranslation(DocumentTranslationRequestModel model, CancellationToken cancellationToken = default)
        {
            ValidateAzureTranslateConnectionOptions();
            ValidateRequestbody(model);

            DocumentTranslationResponseModel result = null;

            var requestBody = SerializeToJson(model);

            using (var client = new HttpClient())
            {
                using (var request = new HttpRequestMessage())
                {
                    request.Method     = HttpMethod.Post;
                    request.RequestUri = new Uri(GetApiUrl());

                    request.Headers.Add(OCP_APIM_SUBSCRIPTION_KEY, options.SubscriptionKey);
                    //request.Headers.Add(OCP_APIM_SUBSCRIPTION_REGION, options.Region);

                    request.Content = new StringContent(requestBody, Encoding.UTF8, CONTENT_TYPE_VALUE);

                    var response = await client.SendAsync(request, cancellationToken);

                    var resultJson = await response.Content?.ReadAsStringAsync();

                    var responseContentType = response.Content.Headers.ContentType?.MediaType ?? string.Empty;

                    var jsonSerializerOptions = new JsonSerializerOptions
                    {
                        PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                    };

                    if (response.IsSuccessStatusCode)
                    {
                        logger.LogInformation($"${Tag} The request has been processed. => Translated.");

                        if (response.Headers.Contains("Operation-Location"))
                        {
                            result = response.Headers.GetValues("Operation-Location").Select(operationLocation => new DocumentTranslationResponseModel
                            {
                                Id = operationLocation.Split('/').Last(),
                                OperationLocation = operationLocation,
                            }).FirstOrDefault();
                        }
                        else
                        {
                            var code    = "No operation location";
                            var message = "Translation operation could not find.";
                            throw new ApiHttpStatusException <ErrorModel <string> >(
                                      HttpStatusCode.NotAcceptable,
                                      message,
                                      new ErrorModel <string>
                            {
                                Code    = code,
                                Message = message,
                            }
                                      );
                        }
                    }
                    else
                    {
                        ErrorResponseModel errorResult;

                        if (responseContentType.EndsWith("/json", StringComparison.OrdinalIgnoreCase))
                        {
                            errorResult = JsonSerializer.Deserialize <ErrorResponseModel>(resultJson);

                            logger.LogInformation($"${Tag} The request does not has been processed. => Not Translated.");
                        }
                        else
                        {
                            errorResult = new ErrorResponseModel
                            {
                                Error = new ErrorModel <int>
                                {
                                    Code    = (int)response.StatusCode,
                                    Message = response.ReasonPhrase,
                                },
                            };

                            logger.LogInformation($"${Tag} The request does not has been processed. => Server error.");
                        }

                        throw new ApiHttpStatusException <ErrorModel <int> >(response.StatusCode, errorResult.Error.Message, errorResult.Error);
                    }
                }
            }

            return(result);
        }