Exemple #1
0
        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()));
        }
Exemple #2
0
        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()));
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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());
        }
Exemple #5
0
 public SessionController(AzureAdB2C b2cOptions, BaseConfiguration baseConfiguration)
 {
     AzureAdB2COptions = b2cOptions;
     this.baseUrl      = baseConfiguration.ClientURL;
 }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
        }