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); }