public virtual Task <IActionResult> PostProductIdentifiers([FromBody] string[] productIdentifiers, [FromQuery] string callbackUri) { return(Logger.LogStartEndAndElapsedTimeAsync(EventIds.ESSPostProductIdentifiersRequestStart, EventIds.ESSPostProductIdentifiersRequestCompleted, "Product Identifiers Endpoint request for _X-Correlation-ID:{correlationId}", async() => { if (productIdentifiers == null || productIdentifiers.Length == 0) { var error = new List <Error> { new Error() { Source = "requestBody", Description = "Either body is null or malformed." } }; return BuildBadRequestErrorResponse(error); } var productIdentifierRequest = new ProductIdentifierRequest() { ProductIdentifier = productIdentifiers, CallbackUri = callbackUri, CorrelationId = GetCurrentCorrelationId() }; var validationResult = await productDataService.ValidateProductDataByProductIdentifiers(productIdentifierRequest); if (!validationResult.IsValid) { List <Error> errors; if (validationResult.HasBadRequestErrors(out errors)) { return BuildBadRequestErrorResponse(errors); } } var azureAdB2C = new AzureAdB2C() { AudToken = TokenAudience, IssToken = TokenIssuer }; var productDetail = await productDataService.CreateProductDataByProductIdentifiers(productIdentifierRequest, azureAdB2C); if (productDetail.IsExchangeSetTooLarge) { Logger.LogError(EventIds.ExchangeSetTooLarge.ToEventId(), "Requested exchange set is too large for product identifiers endpoint for _X-Correlation-ID:{correlationId}", GetCurrentCorrelationId()); return BuildBadRequestErrorResponseForTooLargeExchangeSet(); } return GetEssResponse(productDetail); }, GetCurrentCorrelationId())); }
public virtual Task <IActionResult> GetProductDataSinceDateTime([FromQuery, SwaggerParameter(Required = true), SwaggerSchema(Format = "date-time")] string sinceDateTime, [FromQuery] string callbackUri) { return(Logger.LogStartEndAndElapsedTimeAsync(EventIds.ESSGetProductsFromSpecificDateRequestStart, EventIds.ESSGetProductsFromSpecificDateRequestCompleted, "Product Data SinceDateTime Endpoint request for _X-Correlation-ID:{correlationId}", async() => { ProductDataSinceDateTimeRequest productDataSinceDateTimeRequest = new ProductDataSinceDateTimeRequest() { SinceDateTime = sinceDateTime, CallbackUri = callbackUri, CorrelationId = GetCurrentCorrelationId() }; if (productDataSinceDateTimeRequest.SinceDateTime == null) { var error = new List <Error> { new Error() { Source = "sinceDateTime", Description = "Query parameter 'sinceDateTime' is required." } }; return BuildBadRequestErrorResponse(error); } var validationResult = await productDataService.ValidateProductDataSinceDateTime(productDataSinceDateTimeRequest); if (!validationResult.IsValid && validationResult.HasBadRequestErrors(out List <Error> errors)) { return BuildBadRequestErrorResponse(errors); } AzureAdB2C azureAdB2C = new AzureAdB2C() { AudToken = TokenAudience, IssToken = TokenIssuer }; var productDetail = await productDataService.CreateProductDataSinceDateTime(productDataSinceDateTimeRequest, azureAdB2C); if (productDetail.IsExchangeSetTooLarge) { Logger.LogError(EventIds.ExchangeSetTooLarge.ToEventId(), "Requested exchange set is too large for SinceDateTime endpoint for _X-Correlation-ID:{correlationId}.", GetCurrentCorrelationId()); return BuildBadRequestErrorResponseForTooLargeExchangeSet(); } return GetEssResponse(productDetail); }, GetCurrentCorrelationId())); }
public bool IsAzureB2CUser(AzureAdB2C azureAdB2C, string correlationId) { bool isAzureB2CUser = false; string b2CAuthority = $"{azureAdB2CConfiguration.Value.Instance}{azureAdB2CConfiguration.Value.TenantId}/v2.0/"; // for B2C Token string adB2CAuthority = $"{azureAdConfiguration.Value.MicrosoftOnlineLoginUrl}{azureAdB2CConfiguration.Value.TenantId}/v2.0"; // for AdB2C Token string audience = azureAdB2CConfiguration.Value.ClientId; if (azureAdB2C.IssToken == b2CAuthority && azureAdB2C.AudToken == audience) { logger.LogInformation(EventIds.ESSB2CUserValidationEvent.ToEventId(), "Token passed was B2C token and its Azure B2C user for ClientId:{audience} for _X-Correlation-ID:{CorrelationId}", audience, correlationId); isAzureB2CUser = true; } else if (azureAdB2C.IssToken == adB2CAuthority && azureAdB2C.AudToken == audience) { logger.LogInformation(EventIds.ESSB2CUserValidationEvent.ToEventId(), "Token passed was AdB2C token and its Azure ADB2C user for ClientId:{audience} for _X-Correlation-ID:{CorrelationId}", audience, correlationId); isAzureB2CUser = true; } return(isAzureB2CUser); }
public virtual async Task <IActionResult> NewFilesPublished([FromBody] JObject request) { Logger.LogInformation(EventIds.ESSClearCacheSearchDownloadEventStart.ToEventId(), "Clear Cache Event started for _X-Correlation-ID:{correlationId}", GetCurrentCorrelationId()); var azureAdB2C = new AzureAdB2C { AudToken = TokenAudience, IssToken = TokenIssuer }; if (azureAdB2CHelper.IsAzureB2CUser(azureAdB2C, GetCurrentCorrelationId())) { Logger.LogInformation(EventIds.ESSB2CUserValidationEvent.ToEventId(), "Event was triggered with invalid Azure AD token from Enterprise event for Clear Cache Search and Download Event for _X-Correlation-ID:{correlationId}", GetCurrentCorrelationId()); Logger.LogInformation(EventIds.ESSClearCacheSearchDownloadEventCompleted.ToEventId(), "Clear Cache Event completed as Azure AD Authentication failed with OK response and _X-Correlation-ID:{correlationId}", GetCurrentCorrelationId()); return(GetCacheResponse()); } var eventGridEvent = new CustomEventGridEvent(); JsonConvert.PopulateObject(request.ToString(), eventGridEvent); var data = (eventGridEvent.Data as JObject).ToObject <EnterpriseEventCacheDataRequest>(); Logger.LogInformation(EventIds.ESSClearCacheSearchDownloadEventStart.ToEventId(), "Enterprise Event data deserialized in ESS and Data:{data} and _X-Correlation-ID:{correlationId}", JsonConvert.SerializeObject(data), GetCurrentCorrelationId()); var validationResult = await essWebhookService.ValidateEventGridCacheDataRequest(data); var productName = data.Attributes.Where(a => a.Key == "CellName").Select(a => a.Value).FirstOrDefault(); if (!validationResult.IsValid) { Logger.LogInformation(EventIds.ESSClearCacheSearchDownloadValidationEvent.ToEventId(), "Required attributes missing in event data from Enterprise event for Clear Cache Search and Download Event for _X-Correlation-ID:{correlationId}", GetCurrentCorrelationId()); Logger.LogInformation(EventIds.ESSClearCacheSearchDownloadEventCompleted.ToEventId(), "Clear Cache Event completed for ProductName:{productName} as required data was missing in payload with OK response and _X-Correlation-ID:{correlationId}", productName, GetCurrentCorrelationId()); return(GetCacheResponse()); } await essWebhookService.DeleteSearchAndDownloadCacheData(data, GetCurrentCorrelationId()); Logger.LogInformation(EventIds.ESSClearCacheSearchDownloadEventCompleted.ToEventId(), "Clear Cache Event completed for ProductName:{productName} with OK response and _X-Correlation-ID:{correlationId}", productName, GetCurrentCorrelationId()); return(GetCacheResponse()); }
public SessionController(AzureAdB2C b2cOptions, BaseConfiguration baseConfiguration) { AzureAdB2COptions = b2cOptions; this.baseUrl = baseConfiguration.ClientURL; }
public async Task <ExchangeSetServiceResponse> CreateProductDataByProductIdentifiers(ProductIdentifierRequest productIdentifierRequest, AzureAdB2C azureAdB2C) { DateTime salesCatalogueServiceRequestStartedAt = DateTime.UtcNow; var salesCatalogueResponse = await salesCatalogueService.PostProductIdentifiersAsync(productIdentifierRequest.ProductIdentifier.ToList(), productIdentifierRequest.CorrelationId); long fileSize = 0; if (salesCatalogueResponse.ResponseCode == HttpStatusCode.OK) { fileSize = CommonHelper.GetFileSize(salesCatalogueResponse.ResponseBody); bool isAzureB2C = azureAdB2CHelper.IsAzureB2CUser(azureAdB2C, productIdentifierRequest.CorrelationId); if (isAzureB2C) { var checkFileResponse = CheckIfExchangeSetTooLarge(fileSize); if (checkFileResponse.HttpStatusCode != HttpStatusCode.OK) { return(checkFileResponse); } } } DateTime salesCatalogueServiceRequestCompletedAt = DateTime.UtcNow; monitorHelper.MonitorRequest("Sales Catalogue Service Product Identifier Request", salesCatalogueServiceRequestStartedAt, salesCatalogueServiceRequestCompletedAt, productIdentifierRequest.CorrelationId, null, null, fileSize, null); var response = SetExchangeSetResponse(salesCatalogueResponse, false); if (response.HttpStatusCode != HttpStatusCode.OK && response.HttpStatusCode != HttpStatusCode.NotModified) { return(response); } var exchangeSetServiceResponse = await SetExchangeSetResponseLinks(response, productIdentifierRequest.CorrelationId); if (exchangeSetServiceResponse.HttpStatusCode != HttpStatusCode.Created) { return(exchangeSetServiceResponse); } string expiryDate = exchangeSetServiceResponse.ExchangeSetResponse.ExchangeSetUrlExpiryDateTime.Value.ToString("yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture); if (!string.IsNullOrEmpty(exchangeSetServiceResponse.BatchId)) { await SaveSalesCatalogueStorageDetails(salesCatalogueResponse.ResponseBody, exchangeSetServiceResponse.BatchId, productIdentifierRequest.CallbackUri, productIdentifierRequest.CorrelationId, expiryDate); } return(response); }
public async Task <ExchangeSetServiceResponse> CreateProductDataByProductVersions(ProductDataProductVersionsRequest request, AzureAdB2C azureAdB2C) { DateTime salesCatalogueServiceRequestStartedAt = DateTime.UtcNow; var salesCatalogueResponse = await salesCatalogueService.PostProductVersionsAsync(request.ProductVersions, request.CorrelationId); long fileSize = 0; if (salesCatalogueResponse.ResponseCode == HttpStatusCode.OK) { fileSize = CommonHelper.GetFileSize(salesCatalogueResponse.ResponseBody); bool isAzureB2C = azureAdB2CHelper.IsAzureB2CUser(azureAdB2C, request.CorrelationId); if (isAzureB2C) { var checkFileResponse = CheckIfExchangeSetTooLarge(fileSize); if (checkFileResponse.HttpStatusCode != HttpStatusCode.OK) { return(checkFileResponse); } } } DateTime salesCatalogueServiceRequestCompletedAt = DateTime.UtcNow; monitorHelper.MonitorRequest("Sales Catalogue Service Product Version Request", salesCatalogueServiceRequestStartedAt, salesCatalogueServiceRequestCompletedAt, request.CorrelationId, null, null, fileSize, null); var response = SetExchangeSetResponse(salesCatalogueResponse, true); if (response.HttpStatusCode != HttpStatusCode.OK && response.HttpStatusCode != HttpStatusCode.NotModified) { return(response); } if (salesCatalogueResponse.ResponseCode == HttpStatusCode.NotModified) { response.ExchangeSetResponse.RequestedProductCount = response.ExchangeSetResponse.RequestedProductsAlreadyUpToDateCount = request.ProductVersions.Count; response.ExchangeSetResponse.RequestedProductsNotInExchangeSet = new List <RequestedProductsNotInExchangeSet>(); salesCatalogueResponse.ResponseBody = new SalesCatalogueProductResponse { Products = new List <Products>(), ProductCounts = new ProductCounts() }; salesCatalogueResponse.ResponseBody.ProductCounts.ReturnedProductCount = 0; salesCatalogueResponse.ResponseBody.ProductCounts.RequestedProductsNotReturned = new List <RequestedProductsNotReturned>(); salesCatalogueResponse.ResponseBody.ProductCounts.RequestedProductCount = salesCatalogueResponse.ResponseBody.ProductCounts.RequestedProductsAlreadyUpToDateCount = request.ProductVersions.Count; } var exchangeSetServiceResponse = await SetExchangeSetResponseLinks(response, request.CorrelationId); if (exchangeSetServiceResponse.HttpStatusCode != HttpStatusCode.Created) { return(exchangeSetServiceResponse); } string expiryDate = exchangeSetServiceResponse.ExchangeSetResponse.ExchangeSetUrlExpiryDateTime.Value.ToString("yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture); if (!string.IsNullOrEmpty(exchangeSetServiceResponse.BatchId)) { await SaveSalesCatalogueStorageDetails(salesCatalogueResponse.ResponseBody, exchangeSetServiceResponse.BatchId, request.CallbackUri, request.CorrelationId, expiryDate); } return(response); }