gitextract_58gu5nma/ ├── .ado/ │ ├── eshoponweb-cd-aci.yml │ ├── eshoponweb-cd-webapp-code.yml │ ├── eshoponweb-cd-webapp-docker.yml │ ├── eshoponweb-cd-webapp-dockercompose.yml │ ├── eshoponweb-cd-windows-cm.yml │ ├── eshoponweb-ci-docker.yml │ ├── eshoponweb-ci-dockercompose.yml │ ├── eshoponweb-ci-mend.yml │ ├── eshoponweb-ci-pr.yml │ ├── eshoponweb-ci.yml │ └── eshoponweb-sonar-ci.yml ├── .dockerignore ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── dependabot.yml │ └── workflows/ │ ├── dotnetcore.yml │ ├── eshoponweb-cicd.yml │ └── richnav.yml ├── .gitignore ├── .vscode/ │ ├── extensions.json │ ├── launch.json │ └── tasks.json ├── CodeCoverage.runsettings ├── Directory.Packages.props ├── LICENSE ├── MTT-Notes.md ├── README.md ├── azure.yaml ├── docker-compose-webapp.yml ├── docker-compose.dcproj ├── docker-compose.override.yml ├── docker-compose.yml ├── eShopOnWeb.sln ├── global.json ├── infra/ │ ├── abbreviations.json │ ├── aci.bicep │ ├── acr.bicep │ ├── core/ │ │ ├── database/ │ │ │ └── sqlserver/ │ │ │ └── sqlserver.bicep │ │ ├── host/ │ │ │ ├── appservice.bicep │ │ │ └── appserviceplan.bicep │ │ └── security/ │ │ ├── keyvault-access.bicep │ │ └── keyvault.bicep │ ├── main.bicep │ ├── main.parameters.json │ ├── simple-windows-vm.bicep │ ├── webapp-docker.bicep │ ├── webapp-to-acr-roleassignment.bicep │ └── webapp.bicep ├── src/ │ ├── ApplicationCore/ │ │ ├── ApplicationCore.csproj │ │ ├── CatalogSettings.cs │ │ ├── Constants/ │ │ │ └── AuthorizationConstants.cs │ │ ├── Entities/ │ │ │ ├── BaseEntity.cs │ │ │ ├── BasketAggregate/ │ │ │ │ ├── Basket.cs │ │ │ │ └── BasketItem.cs │ │ │ ├── BuyerAggregate/ │ │ │ │ ├── Buyer.cs │ │ │ │ └── PaymentMethod.cs │ │ │ ├── CatalogBrand.cs │ │ │ ├── CatalogItem.cs │ │ │ ├── CatalogType.cs │ │ │ ├── EshopDiagram.cd │ │ │ └── OrderAggregate/ │ │ │ ├── Address.cs │ │ │ ├── CatalogItemOrdered.cs │ │ │ ├── Order.cs │ │ │ └── OrderItem.cs │ │ ├── Exceptions/ │ │ │ ├── BasketNotFoundException.cs │ │ │ ├── DuplicateException.cs │ │ │ └── EmptyBasketOnCheckoutException.cs │ │ ├── Extensions/ │ │ │ ├── GuardExtensions.cs │ │ │ └── JsonExtensions.cs │ │ ├── Interfaces/ │ │ │ ├── IAggregateRoot.cs │ │ │ ├── IAppLogger.cs │ │ │ ├── IBasketQueryService.cs │ │ │ ├── IBasketService.cs │ │ │ ├── IEmailSender.cs │ │ │ ├── IOrderService.cs │ │ │ ├── IReadRepository.cs │ │ │ ├── IRepository.cs │ │ │ ├── ITokenClaimsService.cs │ │ │ └── IUriComposer.cs │ │ ├── Services/ │ │ │ ├── BasketService.cs │ │ │ ├── OrderService.cs │ │ │ └── UriComposer.cs │ │ └── Specifications/ │ │ ├── BasketWithItemsSpecification.cs │ │ ├── CatalogFilterPaginatedSpecification.cs │ │ ├── CatalogFilterSpecification.cs │ │ ├── CatalogItemNameSpecification.cs │ │ ├── CatalogItemsSpecification.cs │ │ ├── CustomerOrdersSpecification.cs │ │ ├── CustomerOrdersWithItemsSpecification.cs │ │ └── OrderWithItemsByIdSpec.cs │ ├── BlazorAdmin/ │ │ ├── App.razor │ │ ├── BlazorAdmin.csproj │ │ ├── CustomAuthStateProvider.cs │ │ ├── Helpers/ │ │ │ ├── BlazorComponent.cs │ │ │ ├── BlazorLayoutComponent.cs │ │ │ ├── RefreshBroadcast.cs │ │ │ └── ToastComponent.cs │ │ ├── JavaScript/ │ │ │ ├── Cookies.cs │ │ │ ├── Css.cs │ │ │ ├── JSInteropConstants.cs │ │ │ └── Route.cs │ │ ├── Pages/ │ │ │ ├── CatalogItemPage/ │ │ │ │ ├── Create.razor │ │ │ │ ├── Delete.razor │ │ │ │ ├── Details.razor │ │ │ │ ├── Edit.razor │ │ │ │ ├── List.razor │ │ │ │ └── List.razor.cs │ │ │ └── Logout.razor │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── launchSettings.json │ │ ├── Services/ │ │ │ ├── CacheEntry.cs │ │ │ ├── CachedCatalogItemServiceDecorator.cs │ │ │ ├── CachedCatalogLookupDataServiceDecorator .cs │ │ │ ├── CatalogItemService.cs │ │ │ ├── CatalogLookupDataService.cs │ │ │ ├── HttpService.cs │ │ │ └── ToastService.cs │ │ ├── ServicesConfiguration.cs │ │ ├── Shared/ │ │ │ ├── CustomInputSelect.cs │ │ │ ├── MainLayout.razor │ │ │ ├── NavMenu.razor │ │ │ ├── RedirectToLogin.razor │ │ │ ├── Spinner.razor │ │ │ └── Toast.razor │ │ ├── _Imports.razor │ │ └── wwwroot/ │ │ ├── appsettings.Development.json │ │ ├── appsettings.Docker.json │ │ ├── appsettings.json │ │ └── css/ │ │ ├── admin.css │ │ └── open-iconic/ │ │ ├── FONT-LICENSE │ │ ├── ICON-LICENSE │ │ ├── README.md │ │ └── font/ │ │ └── fonts/ │ │ └── open-iconic.otf │ ├── BlazorShared/ │ │ ├── Attributes/ │ │ │ └── EndpointAttribute.cs │ │ ├── Authorization/ │ │ │ ├── ClaimValue.cs │ │ │ ├── Constants.cs │ │ │ └── UserInfo.cs │ │ ├── BaseUrlConfiguration.cs │ │ ├── BlazorShared.csproj │ │ ├── Interfaces/ │ │ │ ├── ICatalogItemService.cs │ │ │ ├── ICatalogLookupDataService.cs │ │ │ └── ILookupDataResponse.cs │ │ └── Models/ │ │ ├── CatalogBrand.cs │ │ ├── CatalogBrandResponse.cs │ │ ├── CatalogItem.cs │ │ ├── CatalogType.cs │ │ ├── CatalogTypeResponse.cs │ │ ├── CreateCatalogItemRequest.cs │ │ ├── CreateCatalogItemResponse.cs │ │ ├── DeleteCatalogItemResponse.cs │ │ ├── EditCatalogItemResponse.cs │ │ ├── ErrorDetails.cs │ │ ├── LookupData.cs │ │ └── PagedCatalogItemResponse.cs │ ├── Infrastructure/ │ │ ├── Data/ │ │ │ ├── CatalogContext.cs │ │ │ ├── CatalogContextSeed.cs │ │ │ ├── Config/ │ │ │ │ ├── BasketConfiguration.cs │ │ │ │ ├── BasketItemConfiguration.cs │ │ │ │ ├── CatalogBrandConfiguration.cs │ │ │ │ ├── CatalogItemConfiguration.cs │ │ │ │ ├── CatalogTypeConfiguration.cs │ │ │ │ ├── OrderConfiguration.cs │ │ │ │ └── OrderItemConfiguration.cs │ │ │ ├── EfRepository.cs │ │ │ ├── FileItem.cs │ │ │ ├── Migrations/ │ │ │ │ ├── 20201202111507_InitialModel.Designer.cs │ │ │ │ ├── 20201202111507_InitialModel.cs │ │ │ │ ├── 20211026175614_FixBuyerId.Designer.cs │ │ │ │ ├── 20211026175614_FixBuyerId.cs │ │ │ │ ├── 20211231093753_FixShipToAddress.Designer.cs │ │ │ │ ├── 20211231093753_FixShipToAddress.cs │ │ │ │ └── CatalogContextModelSnapshot.cs │ │ │ └── Queries/ │ │ │ └── BasketQueryService.cs │ │ ├── Dependencies.cs │ │ ├── Identity/ │ │ │ ├── AppIdentityDbContext.cs │ │ │ ├── AppIdentityDbContextSeed.cs │ │ │ ├── ApplicationUser.cs │ │ │ ├── IdentityTokenClaimService.cs │ │ │ ├── Migrations/ │ │ │ │ ├── 20201202111612_InitialIdentityModel.Designer.cs │ │ │ │ ├── 20201202111612_InitialIdentityModel.cs │ │ │ │ └── AppIdentityDbContextModelSnapshot.cs │ │ │ └── UserNotFoundException.cs │ │ ├── Infrastructure.csproj │ │ ├── Logging/ │ │ │ └── LoggerAdapter.cs │ │ └── Services/ │ │ └── EmailSender.cs │ ├── PublicApi/ │ │ ├── AuthEndpoints/ │ │ │ ├── AuthenticateEndpoint.AuthenticateRequest.cs │ │ │ ├── AuthenticateEndpoint.AuthenticateResponse.cs │ │ │ ├── AuthenticateEndpoint.ClaimValue.cs │ │ │ ├── AuthenticateEndpoint.UserInfo.cs │ │ │ └── AuthenticateEndpoint.cs │ │ ├── BaseMessage.cs │ │ ├── BaseRequest.cs │ │ ├── BaseResponse.cs │ │ ├── CatalogBrandEndpoints/ │ │ │ ├── CatalogBrandDto.cs │ │ │ ├── CatalogBrandListEndpoint.ListCatalogBrandsResponse.cs │ │ │ └── CatalogBrandListEndpoint.cs │ │ ├── CatalogItemEndpoints/ │ │ │ ├── CatalogItemDto.cs │ │ │ ├── CatalogItemGetByIdEndpoint.GetByIdCatalogItemRequest.cs │ │ │ ├── CatalogItemGetByIdEndpoint.GetByIdCatalogItemResponse.cs │ │ │ ├── CatalogItemGetByIdEndpoint.cs │ │ │ ├── CatalogItemListPagedEndpoint.ListPagedCatalogItemRequest.cs │ │ │ ├── CatalogItemListPagedEndpoint.ListPagedCatalogItemResponse.cs │ │ │ ├── CatalogItemListPagedEndpoint.cs │ │ │ ├── CreateCatalogItemEndpoint.CreateCatalogItemRequest.cs │ │ │ ├── CreateCatalogItemEndpoint.CreateCatalogItemResponse.cs │ │ │ ├── CreateCatalogItemEndpoint.cs │ │ │ ├── DeleteCatalogItemEndpoint.DeleteCatalogItemRequest.cs │ │ │ ├── DeleteCatalogItemEndpoint.DeleteCatalogItemResponse.cs │ │ │ ├── DeleteCatalogItemEndpoint.cs │ │ │ ├── UpdateCatalogItemEndpoint.UpdateCatalogItemRequest.cs │ │ │ ├── UpdateCatalogItemEndpoint.UpdateCatalogItemResponse.cs │ │ │ └── UpdateCatalogItemEndpoint.cs │ │ ├── CatalogTypeEndpoints/ │ │ │ ├── CatalogTypeDto.cs │ │ │ ├── CatalogTypeListEndpoint.ListCatalogTypesResponse.cs │ │ │ └── CatalogTypeListEndpoint.cs │ │ ├── CustomSchemaFilters.cs │ │ ├── Dockerfile │ │ ├── ImageValidators.cs │ │ ├── MappingProfile.cs │ │ ├── Middleware/ │ │ │ └── ExceptionMiddleware.cs │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── launchSettings.json │ │ ├── PublicApi.csproj │ │ ├── README.md │ │ ├── appsettings.Development.json │ │ ├── appsettings.Docker.json │ │ └── appsettings.json │ └── Web/ │ ├── .config/ │ │ └── dotnet-tools.json │ ├── Areas/ │ │ └── Identity/ │ │ ├── IdentityHostingStartup.cs │ │ └── Pages/ │ │ ├── Account/ │ │ │ ├── ConfirmEmail.cshtml │ │ │ ├── ConfirmEmail.cshtml.cs │ │ │ ├── Login.cshtml │ │ │ ├── Login.cshtml.cs │ │ │ ├── Logout.cshtml │ │ │ ├── Logout.cshtml.cs │ │ │ ├── Register.cshtml │ │ │ ├── Register.cshtml.cs │ │ │ └── _ViewImports.cshtml │ │ ├── _ValidationScriptsPartial.cshtml │ │ ├── _ViewImports.cshtml │ │ └── _ViewStart.cshtml │ ├── Configuration/ │ │ ├── ConfigureCookieSettings.cs │ │ ├── ConfigureCoreServices.cs │ │ ├── ConfigureWebServices.cs │ │ └── RevokeAuthenticationEvents.cs │ ├── Constants.cs │ ├── Controllers/ │ │ ├── Api/ │ │ │ └── BaseApiController.cs │ │ ├── ManageController.cs │ │ ├── OrderController.cs │ │ └── UserController.cs │ ├── Dockerfile │ ├── Extensions/ │ │ ├── CacheHelpers.cs │ │ ├── EmailSenderExtensions.cs │ │ └── UrlHelperExtensions.cs │ ├── Features/ │ │ ├── MyOrders/ │ │ │ ├── GetMyOrders.cs │ │ │ └── GetMyOrdersHandler.cs │ │ └── OrderDetails/ │ │ ├── GetOrderDetails.cs │ │ └── GetOrderDetailsHandler.cs │ ├── HealthChecks/ │ │ ├── ApiHealthCheck.cs │ │ └── HomePageHealthCheck.cs │ ├── Interfaces/ │ │ ├── IBasketViewModelService.cs │ │ ├── ICatalogItemViewModelService.cs │ │ └── ICatalogViewModelService.cs │ ├── Pages/ │ │ ├── Admin/ │ │ │ ├── EditCatalogItem.cshtml │ │ │ ├── EditCatalogItem.cshtml.cs │ │ │ ├── Index.cshtml │ │ │ └── Index.cshtml.cs │ │ ├── Basket/ │ │ │ ├── BasketItemViewModel.cs │ │ │ ├── BasketViewModel.cs │ │ │ ├── Checkout.cshtml │ │ │ ├── Checkout.cshtml.cs │ │ │ ├── Index.cshtml │ │ │ ├── Index.cshtml.cs │ │ │ ├── Success.cshtml │ │ │ └── Success.cshtml.cs │ │ ├── Error.cshtml │ │ ├── Error.cshtml.cs │ │ ├── FeatureDiagnostics.cshtml │ │ ├── Index.cshtml │ │ ├── Index.cshtml.cs │ │ ├── Privacy.cshtml │ │ ├── Privacy.cshtml.cs │ │ ├── SettingsViewModel.cs │ │ ├── Shared/ │ │ │ ├── Components/ │ │ │ │ └── BasketComponent/ │ │ │ │ ├── Basket.cs │ │ │ │ └── Default.cshtml │ │ │ ├── _editCatalog.cshtml │ │ │ ├── _pagination.cshtml │ │ │ └── _product.cshtml │ │ ├── _ViewImports.cshtml │ │ └── _ViewStart.cshtml │ ├── Program.cs │ ├── Properties/ │ │ └── launchSettings.json │ ├── Services/ │ │ ├── BasketViewModelService.cs │ │ ├── CachedCatalogViewModelService.cs │ │ ├── CatalogItemViewModelService.cs │ │ └── CatalogViewModelService.cs │ ├── SlugifyParameterTransformer.cs │ ├── ViewModels/ │ │ ├── Account/ │ │ │ ├── LoginViewModel.cs │ │ │ ├── LoginWith2faViewModel.cs │ │ │ ├── RegisterViewModel.cs │ │ │ └── ResetPasswordViewModel.cs │ │ ├── BasketComponentViewModel.cs │ │ ├── CatalogIndexViewModel.cs │ │ ├── CatalogItemViewModel.cs │ │ ├── File/ │ │ │ └── FileViewModel.cs │ │ ├── Manage/ │ │ │ ├── ChangePasswordViewModel.cs │ │ │ ├── EnableAuthenticatorViewModel.cs │ │ │ ├── ExternalLoginsViewModel.cs │ │ │ ├── IndexViewModel.cs │ │ │ ├── RemoveLoginViewModel.cs │ │ │ ├── SetPasswordViewModel.cs │ │ │ ├── ShowRecoveryCodesViewModel.cs │ │ │ └── TwoFactorAuthenticationViewModel.cs │ │ ├── OrderDetailViewModel.cs │ │ ├── OrderItemViewModel.cs │ │ ├── OrderViewModel.cs │ │ └── PaginationInfoViewModel.cs │ ├── Views/ │ │ ├── Account/ │ │ │ ├── Lockout.cshtml │ │ │ └── LoginWith2fa.cshtml │ │ ├── Manage/ │ │ │ ├── ChangePassword.cshtml │ │ │ ├── Disable2fa.cshtml │ │ │ ├── EnableAuthenticator.cshtml │ │ │ ├── ExternalLogins.cshtml │ │ │ ├── GenerateRecoveryCodes.cshtml │ │ │ ├── ManageNavPages.cs │ │ │ ├── MyAccount.cshtml │ │ │ ├── ResetAuthenticator.cshtml │ │ │ ├── SetPassword.cshtml │ │ │ ├── ShowRecoverCodes.cshtml │ │ │ ├── TwoFactorAuthentication.cshtml │ │ │ ├── _Layout.cshtml │ │ │ ├── _ManageNav.cshtml │ │ │ ├── _StatusMessage.cshtml │ │ │ └── _ViewImports.cshtml │ │ ├── Order/ │ │ │ ├── Detail.cshtml │ │ │ └── MyOrders.cshtml │ │ ├── Shared/ │ │ │ ├── Components/ │ │ │ │ └── Basket/ │ │ │ │ └── Default.cshtml │ │ │ ├── Error.cshtml │ │ │ ├── _CookieConsentPartial.cshtml │ │ │ ├── _Layout.cshtml │ │ │ ├── _LoginPartial.cshtml │ │ │ └── _ValidationScriptsPartial.cshtml │ │ ├── _ViewImports.cshtml │ │ └── _ViewStart.cshtml │ ├── Web.csproj │ ├── appsettings.Development.json │ ├── appsettings.Docker.json │ ├── appsettings.json │ ├── bundleconfig.json │ ├── compilerconfig.json │ ├── compilerconfig.json.defaults │ ├── key-768c1632-cf7b-41a9-bb7a-bff228ae8fba.xml │ ├── libman.json │ └── wwwroot/ │ ├── css/ │ │ ├── _variables.css │ │ ├── _variables.scss │ │ ├── app.component.css │ │ ├── app.component.scss │ │ ├── app.css │ │ ├── basket/ │ │ │ ├── basket-status/ │ │ │ │ ├── basket-status.component.css │ │ │ │ └── basket-status.component.scss │ │ │ ├── basket.component.css │ │ │ └── basket.component.scss │ │ ├── catalog/ │ │ │ ├── catalog.component.css │ │ │ ├── catalog.component.scss │ │ │ └── pager.css │ │ ├── orders/ │ │ │ ├── orders.component.css │ │ │ └── orders.component.scss │ │ └── shared/ │ │ └── components/ │ │ ├── header/ │ │ │ ├── header.css │ │ │ └── header.scss │ │ ├── identity/ │ │ │ ├── identity.css │ │ │ └── identity.scss │ │ └── pager/ │ │ ├── pager.css │ │ └── pager.scss │ └── js/ │ └── site.js └── tests/ ├── FunctionalTests/ │ ├── FunctionalTests.csproj │ ├── PublicApi/ │ │ ├── ApiTestFixture.cs │ │ ├── ApiTokenHelper.cs │ │ └── AuthEndpoints/ │ │ └── AuthenticateEndpoint.cs │ └── Web/ │ ├── Controllers/ │ │ ├── AccountControllerSignIn.cs │ │ ├── CatalogControllerIndex.cs │ │ └── OrderControllerIndex.cs │ ├── Pages/ │ │ ├── Basket/ │ │ │ ├── BasketPageCheckout.cs │ │ │ ├── CheckoutTest.cs │ │ │ └── IndexTest.cs │ │ └── HomePageOnGet.cs │ ├── WebPageHelpers.cs │ └── WebTestFixture.cs ├── IntegrationTests/ │ ├── IntegrationTests.csproj │ └── Repositories/ │ ├── BasketRepositoryTests/ │ │ └── SetQuantities.cs │ └── OrderRepositoryTests/ │ ├── GetById.cs │ └── GetByIdWithItemsAsync.cs ├── PublicApiIntegrationTests/ │ ├── ApiTokenHelper.cs │ ├── AuthEndpoints/ │ │ └── AuthenticateEndpointTest.cs │ ├── CatalogItemEndpoints/ │ │ ├── CatalogItemGetByIdEndpointTest.cs │ │ ├── CatalogItemListPagedEndpoint.cs │ │ ├── CreateCatalogItemEndpointTest.cs │ │ └── DeleteCatalogItemEndpointTest.cs │ ├── ProgramTest.cs │ ├── PublicApiIntegrationTests.csproj │ └── appsettings.test.json └── UnitTests/ ├── ApplicationCore/ │ ├── Entities/ │ │ ├── BasketTests/ │ │ │ ├── BasketAddItem.cs │ │ │ ├── BasketRemoveEmptyItems.cs │ │ │ └── BasketTotalItems.cs │ │ └── OrderTests/ │ │ └── OrderTotal.cs │ ├── Extensions/ │ │ ├── JsonExtensions.cs │ │ ├── TestChild.cs │ │ └── TestParent.cs │ ├── Services/ │ │ └── BasketServiceTests/ │ │ ├── AddItemToBasket.cs │ │ ├── DeleteBasket.cs │ │ └── TransferBasket.cs │ └── Specifications/ │ ├── BasketWithItemsSpecification.cs │ ├── CatalogFilterPaginatedSpecification.cs │ ├── CatalogFilterSpecification.cs │ ├── CatalogItemsSpecification.cs │ └── CustomerOrdersWithItemsSpecification.cs ├── Builders/ │ ├── AddressBuilder.cs │ ├── BasketBuilder.cs │ └── OrderBuilder.cs ├── MediatorHandlers/ │ └── OrdersTests/ │ ├── GetMyOrders.cs │ └── GetOrderDetails.cs ├── UnitTests.csproj └── Web/ └── Extensions/ └── CacheHelpersTests/ ├── GenerateBrandsCacheKey.cs ├── GenerateCatalogItemCacheKey.cs └── GenerateTypesCacheKey.cs