Showing preview only (1,544K chars total). Download the full file or copy to clipboard to get everything.
Repository: dotnet/eShop
Branch: main
Commit: 5624ad564d16
Files: 779
Total size: 1.3 MB
Directory structure:
gitextract_kui8zjym/
├── .aspire/
│ └── settings.json
├── .config/
│ ├── CredScanSuppressions.json
│ ├── configuration.vs.winget
│ ├── configuration.vsCode.winget
│ └── tsaoptions.json
├── .devcenter/
│ └── catalog/
│ └── definitions/
│ └── imagedefinition.yaml
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── dependabot.yml
│ └── workflows/
│ ├── markdownlint-problem-matcher.json
│ ├── markdownlint.yml
│ ├── playwright.yml
│ ├── pr-validation-maui.yml
│ └── pr-validation.yml
├── .gitignore
├── .markdownlint.json
├── .markdownlintignore
├── .spectral.yml
├── CODE-OF-CONDUCT.md
├── CONTRIBUTING.md
├── Directory.Build.props
├── Directory.Build.targets
├── Directory.Packages.props
├── LICENSE
├── README.md
├── build/
│ ├── acr-build/
│ │ └── queue-all.ps1
│ └── multiarch-manifests/
│ └── create-manifests.ps1
├── ci.yml
├── e2e/
│ ├── AddItemTest.spec.ts
│ ├── BrowseItemTest.spec.ts
│ ├── RemoveItemTest.spec.ts
│ └── login.setup.ts
├── eShop.Web.slnf
├── eShop.slnx
├── es-metadata.yml
├── global.json
├── nuget.config
├── package.json
├── playwright.config.ts
├── src/
│ ├── Basket.API/
│ │ ├── Basket.API.csproj
│ │ ├── Extensions/
│ │ │ ├── Extensions.cs
│ │ │ └── ServerCallContextIdentityExtensions.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Grpc/
│ │ │ └── BasketService.cs
│ │ ├── IntegrationEvents/
│ │ │ ├── EventHandling/
│ │ │ │ └── OrderStartedIntegrationEventHandler.cs
│ │ │ └── Events/
│ │ │ └── OrderStartedIntegrationEvent.cs
│ │ ├── Model/
│ │ │ ├── BasketItem.cs
│ │ │ └── CustomerBasket.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Proto/
│ │ │ └── basket.proto
│ │ ├── Repositories/
│ │ │ ├── IBasketRepository.cs
│ │ │ └── RedisBasketRepository.cs
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── Catalog.API/
│ │ ├── Apis/
│ │ │ └── CatalogApi.cs
│ │ ├── Catalog.API.csproj
│ │ ├── Catalog.API.http
│ │ ├── Catalog.API.json
│ │ ├── Catalog.API_v2.json
│ │ ├── CatalogOptions.cs
│ │ ├── Extensions/
│ │ │ ├── Extensions.cs
│ │ │ └── HostEnvironmentExtensions.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Infrastructure/
│ │ │ ├── CatalogContext.cs
│ │ │ ├── CatalogContextSeed.cs
│ │ │ ├── EntityConfigurations/
│ │ │ │ ├── CatalogBrandEntityTypeConfiguration.cs
│ │ │ │ ├── CatalogItemEntityTypeConfiguration.cs
│ │ │ │ └── CatalogTypeEntityTypeConfiguration.cs
│ │ │ ├── Exceptions/
│ │ │ │ └── CatalogDomainException.cs
│ │ │ └── Migrations/
│ │ │ ├── 20231009153249_Initial.Designer.cs
│ │ │ ├── 20231009153249_Initial.cs
│ │ │ ├── 20231018163051_RemoveHiLoAndIndexCatalogName.Designer.cs
│ │ │ ├── 20231018163051_RemoveHiLoAndIndexCatalogName.cs
│ │ │ ├── 20231026091140_Outbox.Designer.cs
│ │ │ ├── 20231026091140_Outbox.cs
│ │ │ └── CatalogContextModelSnapshot.cs
│ │ ├── IntegrationEvents/
│ │ │ ├── CatalogIntegrationEventService.cs
│ │ │ ├── EventHandling/
│ │ │ │ ├── AnyFutureIntegrationEventHandler.cs.txt
│ │ │ │ ├── OrderStatusChangedToAwaitingValidationIntegrationEventHandler.cs
│ │ │ │ └── OrderStatusChangedToPaidIntegrationEventHandler.cs
│ │ │ ├── Events/
│ │ │ │ ├── ConfirmedOrderStockItem.cs
│ │ │ │ ├── OrderStatusChangedToAwaitingValidationIntegrationEvent.cs
│ │ │ │ ├── OrderStatusChangedToPaidIntegrationEvent.cs
│ │ │ │ ├── OrderStockConfirmedIntegrationEvent.cs
│ │ │ │ ├── OrderStockItem.cs
│ │ │ │ ├── OrderStockRejectedIntegrationEvent.cs
│ │ │ │ └── ProductPriceChangedIntegrationEvent.cs
│ │ │ └── ICatalogIntegrationEventService.cs
│ │ ├── Model/
│ │ │ ├── CatalogBrand.cs
│ │ │ ├── CatalogItem.cs
│ │ │ ├── CatalogServices.cs
│ │ │ ├── CatalogType.cs
│ │ │ ├── PaginatedItems.cs
│ │ │ └── PaginationRequest.cs
│ │ ├── Program.Testing.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Services/
│ │ │ ├── CatalogAI.cs
│ │ │ └── ICatalogAI.cs
│ │ ├── Setup/
│ │ │ └── catalog.json
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── ClientApp/
│ │ ├── Animations/
│ │ │ ├── Base/
│ │ │ │ ├── AnimationBase.cs
│ │ │ │ └── EasingType.cs
│ │ │ ├── FadeToAnimation.cs
│ │ │ └── StoryBoard.cs
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── AppActions.cs
│ │ ├── AppShell.xaml
│ │ ├── AppShell.xaml.cs
│ │ ├── ClientApp.csproj
│ │ ├── ClientApp.sln
│ │ ├── Controls/
│ │ │ ├── AddBasketButton.xaml
│ │ │ ├── AddBasketButton.xaml.cs
│ │ │ ├── CustomTabbedPage.cs
│ │ │ └── ToggleButton.cs
│ │ ├── Converters/
│ │ │ ├── DoesNotHaveCountConverter.cs
│ │ │ ├── DoubleConverter.cs
│ │ │ ├── FirstValidationErrorConverter.cs
│ │ │ ├── HasCountConverter.cs
│ │ │ ├── ItemsToHeightConverter.cs
│ │ │ ├── WebNavigatedEventArgsConverter.cs
│ │ │ └── WebNavigatingEventArgsConverter.cs
│ │ ├── Effects/
│ │ │ ├── EntryLineColorEffect.cs
│ │ │ └── ThemeEffects.cs
│ │ ├── Exceptions/
│ │ │ └── ServiceAuthenticationException.cs
│ │ ├── Extensions/
│ │ │ ├── DictionaryExtensions.cs
│ │ │ ├── ICommandExtensions.cs
│ │ │ └── VisualElementExtensions.cs
│ │ ├── GlobalSuppressions.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Helpers/
│ │ │ ├── EasingHelper.cs
│ │ │ └── UriHelper.cs
│ │ ├── MauiProgram.cs
│ │ ├── Messages/
│ │ │ └── ProductCountChangedMessage.cs
│ │ ├── Models/
│ │ │ ├── Basket/
│ │ │ │ ├── BasketItem.cs
│ │ │ │ └── CustomerBasket.cs
│ │ │ ├── Catalog/
│ │ │ │ ├── CatalogBrand.cs
│ │ │ │ ├── CatalogItem.cs
│ │ │ │ ├── CatalogRoot.cs
│ │ │ │ └── CatalogType.cs
│ │ │ ├── Location/
│ │ │ │ ├── GeolocationError.cs
│ │ │ │ ├── GeolocationException.cs
│ │ │ │ ├── Location.cs
│ │ │ │ └── Position.cs
│ │ │ ├── Marketing/
│ │ │ │ ├── Campaign.cs
│ │ │ │ ├── CampaignItem.cs
│ │ │ │ └── CampaignRoot.cs
│ │ │ ├── Navigation/
│ │ │ │ └── TabParameter.cs
│ │ │ ├── Orders/
│ │ │ │ ├── CancelOrderCommand.cs
│ │ │ │ ├── CardType.cs
│ │ │ │ ├── Order.cs
│ │ │ │ ├── OrderCheckout.cs
│ │ │ │ └── OrderItem.cs
│ │ │ ├── Permissions/
│ │ │ │ ├── Permission.cs
│ │ │ │ └── PermissionStatus.cs
│ │ │ ├── Token/
│ │ │ │ └── UserToken.cs
│ │ │ └── User/
│ │ │ ├── Address.cs
│ │ │ ├── LogoutParameter.cs
│ │ │ ├── PaymentInfo.cs
│ │ │ └── UserInfo.cs
│ │ ├── Platforms/
│ │ │ ├── Android/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── MainActivity.cs
│ │ │ │ ├── MainApplication.cs
│ │ │ │ ├── Resources/
│ │ │ │ │ ├── values/
│ │ │ │ │ │ └── colors.xml
│ │ │ │ │ └── xml/
│ │ │ │ │ └── network_security_config.xml
│ │ │ │ └── WebAuthenticationCallbackActivity.cs
│ │ │ ├── MacCatalyst/
│ │ │ │ ├── AppDelegate.cs
│ │ │ │ ├── Entitlements.Debug.plist
│ │ │ │ ├── Entitlements.Release.plist
│ │ │ │ ├── Info.plist
│ │ │ │ └── Program.cs
│ │ │ ├── Windows/
│ │ │ │ ├── App.xaml
│ │ │ │ ├── App.xaml.cs
│ │ │ │ ├── Package.appxmanifest
│ │ │ │ └── app.manifest
│ │ │ └── iOS/
│ │ │ ├── AppDelegate.cs
│ │ │ ├── Entitlements.plist
│ │ │ ├── Info.plist
│ │ │ └── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Resources/
│ │ │ ├── Fonts/
│ │ │ │ ├── FontAwesomeRegular.otf
│ │ │ │ └── FontAwesomeSolid.otf
│ │ │ ├── Raw/
│ │ │ │ └── AboutAssets.txt
│ │ │ └── Styles/
│ │ │ ├── Colors.xaml
│ │ │ └── Styles.xaml
│ │ ├── Services/
│ │ │ ├── AppEnvironment/
│ │ │ │ ├── AppEnvironmentService.cs
│ │ │ │ └── IAppEnvironmentService.cs
│ │ │ ├── Basket/
│ │ │ │ ├── BasketMockService.cs
│ │ │ │ ├── BasketService.cs
│ │ │ │ ├── IBasketService.cs
│ │ │ │ └── Protos/
│ │ │ │ ├── Basket.cs
│ │ │ │ ├── BasketGrpc.cs
│ │ │ │ └── basket.proto
│ │ │ ├── Catalog/
│ │ │ │ ├── CatalogMockService.cs
│ │ │ │ ├── CatalogService.cs
│ │ │ │ └── ICatalogService.cs
│ │ │ ├── Common/
│ │ │ │ └── Common.cs
│ │ │ ├── Dialog/
│ │ │ │ ├── DialogService.cs
│ │ │ │ └── IDialogService.cs
│ │ │ ├── EShopJsonSerializerContext.cs
│ │ │ ├── FixUri/
│ │ │ │ ├── FixUriService.cs
│ │ │ │ └── IFixUriService.cs
│ │ │ ├── Identity/
│ │ │ │ ├── AuthorizeRequest.cs
│ │ │ │ ├── IIdentityService.cs
│ │ │ │ ├── IdentityMockService.cs
│ │ │ │ └── IdentityService.cs
│ │ │ ├── Location/
│ │ │ │ ├── ILocationService.cs
│ │ │ │ └── LocationService.cs
│ │ │ ├── Navigation/
│ │ │ │ ├── INavigationService.cs
│ │ │ │ └── MauiNavigationService.cs
│ │ │ ├── OpenUrl/
│ │ │ │ ├── IOpenUrlService.cs
│ │ │ │ └── OpenUrlService.cs
│ │ │ ├── Order/
│ │ │ │ ├── IOrderService.cs
│ │ │ │ ├── OrderMockService.cs
│ │ │ │ └── OrderService.cs
│ │ │ ├── RequestProvider/
│ │ │ │ ├── HttpRequestExceptionEx.cs
│ │ │ │ ├── IRequestProvider.cs
│ │ │ │ └── RequestProvider.cs
│ │ │ ├── Settings/
│ │ │ │ ├── ISettingsService.cs
│ │ │ │ └── SettingsService.cs
│ │ │ └── Theme/
│ │ │ ├── ITheme.cs
│ │ │ └── Theme.shared.cs
│ │ ├── Triggers/
│ │ │ └── BeginAnimation.cs
│ │ ├── Validations/
│ │ │ ├── IValidationRule.cs
│ │ │ ├── IValidity.cs
│ │ │ ├── IsNotNullOrEmptyRule.cs
│ │ │ └── ValidatableObject.cs
│ │ ├── ViewModels/
│ │ │ ├── Base/
│ │ │ │ ├── IViewModelBase.cs
│ │ │ │ └── ViewModelBase.cs
│ │ │ ├── BasketViewModel.cs
│ │ │ ├── CatalogItemViewModel.cs
│ │ │ ├── CatalogViewModel.cs
│ │ │ ├── CheckoutViewModel.cs
│ │ │ ├── LoginViewModel.cs
│ │ │ ├── MainViewModel.cs
│ │ │ ├── MapViewModel.cs
│ │ │ ├── ObservableCollectionEx.cs
│ │ │ ├── OrderDetailViewModel.cs
│ │ │ ├── ProfileViewModel.cs
│ │ │ ├── SelectionViewModel.cs
│ │ │ └── SettingsViewModel.cs
│ │ └── Views/
│ │ ├── BadgeView.cs
│ │ ├── BasketView.xaml
│ │ ├── BasketView.xaml.cs
│ │ ├── CatalogItemView.xaml
│ │ ├── CatalogItemView.xaml.cs
│ │ ├── CatalogView.xaml
│ │ ├── CatalogView.xaml.cs
│ │ ├── CheckoutView.xaml
│ │ ├── CheckoutView.xaml.cs
│ │ ├── ContentPageBase.cs
│ │ ├── CustomNavigationView.xaml
│ │ ├── CustomNavigationView.xaml.cs
│ │ ├── FiltersView.xaml
│ │ ├── FiltersView.xaml.cs
│ │ ├── LoginView.xaml
│ │ ├── LoginView.xaml.cs
│ │ ├── MapView.xaml
│ │ ├── MapView.xaml.cs
│ │ ├── MauiAuthenticationBrowser.cs
│ │ ├── OrderDetailView.xaml
│ │ ├── OrderDetailView.xaml.cs
│ │ ├── ProfileView.xaml
│ │ ├── ProfileView.xaml.cs
│ │ ├── SettingsView.xaml
│ │ ├── SettingsView.xaml.cs
│ │ └── Templates/
│ │ ├── BasketItemTemplate.xaml
│ │ ├── BasketItemTemplate.xaml.cs
│ │ ├── CampaignTemplate.xaml
│ │ ├── CampaignTemplate.xaml.cs
│ │ ├── OrderItemTemplate.xaml
│ │ ├── OrderItemTemplate.xaml.cs
│ │ ├── OrderTemplate.xaml
│ │ ├── OrderTemplate.xaml.cs
│ │ ├── ProductTemplate.xaml
│ │ └── ProductTemplate.xaml.cs
│ ├── EventBus/
│ │ ├── Abstractions/
│ │ │ ├── EventBusSubscriptionInfo.cs
│ │ │ ├── IEventBus.cs
│ │ │ ├── IEventBusBuilder.cs
│ │ │ └── IIntegrationEventHandler.cs
│ │ ├── EventBus.csproj
│ │ ├── Events/
│ │ │ └── IntegrationEvent.cs
│ │ ├── Extensions/
│ │ │ ├── EventBusBuilderExtensions.cs
│ │ │ └── GenericTypeExtensions.cs
│ │ └── GlobalUsings.cs
│ ├── EventBusRabbitMQ/
│ │ ├── EventBusOptions.cs
│ │ ├── EventBusRabbitMQ.csproj
│ │ ├── GlobalUsings.cs
│ │ ├── RabbitMQEventBus.cs
│ │ ├── RabbitMQTelemetry.cs
│ │ └── RabbitMqDependencyInjectionExtensions.cs
│ ├── HybridApp/
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── Components/
│ │ │ ├── Layout/
│ │ │ │ ├── FooterBar.razor
│ │ │ │ ├── FooterBar.razor.css
│ │ │ │ ├── HeaderBar.razor
│ │ │ │ ├── HeaderBar.razor.css
│ │ │ │ ├── MainLayout.razor
│ │ │ │ └── MainLayout.razor.css
│ │ │ ├── Pages/
│ │ │ │ ├── Catalog/
│ │ │ │ │ ├── Catalog.razor
│ │ │ │ │ ├── Catalog.razor.css
│ │ │ │ │ ├── CatalogSearch.razor
│ │ │ │ │ └── CatalogSearch.razor.css
│ │ │ │ └── Item/
│ │ │ │ ├── ItemPage.razor
│ │ │ │ └── ItemPage.razor.css
│ │ │ ├── Routes.razor
│ │ │ └── _Imports.razor
│ │ ├── GlobalSuppressions.cs
│ │ ├── HybridApp.csproj
│ │ ├── MainPage.xaml
│ │ ├── MainPage.xaml.cs
│ │ ├── MauiProgram.cs
│ │ ├── Platforms/
│ │ │ ├── Android/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── MainActivity.cs
│ │ │ │ ├── MainApplication.cs
│ │ │ │ └── Resources/
│ │ │ │ ├── values/
│ │ │ │ │ └── colors.xml
│ │ │ │ └── xml/
│ │ │ │ └── network_security_config.xml
│ │ │ ├── MacCatalyst/
│ │ │ │ ├── AppDelegate.cs
│ │ │ │ ├── Entitlements.Debug.plist
│ │ │ │ ├── Entitlements.Release.plist
│ │ │ │ ├── Info.plist
│ │ │ │ └── Program.cs
│ │ │ ├── Tizen/
│ │ │ │ ├── Main.cs
│ │ │ │ └── tizen-manifest.xml
│ │ │ ├── Windows/
│ │ │ │ ├── App.xaml
│ │ │ │ ├── App.xaml.cs
│ │ │ │ ├── Package.appxmanifest
│ │ │ │ └── app.manifest
│ │ │ └── iOS/
│ │ │ ├── AppDelegate.cs
│ │ │ ├── Info.plist
│ │ │ └── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Resources/
│ │ │ └── Raw/
│ │ │ └── AboutAssets.txt
│ │ ├── Services/
│ │ │ ├── CatalogJsonContext.cs
│ │ │ ├── CatalogService.cs
│ │ │ └── ProductImageUrlProvider.cs
│ │ └── wwwroot/
│ │ ├── css/
│ │ │ ├── app.css
│ │ │ └── normalize.css
│ │ └── index.html
│ ├── Identity.API/
│ │ ├── .gitignore
│ │ ├── Configuration/
│ │ │ └── Config.cs
│ │ ├── Data/
│ │ │ ├── ApplicationDbContext.cs
│ │ │ └── Migrations/
│ │ │ ├── 20230925223402_InitialMigration.Designer.cs
│ │ │ ├── 20230925223402_InitialMigration.cs
│ │ │ └── ApplicationDbContextModelSnapshot.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Identity.API.csproj
│ │ ├── Models/
│ │ │ ├── AccountViewModels/
│ │ │ │ ├── ForgotPasswordViewModel.cs
│ │ │ │ ├── LoggedOutViewModel.cs
│ │ │ │ ├── LoginViewModel.cs
│ │ │ │ ├── LogoutViewModel.cs
│ │ │ │ ├── RedirectViewModel.cs
│ │ │ │ ├── RegisterViewModel.cs
│ │ │ │ ├── ResetPasswordViewModel.cs
│ │ │ │ ├── SendCodeViewModel.cs
│ │ │ │ └── VerifyCodeViewModel.cs
│ │ │ ├── ApplicationUser.cs
│ │ │ ├── ConsentViewModels/
│ │ │ │ ├── ConsentInputModel.cs
│ │ │ │ ├── ConsentOptions.cs
│ │ │ │ ├── ConsentViewModel.cs
│ │ │ │ ├── ProcessConsentResult.cs
│ │ │ │ └── ScopeViewModel.cs
│ │ │ ├── ErrorViewModel.cs
│ │ │ └── ManageViewModels/
│ │ │ ├── AddPhoneNumberViewModel.cs
│ │ │ ├── ChangePasswordViewModel.cs
│ │ │ ├── ConfigureTwoFactorViewModel.cs
│ │ │ ├── FactorViewModel.cs
│ │ │ ├── IndexViewModel.cs
│ │ │ ├── SetPasswordViewModel.cs
│ │ │ └── VerifyPhoneNumberViewModel.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Quickstart/
│ │ │ ├── Account/
│ │ │ │ ├── AccountController.cs
│ │ │ │ ├── AccountOptions.cs
│ │ │ │ ├── ExternalController.cs
│ │ │ │ ├── ExternalProvider.cs
│ │ │ │ ├── LoggedOutViewModel.cs
│ │ │ │ ├── LoginInputModel.cs
│ │ │ │ ├── LoginViewModel.cs
│ │ │ │ ├── LogoutInputModel.cs
│ │ │ │ ├── LogoutViewModel.cs
│ │ │ │ └── RedirectViewModel.cs
│ │ │ ├── Consent/
│ │ │ │ ├── ConsentController.cs
│ │ │ │ ├── ConsentInputModel.cs
│ │ │ │ ├── ConsentOptions.cs
│ │ │ │ ├── ConsentViewModel.cs
│ │ │ │ ├── ProcessConsentResult.cs
│ │ │ │ └── ScopeViewModel.cs
│ │ │ ├── Device/
│ │ │ │ ├── DeviceAuthorizationInputModel.cs
│ │ │ │ ├── DeviceAuthorizationViewModel.cs
│ │ │ │ └── DeviceController.cs
│ │ │ ├── Diagnostics/
│ │ │ │ ├── DiagnosticsController.cs
│ │ │ │ └── DiagnosticsViewModel.cs
│ │ │ ├── Extensions.cs
│ │ │ ├── Grants/
│ │ │ │ ├── GrantsController.cs
│ │ │ │ └── GrantsViewModel.cs
│ │ │ ├── Home/
│ │ │ │ ├── ErrorViewModel.cs
│ │ │ │ └── HomeController.cs
│ │ │ └── SecurityHeadersAttribute.cs
│ │ ├── Services/
│ │ │ ├── EFLoginService.cs
│ │ │ ├── ILoginService.cs
│ │ │ ├── IRedirectService.cs
│ │ │ ├── ProfileService.cs
│ │ │ └── RedirectService.cs
│ │ ├── UsersSeed.cs
│ │ ├── Views/
│ │ │ ├── Account/
│ │ │ │ ├── AccessDenied.cshtml
│ │ │ │ ├── LoggedOut.cshtml
│ │ │ │ ├── Login.cshtml
│ │ │ │ └── Logout.cshtml
│ │ │ ├── Consent/
│ │ │ │ └── Index.cshtml
│ │ │ ├── Device/
│ │ │ │ ├── Success.cshtml
│ │ │ │ ├── UserCodeCapture.cshtml
│ │ │ │ └── UserCodeConfirmation.cshtml
│ │ │ ├── Diagnostics/
│ │ │ │ └── Index.cshtml
│ │ │ ├── Grants/
│ │ │ │ └── Index.cshtml
│ │ │ ├── Home/
│ │ │ │ └── Index.cshtml
│ │ │ ├── Shared/
│ │ │ │ ├── Error.cshtml
│ │ │ │ ├── Redirect.cshtml
│ │ │ │ ├── _Layout.cshtml
│ │ │ │ ├── _ScopeListItem.cshtml
│ │ │ │ └── _ValidationSummary.cshtml
│ │ │ ├── _ViewImports.cshtml
│ │ │ └── _ViewStart.cshtml
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ ├── bundleconfig.json
│ │ ├── libman.json
│ │ ├── tempkey.jwk
│ │ └── wwwroot/
│ │ ├── _references.js
│ │ ├── css/
│ │ │ └── site.css
│ │ └── js/
│ │ ├── signin-redirect.js
│ │ ├── signout-redirect.js
│ │ └── site.js
│ ├── IntegrationEventLogEF/
│ │ ├── EventStateEnum.cs
│ │ ├── GlobalUsings.cs
│ │ ├── IntegrationEventLogEF.csproj
│ │ ├── IntegrationEventLogEntry.cs
│ │ ├── IntegrationLogExtensions.cs
│ │ ├── Services/
│ │ │ ├── IIntegrationEventLogService.cs
│ │ │ └── IntegrationEventLogService.cs
│ │ └── Utilities/
│ │ └── ResilientTransaction.cs
│ ├── OrderProcessor/
│ │ ├── BackgroundTaskOptions.cs
│ │ ├── Events/
│ │ │ └── GracePeriodConfirmedIntegrationEvent.cs
│ │ ├── Extensions/
│ │ │ └── Extensions.cs
│ │ ├── GlobalUsings.cs
│ │ ├── OrderProcessor.csproj
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Services/
│ │ │ └── GracePeriodManagerService.cs
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── Ordering.API/
│ │ ├── Apis/
│ │ │ ├── OrderServices.cs
│ │ │ └── OrdersApi.cs
│ │ ├── Application/
│ │ │ ├── Behaviors/
│ │ │ │ ├── LoggingBehavior.cs
│ │ │ │ ├── TransactionBehavior.cs
│ │ │ │ └── ValidatorBehavior.cs
│ │ │ ├── Commands/
│ │ │ │ ├── CancelOrderCommand.cs
│ │ │ │ ├── CancelOrderCommandHandler.cs
│ │ │ │ ├── CreateOrderCommand.cs
│ │ │ │ ├── CreateOrderCommandHandler.cs
│ │ │ │ ├── CreateOrderDraftCommand.cs
│ │ │ │ ├── CreateOrderDraftCommandHandler.cs
│ │ │ │ ├── IdentifiedCommand.cs
│ │ │ │ ├── IdentifiedCommandHandler.cs
│ │ │ │ ├── SetAwaitingValidationOrderStatusCommand.cs
│ │ │ │ ├── SetAwaitingValidationOrderStatusCommandHandler.cs
│ │ │ │ ├── SetPaidOrderStatusCommand.cs
│ │ │ │ ├── SetPaidOrderStatusCommandHandler.cs
│ │ │ │ ├── SetStockConfirmedOrderStatusCommand.cs
│ │ │ │ ├── SetStockConfirmedOrderStatusCommandHandler.cs
│ │ │ │ ├── SetStockRejectedOrderStatusCommand.cs
│ │ │ │ ├── SetStockRejectedOrderStatusCommandHandler.cs
│ │ │ │ ├── ShipOrderCommand.cs
│ │ │ │ └── ShipOrderCommandHandler.cs
│ │ │ ├── DomainEventHandlers/
│ │ │ │ ├── OrderCancelledDomainEventHandler.cs
│ │ │ │ ├── OrderShippedDomainEventHandler.cs
│ │ │ │ ├── OrderStatusChangedToAwaitingValidationDomainEventHandler.cs
│ │ │ │ ├── OrderStatusChangedToPaidDomainEventHandler.cs
│ │ │ │ ├── OrderStatusChangedToStockConfirmedDomainEventHandler.cs
│ │ │ │ ├── UpdateOrderWhenBuyerAndPaymentMethodVerifiedDomainEventHandler.cs
│ │ │ │ └── ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs
│ │ │ ├── IntegrationEvents/
│ │ │ │ ├── EventHandling/
│ │ │ │ │ ├── GracePeriodConfirmedIntegrationEventHandler.cs
│ │ │ │ │ ├── OrderPaymentFailedIntegrationEventHandler.cs
│ │ │ │ │ ├── OrderPaymentSucceededIntegrationEventHandler.cs
│ │ │ │ │ ├── OrderStockConfirmedIntegrationEventHandler.cs
│ │ │ │ │ └── OrderStockRejectedIntegrationEventHandler.cs
│ │ │ │ ├── Events/
│ │ │ │ │ ├── GracePeriodConfirmedIntegrationEvent.cs
│ │ │ │ │ ├── OrderPaymentFailedIntegrationEvent .cs
│ │ │ │ │ ├── OrderPaymentSucceededIntegrationEvent.cs
│ │ │ │ │ ├── OrderStartedIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToAwaitingValidationIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToCancelledIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToPaidIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToShippedIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToStockConfirmedIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedTosubmittedIntegrationEvent.cs
│ │ │ │ │ ├── OrderStockConfirmedIntegrationEvent.cs
│ │ │ │ │ └── OrderStockRejectedIntegrationEvent.cs
│ │ │ │ ├── IOrderingIntegrationEventService.cs
│ │ │ │ └── OrderingIntegrationEventService.cs
│ │ │ ├── Models/
│ │ │ │ ├── BasketItem.cs
│ │ │ │ └── CustomerBasket.cs
│ │ │ ├── Queries/
│ │ │ │ ├── IOrderQueries.cs
│ │ │ │ ├── OrderQueries.cs
│ │ │ │ └── OrderViewModel.cs
│ │ │ └── Validations/
│ │ │ ├── CancelOrderCommandValidator.cs
│ │ │ ├── CreateOrderCommandValidator.cs
│ │ │ ├── IdentifiedCommandValidator.cs
│ │ │ └── ShipOrderCommandValidator.cs
│ │ ├── Extensions/
│ │ │ ├── BasketItemExtensions.cs
│ │ │ ├── Extensions.cs
│ │ │ ├── LinqSelectExtensions.cs
│ │ │ └── OrderingApiTrace.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Infrastructure/
│ │ │ ├── OrderingContextSeed.cs
│ │ │ └── Services/
│ │ │ ├── IIdentityService.cs
│ │ │ └── IdentityService.cs
│ │ ├── Ordering.API.csproj
│ │ ├── Program.Testing.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── Ordering.Domain/
│ │ ├── AggregatesModel/
│ │ │ ├── BuyerAggregate/
│ │ │ │ ├── Buyer.cs
│ │ │ │ ├── CardType.cs
│ │ │ │ ├── IBuyerRepository.cs
│ │ │ │ └── PaymentMethod.cs
│ │ │ └── OrderAggregate/
│ │ │ ├── Address.cs
│ │ │ ├── IOrderRepository.cs
│ │ │ ├── Order.cs
│ │ │ ├── OrderItem.cs
│ │ │ └── OrderStatus.cs
│ │ ├── Events/
│ │ │ ├── BuyerPaymentMethodVerifiedDomainEvent.cs
│ │ │ ├── OrderCancelledDomainEvent.cs
│ │ │ ├── OrderShippedDomainEvent.cs
│ │ │ ├── OrderStartedDomainEvent.cs
│ │ │ ├── OrderStatusChangedToAwaitingValidationDomainEvent.cs
│ │ │ ├── OrderStatusChangedToPaidDomainEvent.cs
│ │ │ └── OrderStatusChangedToStockConfirmedDomainEvent.cs
│ │ ├── Exceptions/
│ │ │ └── OrderingDomainException.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Ordering.Domain.csproj
│ │ └── SeedWork/
│ │ ├── Entity.cs
│ │ ├── IAggregateRoot.cs
│ │ ├── IRepository.cs
│ │ ├── IUnitOfWork.cs
│ │ └── ValueObject.cs
│ ├── Ordering.Infrastructure/
│ │ ├── EntityConfigurations/
│ │ │ ├── BuyerEntityTypeConfiguration.cs
│ │ │ ├── CardTypeEntityTypeConfiguration.cs
│ │ │ ├── ClientRequestEntityTypeConfiguration.cs
│ │ │ ├── OrderEntityTypeConfiguration.cs
│ │ │ ├── OrderItemEntityTypeConfiguration.cs
│ │ │ └── PaymentMethodEntityTypeConfiguration.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Idempotency/
│ │ │ ├── ClientRequest.cs
│ │ │ ├── IRequestManager.cs
│ │ │ └── RequestManager.cs
│ │ ├── MediatorExtension.cs
│ │ ├── Migrations/
│ │ │ ├── 20230925222426_Initial.Designer.cs
│ │ │ ├── 20230925222426_Initial.cs
│ │ │ ├── 20231021004633_FixOrderitemseqSchema.Designer.cs
│ │ │ ├── 20231021004633_FixOrderitemseqSchema.cs
│ │ │ ├── 20231026091055_Outbox.Designer.cs
│ │ │ ├── 20231026091055_Outbox.cs
│ │ │ ├── 20240106121712_UseEnumForOrderStatus.Designer.cs
│ │ │ ├── 20240106121712_UseEnumForOrderStatus.cs
│ │ │ └── OrderingContextModelSnapshot.cs
│ │ ├── Ordering.Infrastructure.csproj
│ │ ├── OrderingContext.cs
│ │ └── Repositories/
│ │ ├── BuyerRepository.cs
│ │ └── OrderRepository.cs
│ ├── PaymentProcessor/
│ │ ├── GlobalUsings.cs
│ │ ├── IntegrationEvents/
│ │ │ ├── EventHandling/
│ │ │ │ └── OrderStatusChangedToStockConfirmedIntegrationEventHandler.cs
│ │ │ └── Events/
│ │ │ ├── OrderPaymentFailedIntegrationEvent.cs
│ │ │ ├── OrderPaymentSucceededIntegrationEvent.cs
│ │ │ └── OrderStatusChangedToStockConfirmedIntegrationEvent.cs
│ │ ├── PaymentOptions.cs
│ │ ├── PaymentProcessor.csproj
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── Shared/
│ │ ├── ActivityExtensions.cs
│ │ └── MigrateDbContextExtensions.cs
│ ├── WebApp/
│ │ ├── Components/
│ │ │ ├── App.razor
│ │ │ ├── Chatbot/
│ │ │ │ ├── ChatState.cs
│ │ │ │ ├── Chatbot.razor
│ │ │ │ ├── Chatbot.razor.css
│ │ │ │ ├── Chatbot.razor.js
│ │ │ │ ├── MessageProcessor.cs
│ │ │ │ ├── ShowChatbotButton.razor
│ │ │ │ └── ShowChatbotButton.razor.css
│ │ │ ├── Layout/
│ │ │ │ ├── CartMenu.razor
│ │ │ │ ├── CartMenu.razor.css
│ │ │ │ ├── FooterBar.razor
│ │ │ │ ├── FooterBar.razor.css
│ │ │ │ ├── HeaderBar.razor
│ │ │ │ ├── HeaderBar.razor.css
│ │ │ │ ├── MainLayout.razor
│ │ │ │ ├── MainLayout.razor.css
│ │ │ │ ├── UserMenu.razor
│ │ │ │ └── UserMenu.razor.css
│ │ │ ├── Pages/
│ │ │ │ ├── Cart/
│ │ │ │ │ ├── CartPage.razor
│ │ │ │ │ └── CartPage.razor.css
│ │ │ │ ├── Catalog/
│ │ │ │ │ ├── Catalog.razor
│ │ │ │ │ └── Catalog.razor.css
│ │ │ │ ├── Checkout/
│ │ │ │ │ ├── Checkout.razor
│ │ │ │ │ └── Checkout.razor.css
│ │ │ │ ├── Item/
│ │ │ │ │ ├── ItemPage.razor
│ │ │ │ │ └── ItemPage.razor.css
│ │ │ │ └── User/
│ │ │ │ ├── LogIn.razor
│ │ │ │ ├── LogOut.razor
│ │ │ │ ├── Orders.razor
│ │ │ │ ├── Orders.razor.css
│ │ │ │ └── OrdersRefreshOnStatusChange.razor
│ │ │ ├── Routes.razor
│ │ │ └── _Imports.razor
│ │ ├── Extensions/
│ │ │ └── Extensions.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Services/
│ │ │ ├── BasketCheckoutInfo.cs
│ │ │ ├── BasketItem.cs
│ │ │ ├── BasketService.cs
│ │ │ ├── BasketState.cs
│ │ │ ├── IBasketState.cs
│ │ │ ├── LogOutService.cs
│ │ │ ├── OrderStatus/
│ │ │ │ ├── IntegrationEvents/
│ │ │ │ │ ├── EventHandling/
│ │ │ │ │ │ ├── OrderStatusChangedToAwaitingValidationIntegrationEventHandler.cs
│ │ │ │ │ │ ├── OrderStatusChangedToCancelledIntegrationEventHandler.cs
│ │ │ │ │ │ ├── OrderStatusChangedToPaidIntegrationEventHandler.cs
│ │ │ │ │ │ ├── OrderStatusChangedToShippedIntegrationEventHandler.cs
│ │ │ │ │ │ ├── OrderStatusChangedToStockConfirmedIntegrationEventHandler.cs
│ │ │ │ │ │ └── OrderStatusChangedToSubmittedIntegrationEventHandler.cs
│ │ │ │ │ └── Events/
│ │ │ │ │ ├── OrderStatusChangedToAwaitingValidationIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToCancelledIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToPaidIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToShippedIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToStockConfirmedIntegrationEvent.cs
│ │ │ │ │ └── OrderStatusChangedToSubmittedIntegrationEvent.cs
│ │ │ │ └── OrderStatusNotificationService.cs
│ │ │ ├── OrderingService.cs
│ │ │ └── ProductImageUrlProvider.cs
│ │ ├── WebApp.csproj
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot/
│ │ └── css/
│ │ ├── app.css
│ │ └── normalize.css
│ ├── WebAppComponents/
│ │ ├── Catalog/
│ │ │ ├── CatalogItem.cs
│ │ │ ├── CatalogListItem.razor
│ │ │ ├── CatalogListItem.razor.css
│ │ │ ├── CatalogSearch.razor
│ │ │ └── CatalogSearch.razor.css
│ │ ├── Item/
│ │ │ └── ItemHelper.cs
│ │ ├── Services/
│ │ │ ├── CatalogService.cs
│ │ │ ├── ICatalogService.cs
│ │ │ └── IProductImageUrlProvider.cs
│ │ ├── WebAppComponents.csproj
│ │ └── _Imports.razor
│ ├── WebhookClient/
│ │ ├── Components/
│ │ │ ├── App.razor
│ │ │ ├── App.razor.css
│ │ │ ├── Layout/
│ │ │ │ ├── MainLayout.razor
│ │ │ │ ├── MainLayout.razor.css
│ │ │ │ ├── UserMenu.razor
│ │ │ │ └── UserMenu.razor.css
│ │ │ ├── Pages/
│ │ │ │ ├── AddWebhook.razor
│ │ │ │ ├── Error.razor
│ │ │ │ ├── Home/
│ │ │ │ │ ├── Home.razor
│ │ │ │ │ ├── Home.razor.css
│ │ │ │ │ ├── ReceivedMessages.razor
│ │ │ │ │ └── RegisteredHooks.razor
│ │ │ │ └── LogIn.razor
│ │ │ ├── Routes.razor
│ │ │ └── _Imports.razor
│ │ ├── Endpoints/
│ │ │ ├── AuthenticationEndpoints.cs
│ │ │ └── WebhookEndpoints.cs
│ │ ├── Extensions/
│ │ │ └── Extensions.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Services/
│ │ │ ├── HooksRepository.cs
│ │ │ ├── WebHookReceived.cs
│ │ │ ├── WebHooksClient.cs
│ │ │ ├── WebhookClientOptions.cs
│ │ │ ├── WebhookData.cs
│ │ │ ├── WebhookResponse.cs
│ │ │ ├── WebhookSubscriptionRequest.cs
│ │ │ └── WebhookType.cs
│ │ ├── WebhookClient.csproj
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot/
│ │ └── app.css
│ ├── Webhooks.API/
│ │ ├── Apis/
│ │ │ └── WebHooksApi.cs
│ │ ├── Exceptions/
│ │ │ └── WebhooksDomainException.cs
│ │ ├── Extensions/
│ │ │ ├── Extensions.cs
│ │ │ └── RouteHandlerBuilderExtensions.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Infrastructure/
│ │ │ └── WebhooksContext.cs
│ │ ├── IntegrationEvents/
│ │ │ ├── OrderStatusChangedToPaidIntegrationEvent.cs
│ │ │ ├── OrderStatusChangedToPaidIntegrationEventHandler.cs
│ │ │ ├── OrderStatusChangedToShippedIntegrationEvent.cs
│ │ │ ├── OrderStatusChangedToShippedIntegrationEventHandler.cs
│ │ │ ├── OrderStockItem.cs
│ │ │ ├── ProductPriceChangedIntegrationEvent.cs
│ │ │ └── ProductPriceChangedIntegrationEventHandler.cs
│ │ ├── Migrations/
│ │ │ ├── 20230925222606_Initial.Designer.cs
│ │ │ ├── 20230925222606_Initial.cs
│ │ │ └── WebhooksContextModelSnapshot.cs
│ │ ├── Model/
│ │ │ ├── WebhookData.cs
│ │ │ ├── WebhookSubscription.cs
│ │ │ ├── WebhookSubscriptionRequest.cs
│ │ │ └── WebhookType.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Services/
│ │ │ ├── GrantUrlTesterService.cs
│ │ │ ├── IGrantUrlTesterService.cs
│ │ │ ├── IWebhooksRetriever.cs
│ │ │ ├── IWebhooksSender.cs
│ │ │ ├── WebhooksRetriever.cs
│ │ │ └── WebhooksSender.cs
│ │ ├── Webhooks.API.csproj
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── eShop.AppHost/
│ │ ├── Extensions.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.json
│ │ └── eShop.AppHost.csproj
│ └── eShop.ServiceDefaults/
│ ├── AuthenticationExtensions.cs
│ ├── ClaimsPrincipalExtensions.cs
│ ├── ConfigurationExtensions.cs
│ ├── Extensions.cs
│ ├── HttpClientExtensions.cs
│ ├── OpenApi.Extensions.cs
│ ├── OpenApiOptionsExtensions.cs
│ └── eShop.ServiceDefaults.csproj
└── tests/
├── Basket.UnitTests/
│ ├── Basket.UnitTests.csproj
│ ├── BasketServiceTests.cs
│ ├── GlobalUsings.cs
│ └── Helpers/
│ └── TestServerCallContext.cs
├── Catalog.FunctionalTests/
│ ├── Catalog.FunctionalTests.csproj
│ ├── CatalogApiFixture.cs
│ ├── CatalogApiTests.cs
│ └── GlobalUsings.cs
├── ClientApp.UnitTests/
│ ├── ClientApp.UnitTests.csproj
│ ├── ClientApp.UnitTests.sln
│ ├── GlobalUsings.cs
│ ├── Mocks/
│ │ ├── MockDialogService.cs
│ │ ├── MockNavigationService.cs
│ │ ├── MockSettingsService.cs
│ │ └── MockViewModel.cs
│ ├── Services/
│ │ ├── BasketServiceTests.cs
│ │ ├── CatalogServiceTests.cs
│ │ └── OrdersServiceTests.cs
│ ├── TestingExtensions.cs
│ └── ViewModels/
│ ├── CatalogItemViewModelTests.cs
│ ├── CatalogViewModelTests.cs
│ ├── MainViewModelTests.cs
│ ├── MockViewModelTests.cs
│ └── OrderViewModelTests.cs
├── Directory.Build.props
├── Ordering.FunctionalTests/
│ ├── AutoAuthorizeMiddleware.cs
│ ├── GlobalUsings.cs
│ ├── Ordering.FunctionalTests.csproj
│ ├── OrderingApiFixture.cs
│ └── OrderingApiTests.cs
├── Ordering.UnitTests/
│ ├── Application/
│ │ ├── IdentifiedCommandHandlerTest.cs
│ │ ├── NewOrderCommandHandlerTest.cs
│ │ ├── OrdersWebApiTest.cs
│ │ └── SetStockRejectedOrderStatusCommandTest.cs
│ ├── Builders.cs
│ ├── Domain/
│ │ ├── BuyerAggregateTest.cs
│ │ ├── OrderAggregateTest.cs
│ │ └── SeedWork/
│ │ └── ValueObjectTests.cs
│ ├── GlobalUsings.cs
│ └── Ordering.UnitTests.csproj
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .aspire/settings.json
================================================
{
"appHostPath": "../src/eShop.AppHost/eShop.AppHost.csproj"
}
================================================
FILE: .config/CredScanSuppressions.json
================================================
{
"tool": "Credential Scanner",
"suppressions": [
{
"placeholder": "Pass123$",
"_justification": "Dummy."
},
{
"placeholder": "yourWeak(!)Password",
"_justification": "Dummy."
}
]
}
================================================
FILE: .config/configuration.vs.winget
================================================
# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2
properties:
configurationVersion: 0.2.0
########################################
### RESOURCES: System Configuration
########################################
resources:
########################################
### OS Configurations
########################################
### Enable: Developer Mode
### -------------------------------------
- resource: Microsoft.Windows.Developer/DeveloperMode
directives:
description: Enable Developer Mode
# Requires elevation only for the set operation
securityContext: elevated
allowPrerelease: true
settings:
Ensure: Present
### Install Windows VirtualMachinePlatform
### -------------------------------------
- resource: PSDscResources/WindowsOptionalFeature
directives:
description: Install VirtualMachinePlatform
securityContext: elevated
settings:
name: VirtualMachinePlatform
ensure: Present
### Install WSL
### -------------------------------------
- resource: PSDscResources/WindowsOptionalFeature
directives:
description: Install WSL
securityContext: elevated
settings:
name: Microsoft-Windows-Subsystem-Linux
ensure: Present
### Configure Install Ubuntu
### -------------------------------------
- resource: PSDscResources/Script
id: ubuntuwsl
directives:
description: Install Ubuntu for WSL
settings:
SetScript: |
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
wsl --install -d Ubuntu
GetScript: return $false
TestScript: return $false
########################################
### Install CLIs, SDKs & Tools
########################################
### Install DotNET SDK Preview
### -------------------------------------
- resource: Microsoft.WinGet.DSC/WinGetPackage
id: dotnetsdk
directives:
description: Install DotNET SDK Preview
# Requires elevation only for the set operation (i.e., installing the package)
securityContext: elevated
settings:
id: Microsoft.DotNet.SDK.Preview
### Install Azure CLI
### -------------------------------------
- resource: Microsoft.WinGet.DSC/WinGetPackage
id: azurecli
directives:
description: Install Azure CLI
# Requires elevation only for the set operation (i.e., installing the package)
securityContext: elevated
settings:
id: Microsoft.AzureCLI
### Install Azd
### -------------------------------------
- resource: Microsoft.WinGet.DSC/WinGetPackage
id: Azd
directives:
description: Install Azd
settings:
id: Microsoft.Azd
### Install Docker Desktop
### -------------------------------------
- resource: Microsoft.WinGet.DSC/WinGetPackage
id: docker
directives:
description: Install Docker Desktop
# Requires elevation only for the set operation (i.e., installing the package)
securityContext: elevated
settings:
id: Docker.DockerDesktop
### Install Visual Sudio
### -------------------------------------
- resource: Microsoft.WinGet.DSC/WinGetPackage
id: vscommunity
directives:
description: Install Visual Studio 2022 Community
# Requires elevation only for the set operation (i.e., installing the package)
# Only requires elevation when the VS Installer isn't installed yet
securityContext: elevated
settings:
id: Microsoft.VisualStudio.2022.Community.Preview
### Install VS Workloads
### -------------------------------------
- resource: Microsoft.VisualStudio.DSC/VSComponents
directives:
description: Install required VS workloads from vsconfig file
securityContext: elevated
allowPrerelease: true
dependsOn:
- vscommunity
settings:
productId: Microsoft.VisualStudio.Product.Community
channelId: VisualStudio.17.Preview
components: [Microsoft.VisualStudio.Workload.NetWeb, Microsoft.VisualStudio.Workload.NetCrossPlat, aspire]
includeRecommended: true
================================================
FILE: .config/configuration.vsCode.winget
================================================
# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2
properties:
configurationVersion: 0.2.0
########################################
### RESOURCES: System Configuration
########################################
resources:
########################################
### OS Configurations
########################################
### Enable: Developer Mode
### -------------------------------------
- resource: Microsoft.Windows.Developer/DeveloperMode
directives:
description: Enable Developer Mode
# Requires elevation only for the set operation
securityContext: elevated
allowPrerelease: true
settings:
Ensure: Present
### Install Windows VirtualMachinePlatform
### -------------------------------------
- resource: PSDscResources/WindowsOptionalFeature
directives:
description: Install VirtualMachinePlatform
securityContext: elevated
settings:
name: VirtualMachinePlatform
ensure: Present
### Install WSL
### -------------------------------------
- resource: PSDscResources/WindowsOptionalFeature
directives:
description: Install WSL
securityContext: elevated
settings:
name: Microsoft-Windows-Subsystem-Linux
ensure: Present
### Configure Install Ubuntu
### -------------------------------------
- resource: PSDscResources/Script
id: ubuntuwsl
directives:
description: Install Ubuntu for WSL
settings:
SetScript: |
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
wsl --install -d Ubuntu
GetScript: return $false
TestScript: return $false
########################################
### Install CLIs, SDKs & Tools
########################################
### Install DotNET SDK Preview
### -------------------------------------
- resource: Microsoft.WinGet.DSC/WinGetPackage
id: dotnetsdk
directives:
description: Install DotNET SDK Preview
# Requires elevation only for the set operation (i.e., installing the package)
securityContext: elevated
settings:
id: Microsoft.DotNet.SDK.Preview
### Install Azure CLI
### -------------------------------------
- resource: Microsoft.WinGet.DSC/WinGetPackage
id: azurecli
directives:
description: Install Azure CLI
# Requires elevation only for the set operation (i.e., installing the package)
securityContext: elevated
settings:
id: Microsoft.AzureCLI
### Install Azd
### -------------------------------------
- resource: Microsoft.WinGet.DSC/WinGetPackage
id: Azd
directives:
description: Install Azd
settings:
id: Microsoft.Azd
### Install Docker Desktop
### -------------------------------------
- resource: Microsoft.WinGet.DSC/WinGetPackage
id: docker
directives:
description: Install Docker Desktop
# Requires elevation only for the set operation (i.e., installing the package)
securityContext: elevated
settings:
id: Docker.DockerDesktop
### Install Microsoft Visual Studio Code
### -------------------------------------
- resource: Microsoft.WinGet.DSC/WinGetPackage
id: vscode
directives:
description: Install Microsoft Visual Studio Code
settings:
id: Microsoft.VisualStudioCode
ensure: Present
########################################
### Install VSCode Extensions
########################################
### Install VSCode Azure Developer CLI Extension
### -------------------------------------
- resource: Microsoft.VSCode.Dsc/VSCodeExtension
id: azure-dev-cli-extension
dependsOn:
- vscode
- docker
directives:
description: Install Azure Developer CLI Extension
allowPrerelease: true
settings:
name: ms-azuretools.azure-dev
exist: true
### Install VSCode WSL Extension
### -------------------------------------
- resource: Microsoft.VSCode.Dsc/VSCodeExtension
id: wsl-extension
dependsOn:
- vscode
- docker
directives:
description: Install WSL extension
allowPrerelease: true
settings:
name: ms-vscode-remote.remote-wsl
exist: true
### Install VSCode Dev Containers Extension
### -------------------------------------
- resource: Microsoft.VSCode.Dsc/VSCodeExtension
id: devcontainers-extension
dependsOn:
- vscode
- docker
directives:
description: Install Dev Containers extension
allowPrerelease: true
settings:
name: ms-vscode-remote.remote-containers
exist: true
### Install VSCode Docker Extension
### -------------------------------------
- resource: Microsoft.VSCode.Dsc/VSCodeExtension
id: docker-extension
dependsOn:
- vscode
- docker
directives:
description: Install Docker extension
allowPrerelease: true
settings:
name: ms-azuretools.vscode-docker
exist: true
### Install VSCode C# DevKit Extension
### -------------------------------------
- resource: Microsoft.VSCode.Dsc/VSCodeExtension
id: c#-devkit-extension
dependsOn:
- vscode
- docker
directives:
description: Install C# DevKit extension
allowPrerelease: true
settings:
name: ms-dotnettools.csdevkit
exist: true
### Install .NET MAUI Extension
### -------------------------------------
- resource: Microsoft.VSCode.Dsc/VSCodeExtension
id: dotnet-maui-extension
dependsOn:
- vscode
- docker
directives:
description: Install .NET MAUI extension
allowPrerelease: true
settings:
name: ms-dotnettools.dotnet-maui
exist: true
================================================
FILE: .config/tsaoptions.json
================================================
{
"areaPath": "DevDiv\\ASP.NET Core\\Policy Violations",
"codebaseName": "eShop",
"instanceUrl": "https://devdiv.visualstudio.com/",
"iterationPath": "DevDiv",
"notificationAliases": [
"aspnetcore-build@microsoft.com"
],
"projectName": "DEVDIV",
"repositoryName": "eShop",
"template": "TFSDEVDIV"
}
================================================
FILE: .devcenter/catalog/definitions/imagedefinition.yaml
================================================
Initial Commit
================================================
FILE: .editorconfig
================================================
###############################
# Core EditorConfig Options #
###############################
root = true
# All files
[*]
indent_style = space
# XML project files
[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}]
indent_size = 2
# XML config files
[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}]
indent_size = 2
# Code files
[*.{cs,csx,vb,vbx}]
indent_size = 4
insert_final_newline = true
charset = utf-8-bom
###############################
# .NET Coding Conventions #
###############################
[*.{cs,vb}]
# Organize usings
dotnet_sort_system_directives_first = true
# this. preferences
dotnet_style_qualification_for_field = false:silent
dotnet_style_qualification_for_property = false:silent
dotnet_style_qualification_for_method = false:silent
dotnet_style_qualification_for_event = false:silent
# Language keywords vs BCL types preferences
dotnet_style_predefined_type_for_locals_parameters_members = true:silent
dotnet_style_predefined_type_for_member_access = true:silent
# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
# Modifier preferences
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
dotnet_style_readonly_field = true:suggestion
# Expression-level preferences
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:silent
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_auto_properties = true:silent
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
dotnet_style_prefer_conditional_expression_over_return = true:silent
###############################
# Naming Conventions #
###############################
# Style Definitions
dotnet_naming_style.pascal_case_style.capitalization = pascal_case
# Use PascalCase for constant fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
dotnet_naming_symbols.constant_fields.applicable_kinds = field
dotnet_naming_symbols.constant_fields.applicable_accessibilities = *
dotnet_naming_symbols.constant_fields.required_modifiers = const
###############################
# C# Coding Conventions #
###############################
[*.cs]
# var preferences
csharp_style_var_for_built_in_types = true:silent
csharp_style_var_when_type_is_apparent = true:silent
csharp_style_var_elsewhere = true:silent
# Expression-bodied members
csharp_style_expression_bodied_methods = false:silent
csharp_style_expression_bodied_constructors = false:silent
csharp_style_expression_bodied_operators = false:silent
csharp_style_expression_bodied_properties = true:silent
csharp_style_expression_bodied_indexers = true:silent
csharp_style_expression_bodied_accessors = true:silent
# Pattern matching preferences
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
# Null-checking preferences
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion
# Modifier preferences
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
# Expression-level preferences
csharp_prefer_braces = true:silent
csharp_style_deconstructed_variable_declaration = true:suggestion
csharp_prefer_simple_default_expression = true:suggestion
csharp_style_prefer_local_over_anonymous_function = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
###############################
# C# Formatting Rules #
###############################
# New line preferences
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_between_query_expression_clauses = true
# Indentation preferences
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = flush_left
# Space preferences
csharp_space_after_cast = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_around_binary_operators = before_and_after
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
# Wrapping preferences
csharp_preserve_single_line_statements = true
csharp_preserve_single_line_blocks = true
###############################
# VB Coding Conventions #
###############################
[*.vb]
# Modifier preferences
visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion
================================================
FILE: .gitattributes
================================================
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
*.sh text eol=lf
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
###############################################################################
# Certificates are binary
###############################################################################
*.pfx binary
================================================
FILE: .github/dependabot.yml
================================================
version: 2
registries:
public-nuget:
type: nuget-feed
url: https://api.nuget.org/v3/index.json
updates:
- package-ecosystem: nuget
directory: "/"
registries:
- public-nuget
schedule:
interval: weekly
open-pull-requests-limit: 15
groups:
Aspire:
patterns:
- "Aspire.*"
- "Microsoft.Extensions.ServiceDiscovery.*"
Azure:
patterns:
- "Azure.*"
- "Microsoft.Azure.*"
- "Microsoft.Extensions.Azure"
AspNetCoreHealthChecks:
patterns:
- "AspNetCore.HealthChecks.*"
AspNetCore:
patterns:
- "Microsoft.AspNetCore.*"
- "Microsoft.Extensions.Features"
MicrosoftExtensions:
patterns:
- "Microsoft.Extensions.*"
- "Microsoft.Bcl.*"
EntityFrameworkCore:
patterns:
- "Microsoft.EntityFrameworkCore.*"
FluentUi:
patterns:
- "Microsoft.FluentUI.*"
OpenTelemetry:
patterns:
- "OpenTelemetry.*"
Npgsql:
patterns:
- "Npgsql.*"
MicrosoftDotNet:
patterns:
- "Microsoft.DotNet.*"
Grpc:
patterns:
- "Grpc.*"
Pgvector:
patterns:
- "Pgvector.*"
Duende:
patterns:
- "Duende.*"
MSTest:
patterns:
- "MSTest.*"
================================================
FILE: .github/workflows/markdownlint-problem-matcher.json
================================================
{
"problemMatcher": [
{
"owner": "markdownlint",
"pattern": [
{
"regexp": "^([^:]*):(\\d+):?(\\d+)?\\s([\\w-\\/]*)\\s(.*)$",
"file": 1,
"line": 2,
"column": 3,
"code": 4,
"message": 5
}
]
}
]
}
================================================
FILE: .github/workflows/markdownlint.yml
================================================
name: Markdownlint
permissions:
contents: read
# run even on changes without markdown changes, so that we can
# make it in GitHub a required check for PR's
on:
pull_request:
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 16.x
- name: Run Markdownlint
run: |
echo "::add-matcher::.github/workflows/markdownlint-problem-matcher.json"
npm i -g markdownlint-cli
markdownlint --ignore '.dotnet/' '**/*.md'
================================================
FILE: .github/workflows/playwright.yml
================================================
name: Playwright Tests for eShop
on:
push:
branches: [ main ]
paths-ignore:
- '**.md'
- 'src/ClientApp/**'
- 'tests/ClientApp.UnitTests/**'
- '.github/workflows/pr-validation-maui.yml'
pull_request:
branches: [ main ]
paths-ignore:
- '**.md'
- 'src/ClientApp/**'
- 'test/ClientApp.UnitTests/**'
- '.github/workflows/pr-validation-maui.yml'
jobs:
test:
timeout-minutes: 60
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'
dotnet-quality: 'preview'
- uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Install dependencies
run: npm ci
- name: Install .NET HTTPS Development Certificate
# if: matrix.os == 'ubuntu-latest'
run: |
dotnet dev-certs https --clean
dotnet dev-certs https --trust
- name: Install Playwright Browsers
run: npx playwright install chromium
- name: Run Playwright tests
run: npx playwright test
env:
ESHOP_USE_HTTP_ENDPOINTS: 1
USERNAME1: bob
PASSWORD: Pass123$
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report
path: playwright-report/
retention-days: 30
================================================
FILE: .github/workflows/pr-validation-maui.yml
================================================
name: eShop Pull Request Validation - .NET MAUI
on:
pull_request:
branches:
- '**'
paths:
- 'src/ClientApp/**'
- 'tests/ClientApp.UnitTests/**'
- '.github/workflows/pr-validation-maui.yml'
push:
branches:
- main
paths:
- 'src/ClientApp/**'
- 'tests/ClientApp.UnitTests/**'
- '.github/workflows/pr-validation-maui.yml'
jobs:
test:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET (global.json)
uses: actions/setup-dotnet@v3
- name: Update Workloads
run: dotnet workload update
- name: Install Workloads
shell: pwsh
run: |
dotnet workload install android
dotnet workload install ios
dotnet workload install maccatalyst
dotnet workload install maui
- name: Build
run: dotnet build src/ClientApp/ClientApp.csproj
- name: Test
run: dotnet test --project tests/ClientApp.UnitTests/ClientApp.UnitTests.csproj --no-progress --output detailed
================================================
FILE: .github/workflows/pr-validation.yml
================================================
name: eShop Pull Request Validation
on:
pull_request:
paths-ignore:
- '**.md'
- 'src/ClientApp/**'
- 'tests/ClientApp.UnitTests/**'
- '.github/workflows/pr-validation-maui.yml'
push:
branches:
- main
paths-ignore:
- '**.md'
- 'src/ClientApp/**'
- 'tests/ClientApp.UnitTests/**'
- '.github/workflows/pr-validation-maui.yml'
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET (global.json)
uses: actions/setup-dotnet@v3
- name: Build
run: dotnet build eShop.Web.slnf
- name: Test
run: dotnet test --solution eShop.Web.slnf --no-build --no-progress --output detailed
================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from `dotnet new gitignore`
# dotenv files
.env
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET
project.lock.json
project.fragment.lock.json
artifacts/
# Tye
.tye/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml
.idea
##
## Visual studio for Mac
##
# globs
Makefile.in
*.userprefs
*.usertasks
config.make
config.status
aclocal.m4
install-sh
autom4te.cache/
*.tar.gz
tarballs/
test-results/
# Mac bundle stuff
*.dmg
*.app
# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
# Vim temporary swap files
*.swp
# Playwright
/test-results/
/playwright-report/
/blob-report/
/playwright/.cache/
/playwright/.auth/
/user.json
.azure
================================================
FILE: .markdownlint.json
================================================
{
"default": true,
"ul-indent": false,
"ul-style": false,
"no-trailing-spaces": false,
"line-length": false,
"blanks-around-headings": false,
"no-duplicate-heading": { "siblings_only": true },
"no-trailing-punctuation": false,
"blanks-around-fences": false,
"blanks-around-lists": false,
"no-inline-html": { "allowed_elements": [ "summary", "details", "kbd", "br" ]},
"no-bare-urls": false,
"single-trailing-newline": false,
"emphasis-style": false,
// rule settings and options are documented in https://github.com/DavidAnson/markdownlint
// feel free to disable more low value rules in here; get rule name from the error message.
// the purpose of the linter is to catch significant issues like broken links.
}
================================================
FILE: .markdownlintignore
================================================
# This is for editors; keep .github/workflows/markdownlint.yml in sync
.dotnet/
================================================
FILE: .spectral.yml
================================================
extends: spectral:oas
rules:
info-contact: off
success-response:
description: All operations should have a success response.
message: Operation is missing a success response.
severity: warn
given: $.paths.*.*.responses
then:
function: schema
functionOptions:
schema:
anyOf:
- required: ["200"]
- required: ["201"]
- required: ["204"]
error-response:
description: All operations should have a error response.
message: Operation is missing a error response.
severity: warn
given: $.paths.*.*.responses
then:
function: schema
functionOptions:
schema:
anyOf:
- required: ["400"]
- required: ["404"]
parameter-description:
description: All parameters should have a description
message: Parameter is missing a description.
severity: warn
given: $.paths.*.*.parameters[*]
then:
field: description
function: truthy
================================================
FILE: CODE-OF-CONDUCT.md
================================================
# Code of Conduct
This project has adopted the code of conduct defined by the Contributor Covenant
to clarify expected behavior in our community.
For more information, see the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct).
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to eShop
Thank you for your interest in contributing to eShop! We're excited to collaborate with you and see how together we can improve and evolve this sample application.
## Getting Started
If this is your first visit, a great way to begin is by tackling issues tagged as `"help wanted"` or `"good first issue"`. These are specially curated to help you get acquainted with the project and make a meaningful impact early on.
## Spot a Typo?
Typos and other small fixes are important to us -— no contribution is too small! If you spot something small, go ahead and open a Pull Request. For these types of contributions, there's no need to create a separate issue.
## Have a Suggestion?
If you have a suggestion on how to enhance eShop, please open an issue with the following details:
- A clear title and description of the suggestion
- Any relevant examples or mockups
- Indicate whether you're interested in implementing the feature yourself
We'll review your suggestion and have a discussion about its potential inclusion in the project.
## Contribution Principles
When considering contributions, we're guided by several principles that align with the project's vision:
- **Best Practices**: We want this sample to be canonical and reflect the best practices in the industry and in .NET.
- **Selectivity in Tools and Libraries**: There is a rich ecosystem of tools, projects, and libraries out there, and we cannot use all of them in this sample. We would like this repo to reflect the use of a realistic set of technologies, not to be a showcase or example of every possible thing it could use.
- **Architectural Integrity**: We welcome refactoring and architectural improvements, provided they're justified. Large-scale changes should come with a clear rationale, such as significant enhancements to the application's design or performance.
- **Enhancing Reliability and Scalability**: We welcome contributions that improve the application's reliability and scalability. These could include updates to error handling, redundancy mechanisms, data access, and any other changes that help eShop operate more robustly under load. We'd love to see relevant test scenarios or metrics for these contributions.
- **Performance Enhancements**: If you're looking to speed up eShop, we're all for it! Please include benchmark comparisons to demonstrate the improvements. Performance improvements that make the code less readable or canonical may have more scrutiny applied.
## Code of Conduct
To ensure a welcoming and positive environment for everyone, please adhere to our Code of Conduct. Respectful collaboration is key to a successful project.
================================================
FILE: Directory.Build.props
================================================
<Project>
<PropertyGroup>
<WarnOnPackingNonPackableProject>false</WarnOnPackingNonPackableProject>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<SuppressNETCoreSdkPreviewMessage>true</SuppressNETCoreSdkPreviewMessage>
<DebugType>embedded</DebugType>
<DebugSymbols>true</DebugSymbols>
<ImplicitUsings>enable</ImplicitUsings>
<!-- Temporarily disable security warnings for transitive packages. -->
<NoWarn>NU1901;NU1902;NU1903;NU1904</NoWarn>
<UseArtifactsOutput>true</UseArtifactsOutput>
</PropertyGroup>
<!-- Enable OpenAI OpenTelemetry so OpenAI calls participate in tracing and metrics. -->
<ItemGroup>
<RuntimeHostConfigurationOption Include="OpenAI.Experimental.EnableOpenTelemetry"
Value="true" />
</ItemGroup>
</Project>
================================================
FILE: Directory.Build.targets
================================================
<Project>
<PropertyGroup Condition="'$(PublishAot)' == 'true'">
<!-- EventSource is disabled by default for non-ASP.NET AOT'd apps, re-enable it -->
<EventSourceSupport>true</EventSourceSupport>
<!-- Ensure individual warnings are shown when publishing -->
<TrimmerSingleWarn>false</TrimmerSingleWarn>
</PropertyGroup>
</Project>
================================================
FILE: Directory.Packages.props
================================================
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
<AspnetVersion>10.0.0</AspnetVersion>
<MicrosoftExtensionsVersion>10.1.0</MicrosoftExtensionsVersion>
<AspireVersion>13.1.0</AspireVersion>
<AspireUnstablePackagesVersion>13.1.0-preview.1.25616.3</AspireUnstablePackagesVersion>
<GrpcVersion>2.71.0</GrpcVersion>
<DuendeVersion>7.3.1</DuendeVersion>
<ApiVersioningVersion>8.1.0</ApiVersioningVersion>
</PropertyGroup>
<ItemGroup>
<!-- Version together with Aspire -->
<PackageVersion Include="Aspire.Hosting.Azure.CognitiveServices" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.Hosting.PostgreSQL" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.Hosting.RabbitMQ" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.Hosting.Redis" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.Hosting.Yarp" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.Npgsql" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.Npgsql.EntityFrameworkCore.PostgreSQL" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.RabbitMQ.Client" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.StackExchange.Redis" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.Azure.AI.OpenAI" Version="$(AspireUnstablePackagesVersion)" />
<PackageVersion Include="Microsoft.Extensions.ApiDescription.Server" Version="10.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageVersion>
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery" Version="$(MicrosoftExtensionsVersion)" />
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery.Yarp" Version="$(MicrosoftExtensionsVersion)" />
<!-- Version together with Asp.Versioning -->
<PackageVersion Include="Asp.Versioning.Http" Version="$(ApiVersioningVersion)" />
<PackageVersion Include="Asp.Versioning.Http.Client" Version="$(ApiVersioningVersion)" />
<PackageVersion Include="Asp.Versioning.Mvc.ApiExplorer" Version="$(ApiVersioningVersion)" />
<!-- Version together with ASP.NET -->
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.1" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="10.0.1" />
<PackageVersion Include="Microsoft.AspNetCore.Components.QuickGrid" Version="10.0.1" />
<PackageVersion Include="Microsoft.AspNetCore.Components.Web" Version="10.0.1" />
<PackageVersion Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="10.0.1" />
<PackageVersion Include="Microsoft.AspNetCore.Identity.UI" Version="10.0.1" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.1" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="10.0.1" />
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="10.0.1" />
<PackageVersion Include="Microsoft.Extensions.Identity.Stores" Version="10.0.1" />
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="10.1.0" />
<PackageVersion Include="Microsoft.OpenApi" Version="2.3.2" />
<PackageVersion Include="MSTest" Version="4.0.2" />
<!-- Version together with EF -->
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.1" />
<PackageVersion Include="NSubstitute" Version="5.3.0" />
<PackageVersion Include="NSubstitute.Analyzers.CSharp" Version="1.0.17" />
<PackageVersion Include="Pgvector" Version="0.3.2" />
<PackageVersion Include="Pgvector.EntityFrameworkCore" Version="0.2.2" />
<!-- Version together with runtime -->
<PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.1" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.1" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.1" />
<!-- Xabaril packages -->
<PackageVersion Include="AspNetCore.HealthChecks.Uris" Version="9.0.0" />
<!-- AI -->
<PackageVersion Include="CommunityToolkit.Aspire.Hosting.Ollama" Version="9.8.0-beta.395" />
<PackageVersion Include="CommunityToolkit.Aspire.OllamaSharp" Version="9.8.0-beta.395" />
<!-- Open Telemetry -->
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.GrpcNetClient" Version="1.14.0-beta.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.14.0" />
<!-- IdentityServer -->
<PackageVersion Include="Duende.IdentityServer" Version="7.3.2" />
<PackageVersion Include="Duende.IdentityServer.AspNetIdentity" Version="7.3.2" />
<PackageVersion Include="Duende.IdentityServer.EntityFramework" Version="7.3.2" />
<PackageVersion Include="Duende.IdentityServer.EntityFramework.Storage" Version="7.3.2" />
<PackageVersion Include="Duende.IdentityServer.Storage" Version="7.3.2" />
<!-- Scaffolding -->
<PackageVersion Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="8.0.0-rc.1.23461.3" />
<!-- Grpc -->
<PackageVersion Include="Grpc.AspNetCore" Version="$(GrpcVersion)" />
<PackageVersion Include="Grpc.Net.ClientFactory" Version="$(GrpcVersion)" />
<PackageVersion Include="Grpc.Tools" Version="2.72.0" PrivateAssets="All" />
<!-- Miscellaneous -->
<PackageVersion Include="Dapper" Version="2.1.35" />
<PackageVersion Include="FluentValidation" Version="12.0.0" />
<PackageVersion Include="FluentValidation.DependencyInjectionExtensions" Version="12.0.0" />
<PackageVersion Include="Google.Protobuf" Version="3.33.0" />
<PackageVersion Include="Microsoft.Web.LibraryManager.Build" Version="3.0.71" />
<PackageVersion Include="System.Reflection.TypeExtensions" Version="4.7.0" />
<PackageVersion Include="xunit.v3.mtp-v2" Version="3.2.1" />
<PackageVersion Include="IdentityModel" Version="7.0.0" />
<PackageVersion Include="Scalar.AspNetCore" Version="2.8.6" />
<!-- Before license change -->
<PackageVersion Include="MediatR" Version="13.0.0" />
</ItemGroup>
</Project>
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) .NET Foundation and Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# eShop Reference Application - "AdventureWorks"
A reference .NET application implementing an e-commerce website using a services-based architecture using [.NET Aspire](https://learn.microsoft.com/dotnet/aspire/).


## Getting Started
This version of eShop is based on .NET 9.
Previous eShop versions:
* [.NET 8](https://github.com/dotnet/eShop/tree/release/8.0)
### Prerequisites
- Clone the eShop repository: https://github.com/dotnet/eshop
- [Install & start Docker Desktop](https://docs.docker.com/engine/install/)
#### Windows with Visual Studio
- Install [Visual Studio 2022 version 17.10 or newer](https://visualstudio.microsoft.com/vs/).
- Select the following workloads:
- `ASP.NET and web development` workload.
- `.NET Aspire SDK` component in `Individual components`.
- Optional: `.NET Multi-platform App UI development` to run client apps
Or
- Run the following commands in a Powershell & Terminal running as `Administrator` to automatically configure your environment with the required tools to build and run this application. (Note: A restart is required and included in the script below.)
```powershell
install-Module -Name Microsoft.WinGet.Configuration -AllowPrerelease -AcceptLicense -Force
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
get-WinGetConfiguration -file .\.configurations\vside.dsc.yaml | Invoke-WinGetConfiguration -AcceptConfigurationAgreements
```
Or
- From Dev Home go to `Machine Configuration -> Clone repositories`. Enter the URL for this repository. In the confirmation screen look for the section `Configuration File Detected` and click `Run File`.
#### Mac, Linux, & Windows without Visual Studio
- Install the latest [.NET 9 SDK](https://dot.net/download?cid=eshop)
Or
- Run the following commands in a Powershell & Terminal running as `Administrator` to automatically configuration your environment with the required tools to build and run this application. (Note: A restart is required after running the script below.)
##### Install Visual Studio Code and related extensions
```powershell
install-Module -Name Microsoft.WinGet.Configuration -AllowPrerelease -AcceptLicense -Force
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
get-WinGetConfiguration -file .\.configurations\vscode.dsc.yaml | Invoke-WinGetConfiguration -AcceptConfigurationAgreements
```
> Note: These commands may require `sudo`
- Optional: Install [Visual Studio Code with C# Dev Kit](https://code.visualstudio.com/docs/csharp/get-started)
- Optional: Install [.NET MAUI Workload](https://learn.microsoft.com/dotnet/maui/get-started/installation?tabs=visual-studio-code)
> Note: When running on Mac with Apple Silicon (M series processor), Rosetta 2 for grpc-tools.
### Running the solution
> [!WARNING]
> Remember to ensure that Docker is started
* (Windows only) Run the application from Visual Studio:
- Open the `eShop.Web.slnf` file in Visual Studio
- Ensure that `eShop.AppHost.csproj` is your startup project
- Hit Ctrl-F5 to launch Aspire
* Or run the application from your terminal:
```powershell
dotnet run --project src/eShop.AppHost/eShop.AppHost.csproj
```
then look for lines like this in the console output in order to find the URL to open the Aspire dashboard:
```sh
Login to the dashboard at: http://localhost:19888/login?t=uniquelogincodeforyou
```
> You may need to install ASP.NET Core HTTPS development certificates first, and then close all browser tabs. Learn more at https://aka.ms/aspnet/https-trust-dev-cert
### Azure Open AI
When using Azure OpenAI, inside *eShop.AppHost/appsettings.json*, add the following section:
```json
"ConnectionStrings": {
"OpenAi": "Endpoint=xxx;Key=xxx;"
}
```
Replace the values with your own. Then, in the eShop.AppHost *Program.cs*, set this value to **true**
```csharp
bool useOpenAI = false;
```
Here's additional guidance on the [.NET Aspire OpenAI component](https://learn.microsoft.com/dotnet/aspire/azureai/azureai-openai-component?tabs=dotnet-cli).
### Use Azure Developer CLI
You can use the [Azure Developer CLI](https://aka.ms/azd) to run this project on Azure with only a few commands. Follow the next instructions:
- Install the latest or update to the latest [Azure Developer CLI (azd)](https://aka.ms/azure-dev/install).
- Log in `azd` (if you haven't done it before) to your Azure account:
```sh
azd auth login
```
- Initialize `azd` from the root of the repo.
```sh
azd init
```
- During init:
- Select `Use code in the current directory`. Azd will automatically detect the .NET Aspire project.
- Confirm `.NET (Aspire)` and continue.
- Select which services to expose to the Internet (exposing `webapp` is enough to test the sample).
- Finalize the initialization by giving a name to your environment.
- Create Azure resources and deploy the sample by running:
```sh
azd up
```
Notes:
- The operation takes a few minutes the first time it is ever run for an environment.
- At the end of the process, `azd` will display the `url` for the webapp. Follow that link to test the sample.
- You can run `azd up` after saving changes to the sample to re-deploy and update the sample.
- Report any issues to [azure-dev](https://github.com/Azure/azure-dev/issues) repo.
- [FAQ and troubleshoot](https://learn.microsoft.com/azure/developer/azure-developer-cli/troubleshoot?tabs=Browser) for azd.
## Contributing
For more information on contributing to this repo, read [the contribution documentation](./CONTRIBUTING.md) and [the Code of Conduct](CODE-OF-CONDUCT.md).
### Sample data
The sample catalog data is defined in [catalog.json](https://github.com/dotnet/eShop/blob/main/src/Catalog.API/Setup/catalog.json). Those product names, descriptions, and brand names are fictional and were generated using [GPT-35-Turbo](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/chatgpt), and the corresponding [product images](https://github.com/dotnet/eShop/tree/main/src/Catalog.API/Pics) were generated using [DALL·E 3](https://openai.com/dall-e-3).
## eShop on Azure
For a version of this app configured for deployment on Azure, please view [the eShop on Azure](https://github.com/Azure-Samples/eShopOnAzure) repo.
================================================
FILE: build/acr-build/queue-all.ps1
================================================
Param(
[parameter(Mandatory=$false)][string]$acrName,
[parameter(Mandatory=$false)][string]$gitUser,
[parameter(Mandatory=$false)][string]$repoName="eShopOnContainers",
[parameter(Mandatory=$false)][string]$gitBranch="dev",
[parameter(Mandatory=$true)][string]$patToken
)
$gitContext = "https://github.com/$gitUser/$repoName"
$services = @(
@{ Name="eshopbasket"; Image="eshop/basket.api"; File="src/Services/Basket/Basket.API/Dockerfile" },
@{ Name="eshopcatalog"; Image="eshop/catalog.api"; File="src/Services/Catalog/Catalog.API/Dockerfile" },
@{ Name="eshopidentity"; Image="eshop/identity.api"; File="src/Services/Identity/Identity.API/Dockerfile" },
@{ Name="eshopordering"; Image="eshop/ordering.api"; File="src/Services/Ordering/Ordering.API/Dockerfile" },
@{ Name="eshoporderingbg"; Image="eshop/orderprocessor"; File="src/Services/Ordering/OrderProcessor/Dockerfile" },
@{ Name="eshopwebspa"; Image="eshop/webspa"; File="src/Web/WebSPA/Dockerfile" },
@{ Name="eshopwebmvc"; Image="eshop/webmvc"; File="src/Web/WebMVC/Dockerfile" },
@{ Name="eshopwebstatus"; Image="eshop/webstatus"; File="src/Web/WebStatus/Dockerfile" },
@{ Name="eshoppayment"; Image="eshop/paymentprocessor"; File="src/Services/Payment/PaymentProcessor/Dockerfile" },
@{ Name="eshopocelotapigw"; Image="eshop/ocelotapigw"; File="src/ApiGateways/ApiGw-Base/Dockerfile" },
@{ Name="eshopmobileshoppingagg"; Image="eshop/mobileshoppingagg"; File="src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile" },
@{ Name="eshopwebshoppingagg"; Image="eshop/webshoppingagg"; File="src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile" },
@{ Name="eshoporderingsignalrhub"; Image="eshop/ordering.signalrhub"; File="src/Services/Ordering/Ordering.SignalrHub/Dockerfile" }
)
$services |% {
$bname = $_.Name
$bimg = $_.Image
$bfile = $_.File
Write-Host "Setting ACR build $bname ($bimg)"
az acr build-task create --registry $acrName --name $bname --image ${bimg}:$gitBranch --context $gitContext --branch $gitBranch --git-access-token $patToken --file $bfile
}
================================================
FILE: build/multiarch-manifests/create-manifests.ps1
================================================
Param(
[parameter(Mandatory=$true)][string]$registry
)
if ([String]::IsNullOrEmpty($registry)) {
Write-Host "Registry must be set to docker registry to use" -ForegroundColor Red
exit 1
}
Write-Host "This script creates the local manifests, for pushing the multi-arch manifests" -ForegroundColor Yellow
Write-Host "Tags used are linux-master, win-master, linux-dev, win-dev, linux-latest, win-latest" -ForegroundColor Yellow
Write-Host "Multiarch images tags will be master, dev, latest" -ForegroundColor Yellow
$services = "identity.api", "basket.api", "catalog.api", "ordering.api", "orderprocessor", "paymentprocessor", "webhooks.api", "ocelotapigw", "mobileshoppingagg", "webshoppingagg", "ordering.signalrhub", "webstatus", "webspa", "webmvc", "webhooks.client"
foreach ($svc in $services) {
Write-Host "Creating manifest for $svc and tags :latest, :master, and :dev"
docker manifest create $registry/${svc}:master $registry/${svc}:linux-master $registry/${svc}:win-master
docker manifest create $registry/${svc}:dev $registry/${svc}:linux-dev $registry/${svc}:win-dev
docker manifest create $registry/${svc}:latest $registry/${svc}:linux-latest $registry/${svc}:win-latest
Write-Host "Pushing manifest for $svc and tags :latest, :master, and :dev"
docker manifest push $registry/${svc}:latest
docker manifest push $registry/${svc}:dev
docker manifest push $registry/${svc}:master
}
================================================
FILE: ci.yml
================================================
# Configure which branches trigger builds
trigger:
batch: true
branches:
include:
- main
variables:
- name: TeamName
value: dotnet-aspire
resources:
repositories:
# Repo: 1ESPipelineTemplates/1ESPipelineTemplates
- repository: 1esPipelines
type: git
name: 1ESPipelineTemplates/1ESPipelineTemplates
ref: refs/tags/release
extends:
template: v1/1ES.Unofficial.PipelineTemplate.yml@1esPipelines
parameters:
sdl:
policheck:
enabled: true
tsa:
enabled: true
pool:
name: NetCore1ESPool-Svc-Internal
image: windows.vs2019.amd64
os: windows
stages:
- stage: buildStage
displayName: Build Stage
jobs:
- job: Build
displayName: Windows Build
timeoutInMinutes: 90
workspace:
clean: all
steps:
- task: UseDotNet@2
inputs:
useGlobalJson: true
- script: dotnet build eShop.Web.slnf
displayName: Build Step
================================================
FILE: e2e/AddItemTest.spec.ts
================================================
import { test, expect } from '@playwright/test';
test('Add item to the cart', async ({ page }) => {
await page.goto('/');
await expect(page.getByRole('heading', { name: 'Ready for a new adventure?' })).toBeVisible();
await page.getByRole('link', { name: 'Adventurer GPS Watch' }).click();
await page.getByRole('button', { name: 'Add to shopping bag' }).click();
await page.getByRole('link', { name: 'shopping bag' }).click();
await page.getByRole('heading', { name: 'Shopping bag' }).click();
await page.getByText('Total').nth(1).click();
await page.getByLabel('product quantity').getByText('1');
await expect.poll(() => page.getByLabel('product quantity').count()).toBeGreaterThan(0);
});
================================================
FILE: e2e/BrowseItemTest.spec.ts
================================================
import { test, expect } from '@playwright/test';
test('Browse Items', async ({ page }) => {
await page.goto('/');
await expect(page.getByRole('heading', { name: 'Ready for a new adventure?' })).toBeVisible();
await page.getByRole('link', { name: 'Adventurer GPS Watch' }).click();
await page.getByRole('heading', { name: 'Adventurer GPS Watch' }).click();
//Expect
await expect(page.getByRole('heading', { name: 'Adventurer GPS Watch' })).toBeVisible();
});
================================================
FILE: e2e/RemoveItemTest.spec.ts
================================================
import { test, expect } from '@playwright/test';
test('Remove item from cart', async ({ page }) => {
await page.goto('/');
await expect(page.getByRole('heading', { name: 'Ready for a new adventure?' })).toBeVisible();
await page.getByRole('link', { name: 'Adventurer GPS Watch' }).click();
await expect(page.getByRole('heading', { name: 'Adventurer GPS Watch' })).toBeVisible();
await page.getByRole('button', { name: 'Add to shopping bag' }).click();
await page.getByRole('link', { name: 'shopping bag' }).click();
await expect(page.getByRole('heading', { name: 'Shopping bag' })).toBeVisible();
await expect.poll(() => page.getByLabel('product quantity').count()).toBeGreaterThan(0);
await page.getByLabel('product quantity').fill('0');
await page.getByRole('button', { name: 'Update' }).click();
await expect(page.getByText('Your shopping bag is empty')).toBeVisible();
});
================================================
FILE: e2e/login.setup.ts
================================================
import { test as setup, expect } from '@playwright/test';
import { STORAGE_STATE } from '../playwright.config';
import { assert } from 'console';
assert(process.env.USERNAME1, 'USERNAME1 is not set');
assert(process.env.PASSWORD, 'PASSWORD is not set');
setup('Login', async ({ page }) => {
await page.goto('/');
await expect(page.getByRole('heading', { name: 'Ready for a new adventure?' })).toBeVisible();
await page.getByLabel('Sign in').click();
await expect(page.getByRole('heading', { name: 'Login' })).toBeVisible();
await page.getByPlaceholder('Username').fill(process.env.USERNAME1!);
await page.getByPlaceholder('Password').fill(process.env.PASSWORD!);
await page.getByRole('button', { name: 'Login' }).click();
await expect(page.getByRole('heading', { name: 'Ready for a new adventure?' })).toBeVisible();
await page.context().storageState({ path: STORAGE_STATE });
})
================================================
FILE: eShop.Web.slnf
================================================
{
"solution": {
"path": "eShop.slnx",
"projects": [
"src\\Basket.API\\Basket.API.csproj",
"src\\Catalog.API\\Catalog.API.csproj",
"src\\EventBusRabbitMQ\\EventBusRabbitMQ.csproj",
"src\\EventBus\\EventBus.csproj",
"src\\Identity.API\\Identity.API.csproj",
"src\\IntegrationEventLogEF\\IntegrationEventLogEF.csproj",
"src\\Ordering.API\\Ordering.API.csproj",
"src\\OrderProcessor\\OrderProcessor.csproj",
"src\\Ordering.Domain\\Ordering.Domain.csproj",
"src\\Ordering.Infrastructure\\Ordering.Infrastructure.csproj",
"src\\PaymentProcessor\\PaymentProcessor.csproj",
"src\\WebAppComponents\\WebAppComponents.csproj",
"src\\WebApp\\WebApp.csproj",
"src\\WebhookClient\\WebhookClient.csproj",
"src\\Webhooks.API\\Webhooks.API.csproj",
"src\\eShop.AppHost\\eShop.AppHost.csproj",
"src\\eShop.ServiceDefaults\\eShop.ServiceDefaults.csproj",
"tests\\Basket.UnitTests\\Basket.UnitTests.csproj",
"tests\\Catalog.FunctionalTests\\Catalog.FunctionalTests.csproj",
"tests\\Ordering.FunctionalTests\\Ordering.FunctionalTests.csproj",
"tests\\Ordering.UnitTests\\Ordering.UnitTests.csproj"
]
}
}
================================================
FILE: eShop.slnx
================================================
<Solution>
<Folder Name="/src/">
<Project Path="src/eShop.AppHost/eShop.AppHost.csproj" />
<Project Path="src/Basket.API/Basket.API.csproj" />
<Project Path="src/Catalog.API/Catalog.API.csproj" />
<Project Path="src/eShop.ServiceDefaults/eShop.ServiceDefaults.csproj" />
<Project Path="src/EventBus/EventBus.csproj" />
<Project Path="src/EventBusRabbitMQ/EventBusRabbitMQ.csproj" />
<Project Path="src/Identity.API/Identity.API.csproj" />
<Project Path="src/IntegrationEventLogEF/IntegrationEventLogEF.csproj" />
<Project Path="src/Ordering.API/Ordering.API.csproj" />
<Project Path="src/OrderProcessor/OrderProcessor.csproj" />
<Project Path="src/Ordering.Domain/Ordering.Domain.csproj" />
<Project Path="src/Ordering.Infrastructure/Ordering.Infrastructure.csproj" />
<Project Path="src/PaymentProcessor/PaymentProcessor.csproj" />
<Project Path="src/WebApp/WebApp.csproj" />
<Project Path="src/WebhookClient/WebhookClient.csproj" />
<Project Path="src/Webhooks.API/Webhooks.API.csproj" />
<Project Path="src/WebAppComponents/WebAppComponents.csproj" />
<Project Path="src/HybridApp/HybridApp.csproj" />
<Project Path="src/ClientApp/ClientApp.csproj" />
</Folder>
<Folder Name="/tests/">
<Project Path="tests/Basket.UnitTests/Basket.UnitTests.csproj" />
<Project Path="tests/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj" />
<Project Path="tests/Ordering.FunctionalTests/Ordering.FunctionalTests.csproj" />
<Project Path="tests/Ordering.UnitTests/Ordering.UnitTests.csproj" />
<Project Path="tests/ClientApp.UnitTests/ClientApp.UnitTests.csproj" />
</Folder>
<Folder Name="/Solution Items/">
<File Path=".editorconfig" />
<File Path="Directory.Packages.props" />
<File Path="NuGet.config" />
<File Path="README.md" />
</Folder>
</Solution>
================================================
FILE: es-metadata.yml
================================================
schemaVersion: 0.0.1
isProduction: true
accountableOwners:
service: 4db45fa9-fb0f-43ce-b523-ad1da773dfbc
routing:
defaultAreaPath:
org: devdiv
path: DevDiv\ASP.NET Core
================================================
FILE: global.json
================================================
{
"sdk": {
"version": "10.0.100",
"rollForward": "latestFeature",
"allowPrerelease": true
},
"test": {
"runner": "Microsoft.Testing.Platform"
},
"msbuild-sdks": {
"MSTest.Sdk": "4.0.2"
}
}
================================================
FILE: nuget.config
================================================
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<!--To inherit the global NuGet package sources remove the <clear/> line below -->
<clear />
<add key="nuget" value="https://api.nuget.org/v3/index.json" />
</packageSources>
<packageSourceMapping>
<!-- key value for <packageSource> should match key values from <packageSources> element -->
<clear />
<packageSource key="nuget">
<package pattern="*" />
</packageSource>
</packageSourceMapping>
</configuration>
================================================
FILE: package.json
================================================
{
"name": "eshop",
"version": "1.0.0",
"description": "A reference .NET application implementing an eCommerce web site using a services-based architecture.",
"directories": {
"test": "tests"
},
"scripts": {},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@playwright/test": "^1.42.1",
"@types/node": "^20.11.25",
"dotenv": "^16.4.5"
}
}
================================================
FILE: playwright.config.ts
================================================
import { defineConfig, devices } from '@playwright/test';
require("dotenv").config({ path: "./.env" });
import path from 'path';
export const STORAGE_STATE = path.join(__dirname, 'playwright/.auth/user.json');
/**
* See https://playwright.dev/docs/test-configuration.
*/
export default defineConfig({
testDir: './e2e',
/* Run tests in files in parallel */
fullyParallel: true,
/* Fail the build on CI if you accidentally left test.only in the source code. */
forbidOnly: !!process.env.CI,
/* Retry on CI only */
retries: process.env.CI ? 2 : 0,
/* Opt out of parallel tests on CI. */
workers: process.env.CI ? 1 : undefined,
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
reporter: 'html',
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {
/* Base URL to use in actions like `await page.goto('/')`. */
baseURL: 'http://localhost:5045',
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: 'on-first-retry',
...devices['Desktop Chrome'],
},
/* Configure projects for major browsers */
projects: [
{
name: 'setup',
testMatch: '**/*.setup.ts',
},
{
name: 'e2e tests logged in',
testMatch: ['**/AddItemTest.spec.ts', '**/RemoveItemTest.spec.ts'],
dependencies: ['setup'],
use: {
storageState: STORAGE_STATE,
},
},
{
name: 'e2e tests without logged in',
testMatch: ['**/BrowseItemTest.spec.ts'],
}
// {
// name: 'chromium',
// use: { ...devices['Desktop Chrome'] },
// },
// {
// name: 'firefox',
// use: { ...devices['Desktop Firefox'] },
// },
// {
// name: 'webkit',
// use: { ...devices['Desktop Safari'] },
// },
/* Test against mobile viewports. */
// {
// name: 'Mobile Chrome',
// use: { ...devices['Pixel 5'] },
// },
// {
// name: 'Mobile Safari',
// use: { ...devices['iPhone 12'] },
// },
/* Test against branded browsers. */
// {
// name: 'Microsoft Edge',
// use: { ...devices['Desktop Edge'], channel: 'msedge' },
// },
// {
// name: 'Google Chrome',
// use: { ...devices['Desktop Chrome'], channel: 'chrome' },
// },
],
/* Run your local dev server before starting the tests */
webServer: {
command: 'dotnet run --project src/eShop.AppHost/eShop.AppHost.csproj',
url: 'http://localhost:5045',
reuseExistingServer: !process.env.CI,
stderr: 'pipe',
stdout: 'pipe',
timeout: process.env.CI ? (5 * 60_000) : 60_000,
},
});
================================================
FILE: src/Basket.API/Basket.API.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<UserSecretsId>2964ec8e-0d48-4541-b305-94cab537f867</UserSecretsId>
<PublishAot Condition="'$(EnableAotPublishing)' == 'true'">true</PublishAot>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Aspire.StackExchange.Redis" />
<PackageReference Include="Grpc.AspNetCore" />
</ItemGroup>
<ItemGroup>
<Protobuf Include="Proto\basket.proto" GrpcServices="Server" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\eShop.ServiceDefaults\eShop.ServiceDefaults.csproj" />
<ProjectReference Include="..\EventBusRabbitMQ\EventBusRabbitMQ.csproj" />
</ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="Basket.FunctionalTests" />
</ItemGroup>
</Project>
================================================
FILE: src/Basket.API/Extensions/Extensions.cs
================================================
using System.Text.Json.Serialization;
using eShop.Basket.API.Repositories;
using eShop.Basket.API.IntegrationEvents.EventHandling;
using eShop.Basket.API.IntegrationEvents.EventHandling.Events;
namespace eShop.Basket.API.Extensions;
public static class Extensions
{
public static void AddApplicationServices(this IHostApplicationBuilder builder)
{
builder.AddDefaultAuthentication();
builder.AddRedisClient("redis");
builder.Services.AddSingleton<IBasketRepository, RedisBasketRepository>();
builder.AddRabbitMqEventBus("eventbus")
.AddSubscription<OrderStartedIntegrationEvent, OrderStartedIntegrationEventHandler>()
.ConfigureJsonOptions(options => options.TypeInfoResolverChain.Add(IntegrationEventContext.Default));
}
}
[JsonSerializable(typeof(OrderStartedIntegrationEvent))]
partial class IntegrationEventContext : JsonSerializerContext
{
}
================================================
FILE: src/Basket.API/Extensions/ServerCallContextIdentityExtensions.cs
================================================
#nullable enable
namespace eShop.Basket.API.Extensions;
internal static class ServerCallContextIdentityExtensions
{
public static string? GetUserIdentity(this ServerCallContext context) => context.GetHttpContext().User.FindFirst("sub")?.Value;
public static string? GetUserName(this ServerCallContext context) => context.GetHttpContext().User.FindFirst(x => x.Type == ClaimTypes.Name)?.Value;
}
================================================
FILE: src/Basket.API/GlobalUsings.cs
================================================
global using System.ComponentModel.DataAnnotations;
global using System.Security.Claims;
global using System.Text.Json;
global using Grpc.Core;
global using Microsoft.AspNetCore.Authorization;
global using eShop.Basket.API.Extensions;
global using eShop.Basket.API.Grpc;
global using eShop.EventBus.Abstractions;
global using eShop.EventBus.Events;
global using eShop.ServiceDefaults;
global using StackExchange.Redis;
================================================
FILE: src/Basket.API/Grpc/BasketService.cs
================================================
using System.Diagnostics.CodeAnalysis;
using eShop.Basket.API.Repositories;
using eShop.Basket.API.Extensions;
using eShop.Basket.API.Model;
namespace eShop.Basket.API.Grpc;
public class BasketService(
IBasketRepository repository,
ILogger<BasketService> logger) : Basket.BasketBase
{
[AllowAnonymous]
public override async Task<CustomerBasketResponse> GetBasket(GetBasketRequest request, ServerCallContext context)
{
var userId = context.GetUserIdentity();
if (string.IsNullOrEmpty(userId))
{
return new();
}
if (logger.IsEnabled(LogLevel.Debug))
{
logger.LogDebug("Begin GetBasketById call from method {Method} for basket id {Id}", context.Method, userId);
}
var data = await repository.GetBasketAsync(userId);
if (data is not null)
{
return MapToCustomerBasketResponse(data);
}
return new();
}
public override async Task<CustomerBasketResponse> UpdateBasket(UpdateBasketRequest request, ServerCallContext context)
{
var userId = context.GetUserIdentity();
if (string.IsNullOrEmpty(userId))
{
ThrowNotAuthenticated();
}
if (logger.IsEnabled(LogLevel.Debug))
{
logger.LogDebug("Begin UpdateBasket call from method {Method} for basket id {Id}", context.Method, userId);
}
var customerBasket = MapToCustomerBasket(userId, request);
var response = await repository.UpdateBasketAsync(customerBasket);
if (response is null)
{
ThrowBasketDoesNotExist(userId);
}
return MapToCustomerBasketResponse(response);
}
public override async Task<DeleteBasketResponse> DeleteBasket(DeleteBasketRequest request, ServerCallContext context)
{
var userId = context.GetUserIdentity();
if (string.IsNullOrEmpty(userId))
{
ThrowNotAuthenticated();
}
await repository.DeleteBasketAsync(userId);
return new();
}
[DoesNotReturn]
private static void ThrowNotAuthenticated() => throw new RpcException(new Status(StatusCode.Unauthenticated, "The caller is not authenticated."));
[DoesNotReturn]
private static void ThrowBasketDoesNotExist(string userId) => throw new RpcException(new Status(StatusCode.NotFound, $"Basket with buyer id {userId} does not exist"));
private static CustomerBasketResponse MapToCustomerBasketResponse(CustomerBasket customerBasket)
{
var response = new CustomerBasketResponse();
foreach (var item in customerBasket.Items)
{
response.Items.Add(new BasketItem()
{
ProductId = item.ProductId,
Quantity = item.Quantity,
});
}
return response;
}
private static CustomerBasket MapToCustomerBasket(string userId, UpdateBasketRequest customerBasketRequest)
{
var response = new CustomerBasket
{
BuyerId = userId
};
foreach (var item in customerBasketRequest.Items)
{
response.Items.Add(new()
{
ProductId = item.ProductId,
Quantity = item.Quantity,
});
}
return response;
}
}
================================================
FILE: src/Basket.API/IntegrationEvents/EventHandling/OrderStartedIntegrationEventHandler.cs
================================================
using eShop.Basket.API.Repositories;
using eShop.Basket.API.IntegrationEvents.EventHandling.Events;
namespace eShop.Basket.API.IntegrationEvents.EventHandling;
public class OrderStartedIntegrationEventHandler(
IBasketRepository repository,
ILogger<OrderStartedIntegrationEventHandler> logger) : IIntegrationEventHandler<OrderStartedIntegrationEvent>
{
public async Task Handle(OrderStartedIntegrationEvent @event)
{
logger.LogInformation("Handling integration event: {IntegrationEventId} - ({@IntegrationEvent})", @event.Id, @event);
await repository.DeleteBasketAsync(@event.UserId);
}
}
================================================
FILE: src/Basket.API/IntegrationEvents/Events/OrderStartedIntegrationEvent.cs
================================================
namespace eShop.Basket.API.IntegrationEvents.EventHandling.Events;
// Integration Events notes:
// An Event is "something that has happened in the past", therefore its name has to be
// An Integration Event is an event that can cause side effects to other microservices, Bounded-Contexts or external systems.
public record OrderStartedIntegrationEvent(string UserId) : IntegrationEvent;
================================================
FILE: src/Basket.API/Model/BasketItem.cs
================================================
namespace eShop.Basket.API.Model;
public class BasketItem : IValidatableObject
{
public string Id { get; set; }
public int ProductId { get; set; }
public string ProductName { get; set; }
public decimal UnitPrice { get; set; }
public decimal OldUnitPrice { get; set; }
public int Quantity { get; set; }
public string PictureUrl { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
if (Quantity < 1)
{
results.Add(new ValidationResult("Invalid number of units", new[] { "Quantity" }));
}
return results;
}
}
================================================
FILE: src/Basket.API/Model/CustomerBasket.cs
================================================
namespace eShop.Basket.API.Model;
public class CustomerBasket
{
public string BuyerId { get; set; }
public List<BasketItem> Items { get; set; } = [];
public CustomerBasket() { }
public CustomerBasket(string customerId)
{
BuyerId = customerId;
}
}
================================================
FILE: src/Basket.API/Program.cs
================================================
var builder = WebApplication.CreateBuilder(args);
builder.AddBasicServiceDefaults();
builder.AddApplicationServices();
builder.Services.AddGrpc();
var app = builder.Build();
app.MapDefaultEndpoints();
app.MapGrpcService<BasketService>();
app.Run();
================================================
FILE: src/Basket.API/Properties/launchSettings.json
================================================
{
"profiles": {
"http": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "http://localhost:5221",
"environmentVariables": {
"Identity__Url": "http://localhost:5223",
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
================================================
FILE: src/Basket.API/Proto/basket.proto
================================================
syntax = "proto3";
option csharp_namespace = "eShop.Basket.API.Grpc";
package BasketApi;
service Basket {
rpc GetBasket(GetBasketRequest) returns (CustomerBasketResponse) {}
rpc UpdateBasket(UpdateBasketRequest) returns (CustomerBasketResponse) {}
rpc DeleteBasket(DeleteBasketRequest) returns (DeleteBasketResponse) {}
}
message GetBasketRequest {
}
message CustomerBasketResponse {
repeated BasketItem items = 1;
}
message BasketItem {
int32 product_id = 2;
int32 quantity = 6;
}
message UpdateBasketRequest {
repeated BasketItem items = 2;
}
message DeleteBasketRequest {
}
message DeleteBasketResponse {
}
================================================
FILE: src/Basket.API/Repositories/IBasketRepository.cs
================================================
using eShop.Basket.API.Model;
namespace eShop.Basket.API.Repositories;
public interface IBasketRepository
{
Task<CustomerBasket> GetBasketAsync(string customerId);
Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket);
Task<bool> DeleteBasketAsync(string id);
}
================================================
FILE: src/Basket.API/Repositories/RedisBasketRepository.cs
================================================
using System.Text.Json.Serialization;
using eShop.Basket.API.Model;
namespace eShop.Basket.API.Repositories;
public class RedisBasketRepository(ILogger<RedisBasketRepository> logger, IConnectionMultiplexer redis) : IBasketRepository
{
private readonly IDatabase _database = redis.GetDatabase();
// implementation:
// - /basket/{id} "string" per unique basket
private static RedisKey BasketKeyPrefix = "/basket/"u8.ToArray();
// note on UTF8 here: library limitation (to be fixed) - prefixes are more efficient as blobs
private static RedisKey GetBasketKey(string userId) => BasketKeyPrefix.Append(userId);
public async Task<bool> DeleteBasketAsync(string id)
{
return await _database.KeyDeleteAsync(GetBasketKey(id));
}
public async Task<CustomerBasket> GetBasketAsync(string customerId)
{
using var data = await _database.StringGetLeaseAsync(GetBasketKey(customerId));
if (data is null || data.Length == 0)
{
return null;
}
return JsonSerializer.Deserialize(data.Span, BasketSerializationContext.Default.CustomerBasket);
}
public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket)
{
var json = JsonSerializer.SerializeToUtf8Bytes(basket, BasketSerializationContext.Default.CustomerBasket);
var created = await _database.StringSetAsync(GetBasketKey(basket.BuyerId), json);
if (!created)
{
logger.LogInformation("Problem occurred persisting the item.");
return null;
}
logger.LogInformation("Basket item persisted successfully.");
return await GetBasketAsync(basket.BuyerId);
}
}
[JsonSerializable(typeof(CustomerBasket))]
[JsonSourceGenerationOptions(PropertyNameCaseInsensitive = true)]
public partial class BasketSerializationContext : JsonSerializerContext
{
}
================================================
FILE: src/Basket.API/appsettings.Development.json
================================================
{
}
================================================
FILE: src/Basket.API/appsettings.json
================================================
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
},
"ConnectionStrings": {
"Redis": "localhost",
"EventBus": "amqp://localhost"
},
"Identity": {
"Audience": "basket"
},
"EventBus": {
"SubscriptionClientName": "Basket"
}
}
================================================
FILE: src/Catalog.API/Apis/CatalogApi.cs
================================================
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Pgvector.EntityFrameworkCore;
namespace eShop.Catalog.API;
public static class CatalogApi
{
public static IEndpointRouteBuilder MapCatalogApi(this IEndpointRouteBuilder app)
{
// RouteGroupBuilder for catalog endpoints
var vApi = app.NewVersionedApi("Catalog");
var api = vApi.MapGroup("api/catalog").HasApiVersion(1, 0).HasApiVersion(2, 0);
var v1 = vApi.MapGroup("api/catalog").HasApiVersion(1, 0);
var v2 = vApi.MapGroup("api/catalog").HasApiVersion(2, 0);
// Routes for querying catalog items.
v1.MapGet("/items", GetAllItemsV1)
.WithName("ListItems")
.WithSummary("List catalog items")
.WithDescription("Get a paginated list of items in the catalog.")
.WithTags("Items");
v2.MapGet("/items", GetAllItems)
.WithName("ListItems-V2")
.WithSummary("List catalog items")
.WithDescription("Get a paginated list of items in the catalog.")
.WithTags("Items");
api.MapGet("/items/by", GetItemsByIds)
.WithName("BatchGetItems")
.WithSummary("Batch get catalog items")
.WithDescription("Get multiple items from the catalog")
.WithTags("Items");
api.MapGet("/items/{id:int}", GetItemById)
.WithName("GetItem")
.WithSummary("Get catalog item")
.WithDescription("Get an item from the catalog")
.WithTags("Items");
v1.MapGet("/items/by/{name:minlength(1)}", GetItemsByName)
.WithName("GetItemsByName")
.WithSummary("Get catalog items by name")
.WithDescription("Get a paginated list of catalog items with the specified name.")
.WithTags("Items");
api.MapGet("/items/{id:int}/pic", GetItemPictureById)
.WithName("GetItemPicture")
.WithSummary("Get catalog item picture")
.WithDescription("Get the picture for a catalog item")
.WithTags("Items");
// Routes for resolving catalog items using AI.
v1.MapGet("/items/withsemanticrelevance/{text:minlength(1)}", GetItemsBySemanticRelevanceV1)
.WithName("GetRelevantItems")
.WithSummary("Search catalog for relevant items")
.WithDescription("Search the catalog for items related to the specified text")
.WithTags("Search");
// Routes for resolving catalog items using AI.
v2.MapGet("/items/withsemanticrelevance", GetItemsBySemanticRelevance)
.WithName("GetRelevantItems-V2")
.WithSummary("Search catalog for relevant items")
.WithDescription("Search the catalog for items related to the specified text")
.WithTags("Search");
// Routes for resolving catalog items by type and brand.
v1.MapGet("/items/type/{typeId}/brand/{brandId?}", GetItemsByBrandAndTypeId)
.WithName("GetItemsByTypeAndBrand")
.WithSummary("Get catalog items by type and brand")
.WithDescription("Get catalog items of the specified type and brand")
.WithTags("Types");
v1.MapGet("/items/type/all/brand/{brandId:int?}", GetItemsByBrandId)
.WithName("GetItemsByBrand")
.WithSummary("List catalog items by brand")
.WithDescription("Get a list of catalog items for the specified brand")
.WithTags("Brands");
api.MapGet("/catalogtypes",
[ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest, "application/problem+json")]
async (CatalogContext context) => await context.CatalogTypes.OrderBy(x => x.Type).ToListAsync())
.WithName("ListItemTypes")
.WithSummary("List catalog item types")
.WithDescription("Get a list of the types of catalog items")
.WithTags("Types");
api.MapGet("/catalogbrands",
[ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest, "application/problem+json")]
async (CatalogContext context) => await context.CatalogBrands.OrderBy(x => x.Brand).ToListAsync())
.WithName("ListItemBrands")
.WithSummary("List catalog item brands")
.WithDescription("Get a list of the brands of catalog items")
.WithTags("Brands");
// Routes for modifying catalog items.
v1.MapPut("/items", UpdateItemV1)
.WithName("UpdateItem")
.WithSummary("Create or replace a catalog item")
.WithDescription("Create or replace a catalog item")
.WithTags("Items");
v2.MapPut("/items/{id:int}", UpdateItem)
.WithName("UpdateItem-V2")
.WithSummary("Create or replace a catalog item")
.WithDescription("Create or replace a catalog item")
.WithTags("Items");
api.MapPost("/items", CreateItem)
.WithName("CreateItem")
.WithSummary("Create a catalog item")
.WithDescription("Create a new item in the catalog");
api.MapDelete("/items/{id:int}", DeleteItemById)
.WithName("DeleteItem")
.WithSummary("Delete catalog item")
.WithDescription("Delete the specified catalog item");
return app;
}
[ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest, "application/problem+json")]
public static async Task<Ok<PaginatedItems<CatalogItem>>> GetAllItemsV1(
[AsParameters] PaginationRequest paginationRequest,
[AsParameters] CatalogServices services)
{
return await GetAllItems(paginationRequest, services, null, null, null);
}
[ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest, "application/problem+json")]
public static async Task<Ok<PaginatedItems<CatalogItem>>> GetAllItems(
[AsParameters] PaginationRequest paginationRequest,
[AsParameters] CatalogServices services,
[Description("The name of the item to return")] string? name,
[Description("The type of items to return")] int? type,
[Description("The brand of items to return")] int? brand)
{
var pageSize = paginationRequest.PageSize;
var pageIndex = paginationRequest.PageIndex;
var root = (IQueryable<CatalogItem>)services.Context.CatalogItems;
if (name is not null)
{
root = root.Where(c => c.Name.StartsWith(name));
}
if (type is not null)
{
root = root.Where(c => c.CatalogTypeId == type);
}
if (brand is not null)
{
root = root.Where(c => c.CatalogBrandId == brand);
}
var totalItems = await root
.LongCountAsync();
var itemsOnPage = await root
.OrderBy(c => c.Name)
.Skip(pageSize * pageIndex)
.Take(pageSize)
.ToListAsync();
return TypedResults.Ok(new PaginatedItems<CatalogItem>(pageIndex, pageSize, totalItems, itemsOnPage));
}
[ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest, "application/problem+json")]
public static async Task<Ok<List<CatalogItem>>> GetItemsByIds(
[AsParameters] CatalogServices services,
[Description("List of ids for catalog items to return")] int[] ids)
{
var items = await services.Context.CatalogItems.Where(item => ids.Contains(item.Id)).ToListAsync();
return TypedResults.Ok(items);
}
[ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest, "application/problem+json")]
public static async Task<Results<Ok<CatalogItem>, NotFound, BadRequest<ProblemDetails>>> GetItemById(
HttpContext httpContext,
[AsParameters] CatalogServices services,
[Description("The catalog item id")] int id)
{
if (id <= 0)
{
return TypedResults.BadRequest<ProblemDetails>(new (){
Detail = "Id is not valid"
});
}
var item = await services.Context.CatalogItems.Include(ci => ci.CatalogBrand).SingleOrDefaultAsync(ci => ci.Id == id);
if (item == null)
{
return TypedResults.NotFound();
}
return TypedResults.Ok(item);
}
[ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest, "application/problem+json")]
public static async Task<Ok<PaginatedItems<CatalogItem>>> GetItemsByName(
[AsParameters] PaginationRequest paginationRequest,
[AsParameters] CatalogServices services,
[Description("The name of the item to return")] string name)
{
return await GetAllItems(paginationRequest, services, name, null, null);
}
[ProducesResponseType<byte[]>(StatusCodes.Status200OK, "application/octet-stream",
[ "image/png", "image/gif", "image/jpeg", "image/bmp", "image/tiff",
"image/wmf", "image/jp2", "image/svg+xml", "image/webp" ])]
public static async Task<Results<PhysicalFileHttpResult,NotFound>> GetItemPictureById(
CatalogContext context,
IWebHostEnvironment environment,
[Description("The catalog item id")] int id)
{
var item = await context.CatalogItems.FindAsync(id);
if (item is null || item.PictureFileName is null)
{
return TypedResults.NotFound();
}
var path = GetFullPath(environment.ContentRootPath, item.PictureFileName);
string imageFileExtension = Path.GetExtension(item.PictureFileName) ?? string.Empty;
string mimetype = GetImageMimeTypeFromImageFileExtension(imageFileExtension);
DateTime lastModified = File.GetLastWriteTimeUtc(path);
return TypedResults.PhysicalFile(path, mimetype, lastModified: lastModified);
}
[ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest, "application/problem+json")]
public static async Task<Results<Ok<PaginatedItems<CatalogItem>>, RedirectToRouteHttpResult>> GetItemsBySemanticRelevanceV1(
[AsParameters] PaginationRequest paginationRequest,
[AsParameters] CatalogServices services,
[Description("The text string to use when search for related items in the catalog")] string text)
{
return await GetItemsBySemanticRelevance(paginationRequest, services, text);
}
[ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest, "application/problem+json")]
public static async Task<Results<Ok<PaginatedItems<CatalogItem>>, RedirectToRouteHttpResult>> GetItemsBySemanticRelevance(
[AsParameters] PaginationRequest paginationRequest,
[AsParameters] CatalogServices services,
[Description("The text string to use when search for related items in the catalog"), Required, MinLength(1)] string text)
{
var pageSize = paginationRequest.PageSize;
var pageIndex = paginationRequest.PageIndex;
if (!services.CatalogAI.IsEnabled)
{
return await GetItemsByName(paginationRequest, services, text);
}
// Create an embedding for the input search
var vector = await services.CatalogAI.GetEmbeddingAsync(text);
if (vector is null)
{
return await GetItemsByName(paginationRequest, services, text);
}
// Get the total number of items
var totalItems = await services.Context.CatalogItems
.LongCountAsync();
// Get the next page of items, ordered by most similar (smallest distance) to the input search
List<CatalogItem> itemsOnPage;
if (services.Logger.IsEnabled(LogLevel.Debug))
{
var itemsWithDistance = await services.Context.CatalogItems
.Where(c => c.Embedding != null)
.Select(c => new { Item = c, Distance = c.Embedding!.CosineDistance(vector) })
.OrderBy(c => c.Distance)
.Skip(pageSize * pageIndex)
.Take(pageSize)
.ToListAsync();
services.Logger.LogDebug("Results from {text}: {results}", text, string.Join(", ", itemsWithDistance.Select(i => $"{i.Item.Name} => {i.Distance}")));
itemsOnPage = itemsWithDistance.Select(i => i.Item).ToList();
}
else
{
itemsOnPage = await services.Context.CatalogItems
.Where(c => c.Embedding != null)
.OrderBy(c => c.Embedding!.CosineDistance(vector))
.Skip(pageSize * pageIndex)
.Take(pageSize)
.ToListAsync();
}
return TypedResults.Ok(new PaginatedItems<CatalogItem>(pageIndex, pageSize, totalItems, itemsOnPage));
}
[ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest, "application/problem+json")]
public static async Task<Ok<PaginatedItems<CatalogItem>>> GetItemsByBrandAndTypeId(
[AsParameters] PaginationRequest paginationRequest,
[AsParameters] CatalogServices services,
[Description("The type of items to return")] int typeId,
[Description("The brand of items to return")] int? brandId)
{
return await GetAllItems(paginationRequest, services, null, typeId, brandId);
}
[ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest, "application/problem+json")]
public static async Task<Ok<PaginatedItems<CatalogItem>>> GetItemsByBrandId(
[AsParameters] PaginationRequest paginationRequest,
[AsParameters] CatalogServices services,
[Description("The brand of items to return")] int? brandId)
{
return await GetAllItems(paginationRequest, services, null, null, brandId);
}
public static async Task<Results<Created, BadRequest<ProblemDetails>, NotFound<ProblemDetails>>> UpdateItemV1(
HttpContext httpContext,
[AsParameters] CatalogServices services,
CatalogItem productToUpdate)
{
if (productToUpdate?.Id == null)
{
return TypedResults.BadRequest<ProblemDetails>(new (){
Detail = "Item id must be provided in the request body."
});
}
return await UpdateItem(httpContext, productToUpdate.Id, services, productToUpdate);
}
public static async Task<Results<Created, BadRequest<ProblemDetails>, NotFound<ProblemDetails>>> UpdateItem(
HttpContext httpContext,
[Description("The id of the catalog item to delete")] int id,
[AsParameters] CatalogServices services,
CatalogItem productToUpdate)
{
var catalogItem = await services.Context.CatalogItems.SingleOrDefaultAsync(i => i.Id == id);
if (catalogItem == null)
{
return TypedResults.NotFound<ProblemDetails>(new (){
Detail = $"Item with id {id} not found."
});
}
// Update current product
var catalogEntry = services.Context.Entry(catalogItem);
catalogEntry.CurrentValues.SetValues(productToUpdate);
catalogItem.Embedding = await services.CatalogAI.GetEmbeddingAsync(catalogItem);
var priceEntry = catalogEntry.Property(i => i.Price);
if (priceEntry.IsModified) // Save product's data and publish integration event through the Event Bus if price has changed
{
//Create Integration Event to be published through the Event Bus
var priceChangedEvent = new ProductPriceChangedIntegrationEvent(catalogItem.Id, productToUpdate.Price, priceEntry.OriginalValue);
// Achieving atomicity between original Catalog database operation and the IntegrationEventLog thanks to a local transaction
await services.EventService.SaveEventAndCatalogContextChangesAsync(priceChangedEvent);
// Publish through the Event Bus and mark the saved event as published
await services.EventService.PublishThroughEventBusAsync(priceChangedEvent);
}
else // Just save the updated product because the Product's Price hasn't changed.
{
await services.Context.SaveChangesAsync();
}
return TypedResults.Created($"/api/catalog/items/{id}");
}
[ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest, "application/problem+json")]
public static async Task<Created> CreateItem(
[AsParameters] CatalogServices services,
CatalogItem product)
{
var item = new CatalogItem(product.Name)
{
Id = product.Id,
CatalogBrandId = product.CatalogBrandId,
CatalogTypeId = product.CatalogTypeId,
Description = product.Description,
PictureFileName = product.PictureFileName,
Price = product.Price,
AvailableStock = product.AvailableStock,
RestockThreshold = product.RestockThreshold,
MaxStockThreshold = product.MaxStockThreshold
};
item.Embedding = await services.CatalogAI.GetEmbeddingAsync(item);
services.Context.CatalogItems.Add(item);
await services.Context.SaveChangesAsync();
return TypedResults.Created($"/api/catalog/items/{item.Id}");
}
public static async Task<Results<NoContent, NotFound>> DeleteItemById(
[AsParameters] CatalogServices services,
[Description("The id of the catalog item to delete")] int id)
{
var item = services.Context.CatalogItems.SingleOrDefault(x => x.Id == id);
if (item is null)
{
return TypedResults.NotFound();
}
services.Context.CatalogItems.Remove(item);
await services.Context.SaveChangesAsync();
return TypedResults.NoContent();
}
private static string GetImageMimeTypeFromImageFileExtension(string extension) => extension switch
{
".png" => "image/png",
".gif" => "image/gif",
".jpg" or ".jpeg" => "image/jpeg",
".bmp" => "image/bmp",
".tiff" => "image/tiff",
".wmf" => "image/wmf",
".jp2" => "image/jp2",
".svg" => "image/svg+xml",
".webp" => "image/webp",
_ => "application/octet-stream",
};
public static string GetFullPath(string contentRootPath, string pictureFileName) =>
Path.Combine(contentRootPath, "Pics", pictureFileName);
}
================================================
FILE: src/Catalog.API/Catalog.API.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<UserSecretsId>d1b521ec-3411-4d39-98c6-8509466ed471</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<Compile Include="..\Shared\ActivityExtensions.cs" Link="Extensions\ActivityExtensions.cs" />
<Compile Include="..\Shared\MigrateDbContextExtensions.cs" Link="Extensions\MigrateDbContextExtensions.cs" />
</ItemGroup>
<PropertyGroup>
<OpenApiDocumentsDirectory>$(MSBuildProjectDirectory)</OpenApiDocumentsDirectory>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Asp.Versioning.Http" />
<PackageReference Include="Aspire.Npgsql.EntityFrameworkCore.PostgreSQL" />
<PackageReference Include="CommunityToolkit.Aspire.OllamaSharp" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.ApiDescription.Server">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<!-- AI -->
<ItemGroup>
<PackageReference Include="Aspire.Azure.AI.OpenAI" />
<PackageReference Include="Pgvector" />
<PackageReference Include="Pgvector.EntityFrameworkCore" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\EventBusRabbitMQ\EventBusRabbitMQ.csproj" />
<ProjectReference Include="..\IntegrationEventLogEF\IntegrationEventLogEF.csproj" />
<ProjectReference Include="..\eShop.ServiceDefaults\eShop.ServiceDefaults.csproj" />
</ItemGroup>
<ItemGroup>
<Content Include="Pics\*.webp" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="Catalog.FunctionalTests" />
</ItemGroup>
</Project>
================================================
FILE: src/Catalog.API/Catalog.API.http
================================================
@Catalog.API_HostAddress = http://localhost:5222
@ApiVersion = 1.0
GET {{Catalog.API_HostAddress}}/openapi/v1.json
###
GET {{Catalog.API_HostAddress}}/api/catalog/items?api-version={{ApiVersion}}
###
GET {{Catalog.API_HostAddress}}/api/catalog/items/type/1/brand/2?api-version={{ApiVersion}}
###
# A request with an unknown API version returns a 400 ProblemDetails response
GET {{Catalog.API_HostAddress}}/api/catalog/items/463/pic?api-version=99
###
# A request with an unknown item id returns a 404 NotFound with empty response body
GET {{Catalog.API_HostAddress}}/api/catalog/items/463/pic?api-version={{ApiVersion}}
###
PUT {{Catalog.API_HostAddress}}/api/catalog/items?api-version={{ApiVersion}}
content-type: application/json
{
"id": 999,
"name": "Item1",
"price": 100,
"description": "Description1",
"pictureFileName": "item1.png",
"catalogTypeId": 1,
"catalogBrandId": 2
}
================================================
FILE: src/Catalog.API/Catalog.API.json
================================================
{
"openapi": "3.1.1",
"info": {
"title": "eShop - Catalog HTTP API",
"description": "The Catalog Microservice HTTP API. This is a Data-Driven/CRUD microservice sample",
"version": "1.0"
},
"paths": {
"/api/catalog/items/by": {
"get": {
"tags": [
"Items"
],
"summary": "Batch get catalog items",
"description": "Get multiple items from the catalog",
"operationId": "BatchGetItems",
"parameters": [
{
"name": "ids",
"in": "query",
"description": "List of ids for catalog items to return",
"required": true,
"schema": {
"type": "array",
"items": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
}
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "1.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CatalogItem"
}
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
}
},
"/api/catalog/items/{id}": {
"get": {
"tags": [
"Items"
],
"summary": "Get catalog item",
"description": "Get an item from the catalog",
"operationId": "GetItem",
"parameters": [
{
"name": "id",
"in": "path",
"description": "The catalog item id",
"required": true,
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": "integer",
"format": "int32"
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "1.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CatalogItem"
}
}
}
},
"404": {
"description": "Not Found"
},
"400": {
"description": "Bad Request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
},
"delete": {
"tags": [
"Catalog"
],
"summary": "Delete catalog item",
"description": "Delete the specified catalog item",
"operationId": "DeleteItem",
"parameters": [
{
"name": "id",
"in": "path",
"description": "The id of the catalog item to delete",
"required": true,
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": "integer",
"format": "int32"
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "1.0"
}
}
],
"responses": {
"204": {
"description": "No Content"
},
"404": {
"description": "Not Found"
}
}
}
},
"/api/catalog/items/{id}/pic": {
"get": {
"tags": [
"Items"
],
"summary": "Get catalog item picture",
"description": "Get the picture for a catalog item",
"operationId": "GetItemPicture",
"parameters": [
{
"name": "id",
"in": "path",
"description": "The catalog item id",
"required": true,
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": "integer",
"format": "int32"
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "1.0"
}
}
],
"responses": {
"404": {
"description": "Not Found"
},
"200": {
"description": "OK",
"content": {
"application/octet-stream": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/png": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/gif": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/jpeg": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/bmp": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/tiff": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/wmf": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/jp2": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/svg+xml": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/webp": {
"schema": {
"type": "string",
"format": "byte"
}
}
}
}
}
}
},
"/api/catalog/catalogtypes": {
"get": {
"tags": [
"Types"
],
"summary": "List catalog item types",
"description": "Get a list of the types of catalog items",
"operationId": "ListItemTypes",
"parameters": [
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "1.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CatalogType"
}
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
}
},
"/api/catalog/catalogbrands": {
"get": {
"tags": [
"Brands"
],
"summary": "List catalog item brands",
"description": "Get a list of the brands of catalog items",
"operationId": "ListItemBrands",
"parameters": [
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "1.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CatalogBrand"
}
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
}
},
"/api/catalog/items": {
"post": {
"tags": [
"Catalog"
],
"summary": "Create a catalog item",
"description": "Create a new item in the catalog",
"operationId": "CreateItem",
"parameters": [
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "1.0"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CatalogItem"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Created"
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
},
"get": {
"tags": [
"Items"
],
"summary": "List catalog items",
"description": "Get a paginated list of items in the catalog.",
"operationId": "ListItems",
"parameters": [
{
"name": "PageSize",
"in": "query",
"description": "Number of items to return in a single page of results",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32",
"default": 10
}
},
{
"name": "PageIndex",
"in": "query",
"description": "The index of the page of results to return",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32",
"default": 0
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "1.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PaginatedItemsOfCatalogItem"
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
},
"put": {
"tags": [
"Items"
],
"summary": "Create or replace a catalog item",
"description": "Create or replace a catalog item",
"operationId": "UpdateItem",
"parameters": [
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "1.0"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CatalogItem"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Created"
},
"400": {
"description": "Bad Request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"404": {
"description": "Not Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
}
},
"/api/catalog/items/by/{name}": {
"get": {
"tags": [
"Items"
],
"summary": "Get catalog items by name",
"description": "Get a paginated list of catalog items with the specified name.",
"operationId": "GetItemsByName",
"parameters": [
{
"name": "PageSize",
"in": "query",
"description": "Number of items to return in a single page of results",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32",
"default": 10
}
},
{
"name": "PageIndex",
"in": "query",
"description": "The index of the page of results to return",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32",
"default": 0
}
},
{
"name": "name",
"in": "path",
"description": "The name of the item to return",
"required": true,
"schema": {
"minLength": 1,
"type": "string"
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "1.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PaginatedItemsOfCatalogItem"
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
}
},
"/api/catalog/items/withsemanticrelevance/{text}": {
"get": {
"tags": [
"Search"
],
"summary": "Search catalog for relevant items",
"description": "Search the catalog for items related to the specified text",
"operationId": "GetRelevantItems",
"parameters": [
{
"name": "PageSize",
"in": "query",
"description": "Number of items to return in a single page of results",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32",
"default": 10
}
},
{
"name": "PageIndex",
"in": "query",
"description": "The index of the page of results to return",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32",
"default": 0
}
},
{
"name": "text",
"in": "path",
"description": "The text string to use when search for related items in the catalog",
"required": true,
"schema": {
"minLength": 1,
"type": "string"
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "1.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PaginatedItemsOfCatalogItem"
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
}
},
"/api/catalog/items/type/{typeId}/brand/{brandId}": {
"get": {
"tags": [
"Types"
],
"summary": "Get catalog items by type and brand",
"description": "Get catalog items of the specified type and brand",
"operationId": "GetItemsByTypeAndBrand",
"parameters": [
{
"name": "PageSize",
"in": "query",
"description": "Number of items to return in a single page of results",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32",
"default": 10
}
},
{
"name": "PageIndex",
"in": "query",
"description": "The index of the page of results to return",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32",
"default": 0
}
},
{
"name": "typeId",
"in": "path",
"description": "The type of items to return",
"required": true,
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
}
},
{
"name": "brandId",
"in": "path",
"description": "The brand of items to return",
"required": true,
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "1.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PaginatedItemsOfCatalogItem"
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
}
},
"/api/catalog/items/type/all/brand/{brandId}": {
"get": {
"tags": [
"Brands"
],
"summary": "List catalog items by brand",
"description": "Get a list of catalog items for the specified brand",
"operationId": "GetItemsByBrand",
"parameters": [
{
"name": "PageSize",
"in": "query",
"description": "Number of items to return in a single page of results",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32",
"default": 10
}
},
{
"name": "PageIndex",
"in": "query",
"description": "The index of the page of results to return",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32",
"default": 0
}
},
{
"name": "brandId",
"in": "path",
"description": "The brand of items to return",
"required": true,
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "1.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PaginatedItemsOfCatalogItem"
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
}
}
},
"components": {
"schemas": {
"CatalogBrand": {
"required": [
"brand"
],
"type": "object",
"properties": {
"id": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"brand": {
"type": "string"
}
}
},
"CatalogItem": {
"required": [
"name"
],
"type": "object",
"properties": {
"id": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"name": {
"type": "string"
},
"description": {
"type": [
"null",
"string"
]
},
"price": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
"type": [
"number",
"string"
],
"format": "double"
},
"pictureFileName": {
"type": [
"null",
"string"
]
},
"catalogTypeId": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"catalogType": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/components/schemas/CatalogType"
}
]
},
"catalogBrandId": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"catalogBrand": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/components/schemas/CatalogBrand"
}
]
},
"availableStock": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"restockThreshold": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"maxStockThreshold": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"onReorder": {
"type": "boolean"
}
}
},
"CatalogType": {
"required": [
"type"
],
"type": "object",
"properties": {
"id": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"type": {
"type": "string"
}
}
},
"PaginatedItemsOfCatalogItem": {
"required": [
"pageIndex",
"pageSize",
"count",
"data"
],
"type": "object",
"properties": {
"pageIndex": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"pageSize": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"count": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int64"
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CatalogItem"
}
}
}
},
"ProblemDetails": {
"type": "object",
"properties": {
"type": {
"type": [
"null",
"string"
]
},
"title": {
"type": [
"null",
"string"
]
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"null",
"integer",
"string"
],
"format": "int32"
},
"detail": {
"type": [
"null",
"string"
]
},
"instance": {
"type": [
"null",
"string"
]
}
}
}
}
},
"tags": [
{
"name": "Items"
},
{
"name": "Catalog"
},
{
"name": "Types"
},
{
"name": "Brands"
},
{
"name": "Search"
}
]
}
================================================
FILE: src/Catalog.API/Catalog.API_v2.json
================================================
{
"openapi": "3.1.1",
"info": {
"title": "eShop - Catalog HTTP API",
"description": "The Catalog Microservice HTTP API. This is a Data-Driven/CRUD microservice sample",
"version": "2.0"
},
"paths": {
"/api/catalog/items/by": {
"get": {
"tags": [
"Items"
],
"summary": "Batch get catalog items",
"description": "Get multiple items from the catalog",
"operationId": "BatchGetItems",
"parameters": [
{
"name": "ids",
"in": "query",
"description": "List of ids for catalog items to return",
"required": true,
"schema": {
"type": "array",
"items": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
}
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "2.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CatalogItem"
}
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
}
},
"/api/catalog/items/{id}": {
"get": {
"tags": [
"Items"
],
"summary": "Get catalog item",
"description": "Get an item from the catalog",
"operationId": "GetItem",
"parameters": [
{
"name": "id",
"in": "path",
"description": "The catalog item id",
"required": true,
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": "integer",
"format": "int32"
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "2.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CatalogItem"
}
}
}
},
"404": {
"description": "Not Found"
},
"400": {
"description": "Bad Request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
},
"delete": {
"tags": [
"Catalog"
],
"summary": "Delete catalog item",
"description": "Delete the specified catalog item",
"operationId": "DeleteItem",
"parameters": [
{
"name": "id",
"in": "path",
"description": "The id of the catalog item to delete",
"required": true,
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": "integer",
"format": "int32"
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "2.0"
}
}
],
"responses": {
"204": {
"description": "No Content"
},
"404": {
"description": "Not Found"
}
}
},
"put": {
"tags": [
"Items"
],
"summary": "Create or replace a catalog item",
"description": "Create or replace a catalog item",
"operationId": "UpdateItem-V2",
"parameters": [
{
"name": "id",
"in": "path",
"description": "The id of the catalog item to delete",
"required": true,
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": "integer",
"format": "int32"
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "2.0"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CatalogItem"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Created"
},
"400": {
"description": "Bad Request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"404": {
"description": "Not Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
}
},
"/api/catalog/items/{id}/pic": {
"get": {
"tags": [
"Items"
],
"summary": "Get catalog item picture",
"description": "Get the picture for a catalog item",
"operationId": "GetItemPicture",
"parameters": [
{
"name": "id",
"in": "path",
"description": "The catalog item id",
"required": true,
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": "integer",
"format": "int32"
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "2.0"
}
}
],
"responses": {
"404": {
"description": "Not Found"
},
"200": {
"description": "OK",
"content": {
"application/octet-stream": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/png": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/gif": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/jpeg": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/bmp": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/tiff": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/wmf": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/jp2": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/svg+xml": {
"schema": {
"type": "string",
"format": "byte"
}
},
"image/webp": {
"schema": {
"type": "string",
"format": "byte"
}
}
}
}
}
}
},
"/api/catalog/catalogtypes": {
"get": {
"tags": [
"Types"
],
"summary": "List catalog item types",
"description": "Get a list of the types of catalog items",
"operationId": "ListItemTypes",
"parameters": [
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "2.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CatalogType"
}
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
}
},
"/api/catalog/catalogbrands": {
"get": {
"tags": [
"Brands"
],
"summary": "List catalog item brands",
"description": "Get a list of the brands of catalog items",
"operationId": "ListItemBrands",
"parameters": [
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "2.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CatalogBrand"
}
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
}
},
"/api/catalog/items": {
"post": {
"tags": [
"Catalog"
],
"summary": "Create a catalog item",
"description": "Create a new item in the catalog",
"operationId": "CreateItem",
"parameters": [
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "2.0"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CatalogItem"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Created"
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
},
"get": {
"tags": [
"Items"
],
"summary": "List catalog items",
"description": "Get a paginated list of items in the catalog.",
"operationId": "ListItems-V2",
"parameters": [
{
"name": "PageSize",
"in": "query",
"description": "Number of items to return in a single page of results",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32",
"default": 10
}
},
{
"name": "PageIndex",
"in": "query",
"description": "The index of the page of results to return",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32",
"default": 0
}
},
{
"name": "name",
"in": "query",
"description": "The name of the item to return",
"schema": {
"type": "string"
}
},
{
"name": "type",
"in": "query",
"description": "The type of items to return",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
}
},
{
"name": "brand",
"in": "query",
"description": "The brand of items to return",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "2.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PaginatedItemsOfCatalogItem"
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
}
},
"/api/catalog/items/withsemanticrelevance": {
"get": {
"tags": [
"Search"
],
"summary": "Search catalog for relevant items",
"description": "Search the catalog for items related to the specified text",
"operationId": "GetRelevantItems-V2",
"parameters": [
{
"name": "PageSize",
"in": "query",
"description": "Number of items to return in a single page of results",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32",
"default": 10
}
},
{
"name": "PageIndex",
"in": "query",
"description": "The index of the page of results to return",
"schema": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32",
"default": 0
}
},
{
"name": "text",
"in": "query",
"description": "The text string to use when search for related items in the catalog",
"required": true,
"schema": {
"minLength": 1,
"type": "string"
}
},
{
"name": "api-version",
"in": "query",
"description": "The API version, in the format 'major.minor'.",
"required": true,
"schema": {
"type": "string",
"example": "2.0"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PaginatedItemsOfCatalogItem"
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
}
}
}
},
"components": {
"schemas": {
"CatalogBrand": {
"required": [
"brand"
],
"type": "object",
"properties": {
"id": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"brand": {
"type": "string"
}
}
},
"CatalogItem": {
"required": [
"name"
],
"type": "object",
"properties": {
"id": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"name": {
"type": "string"
},
"description": {
"type": [
"null",
"string"
]
},
"price": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
"type": [
"number",
"string"
],
"format": "double"
},
"pictureFileName": {
"type": [
"null",
"string"
]
},
"catalogTypeId": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"catalogType": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/components/schemas/CatalogType"
}
]
},
"catalogBrandId": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"catalogBrand": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/components/schemas/CatalogBrand"
}
]
},
"availableStock": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"restockThreshold": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"maxStockThreshold": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"onReorder": {
"type": "boolean"
}
}
},
"CatalogType": {
"required": [
"type"
],
"type": "object",
"properties": {
"id": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"type": {
"type": "string"
}
}
},
"PaginatedItemsOfCatalogItem": {
"required": [
"pageIndex",
"pageSize",
"count",
"data"
],
"type": "object",
"properties": {
"pageIndex": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"pageSize": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"count": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int64"
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CatalogItem"
}
}
}
},
"ProblemDetails": {
"type": "object",
"properties": {
"type": {
"type": [
"null",
"string"
]
},
"title": {
"type": [
"null",
"string"
]
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"null",
"integer",
"string"
],
"format": "int32"
},
"detail": {
"type": [
"null",
"string"
]
},
"instance": {
"type": [
"null",
"string"
]
}
}
}
}
},
"tags": [
{
"name": "Items"
},
{
"name": "Catalog"
},
{
"name": "Types"
},
{
"name": "Brands"
},
{
"name": "Search"
}
]
}
================================================
FILE: src/Catalog.API/CatalogOptions.cs
================================================
namespace eShop.Catalog.API;
public class CatalogOptions
{
public string? PicBaseUrl { get; set; }
public bool UseCustomizationData { get; set; }
}
================================================
FILE: src/Catalog.API/Extensions/Extensions.cs
================================================
using eShop.Catalog.API.Services;
public static class Extensions
{
public static void AddApplicationServices(this IHostApplicationBuilder builder)
{
// Avoid loading full database config and migrations if startup
// is being invoked from build-time OpenAPI generation
if (builder.Environment.IsBuild())
{
builder.Services.AddDbContext<CatalogContext>();
return;
}
builder.AddNpgsqlDbContext<CatalogContext>("catalogdb", configureDbContextOptions: dbContextOptionsBuilder =>
{
dbContextOptionsBuilder.UseNpgsql(builder =>
{
builder.UseVector();
});
});
// REVIEW: This is done for development ease but shouldn't be here in production
builder.Services.AddMigration<CatalogContext, CatalogContextSeed>();
// Add the integration services that consume the DbContext
builder.Services.AddTransient<IIntegrationEventLogService, IntegrationEventLogService<CatalogContext>>();
builder.Services.AddTransient<ICatalogIntegrationEventService, CatalogIntegrationEventService>();
builder.AddRabbitMqEventBus("eventbus")
.AddSubscription<OrderStatusChangedToAwaitingValidationIntegrationEvent, OrderStatusChangedToAwaitingValidationIntegrationEventHandler>()
.AddSubscription<OrderStatusChangedToPaidIntegrationEvent, OrderStatusChangedToPaidIntegrationEventHandler>();
builder.Services.AddOptions<CatalogOptions>()
.BindConfiguration(nameof(CatalogOptions));
if (builder.Configuration["OllamaEnabled"] is string ollamaEnabled && bool.Parse(ollamaEnabled))
{
builder.AddOllamaApiClient("embedding")
.AddEmbeddingGenerator();
}
else if (!string.IsNullOrWhiteSpace(builder.Configuration.GetConnectionString("textEmbeddingModel")))
{
builder.AddOpenAIClientFromConfiguration("textEmbeddingModel")
.AddEmbeddingGenerator();
}
builder.Services.AddScoped<ICatalogAI, CatalogAI>();
}
}
================================================
FILE: src/Catalog.API/Extensions/HostEnvironmentExtensions.cs
================================================
using System.Reflection;
namespace Microsoft.Extensions.Hosting;
internal static class HostEnvironmentExtensions
{
public static bool IsBuild(this IHostEnvironment hostEnvironment)
{
// Check if the environment is "Build" or the entry assembly is "GetDocument.Insider"
// to account for scenarios where app is launching via OpenAPI build-time generation
// via the GetDocument.Insider tool.
return hostEnvironment.IsEnvironment("Build") || Assembly.GetEntryAssembly()?.GetName().Name == "GetDocument.Insider";
}
}
================================================
FILE: src/Catalog.API/GlobalUsings.cs
================================================
global using Asp.Versioning;
global using Asp.Versioning.Conventions;
global using eShop.Catalog.API;
global using eShop.Catalog.API.Infrastructure;
global using eShop.Catalog.API.Infrastructure.EntityConfigurations;
global using eShop.Catalog.API.Infrastructure.Exceptions;
global using eShop.Catalog.API.IntegrationEvents;
global using eShop.Catalog.API.IntegrationEvents.EventHandling;
global using eShop.Catalog.API.IntegrationEvents.Events;
global using eShop.Catalog.API.Model;
global using eShop.EventBus.Abstractions;
global using eShop.EventBus.Events;
global using eShop.IntegrationEventLogEF;
global using eShop.IntegrationEventLogEF.Services;
global using eShop.IntegrationEventLogEF.Utilities;
global using eShop.ServiceDefaults;
global using Microsoft.EntityFrameworkCore;
global using Microsoft.EntityFrameworkCore.Metadata.Builders;
global using Microsoft.Extensions.Options;
global using Npgsql;
================================================
FILE: src/Catalog.API/Infrastructure/CatalogContext.cs
================================================
namespace eShop.Catalog.API.Infrastructure;
/// <remarks>
/// Add migrations using the following command inside the 'Catalog.API' project directory:
///
/// dotnet ef migrations add --context CatalogContext [migration-name]
/// </remarks>
public class CatalogContext : DbContext
{
public CatalogContext(DbContextOptions<CatalogContext> options, IConfiguration configuration) : base(options)
{
}
public required DbSet<CatalogItem> CatalogItems { get; set; }
public required DbSet<CatalogBrand> CatalogBrands { get; set; }
public required DbSet<CatalogType> CatalogTypes { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
builder.HasPostgresExtension("vector");
builder.ApplyConfiguration(new CatalogBrandEntityTypeConfiguration());
builder.ApplyConfiguration(new CatalogTypeEntityTypeConfiguration());
builder.ApplyConfiguration(new CatalogItemEntityTypeConfiguration());
// Add the outbox table to this context
builder.UseIntegrationEventLogs();
}
}
================================================
FILE: src/Catalog.API/Infrastructure/CatalogContextSeed.cs
================================================
using System.Text.Json;
using eShop.Catalog.API.Services;
using Pgvector;
namespace eShop.Catalog.API.Infrastructure;
public partial class CatalogContextSeed(
IWebHostEnvironment env,
IOptions<CatalogOptions> settings,
ICatalogAI catalogAI,
ILogger<CatalogContextSeed> logger) : IDbSeeder<CatalogContext>
{
public async Task SeedAsync(CatalogContext context)
{
var useCustomizationData = settings.Value.UseCustomizationData;
var contentRootPath = env.ContentRootPath;
var picturePath = env.WebRootPath;
// Workaround from https://github.com/npgsql/efcore.pg/issues/292#issuecomment-388608426
context.Database.OpenConnection();
((NpgsqlConnection)context.Database.GetDbConnection()).ReloadTypes();
if (!context.CatalogItems.Any())
{
var sourcePath = Path.Combine(contentRootPath, "Setup", "catalog.json");
var sourceJson = File.ReadAllText(sourcePath);
var sourceItems = JsonSerializer.Deserialize<CatalogSourceEntry[]>(sourceJson) ?? Array.Empty<CatalogSourceEntry>();
context.CatalogBrands.RemoveRange(context.CatalogBrands);
await context.CatalogBrands.AddRangeAsync(sourceItems.Select(x => x.Brand).Distinct()
.Where(brandName => brandName != null)
.Select(brandName => new CatalogBrand(brandName!)));
logger.LogInformation("Seeded catalog with {NumBrands} brands", context.CatalogBrands.Count());
context.CatalogTypes.RemoveRange(context.CatalogTypes);
await context.CatalogTypes.AddRangeAsync(sourceItems.Select(x => x.Type).Distinct()
.Where(typeName => typeName != null)
.Select(typeName => new CatalogType(typeName!)));
logger.LogInformation("Seeded catalog with {NumTypes} types", context.CatalogTypes.Count());
await context.SaveChangesAsync();
var brandIdsByName = await context.CatalogBrands.ToDictionaryAsync(x => x.Brand, x => x.Id);
var typeIdsByName = await context.CatalogTypes.ToDictionaryAsync(x => x.Type, x => x.Id);
var catalogItems = sourceItems
.Where(source => source.Name != null && source.Brand != null && source.Type != null)
.Select(source => new CatalogItem(source.Name!)
{
Id = source.Id,
Description = source.Description,
Price = source.Price,
CatalogBrandId = brandIdsByName[source.Brand!],
CatalogTypeId = typeIdsByName[source.Type!],
AvailableStock = 100,
MaxStockThreshold = 200,
RestockThreshold = 10,
PictureFileName = $"{source.Id}.webp",
}).ToArray();
if (catalogAI.IsEnabled)
{
logger.LogInformation("Generating {NumItems} embeddings", catalogItems.Length);
IReadOnlyList<Vector>? embeddings = await catalogAI.GetEmbeddingsAsync(catalogItems);
for (int i = 0; i < catalogItems.Length; i++)
{
catalogItems[i].Embedding = embeddings?[i];
}
}
await context.CatalogItems.AddRangeAsync(catalogItems);
logger.LogInformation("Seeded catalog with {NumItems} items", context.CatalogItems.Count());
await context.SaveChangesAsync();
}
}
private class CatalogSourceEntry
{
public int Id { get; set; }
public string? Type { get; set; }
public string? Brand { get; set; }
public string? Name { get; set; }
public string? Description { get; set; }
public decimal Price { get; set; }
}
}
================================================
FILE: src/Catalog.API/Infrastructure/EntityConfigurations/CatalogBrandEntityTypeConfiguration.cs
================================================
namespace eShop.Catalog.API.Infrastructure.EntityConfigurations;
class CatalogBrandEntityTypeConfiguration
: IEntityTypeConfiguration<CatalogBrand>
{
public void Configure(EntityTypeBuilder<CatalogBrand> builder)
{
builder.ToTable("CatalogBrand");
builder.Property(cb => cb.Brand)
.HasMaxLength(100);
}
}
================================================
FILE: src/Catalog.API/Infrastructure/EntityConfigurations/CatalogItemEntityTypeConfiguration.cs
================================================
namespace eShop.Catalog.API.Infrastructure.EntityConfigurations;
class CatalogItemEntityTypeConfiguration
: IEntityTypeConfiguration<CatalogItem>
{
public void Configure(EntityTypeBuilder<CatalogItem> builder)
{
builder.ToTable("Catalog");
builder.Property(ci => ci.Name)
.HasMaxLength(50);
builder.Property(ci => ci.Embedding)
.HasColumnType("vector(384)");
builder.HasOne(ci => ci.CatalogBrand)
.WithMany();
builder.HasOne(ci => ci.CatalogType)
.WithMany();
builder.HasIndex(ci => ci.Name);
}
}
================================================
FILE: src/Catalog.API/Infrastructure/EntityConfigurations/CatalogTypeEntityTypeConfiguration.cs
================================================
namespace eShop.Catalog.API.Infrastructure.EntityConfigurations;
class CatalogTypeEntityTypeConfiguration
: IEntityTypeConfiguration<CatalogType>
{
public void Configure(EntityTypeBuilder<CatalogType> builder)
{
builder.ToTable("CatalogType");
builder.Property(cb => cb.Type)
.HasMaxLength(100);
}
}
================================================
FILE: src/Catalog.API/Infrastructure/Exceptions/CatalogDomainException.cs
================================================
namespace eShop.Catalog.API.Infrastructure.Exceptions;
/// <summary>
/// Exception type for app exceptions
/// </summary>
public class CatalogDomainException : Exception
{
public CatalogDomainException()
{ }
public CatalogDomainException(string message)
: base(message)
{ }
public CatalogDomainException(string message, Exception innerException)
: base(message, innerException)
{ }
}
================================================
FILE: src/Catalog.API/Infrastructure/Migrations/20231009153249_Initial.Designer.cs
================================================
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using eShop.Catalog.API.Infrastructure;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using Pgvector;
#nullable disable
namespace eShop.Catalog.API.Infrastructure.Migrations
{
[DbContext(typeof(CatalogContext))]
[Migration("20231009153249_Initial")]
partial class Initial
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "7.0.11")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "vector");
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.HasSequence("catalog_brand_hilo")
.IncrementsBy(10);
modelBuilder.HasSequence("catalog_hilo")
.IncrementsBy(10);
modelBuilder.HasSequence("catalog_type_hilo")
.IncrementsBy(10);
modelBuilder.Entity("eShop.Catalog.API.Model.CatalogBrand", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseHiLo(b.Property<int>("Id"), "catalog_brand_hilo");
b.Property<string>("Brand")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("character varying(100)");
b.HasKey("Id");
b.ToTable("CatalogBrand", (string)null);
});
modelBuilder.Entity("eShop.Catalog.API.Model.CatalogItem", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseHiLo(b.Property<int>("Id"), "catalog_hilo");
b.Property<int>("AvailableStock")
.HasColumnType("integer");
b.Property<int>("CatalogBrandId")
.HasColumnType("integer");
b.Property<int>("CatalogTypeId")
.HasColumnType("integer");
b.Property<string>("Description")
.HasColumnType("text");
b.Property<Vector>("Embedding")
.HasColumnType("vector(384)");
b.Property<int>("MaxStockThreshold")
.HasColumnType("integer");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("character varying(50)");
b.Property<bool>("OnReorder")
.HasColumnType("boolean");
b.Property<string>("PictureFileName")
.HasColumnType("text");
b.Property<decimal>("Price")
.HasColumnType("numeric");
b.Property<int>("RestockThreshold")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("CatalogBrandId");
b.HasIndex("CatalogTypeId");
b.ToTable("Catalog", (string)null);
});
modelBuilder.Entity("eShop.Catalog.API.Model.CatalogType", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseHiLo(b.Property<int>("Id"), "catalog_type_hilo");
b.Property<string>("Type")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("character varying(100)");
b.HasKey("Id");
b.ToTable("CatalogType", (string)null);
});
modelBuilder.Entity("eShop.Catalog.API.Model.CatalogItem", b =>
{
b.HasOne("eShop.Catalog.API.Model.CatalogBrand", "CatalogBrand")
.WithMany()
.HasForeignKey("CatalogBrandId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("eShop.Catalog.API.Model.CatalogType", "CatalogType")
.WithMany()
.HasForeignKey("CatalogTypeId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("CatalogBrand");
b.Navigation("CatalogType");
});
#pragma warning restore 612, 618
}
}
}
================================================
FILE: src/Catalog.API/Infrastructure/Migrations/20231009153249_Initial.cs
================================================
using Microsoft.EntityFrameworkCore.Migrations;
using Pgvector;
#nullable disable
namespace eShop.Catalog.API.Infrastructure.Migrations
{
/// <inheritdoc />
public partial class Initial : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterDatabase()
.Annotation("Npgsql:PostgresExtension:vector", ",,");
migrationBuilder.CreateSequence(
name: "catalog_brand_hilo",
incrementBy: 10);
migrationBuilder.CreateSequence(
name: "catalog_hilo",
incrementBy: 10);
migrationBuilder.CreateSequence(
name: "catalog_type_hilo",
incrementBy: 10);
migrationBuilder.CreateTable(
name: "CatalogBrand",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
Brand = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_CatalogBrand", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CatalogType",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
Type = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_CatalogType", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Catalog",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
Name = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
Description = table.Column<string>(type: "text", nullable: true),
Price = table.Column<decimal>(type: "numeric", nullable: false),
PictureFileName = table.Column<string>(type: "text", nullable: true),
CatalogTypeId = table.Column<int>(type: "integer", nullable: false),
CatalogBrandId = table.Column<int>(type: "integer", nullable: false),
AvailableStock = table.Column<int>(type: "integer", nullable: false),
RestockThreshold = table.Column<int>(type: "integer", nullable: false),
MaxStockThreshold = table.Column<int>(type: "integer", nullable: false),
Embedding = table.Column<Vector>(type: "vector(384)", nullable: true),
OnReorder = table.Column<bool>(type: "boolean", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Catalog", x => x.Id);
table.ForeignKey(
name: "FK_Catalog_CatalogBrand_CatalogBrandId",
column: x => x.CatalogBrandId,
principalTable: "CatalogBrand",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_Catalog_CatalogType_CatalogTypeId",
column: x => x.CatalogTypeId,
principalTable: "CatalogType",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_Catalog_CatalogBrandId",
table: "Catalog",
column: "CatalogBrandId");
migrationBuilder.CreateIndex(
name: "IX_Catalog_CatalogTypeId",
table: "Catalog",
column: "CatalogTypeId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Catalog");
migrationBuilder.DropTable(
name: "CatalogBrand");
migrationBuilder.DropTable(
name: "CatalogType");
migrationBuilder.DropSequence(
name: "catalog_brand_hilo");
migrationBuilder.DropSequence(
name: "catalog_hilo");
migrationBuilder.DropSequence(
name: "catalog_type_hilo");
}
}
}
================================================
FILE: src/Catalog.API/Infrastructure/Migrations/20231018163051_RemoveHiLoAndIndexCatalogName.Designer.cs
================================================
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using eShop.Catalog.API.Infrastructure;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using Pgvector;
#nullable disable
namespace eShop.Catalog.API.Infrastructure.Migrations
{
[DbContext(typeof(CatalogContext))]
[Migration("20231018163051_RemoveHiLoAndIndexCatalogName")]
partial class RemoveHiLoAndIndexCatalogName
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "vector");
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("eShop.Catalog.API.Model.CatalogBrand", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Brand")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("character varying(100)");
b.HasKey("Id");
b.ToTable("CatalogBrand", (string)null);
});
modelBuilder.Entity("eShop.Catalog.API.Model.CatalogItem", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("AvailableStock")
.HasColumnType("integer");
b.Property<int>("CatalogBrandId")
.HasColumnType("integer");
b.Property<int>("CatalogTypeId")
.HasColumnType("integer");
b.Property<string>("Description")
.HasColumnType("text");
b.Property<Vector>("Embedding")
.HasColumnType("vector(384)");
b.Property<int>("MaxStockThreshold")
.HasColumnType("integer");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("character varying(50)");
b.Property<bool>("OnReorder")
.HasColumnType("boolean");
b.Property<string>("PictureFileName")
.HasColumnType("text");
b.Property<decimal>("Price")
.HasColumnType("numeric");
b.Property<int>("RestockThreshold")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("CatalogBrandId");
b.HasIndex("CatalogTypeId");
b.HasIndex("Name");
b.ToTable("Catalog", (string)null);
});
modelBuilder.Entity("eShop.Catalog.API.Model.CatalogType", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Type")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("character varying(100)");
b.HasKey("Id");
b.ToTable("CatalogType", (string)null);
});
modelBuilder.Entity("eShop.Catalog.API.Model.CatalogItem", b =>
{
b.HasOne("eShop.Catalog.API.Model.CatalogBrand", "CatalogBrand")
.WithMany()
.HasForeignKey("CatalogBrandId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("eShop.Catalog.API.Model.CatalogType", "CatalogType")
.WithMany()
.HasForeignKey("CatalogTypeId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("CatalogBrand");
b.Navigation("CatalogType");
});
#pragma warning restore 612, 618
}
}
}
================================================
FILE: src/Catalog.API/Infrastructure/Migrations/20231018163051_RemoveHiLoAndIndexCatalogName.cs
================================================
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace eShop.Catalog.API.Infrastructure.Migrations
{
/// <inheritdoc />
public partial class RemoveHiLoAndIndexCatalogName : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropSequence(
name: "catalog_brand_hilo");
migrationBuilder.DropSequence(
name: "catalog_hilo");
migrationBuilder.DropSequence(
name: "catalog_type_hilo");
migrationBuilder.AlterColumn<int>(
name: "Id",
table: "CatalogType",
type: "integer",
nullable: false,
oldClrType: typeof(int),
oldType: "integer")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
migrationBuilder.AlterColumn<int>(
name: "Id",
table: "CatalogBrand",
type: "integer",
nullable: false,
oldClrType: typeof(int),
oldType: "integer")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
migrationBuilder.AlterColumn<int>(
name: "Id",
table: "Catalog",
type: "integer",
nullable: false,
oldClrType: typeof(int),
oldType: "integer")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
migrationBuilder.CreateIndex(
name: "IX_Catalog_Name",
table: "Catalog",
column: "Name");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropIndex(
name: "IX_Catalog_Name",
table: "Catalog");
migrationBuilder.CreateSequence(
name: "catalog_brand_hilo",
incrementBy: 10);
migrationBuilder.CreateSequence(
name: "catalog_hilo",
incrementBy: 10);
migrationBuilder.CreateSequence(
name: "catalog_type_hilo",
incrementBy: 10);
migrationBuilder.AlterColumn<int>(
name: "Id",
table: "CatalogType",
type: "integer",
nullable: false,
oldClrType: typeof(int),
oldType: "integer")
.OldAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
migrationBuilder.AlterColumn<int>(
name: "Id",
table: "CatalogBrand",
type: "integer",
nullable: false,
oldClrType: typeof(int),
oldType: "integer")
.OldAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
migrationBuilder.AlterColumn<int>(
name: "Id",
table: "Catalog",
type: "integer",
nullable: false,
oldClrType: typeof(int),
oldType: "integer")
.OldAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
}
}
}
================================================
FILE: src/Catalog.API/Infrastructure/Migrations/20231026091140_Outbox.Designer.cs
================================================
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using eShop.Catalog.API.Infrastructure;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using Pgvector;
#nullable disable
namespace eShop.Catalog.API.Infrastructure.Migrations
{
[DbContext(typeof(CatalogContext))]
[Migration("20231026091140_Outbox")]
partial class Outbox
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.0-rtm.23512.13")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "vector");
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("eShop.Catalog.API.Model.CatalogBrand", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Brand")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("character varying(100)");
b.HasKey("Id");
b.ToTable("CatalogBrand", (string)null);
});
modelBuilder.Entity("eShop.Catalog.API.Model.CatalogItem", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("AvailableStock")
.HasColumnType("integer");
b.Property<int>("CatalogBrandId")
.HasColumnType("integer");
b.Property<int>("CatalogTypeId")
.HasColumnType("integer");
b.Property<string>("Description")
.HasColumnType("text");
b.Property<Vector>("Embedding")
.HasColumnType("vector(384)");
b.Property<int>("MaxStockThreshold")
.HasColumnType("integer");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("character varying(50)");
b.Property<bool>("OnReorder")
.HasColumnType("boolean");
b.Property<string>("PictureFileName")
.HasColumnType("text");
b.Property<decimal>("Price")
.HasColumnType("numeric");
b.Property<int>("RestockThreshold")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("CatalogBrandId");
b.HasIndex("CatalogTypeId");
b.HasIndex("Name");
b.ToTable("Catalog", (string)null);
});
modelBuilder.Entity("eShop.Catalog.API.Model.CatalogType", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Type")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("character varying(100)");
b.HasKey("Id");
b.ToTable("CatalogType", (string)null);
});
modelBuilder.Entity("eShop.IntegrationEventLogEF.IntegrationEventLogEntry", b =>
{
b.Property<Guid>("EventId")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<string>("Content")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("CreationTime")
.HasColumnType("timestamp with time zone");
b.Property<string>("EventTypeName")
.IsRequired()
.HasColumnType("text");
b.Property<int>("State")
.HasColumnType("integer");
b.Property<int>("TimesSent")
.HasColumnType("integer");
b.Property<Guid>("TransactionId")
.HasColumnType("uuid");
b.HasKey("EventId");
b.ToTable("IntegrationEventLog", (string)null);
});
modelBuilder.Entity("eShop.Catalog.API.Model.CatalogItem", b =>
{
gitextract_kui8zjym/
├── .aspire/
│ └── settings.json
├── .config/
│ ├── CredScanSuppressions.json
│ ├── configuration.vs.winget
│ ├── configuration.vsCode.winget
│ └── tsaoptions.json
├── .devcenter/
│ └── catalog/
│ └── definitions/
│ └── imagedefinition.yaml
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── dependabot.yml
│ └── workflows/
│ ├── markdownlint-problem-matcher.json
│ ├── markdownlint.yml
│ ├── playwright.yml
│ ├── pr-validation-maui.yml
│ └── pr-validation.yml
├── .gitignore
├── .markdownlint.json
├── .markdownlintignore
├── .spectral.yml
├── CODE-OF-CONDUCT.md
├── CONTRIBUTING.md
├── Directory.Build.props
├── Directory.Build.targets
├── Directory.Packages.props
├── LICENSE
├── README.md
├── build/
│ ├── acr-build/
│ │ └── queue-all.ps1
│ └── multiarch-manifests/
│ └── create-manifests.ps1
├── ci.yml
├── e2e/
│ ├── AddItemTest.spec.ts
│ ├── BrowseItemTest.spec.ts
│ ├── RemoveItemTest.spec.ts
│ └── login.setup.ts
├── eShop.Web.slnf
├── eShop.slnx
├── es-metadata.yml
├── global.json
├── nuget.config
├── package.json
├── playwright.config.ts
├── src/
│ ├── Basket.API/
│ │ ├── Basket.API.csproj
│ │ ├── Extensions/
│ │ │ ├── Extensions.cs
│ │ │ └── ServerCallContextIdentityExtensions.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Grpc/
│ │ │ └── BasketService.cs
│ │ ├── IntegrationEvents/
│ │ │ ├── EventHandling/
│ │ │ │ └── OrderStartedIntegrationEventHandler.cs
│ │ │ └── Events/
│ │ │ └── OrderStartedIntegrationEvent.cs
│ │ ├── Model/
│ │ │ ├── BasketItem.cs
│ │ │ └── CustomerBasket.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Proto/
│ │ │ └── basket.proto
│ │ ├── Repositories/
│ │ │ ├── IBasketRepository.cs
│ │ │ └── RedisBasketRepository.cs
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── Catalog.API/
│ │ ├── Apis/
│ │ │ └── CatalogApi.cs
│ │ ├── Catalog.API.csproj
│ │ ├── Catalog.API.http
│ │ ├── Catalog.API.json
│ │ ├── Catalog.API_v2.json
│ │ ├── CatalogOptions.cs
│ │ ├── Extensions/
│ │ │ ├── Extensions.cs
│ │ │ └── HostEnvironmentExtensions.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Infrastructure/
│ │ │ ├── CatalogContext.cs
│ │ │ ├── CatalogContextSeed.cs
│ │ │ ├── EntityConfigurations/
│ │ │ │ ├── CatalogBrandEntityTypeConfiguration.cs
│ │ │ │ ├── CatalogItemEntityTypeConfiguration.cs
│ │ │ │ └── CatalogTypeEntityTypeConfiguration.cs
│ │ │ ├── Exceptions/
│ │ │ │ └── CatalogDomainException.cs
│ │ │ └── Migrations/
│ │ │ ├── 20231009153249_Initial.Designer.cs
│ │ │ ├── 20231009153249_Initial.cs
│ │ │ ├── 20231018163051_RemoveHiLoAndIndexCatalogName.Designer.cs
│ │ │ ├── 20231018163051_RemoveHiLoAndIndexCatalogName.cs
│ │ │ ├── 20231026091140_Outbox.Designer.cs
│ │ │ ├── 20231026091140_Outbox.cs
│ │ │ └── CatalogContextModelSnapshot.cs
│ │ ├── IntegrationEvents/
│ │ │ ├── CatalogIntegrationEventService.cs
│ │ │ ├── EventHandling/
│ │ │ │ ├── AnyFutureIntegrationEventHandler.cs.txt
│ │ │ │ ├── OrderStatusChangedToAwaitingValidationIntegrationEventHandler.cs
│ │ │ │ └── OrderStatusChangedToPaidIntegrationEventHandler.cs
│ │ │ ├── Events/
│ │ │ │ ├── ConfirmedOrderStockItem.cs
│ │ │ │ ├── OrderStatusChangedToAwaitingValidationIntegrationEvent.cs
│ │ │ │ ├── OrderStatusChangedToPaidIntegrationEvent.cs
│ │ │ │ ├── OrderStockConfirmedIntegrationEvent.cs
│ │ │ │ ├── OrderStockItem.cs
│ │ │ │ ├── OrderStockRejectedIntegrationEvent.cs
│ │ │ │ └── ProductPriceChangedIntegrationEvent.cs
│ │ │ └── ICatalogIntegrationEventService.cs
│ │ ├── Model/
│ │ │ ├── CatalogBrand.cs
│ │ │ ├── CatalogItem.cs
│ │ │ ├── CatalogServices.cs
│ │ │ ├── CatalogType.cs
│ │ │ ├── PaginatedItems.cs
│ │ │ └── PaginationRequest.cs
│ │ ├── Program.Testing.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Services/
│ │ │ ├── CatalogAI.cs
│ │ │ └── ICatalogAI.cs
│ │ ├── Setup/
│ │ │ └── catalog.json
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── ClientApp/
│ │ ├── Animations/
│ │ │ ├── Base/
│ │ │ │ ├── AnimationBase.cs
│ │ │ │ └── EasingType.cs
│ │ │ ├── FadeToAnimation.cs
│ │ │ └── StoryBoard.cs
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── AppActions.cs
│ │ ├── AppShell.xaml
│ │ ├── AppShell.xaml.cs
│ │ ├── ClientApp.csproj
│ │ ├── ClientApp.sln
│ │ ├── Controls/
│ │ │ ├── AddBasketButton.xaml
│ │ │ ├── AddBasketButton.xaml.cs
│ │ │ ├── CustomTabbedPage.cs
│ │ │ └── ToggleButton.cs
│ │ ├── Converters/
│ │ │ ├── DoesNotHaveCountConverter.cs
│ │ │ ├── DoubleConverter.cs
│ │ │ ├── FirstValidationErrorConverter.cs
│ │ │ ├── HasCountConverter.cs
│ │ │ ├── ItemsToHeightConverter.cs
│ │ │ ├── WebNavigatedEventArgsConverter.cs
│ │ │ └── WebNavigatingEventArgsConverter.cs
│ │ ├── Effects/
│ │ │ ├── EntryLineColorEffect.cs
│ │ │ └── ThemeEffects.cs
│ │ ├── Exceptions/
│ │ │ └── ServiceAuthenticationException.cs
│ │ ├── Extensions/
│ │ │ ├── DictionaryExtensions.cs
│ │ │ ├── ICommandExtensions.cs
│ │ │ └── VisualElementExtensions.cs
│ │ ├── GlobalSuppressions.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Helpers/
│ │ │ ├── EasingHelper.cs
│ │ │ └── UriHelper.cs
│ │ ├── MauiProgram.cs
│ │ ├── Messages/
│ │ │ └── ProductCountChangedMessage.cs
│ │ ├── Models/
│ │ │ ├── Basket/
│ │ │ │ ├── BasketItem.cs
│ │ │ │ └── CustomerBasket.cs
│ │ │ ├── Catalog/
│ │ │ │ ├── CatalogBrand.cs
│ │ │ │ ├── CatalogItem.cs
│ │ │ │ ├── CatalogRoot.cs
│ │ │ │ └── CatalogType.cs
│ │ │ ├── Location/
│ │ │ │ ├── GeolocationError.cs
│ │ │ │ ├── GeolocationException.cs
│ │ │ │ ├── Location.cs
│ │ │ │ └── Position.cs
│ │ │ ├── Marketing/
│ │ │ │ ├── Campaign.cs
│ │ │ │ ├── CampaignItem.cs
│ │ │ │ └── CampaignRoot.cs
│ │ │ ├── Navigation/
│ │ │ │ └── TabParameter.cs
│ │ │ ├── Orders/
│ │ │ │ ├── CancelOrderCommand.cs
│ │ │ │ ├── CardType.cs
│ │ │ │ ├── Order.cs
│ │ │ │ ├── OrderCheckout.cs
│ │ │ │ └── OrderItem.cs
│ │ │ ├── Permissions/
│ │ │ │ ├── Permission.cs
│ │ │ │ └── PermissionStatus.cs
│ │ │ ├── Token/
│ │ │ │ └── UserToken.cs
│ │ │ └── User/
│ │ │ ├── Address.cs
│ │ │ ├── LogoutParameter.cs
│ │ │ ├── PaymentInfo.cs
│ │ │ └── UserInfo.cs
│ │ ├── Platforms/
│ │ │ ├── Android/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── MainActivity.cs
│ │ │ │ ├── MainApplication.cs
│ │ │ │ ├── Resources/
│ │ │ │ │ ├── values/
│ │ │ │ │ │ └── colors.xml
│ │ │ │ │ └── xml/
│ │ │ │ │ └── network_security_config.xml
│ │ │ │ └── WebAuthenticationCallbackActivity.cs
│ │ │ ├── MacCatalyst/
│ │ │ │ ├── AppDelegate.cs
│ │ │ │ ├── Entitlements.Debug.plist
│ │ │ │ ├── Entitlements.Release.plist
│ │ │ │ ├── Info.plist
│ │ │ │ └── Program.cs
│ │ │ ├── Windows/
│ │ │ │ ├── App.xaml
│ │ │ │ ├── App.xaml.cs
│ │ │ │ ├── Package.appxmanifest
│ │ │ │ └── app.manifest
│ │ │ └── iOS/
│ │ │ ├── AppDelegate.cs
│ │ │ ├── Entitlements.plist
│ │ │ ├── Info.plist
│ │ │ └── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Resources/
│ │ │ ├── Fonts/
│ │ │ │ ├── FontAwesomeRegular.otf
│ │ │ │ └── FontAwesomeSolid.otf
│ │ │ ├── Raw/
│ │ │ │ └── AboutAssets.txt
│ │ │ └── Styles/
│ │ │ ├── Colors.xaml
│ │ │ └── Styles.xaml
│ │ ├── Services/
│ │ │ ├── AppEnvironment/
│ │ │ │ ├── AppEnvironmentService.cs
│ │ │ │ └── IAppEnvironmentService.cs
│ │ │ ├── Basket/
│ │ │ │ ├── BasketMockService.cs
│ │ │ │ ├── BasketService.cs
│ │ │ │ ├── IBasketService.cs
│ │ │ │ └── Protos/
│ │ │ │ ├── Basket.cs
│ │ │ │ ├── BasketGrpc.cs
│ │ │ │ └── basket.proto
│ │ │ ├── Catalog/
│ │ │ │ ├── CatalogMockService.cs
│ │ │ │ ├── CatalogService.cs
│ │ │ │ └── ICatalogService.cs
│ │ │ ├── Common/
│ │ │ │ └── Common.cs
│ │ │ ├── Dialog/
│ │ │ │ ├── DialogService.cs
│ │ │ │ └── IDialogService.cs
│ │ │ ├── EShopJsonSerializerContext.cs
│ │ │ ├── FixUri/
│ │ │ │ ├── FixUriService.cs
│ │ │ │ └── IFixUriService.cs
│ │ │ ├── Identity/
│ │ │ │ ├── AuthorizeRequest.cs
│ │ │ │ ├── IIdentityService.cs
│ │ │ │ ├── IdentityMockService.cs
│ │ │ │ └── IdentityService.cs
│ │ │ ├── Location/
│ │ │ │ ├── ILocationService.cs
│ │ │ │ └── LocationService.cs
│ │ │ ├── Navigation/
│ │ │ │ ├── INavigationService.cs
│ │ │ │ └── MauiNavigationService.cs
│ │ │ ├── OpenUrl/
│ │ │ │ ├── IOpenUrlService.cs
│ │ │ │ └── OpenUrlService.cs
│ │ │ ├── Order/
│ │ │ │ ├── IOrderService.cs
│ │ │ │ ├── OrderMockService.cs
│ │ │ │ └── OrderService.cs
│ │ │ ├── RequestProvider/
│ │ │ │ ├── HttpRequestExceptionEx.cs
│ │ │ │ ├── IRequestProvider.cs
│ │ │ │ └── RequestProvider.cs
│ │ │ ├── Settings/
│ │ │ │ ├── ISettingsService.cs
│ │ │ │ └── SettingsService.cs
│ │ │ └── Theme/
│ │ │ ├── ITheme.cs
│ │ │ └── Theme.shared.cs
│ │ ├── Triggers/
│ │ │ └── BeginAnimation.cs
│ │ ├── Validations/
│ │ │ ├── IValidationRule.cs
│ │ │ ├── IValidity.cs
│ │ │ ├── IsNotNullOrEmptyRule.cs
│ │ │ └── ValidatableObject.cs
│ │ ├── ViewModels/
│ │ │ ├── Base/
│ │ │ │ ├── IViewModelBase.cs
│ │ │ │ └── ViewModelBase.cs
│ │ │ ├── BasketViewModel.cs
│ │ │ ├── CatalogItemViewModel.cs
│ │ │ ├── CatalogViewModel.cs
│ │ │ ├── CheckoutViewModel.cs
│ │ │ ├── LoginViewModel.cs
│ │ │ ├── MainViewModel.cs
│ │ │ ├── MapViewModel.cs
│ │ │ ├── ObservableCollectionEx.cs
│ │ │ ├── OrderDetailViewModel.cs
│ │ │ ├── ProfileViewModel.cs
│ │ │ ├── SelectionViewModel.cs
│ │ │ └── SettingsViewModel.cs
│ │ └── Views/
│ │ ├── BadgeView.cs
│ │ ├── BasketView.xaml
│ │ ├── BasketView.xaml.cs
│ │ ├── CatalogItemView.xaml
│ │ ├── CatalogItemView.xaml.cs
│ │ ├── CatalogView.xaml
│ │ ├── CatalogView.xaml.cs
│ │ ├── CheckoutView.xaml
│ │ ├── CheckoutView.xaml.cs
│ │ ├── ContentPageBase.cs
│ │ ├── CustomNavigationView.xaml
│ │ ├── CustomNavigationView.xaml.cs
│ │ ├── FiltersView.xaml
│ │ ├── FiltersView.xaml.cs
│ │ ├── LoginView.xaml
│ │ ├── LoginView.xaml.cs
│ │ ├── MapView.xaml
│ │ ├── MapView.xaml.cs
│ │ ├── MauiAuthenticationBrowser.cs
│ │ ├── OrderDetailView.xaml
│ │ ├── OrderDetailView.xaml.cs
│ │ ├── ProfileView.xaml
│ │ ├── ProfileView.xaml.cs
│ │ ├── SettingsView.xaml
│ │ ├── SettingsView.xaml.cs
│ │ └── Templates/
│ │ ├── BasketItemTemplate.xaml
│ │ ├── BasketItemTemplate.xaml.cs
│ │ ├── CampaignTemplate.xaml
│ │ ├── CampaignTemplate.xaml.cs
│ │ ├── OrderItemTemplate.xaml
│ │ ├── OrderItemTemplate.xaml.cs
│ │ ├── OrderTemplate.xaml
│ │ ├── OrderTemplate.xaml.cs
│ │ ├── ProductTemplate.xaml
│ │ └── ProductTemplate.xaml.cs
│ ├── EventBus/
│ │ ├── Abstractions/
│ │ │ ├── EventBusSubscriptionInfo.cs
│ │ │ ├── IEventBus.cs
│ │ │ ├── IEventBusBuilder.cs
│ │ │ └── IIntegrationEventHandler.cs
│ │ ├── EventBus.csproj
│ │ ├── Events/
│ │ │ └── IntegrationEvent.cs
│ │ ├── Extensions/
│ │ │ ├── EventBusBuilderExtensions.cs
│ │ │ └── GenericTypeExtensions.cs
│ │ └── GlobalUsings.cs
│ ├── EventBusRabbitMQ/
│ │ ├── EventBusOptions.cs
│ │ ├── EventBusRabbitMQ.csproj
│ │ ├── GlobalUsings.cs
│ │ ├── RabbitMQEventBus.cs
│ │ ├── RabbitMQTelemetry.cs
│ │ └── RabbitMqDependencyInjectionExtensions.cs
│ ├── HybridApp/
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── Components/
│ │ │ ├── Layout/
│ │ │ │ ├── FooterBar.razor
│ │ │ │ ├── FooterBar.razor.css
│ │ │ │ ├── HeaderBar.razor
│ │ │ │ ├── HeaderBar.razor.css
│ │ │ │ ├── MainLayout.razor
│ │ │ │ └── MainLayout.razor.css
│ │ │ ├── Pages/
│ │ │ │ ├── Catalog/
│ │ │ │ │ ├── Catalog.razor
│ │ │ │ │ ├── Catalog.razor.css
│ │ │ │ │ ├── CatalogSearch.razor
│ │ │ │ │ └── CatalogSearch.razor.css
│ │ │ │ └── Item/
│ │ │ │ ├── ItemPage.razor
│ │ │ │ └── ItemPage.razor.css
│ │ │ ├── Routes.razor
│ │ │ └── _Imports.razor
│ │ ├── GlobalSuppressions.cs
│ │ ├── HybridApp.csproj
│ │ ├── MainPage.xaml
│ │ ├── MainPage.xaml.cs
│ │ ├── MauiProgram.cs
│ │ ├── Platforms/
│ │ │ ├── Android/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── MainActivity.cs
│ │ │ │ ├── MainApplication.cs
│ │ │ │ └── Resources/
│ │ │ │ ├── values/
│ │ │ │ │ └── colors.xml
│ │ │ │ └── xml/
│ │ │ │ └── network_security_config.xml
│ │ │ ├── MacCatalyst/
│ │ │ │ ├── AppDelegate.cs
│ │ │ │ ├── Entitlements.Debug.plist
│ │ │ │ ├── Entitlements.Release.plist
│ │ │ │ ├── Info.plist
│ │ │ │ └── Program.cs
│ │ │ ├── Tizen/
│ │ │ │ ├── Main.cs
│ │ │ │ └── tizen-manifest.xml
│ │ │ ├── Windows/
│ │ │ │ ├── App.xaml
│ │ │ │ ├── App.xaml.cs
│ │ │ │ ├── Package.appxmanifest
│ │ │ │ └── app.manifest
│ │ │ └── iOS/
│ │ │ ├── AppDelegate.cs
│ │ │ ├── Info.plist
│ │ │ └── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Resources/
│ │ │ └── Raw/
│ │ │ └── AboutAssets.txt
│ │ ├── Services/
│ │ │ ├── CatalogJsonContext.cs
│ │ │ ├── CatalogService.cs
│ │ │ └── ProductImageUrlProvider.cs
│ │ └── wwwroot/
│ │ ├── css/
│ │ │ ├── app.css
│ │ │ └── normalize.css
│ │ └── index.html
│ ├── Identity.API/
│ │ ├── .gitignore
│ │ ├── Configuration/
│ │ │ └── Config.cs
│ │ ├── Data/
│ │ │ ├── ApplicationDbContext.cs
│ │ │ └── Migrations/
│ │ │ ├── 20230925223402_InitialMigration.Designer.cs
│ │ │ ├── 20230925223402_InitialMigration.cs
│ │ │ └── ApplicationDbContextModelSnapshot.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Identity.API.csproj
│ │ ├── Models/
│ │ │ ├── AccountViewModels/
│ │ │ │ ├── ForgotPasswordViewModel.cs
│ │ │ │ ├── LoggedOutViewModel.cs
│ │ │ │ ├── LoginViewModel.cs
│ │ │ │ ├── LogoutViewModel.cs
│ │ │ │ ├── RedirectViewModel.cs
│ │ │ │ ├── RegisterViewModel.cs
│ │ │ │ ├── ResetPasswordViewModel.cs
│ │ │ │ ├── SendCodeViewModel.cs
│ │ │ │ └── VerifyCodeViewModel.cs
│ │ │ ├── ApplicationUser.cs
│ │ │ ├── ConsentViewModels/
│ │ │ │ ├── ConsentInputModel.cs
│ │ │ │ ├── ConsentOptions.cs
│ │ │ │ ├── ConsentViewModel.cs
│ │ │ │ ├── ProcessConsentResult.cs
│ │ │ │ └── ScopeViewModel.cs
│ │ │ ├── ErrorViewModel.cs
│ │ │ └── ManageViewModels/
│ │ │ ├── AddPhoneNumberViewModel.cs
│ │ │ ├── ChangePasswordViewModel.cs
│ │ │ ├── ConfigureTwoFactorViewModel.cs
│ │ │ ├── FactorViewModel.cs
│ │ │ ├── IndexViewModel.cs
│ │ │ ├── SetPasswordViewModel.cs
│ │ │ └── VerifyPhoneNumberViewModel.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Quickstart/
│ │ │ ├── Account/
│ │ │ │ ├── AccountController.cs
│ │ │ │ ├── AccountOptions.cs
│ │ │ │ ├── ExternalController.cs
│ │ │ │ ├── ExternalProvider.cs
│ │ │ │ ├── LoggedOutViewModel.cs
│ │ │ │ ├── LoginInputModel.cs
│ │ │ │ ├── LoginViewModel.cs
│ │ │ │ ├── LogoutInputModel.cs
│ │ │ │ ├── LogoutViewModel.cs
│ │ │ │ └── RedirectViewModel.cs
│ │ │ ├── Consent/
│ │ │ │ ├── ConsentController.cs
│ │ │ │ ├── ConsentInputModel.cs
│ │ │ │ ├── ConsentOptions.cs
│ │ │ │ ├── ConsentViewModel.cs
│ │ │ │ ├── ProcessConsentResult.cs
│ │ │ │ └── ScopeViewModel.cs
│ │ │ ├── Device/
│ │ │ │ ├── DeviceAuthorizationInputModel.cs
│ │ │ │ ├── DeviceAuthorizationViewModel.cs
│ │ │ │ └── DeviceController.cs
│ │ │ ├── Diagnostics/
│ │ │ │ ├── DiagnosticsController.cs
│ │ │ │ └── DiagnosticsViewModel.cs
│ │ │ ├── Extensions.cs
│ │ │ ├── Grants/
│ │ │ │ ├── GrantsController.cs
│ │ │ │ └── GrantsViewModel.cs
│ │ │ ├── Home/
│ │ │ │ ├── ErrorViewModel.cs
│ │ │ │ └── HomeController.cs
│ │ │ └── SecurityHeadersAttribute.cs
│ │ ├── Services/
│ │ │ ├── EFLoginService.cs
│ │ │ ├── ILoginService.cs
│ │ │ ├── IRedirectService.cs
│ │ │ ├── ProfileService.cs
│ │ │ └── RedirectService.cs
│ │ ├── UsersSeed.cs
│ │ ├── Views/
│ │ │ ├── Account/
│ │ │ │ ├── AccessDenied.cshtml
│ │ │ │ ├── LoggedOut.cshtml
│ │ │ │ ├── Login.cshtml
│ │ │ │ └── Logout.cshtml
│ │ │ ├── Consent/
│ │ │ │ └── Index.cshtml
│ │ │ ├── Device/
│ │ │ │ ├── Success.cshtml
│ │ │ │ ├── UserCodeCapture.cshtml
│ │ │ │ └── UserCodeConfirmation.cshtml
│ │ │ ├── Diagnostics/
│ │ │ │ └── Index.cshtml
│ │ │ ├── Grants/
│ │ │ │ └── Index.cshtml
│ │ │ ├── Home/
│ │ │ │ └── Index.cshtml
│ │ │ ├── Shared/
│ │ │ │ ├── Error.cshtml
│ │ │ │ ├── Redirect.cshtml
│ │ │ │ ├── _Layout.cshtml
│ │ │ │ ├── _ScopeListItem.cshtml
│ │ │ │ └── _ValidationSummary.cshtml
│ │ │ ├── _ViewImports.cshtml
│ │ │ └── _ViewStart.cshtml
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ ├── bundleconfig.json
│ │ ├── libman.json
│ │ ├── tempkey.jwk
│ │ └── wwwroot/
│ │ ├── _references.js
│ │ ├── css/
│ │ │ └── site.css
│ │ └── js/
│ │ ├── signin-redirect.js
│ │ ├── signout-redirect.js
│ │ └── site.js
│ ├── IntegrationEventLogEF/
│ │ ├── EventStateEnum.cs
│ │ ├── GlobalUsings.cs
│ │ ├── IntegrationEventLogEF.csproj
│ │ ├── IntegrationEventLogEntry.cs
│ │ ├── IntegrationLogExtensions.cs
│ │ ├── Services/
│ │ │ ├── IIntegrationEventLogService.cs
│ │ │ └── IntegrationEventLogService.cs
│ │ └── Utilities/
│ │ └── ResilientTransaction.cs
│ ├── OrderProcessor/
│ │ ├── BackgroundTaskOptions.cs
│ │ ├── Events/
│ │ │ └── GracePeriodConfirmedIntegrationEvent.cs
│ │ ├── Extensions/
│ │ │ └── Extensions.cs
│ │ ├── GlobalUsings.cs
│ │ ├── OrderProcessor.csproj
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Services/
│ │ │ └── GracePeriodManagerService.cs
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── Ordering.API/
│ │ ├── Apis/
│ │ │ ├── OrderServices.cs
│ │ │ └── OrdersApi.cs
│ │ ├── Application/
│ │ │ ├── Behaviors/
│ │ │ │ ├── LoggingBehavior.cs
│ │ │ │ ├── TransactionBehavior.cs
│ │ │ │ └── ValidatorBehavior.cs
│ │ │ ├── Commands/
│ │ │ │ ├── CancelOrderCommand.cs
│ │ │ │ ├── CancelOrderCommandHandler.cs
│ │ │ │ ├── CreateOrderCommand.cs
│ │ │ │ ├── CreateOrderCommandHandler.cs
│ │ │ │ ├── CreateOrderDraftCommand.cs
│ │ │ │ ├── CreateOrderDraftCommandHandler.cs
│ │ │ │ ├── IdentifiedCommand.cs
│ │ │ │ ├── IdentifiedCommandHandler.cs
│ │ │ │ ├── SetAwaitingValidationOrderStatusCommand.cs
│ │ │ │ ├── SetAwaitingValidationOrderStatusCommandHandler.cs
│ │ │ │ ├── SetPaidOrderStatusCommand.cs
│ │ │ │ ├── SetPaidOrderStatusCommandHandler.cs
│ │ │ │ ├── SetStockConfirmedOrderStatusCommand.cs
│ │ │ │ ├── SetStockConfirmedOrderStatusCommandHandler.cs
│ │ │ │ ├── SetStockRejectedOrderStatusCommand.cs
│ │ │ │ ├── SetStockRejectedOrderStatusCommandHandler.cs
│ │ │ │ ├── ShipOrderCommand.cs
│ │ │ │ └── ShipOrderCommandHandler.cs
│ │ │ ├── DomainEventHandlers/
│ │ │ │ ├── OrderCancelledDomainEventHandler.cs
│ │ │ │ ├── OrderShippedDomainEventHandler.cs
│ │ │ │ ├── OrderStatusChangedToAwaitingValidationDomainEventHandler.cs
│ │ │ │ ├── OrderStatusChangedToPaidDomainEventHandler.cs
│ │ │ │ ├── OrderStatusChangedToStockConfirmedDomainEventHandler.cs
│ │ │ │ ├── UpdateOrderWhenBuyerAndPaymentMethodVerifiedDomainEventHandler.cs
│ │ │ │ └── ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs
│ │ │ ├── IntegrationEvents/
│ │ │ │ ├── EventHandling/
│ │ │ │ │ ├── GracePeriodConfirmedIntegrationEventHandler.cs
│ │ │ │ │ ├── OrderPaymentFailedIntegrationEventHandler.cs
│ │ │ │ │ ├── OrderPaymentSucceededIntegrationEventHandler.cs
│ │ │ │ │ ├── OrderStockConfirmedIntegrationEventHandler.cs
│ │ │ │ │ └── OrderStockRejectedIntegrationEventHandler.cs
│ │ │ │ ├── Events/
│ │ │ │ │ ├── GracePeriodConfirmedIntegrationEvent.cs
│ │ │ │ │ ├── OrderPaymentFailedIntegrationEvent .cs
│ │ │ │ │ ├── OrderPaymentSucceededIntegrationEvent.cs
│ │ │ │ │ ├── OrderStartedIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToAwaitingValidationIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToCancelledIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToPaidIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToShippedIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToStockConfirmedIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedTosubmittedIntegrationEvent.cs
│ │ │ │ │ ├── OrderStockConfirmedIntegrationEvent.cs
│ │ │ │ │ └── OrderStockRejectedIntegrationEvent.cs
│ │ │ │ ├── IOrderingIntegrationEventService.cs
│ │ │ │ └── OrderingIntegrationEventService.cs
│ │ │ ├── Models/
│ │ │ │ ├── BasketItem.cs
│ │ │ │ └── CustomerBasket.cs
│ │ │ ├── Queries/
│ │ │ │ ├── IOrderQueries.cs
│ │ │ │ ├── OrderQueries.cs
│ │ │ │ └── OrderViewModel.cs
│ │ │ └── Validations/
│ │ │ ├── CancelOrderCommandValidator.cs
│ │ │ ├── CreateOrderCommandValidator.cs
│ │ │ ├── IdentifiedCommandValidator.cs
│ │ │ └── ShipOrderCommandValidator.cs
│ │ ├── Extensions/
│ │ │ ├── BasketItemExtensions.cs
│ │ │ ├── Extensions.cs
│ │ │ ├── LinqSelectExtensions.cs
│ │ │ └── OrderingApiTrace.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Infrastructure/
│ │ │ ├── OrderingContextSeed.cs
│ │ │ └── Services/
│ │ │ ├── IIdentityService.cs
│ │ │ └── IdentityService.cs
│ │ ├── Ordering.API.csproj
│ │ ├── Program.Testing.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── Ordering.Domain/
│ │ ├── AggregatesModel/
│ │ │ ├── BuyerAggregate/
│ │ │ │ ├── Buyer.cs
│ │ │ │ ├── CardType.cs
│ │ │ │ ├── IBuyerRepository.cs
│ │ │ │ └── PaymentMethod.cs
│ │ │ └── OrderAggregate/
│ │ │ ├── Address.cs
│ │ │ ├── IOrderRepository.cs
│ │ │ ├── Order.cs
│ │ │ ├── OrderItem.cs
│ │ │ └── OrderStatus.cs
│ │ ├── Events/
│ │ │ ├── BuyerPaymentMethodVerifiedDomainEvent.cs
│ │ │ ├── OrderCancelledDomainEvent.cs
│ │ │ ├── OrderShippedDomainEvent.cs
│ │ │ ├── OrderStartedDomainEvent.cs
│ │ │ ├── OrderStatusChangedToAwaitingValidationDomainEvent.cs
│ │ │ ├── OrderStatusChangedToPaidDomainEvent.cs
│ │ │ └── OrderStatusChangedToStockConfirmedDomainEvent.cs
│ │ ├── Exceptions/
│ │ │ └── OrderingDomainException.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Ordering.Domain.csproj
│ │ └── SeedWork/
│ │ ├── Entity.cs
│ │ ├── IAggregateRoot.cs
│ │ ├── IRepository.cs
│ │ ├── IUnitOfWork.cs
│ │ └── ValueObject.cs
│ ├── Ordering.Infrastructure/
│ │ ├── EntityConfigurations/
│ │ │ ├── BuyerEntityTypeConfiguration.cs
│ │ │ ├── CardTypeEntityTypeConfiguration.cs
│ │ │ ├── ClientRequestEntityTypeConfiguration.cs
│ │ │ ├── OrderEntityTypeConfiguration.cs
│ │ │ ├── OrderItemEntityTypeConfiguration.cs
│ │ │ └── PaymentMethodEntityTypeConfiguration.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Idempotency/
│ │ │ ├── ClientRequest.cs
│ │ │ ├── IRequestManager.cs
│ │ │ └── RequestManager.cs
│ │ ├── MediatorExtension.cs
│ │ ├── Migrations/
│ │ │ ├── 20230925222426_Initial.Designer.cs
│ │ │ ├── 20230925222426_Initial.cs
│ │ │ ├── 20231021004633_FixOrderitemseqSchema.Designer.cs
│ │ │ ├── 20231021004633_FixOrderitemseqSchema.cs
│ │ │ ├── 20231026091055_Outbox.Designer.cs
│ │ │ ├── 20231026091055_Outbox.cs
│ │ │ ├── 20240106121712_UseEnumForOrderStatus.Designer.cs
│ │ │ ├── 20240106121712_UseEnumForOrderStatus.cs
│ │ │ └── OrderingContextModelSnapshot.cs
│ │ ├── Ordering.Infrastructure.csproj
│ │ ├── OrderingContext.cs
│ │ └── Repositories/
│ │ ├── BuyerRepository.cs
│ │ └── OrderRepository.cs
│ ├── PaymentProcessor/
│ │ ├── GlobalUsings.cs
│ │ ├── IntegrationEvents/
│ │ │ ├── EventHandling/
│ │ │ │ └── OrderStatusChangedToStockConfirmedIntegrationEventHandler.cs
│ │ │ └── Events/
│ │ │ ├── OrderPaymentFailedIntegrationEvent.cs
│ │ │ ├── OrderPaymentSucceededIntegrationEvent.cs
│ │ │ └── OrderStatusChangedToStockConfirmedIntegrationEvent.cs
│ │ ├── PaymentOptions.cs
│ │ ├── PaymentProcessor.csproj
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── Shared/
│ │ ├── ActivityExtensions.cs
│ │ └── MigrateDbContextExtensions.cs
│ ├── WebApp/
│ │ ├── Components/
│ │ │ ├── App.razor
│ │ │ ├── Chatbot/
│ │ │ │ ├── ChatState.cs
│ │ │ │ ├── Chatbot.razor
│ │ │ │ ├── Chatbot.razor.css
│ │ │ │ ├── Chatbot.razor.js
│ │ │ │ ├── MessageProcessor.cs
│ │ │ │ ├── ShowChatbotButton.razor
│ │ │ │ └── ShowChatbotButton.razor.css
│ │ │ ├── Layout/
│ │ │ │ ├── CartMenu.razor
│ │ │ │ ├── CartMenu.razor.css
│ │ │ │ ├── FooterBar.razor
│ │ │ │ ├── FooterBar.razor.css
│ │ │ │ ├── HeaderBar.razor
│ │ │ │ ├── HeaderBar.razor.css
│ │ │ │ ├── MainLayout.razor
│ │ │ │ ├── MainLayout.razor.css
│ │ │ │ ├── UserMenu.razor
│ │ │ │ └── UserMenu.razor.css
│ │ │ ├── Pages/
│ │ │ │ ├── Cart/
│ │ │ │ │ ├── CartPage.razor
│ │ │ │ │ └── CartPage.razor.css
│ │ │ │ ├── Catalog/
│ │ │ │ │ ├── Catalog.razor
│ │ │ │ │ └── Catalog.razor.css
│ │ │ │ ├── Checkout/
│ │ │ │ │ ├── Checkout.razor
│ │ │ │ │ └── Checkout.razor.css
│ │ │ │ ├── Item/
│ │ │ │ │ ├── ItemPage.razor
│ │ │ │ │ └── ItemPage.razor.css
│ │ │ │ └── User/
│ │ │ │ ├── LogIn.razor
│ │ │ │ ├── LogOut.razor
│ │ │ │ ├── Orders.razor
│ │ │ │ ├── Orders.razor.css
│ │ │ │ └── OrdersRefreshOnStatusChange.razor
│ │ │ ├── Routes.razor
│ │ │ └── _Imports.razor
│ │ ├── Extensions/
│ │ │ └── Extensions.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Services/
│ │ │ ├── BasketCheckoutInfo.cs
│ │ │ ├── BasketItem.cs
│ │ │ ├── BasketService.cs
│ │ │ ├── BasketState.cs
│ │ │ ├── IBasketState.cs
│ │ │ ├── LogOutService.cs
│ │ │ ├── OrderStatus/
│ │ │ │ ├── IntegrationEvents/
│ │ │ │ │ ├── EventHandling/
│ │ │ │ │ │ ├── OrderStatusChangedToAwaitingValidationIntegrationEventHandler.cs
│ │ │ │ │ │ ├── OrderStatusChangedToCancelledIntegrationEventHandler.cs
│ │ │ │ │ │ ├── OrderStatusChangedToPaidIntegrationEventHandler.cs
│ │ │ │ │ │ ├── OrderStatusChangedToShippedIntegrationEventHandler.cs
│ │ │ │ │ │ ├── OrderStatusChangedToStockConfirmedIntegrationEventHandler.cs
│ │ │ │ │ │ └── OrderStatusChangedToSubmittedIntegrationEventHandler.cs
│ │ │ │ │ └── Events/
│ │ │ │ │ ├── OrderStatusChangedToAwaitingValidationIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToCancelledIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToPaidIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToShippedIntegrationEvent.cs
│ │ │ │ │ ├── OrderStatusChangedToStockConfirmedIntegrationEvent.cs
│ │ │ │ │ └── OrderStatusChangedToSubmittedIntegrationEvent.cs
│ │ │ │ └── OrderStatusNotificationService.cs
│ │ │ ├── OrderingService.cs
│ │ │ └── ProductImageUrlProvider.cs
│ │ ├── WebApp.csproj
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot/
│ │ └── css/
│ │ ├── app.css
│ │ └── normalize.css
│ ├── WebAppComponents/
│ │ ├── Catalog/
│ │ │ ├── CatalogItem.cs
│ │ │ ├── CatalogListItem.razor
│ │ │ ├── CatalogListItem.razor.css
│ │ │ ├── CatalogSearch.razor
│ │ │ └── CatalogSearch.razor.css
│ │ ├── Item/
│ │ │ └── ItemHelper.cs
│ │ ├── Services/
│ │ │ ├── CatalogService.cs
│ │ │ ├── ICatalogService.cs
│ │ │ └── IProductImageUrlProvider.cs
│ │ ├── WebAppComponents.csproj
│ │ └── _Imports.razor
│ ├── WebhookClient/
│ │ ├── Components/
│ │ │ ├── App.razor
│ │ │ ├── App.razor.css
│ │ │ ├── Layout/
│ │ │ │ ├── MainLayout.razor
│ │ │ │ ├── MainLayout.razor.css
│ │ │ │ ├── UserMenu.razor
│ │ │ │ └── UserMenu.razor.css
│ │ │ ├── Pages/
│ │ │ │ ├── AddWebhook.razor
│ │ │ │ ├── Error.razor
│ │ │ │ ├── Home/
│ │ │ │ │ ├── Home.razor
│ │ │ │ │ ├── Home.razor.css
│ │ │ │ │ ├── ReceivedMessages.razor
│ │ │ │ │ └── RegisteredHooks.razor
│ │ │ │ └── LogIn.razor
│ │ │ ├── Routes.razor
│ │ │ └── _Imports.razor
│ │ ├── Endpoints/
│ │ │ ├── AuthenticationEndpoints.cs
│ │ │ └── WebhookEndpoints.cs
│ │ ├── Extensions/
│ │ │ └── Extensions.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Services/
│ │ │ ├── HooksRepository.cs
│ │ │ ├── WebHookReceived.cs
│ │ │ ├── WebHooksClient.cs
│ │ │ ├── WebhookClientOptions.cs
│ │ │ ├── WebhookData.cs
│ │ │ ├── WebhookResponse.cs
│ │ │ ├── WebhookSubscriptionRequest.cs
│ │ │ └── WebhookType.cs
│ │ ├── WebhookClient.csproj
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot/
│ │ └── app.css
│ ├── Webhooks.API/
│ │ ├── Apis/
│ │ │ └── WebHooksApi.cs
│ │ ├── Exceptions/
│ │ │ └── WebhooksDomainException.cs
│ │ ├── Extensions/
│ │ │ ├── Extensions.cs
│ │ │ └── RouteHandlerBuilderExtensions.cs
│ │ ├── GlobalUsings.cs
│ │ ├── Infrastructure/
│ │ │ └── WebhooksContext.cs
│ │ ├── IntegrationEvents/
│ │ │ ├── OrderStatusChangedToPaidIntegrationEvent.cs
│ │ │ ├── OrderStatusChangedToPaidIntegrationEventHandler.cs
│ │ │ ├── OrderStatusChangedToShippedIntegrationEvent.cs
│ │ │ ├── OrderStatusChangedToShippedIntegrationEventHandler.cs
│ │ │ ├── OrderStockItem.cs
│ │ │ ├── ProductPriceChangedIntegrationEvent.cs
│ │ │ └── ProductPriceChangedIntegrationEventHandler.cs
│ │ ├── Migrations/
│ │ │ ├── 20230925222606_Initial.Designer.cs
│ │ │ ├── 20230925222606_Initial.cs
│ │ │ └── WebhooksContextModelSnapshot.cs
│ │ ├── Model/
│ │ │ ├── WebhookData.cs
│ │ │ ├── WebhookSubscription.cs
│ │ │ ├── WebhookSubscriptionRequest.cs
│ │ │ └── WebhookType.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── Services/
│ │ │ ├── GrantUrlTesterService.cs
│ │ │ ├── IGrantUrlTesterService.cs
│ │ │ ├── IWebhooksRetriever.cs
│ │ │ ├── IWebhooksSender.cs
│ │ │ ├── WebhooksRetriever.cs
│ │ │ └── WebhooksSender.cs
│ │ ├── Webhooks.API.csproj
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── eShop.AppHost/
│ │ ├── Extensions.cs
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.json
│ │ └── eShop.AppHost.csproj
│ └── eShop.ServiceDefaults/
│ ├── AuthenticationExtensions.cs
│ ├── ClaimsPrincipalExtensions.cs
│ ├── ConfigurationExtensions.cs
│ ├── Extensions.cs
│ ├── HttpClientExtensions.cs
│ ├── OpenApi.Extensions.cs
│ ├── OpenApiOptionsExtensions.cs
│ └── eShop.ServiceDefaults.csproj
└── tests/
├── Basket.UnitTests/
│ ├── Basket.UnitTests.csproj
│ ├── BasketServiceTests.cs
│ ├── GlobalUsings.cs
│ └── Helpers/
│ └── TestServerCallContext.cs
├── Catalog.FunctionalTests/
│ ├── Catalog.FunctionalTests.csproj
│ ├── CatalogApiFixture.cs
│ ├── CatalogApiTests.cs
│ └── GlobalUsings.cs
├── ClientApp.UnitTests/
│ ├── ClientApp.UnitTests.csproj
│ ├── ClientApp.UnitTests.sln
│ ├── GlobalUsings.cs
│ ├── Mocks/
│ │ ├── MockDialogService.cs
│ │ ├── MockNavigationService.cs
│ │ ├── MockSettingsService.cs
│ │ └── MockViewModel.cs
│ ├── Services/
│ │ ├── BasketServiceTests.cs
│ │ ├── CatalogServiceTests.cs
│ │ └── OrdersServiceTests.cs
│ ├── TestingExtensions.cs
│ └── ViewModels/
│ ├── CatalogItemViewModelTests.cs
│ ├── CatalogViewModelTests.cs
│ ├── MainViewModelTests.cs
│ ├── MockViewModelTests.cs
│ └── OrderViewModelTests.cs
├── Directory.Build.props
├── Ordering.FunctionalTests/
│ ├── AutoAuthorizeMiddleware.cs
│ ├── GlobalUsings.cs
│ ├── Ordering.FunctionalTests.csproj
│ ├── OrderingApiFixture.cs
│ └── OrderingApiTests.cs
├── Ordering.UnitTests/
│ ├── Application/
│ │ ├── IdentifiedCommandHandlerTest.cs
│ │ ├── NewOrderCommandHandlerTest.cs
│ │ ├── OrdersWebApiTest.cs
│ │ └── SetStockRejectedOrderStatusCommandTest.cs
│ ├── Builders.cs
│ ├── Domain/
│ │ ├── BuyerAggregateTest.cs
│ │ ├── OrderAggregateTest.cs
│ │ └── SeedWork/
│ │ └── ValueObjectTests.cs
│ ├── GlobalUsings.cs
│ └── Ordering.UnitTests.csproj
└── README.md
SYMBOL INDEX (1706 symbols across 496 files)
FILE: playwright.config.ts
constant STORAGE_STATE (line 5) | const STORAGE_STATE = path.join(__dirname, 'playwright/.auth/user.json');
FILE: src/Basket.API/Extensions/Extensions.cs
class Extensions (line 8) | public static class Extensions
method AddApplicationServices (line 10) | public static void AddApplicationServices(this IHostApplicationBuilder...
class IntegrationEventContext (line 24) | [JsonSerializable(typeof(OrderStartedIntegrationEvent))]
FILE: src/Basket.API/Extensions/ServerCallContextIdentityExtensions.cs
class ServerCallContextIdentityExtensions (line 5) | internal static class ServerCallContextIdentityExtensions
method GetUserIdentity (line 7) | public static string? GetUserIdentity(this ServerCallContext context) ...
method GetUserName (line 8) | public static string? GetUserName(this ServerCallContext context) => c...
FILE: src/Basket.API/Grpc/BasketService.cs
class BasketService (line 8) | public class BasketService(
method GetBasket (line 12) | [AllowAnonymous]
method UpdateBasket (line 36) | public override async Task<CustomerBasketResponse> UpdateBasket(Update...
method DeleteBasket (line 59) | public override async Task<DeleteBasketResponse> DeleteBasket(DeleteBa...
method ThrowNotAuthenticated (line 71) | [DoesNotReturn]
method ThrowBasketDoesNotExist (line 74) | [DoesNotReturn]
method MapToCustomerBasketResponse (line 77) | private static CustomerBasketResponse MapToCustomerBasketResponse(Cust...
method MapToCustomerBasket (line 93) | private static CustomerBasket MapToCustomerBasket(string userId, Updat...
FILE: src/Basket.API/IntegrationEvents/EventHandling/OrderStartedIntegrationEventHandler.cs
class OrderStartedIntegrationEventHandler (line 6) | public class OrderStartedIntegrationEventHandler(
method Handle (line 10) | public async Task Handle(OrderStartedIntegrationEvent @event)
FILE: src/Basket.API/IntegrationEvents/Events/OrderStartedIntegrationEvent.cs
type OrderStartedIntegrationEvent (line 6) | public record OrderStartedIntegrationEvent(string UserId) : IntegrationE...
FILE: src/Basket.API/Model/BasketItem.cs
class BasketItem (line 3) | public class BasketItem : IValidatableObject
method Validate (line 13) | public IEnumerable<ValidationResult> Validate(ValidationContext valida...
FILE: src/Basket.API/Model/CustomerBasket.cs
class CustomerBasket (line 3) | public class CustomerBasket
method CustomerBasket (line 9) | public CustomerBasket() { }
method CustomerBasket (line 11) | public CustomerBasket(string customerId)
FILE: src/Basket.API/Repositories/IBasketRepository.cs
type IBasketRepository (line 5) | public interface IBasketRepository
method GetBasketAsync (line 7) | Task<CustomerBasket> GetBasketAsync(string customerId);
method UpdateBasketAsync (line 8) | Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket);
method DeleteBasketAsync (line 9) | Task<bool> DeleteBasketAsync(string id);
FILE: src/Basket.API/Repositories/RedisBasketRepository.cs
class RedisBasketRepository (line 6) | public class RedisBasketRepository(ILogger<RedisBasketRepository> logger...
method GetBasketKey (line 16) | private static RedisKey GetBasketKey(string userId) => BasketKeyPrefix...
method DeleteBasketAsync (line 18) | public async Task<bool> DeleteBasketAsync(string id)
method GetBasketAsync (line 23) | public async Task<CustomerBasket> GetBasketAsync(string customerId)
method UpdateBasketAsync (line 34) | public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket bas...
class BasketSerializationContext (line 51) | [JsonSerializable(typeof(CustomerBasket))]
FILE: src/Catalog.API/Apis/CatalogApi.cs
class CatalogApi (line 10) | public static class CatalogApi
method MapCatalogApi (line 12) | public static IEndpointRouteBuilder MapCatalogApi(this IEndpointRouteB...
method GetAllItemsV1 (line 115) | [ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest,...
method GetAllItems (line 123) | [ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest,...
method GetItemsByIds (line 161) | [ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest,...
method GetItemById (line 170) | [ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest,...
method GetItemsByName (line 193) | [ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest,...
method GetItemPictureById (line 202) | [ProducesResponseType<byte[]>(StatusCodes.Status200OK, "application/oc...
method GetItemsBySemanticRelevanceV1 (line 226) | [ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest,...
method GetItemsBySemanticRelevance (line 236) | [ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest,...
method GetItemsByBrandAndTypeId (line 291) | [ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest,...
method GetItemsByBrandId (line 301) | [ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest,...
method UpdateItemV1 (line 310) | public static async Task<Results<Created, BadRequest<ProblemDetails>, ...
method UpdateItem (line 324) | public static async Task<Results<Created, BadRequest<ProblemDetails>, ...
method CreateItem (line 365) | [ProducesResponseType<ProblemDetails>(StatusCodes.Status400BadRequest,...
method DeleteItemById (line 390) | public static async Task<Results<NoContent, NotFound>> DeleteItemById(
method GetImageMimeTypeFromImageFileExtension (line 406) | private static string GetImageMimeTypeFromImageFileExtension(string ex...
method GetFullPath (line 420) | public static string GetFullPath(string contentRootPath, string pictur...
FILE: src/Catalog.API/CatalogOptions.cs
class CatalogOptions (line 3) | public class CatalogOptions
FILE: src/Catalog.API/Extensions/Extensions.cs
class Extensions (line 3) | public static class Extensions
method AddApplicationServices (line 5) | public static void AddApplicationServices(this IHostApplicationBuilder...
FILE: src/Catalog.API/Extensions/HostEnvironmentExtensions.cs
class HostEnvironmentExtensions (line 5) | internal static class HostEnvironmentExtensions
method IsBuild (line 7) | public static bool IsBuild(this IHostEnvironment hostEnvironment)
FILE: src/Catalog.API/Infrastructure/CatalogContext.cs
class CatalogContext (line 8) | public class CatalogContext : DbContext
method CatalogContext (line 10) | public CatalogContext(DbContextOptions<CatalogContext> options, IConfi...
method OnModelCreating (line 18) | protected override void OnModelCreating(ModelBuilder builder)
FILE: src/Catalog.API/Infrastructure/CatalogContextSeed.cs
class CatalogContextSeed (line 7) | public partial class CatalogContextSeed(
method SeedAsync (line 13) | public async Task SeedAsync(CatalogContext context)
class CatalogSourceEntry (line 77) | private class CatalogSourceEntry
FILE: src/Catalog.API/Infrastructure/EntityConfigurations/CatalogBrandEntityTypeConfiguration.cs
class CatalogBrandEntityTypeConfiguration (line 3) | class CatalogBrandEntityTypeConfiguration
method Configure (line 6) | public void Configure(EntityTypeBuilder<CatalogBrand> builder)
FILE: src/Catalog.API/Infrastructure/EntityConfigurations/CatalogItemEntityTypeConfiguration.cs
class CatalogItemEntityTypeConfiguration (line 3) | class CatalogItemEntityTypeConfiguration
method Configure (line 6) | public void Configure(EntityTypeBuilder<CatalogItem> builder)
FILE: src/Catalog.API/Infrastructure/EntityConfigurations/CatalogTypeEntityTypeConfiguration.cs
class CatalogTypeEntityTypeConfiguration (line 3) | class CatalogTypeEntityTypeConfiguration
method Configure (line 6) | public void Configure(EntityTypeBuilder<CatalogType> builder)
FILE: src/Catalog.API/Infrastructure/Exceptions/CatalogDomainException.cs
class CatalogDomainException (line 6) | public class CatalogDomainException : Exception
method CatalogDomainException (line 8) | public CatalogDomainException()
method CatalogDomainException (line 11) | public CatalogDomainException(string message)
method CatalogDomainException (line 15) | public CatalogDomainException(string message, Exception innerException)
FILE: src/Catalog.API/Infrastructure/Migrations/20231009153249_Initial.Designer.cs
class Initial (line 14) | [DbContext(typeof(CatalogContext))]
method BuildTargetModel (line 19) | protected override void BuildTargetModel(ModelBuilder modelBuilder)
FILE: src/Catalog.API/Infrastructure/Migrations/20231009153249_Initial.cs
class Initial (line 9) | public partial class Initial : Migration
method Up (line 12) | protected override void Up(MigrationBuilder migrationBuilder)
method Down (line 99) | protected override void Down(MigrationBuilder migrationBuilder)
FILE: src/Catalog.API/Infrastructure/Migrations/20231018163051_RemoveHiLoAndIndexCatalogName.Designer.cs
class RemoveHiLoAndIndexCatalogName (line 14) | [DbContext(typeof(CatalogContext))]
method BuildTargetModel (line 19) | protected override void BuildTargetModel(ModelBuilder modelBuilder)
FILE: src/Catalog.API/Infrastructure/Migrations/20231018163051_RemoveHiLoAndIndexCatalogName.cs
class RemoveHiLoAndIndexCatalogName (line 9) | public partial class RemoveHiLoAndIndexCatalogName : Migration
method Up (line 12) | protected override void Up(MigrationBuilder migrationBuilder)
method Down (line 57) | protected override void Down(MigrationBuilder migrationBuilder)
FILE: src/Catalog.API/Infrastructure/Migrations/20231026091140_Outbox.Designer.cs
class Outbox (line 15) | [DbContext(typeof(CatalogContext))]
method BuildTargetModel (line 20) | protected override void BuildTargetModel(ModelBuilder modelBuilder)
FILE: src/Catalog.API/Infrastructure/Migrations/20231026091140_Outbox.cs
class Outbox (line 9) | public partial class Outbox : Migration
method Up (line 12) | protected override void Up(MigrationBuilder migrationBuilder)
method Down (line 33) | protected override void Down(MigrationBuilder migrationBuilder)
FILE: src/Catalog.API/Infrastructure/Migrations/CatalogContextModelSnapshot.cs
class CatalogContextModelSnapshot (line 14) | [DbContext(typeof(CatalogContext))]
method BuildModel (line 17) | protected override void BuildModel(ModelBuilder modelBuilder)
FILE: src/Catalog.API/IntegrationEvents/CatalogIntegrationEventService.cs
class CatalogIntegrationEventService (line 3) | public sealed class CatalogIntegrationEventService(ILogger<CatalogIntegr...
method PublishThroughEventBusAsync (line 11) | public async Task PublishThroughEventBusAsync(IntegrationEvent evt)
method SaveEventAndCatalogContextChangesAsync (line 28) | public async Task SaveEventAndCatalogContextChangesAsync(IntegrationEv...
method Dispose (line 42) | private void Dispose(bool disposing)
method Dispose (line 55) | public void Dispose()
FILE: src/Catalog.API/IntegrationEvents/EventHandling/OrderStatusChangedToAwaitingValidationIntegrationEventHandler.cs
class OrderStatusChangedToAwaitingValidationIntegrationEventHandler (line 3) | public class OrderStatusChangedToAwaitingValidationIntegrationEventHandler(
method Handle (line 9) | public async Task Handle(OrderStatusChangedToAwaitingValidationIntegra...
FILE: src/Catalog.API/IntegrationEvents/EventHandling/OrderStatusChangedToPaidIntegrationEventHandler.cs
class OrderStatusChangedToPaidIntegrationEventHandler (line 3) | public class OrderStatusChangedToPaidIntegrationEventHandler(
method Handle (line 8) | public async Task Handle(OrderStatusChangedToPaidIntegrationEvent @event)
FILE: src/Catalog.API/IntegrationEvents/Events/ConfirmedOrderStockItem.cs
type ConfirmedOrderStockItem (line 3) | public record ConfirmedOrderStockItem(int ProductId, bool HasStock);
FILE: src/Catalog.API/IntegrationEvents/Events/OrderStatusChangedToAwaitingValidationIntegrationEvent.cs
type OrderStatusChangedToAwaitingValidationIntegrationEvent (line 3) | public record OrderStatusChangedToAwaitingValidationIntegrationEvent(int...
FILE: src/Catalog.API/IntegrationEvents/Events/OrderStatusChangedToPaidIntegrationEvent.cs
type OrderStatusChangedToPaidIntegrationEvent (line 3) | public record OrderStatusChangedToPaidIntegrationEvent(int OrderId, IEnu...
FILE: src/Catalog.API/IntegrationEvents/Events/OrderStockConfirmedIntegrationEvent.cs
type OrderStockConfirmedIntegrationEvent (line 3) | public record OrderStockConfirmedIntegrationEvent(int OrderId) : Integra...
FILE: src/Catalog.API/IntegrationEvents/Events/OrderStockItem.cs
type OrderStockItem (line 3) | public record OrderStockItem(int ProductId, int Units);
FILE: src/Catalog.API/IntegrationEvents/Events/OrderStockRejectedIntegrationEvent.cs
type OrderStockRejectedIntegrationEvent (line 3) | public record OrderStockRejectedIntegrationEvent(int OrderId, List<Confi...
FILE: src/Catalog.API/IntegrationEvents/Events/ProductPriceChangedIntegrationEvent.cs
type ProductPriceChangedIntegrationEvent (line 6) | public record ProductPriceChangedIntegrationEvent(int ProductId, decimal...
FILE: src/Catalog.API/IntegrationEvents/ICatalogIntegrationEventService.cs
type ICatalogIntegrationEventService (line 3) | public interface ICatalogIntegrationEventService
method SaveEventAndCatalogContextChangesAsync (line 5) | Task SaveEventAndCatalogContextChangesAsync(IntegrationEvent evt);
method PublishThroughEventBusAsync (line 6) | Task PublishThroughEventBusAsync(IntegrationEvent evt);
FILE: src/Catalog.API/Model/CatalogBrand.cs
class CatalogBrand (line 5) | public class CatalogBrand
method CatalogBrand (line 7) | public CatalogBrand(string brand) {
FILE: src/Catalog.API/Model/CatalogItem.cs
class CatalogItem (line 7) | public class CatalogItem
method CatalogItem (line 47) | public CatalogItem(string name) { Name = name; }
method RemoveStock (line 62) | public int RemoveStock(int quantityDesired)
method AddStock (line 86) | public int AddStock(int quantity)
FILE: src/Catalog.API/Model/CatalogServices.cs
class CatalogServices (line 4) | public class CatalogServices(
FILE: src/Catalog.API/Model/CatalogType.cs
class CatalogType (line 5) | public class CatalogType
method CatalogType (line 7) | public CatalogType(string type) {
FILE: src/Catalog.API/Model/PaginatedItems.cs
class PaginatedItems (line 5) | public class PaginatedItems<TEntity>(int pageIndex, int pageSize, long c...
FILE: src/Catalog.API/Model/PaginationRequest.cs
type PaginationRequest (line 5) | public record PaginationRequest(
FILE: src/Catalog.API/Program.Testing.cs
class Program (line 6) | public partial class Program { }
FILE: src/Catalog.API/Services/CatalogAI.cs
class CatalogAI (line 7) | public sealed class CatalogAI : ICatalogAI
method CatalogAI (line 17) | public CatalogAI(IWebHostEnvironment environment, ILogger<CatalogAI> l...
method GetEmbeddingAsync (line 28) | public ValueTask<Vector?> GetEmbeddingAsync(CatalogItem item) =>
method GetEmbeddingsAsync (line 34) | public async ValueTask<IReadOnlyList<Vector>?> GetEmbeddingsAsync(IEnu...
method GetEmbeddingAsync (line 55) | public async ValueTask<Vector?> GetEmbeddingAsync(string text)
method CatalogItemToString (line 75) | private static string CatalogItemToString(CatalogItem item) => $"{item...
FILE: src/Catalog.API/Services/ICatalogAI.cs
type ICatalogAI (line 5) | public interface ICatalogAI
method GetEmbeddingAsync (line 11) | ValueTask<Vector?> GetEmbeddingAsync(string text);
method GetEmbeddingAsync (line 14) | ValueTask<Vector?> GetEmbeddingAsync(CatalogItem item);
method GetEmbeddingsAsync (line 17) | ValueTask<IReadOnlyList<Vector>?> GetEmbeddingsAsync(IEnumerable<Catal...
FILE: src/ClientApp/Animations/Base/AnimationBase.cs
class AnimationBase (line 5) | public abstract class AnimationBase : BindableObject
method BeginAnimation (line 59) | protected abstract Task BeginAnimation();
method Begin (line 61) | public async Task Begin()
method ResetAnimation (line 83) | protected abstract Task ResetAnimation();
method Reset (line 85) | public async Task Reset()
method InternalBegin (line 91) | private async Task InternalBegin()
FILE: src/ClientApp/Animations/Base/EasingType.cs
type EasingType (line 3) | public enum EasingType
FILE: src/ClientApp/Animations/FadeToAnimation.cs
class FadeToAnimation (line 6) | public class FadeToAnimation : AnimationBase
method BeginAnimation (line 19) | protected override Task BeginAnimation()
method ResetAnimation (line 29) | protected override Task ResetAnimation()
class FadeInAnimation (line 40) | public class FadeInAnimation : AnimationBase
type FadeDirection (line 42) | public enum FadeDirection
method BeginAnimation (line 59) | protected override Task BeginAnimation()
method ResetAnimation (line 71) | protected override Task ResetAnimation()
method FadeIn (line 83) | internal Animation FadeIn()
class FadeOutAnimation (line 98) | public class FadeOutAnimation : AnimationBase
type FadeDirection (line 100) | public enum FadeDirection
method BeginAnimation (line 117) | protected override Task BeginAnimation()
method ResetAnimation (line 129) | protected override Task ResetAnimation()
method FadeOut (line 141) | internal Animation FadeOut()
FILE: src/ClientApp/Animations/StoryBoard.cs
class StoryBoard (line 5) | [ContentProperty("Animations")]
method StoryBoard (line 8) | public StoryBoard()
method StoryBoard (line 13) | public StoryBoard(List<AnimationBase> animations)
method BeginAnimation (line 20) | protected override async Task BeginAnimation()
method ResetAnimation (line 33) | protected override async Task ResetAnimation()
FILE: src/ClientApp/App.xaml.cs
class App (line 12) | public partial class App : Application
method App (line 20) | public App(
method CreateWindow (line 39) | protected override Window CreateWindow(IActivationState activationState)
method InitApp (line 44) | private void InitApp()
method OnStart (line 57) | protected override async void OnStart()
method OnSleep (line 74) | protected override void OnSleep()
method OnResume (line 80) | protected override void OnResume()
method App_RequestedThemeChanged (line 86) | private void App_RequestedThemeChanged(object sender, AppThemeChangedE...
method SetStatusBar (line 91) | private void SetStatusBar()
method GetGpsLocation (line 115) | private async Task GetGpsLocation()
method SendCurrentLocation (line 140) | private async Task SendCurrentLocation()
method HandleAppActions (line 151) | public static void HandleAppActions(AppAction appAction)
FILE: src/ClientApp/AppActions.cs
class AppActions (line 3) | public static class AppActions
FILE: src/ClientApp/AppShell.xaml.cs
class AppShell (line 6) | public partial class AppShell : Shell
method AppShell (line 10) | public AppShell(INavigationService navigationService)
method OnHandlerChanged (line 18) | protected override async void OnHandlerChanged()
method InitializeRouting (line 28) | private static void InitializeRouting()
FILE: src/ClientApp/Controls/AddBasketButton.xaml.cs
class AddBasketButton (line 3) | public partial class AddBasketButton : Grid
method AddBasketButton (line 5) | public AddBasketButton()
FILE: src/ClientApp/Controls/CustomTabbedPage.cs
class CustomTabbedPage (line 3) | public class CustomTabbedPage : TabbedPage
method GetBadgeText (line 11) | public static string GetBadgeText(BindableObject view)
method SetBadgeText (line 16) | public static void SetBadgeText(BindableObject view, string value)
method GetBadgeColor (line 21) | public static Color GetBadgeColor(BindableObject view)
method SetBadgeColor (line 26) | public static void SetBadgeColor(BindableObject view, Color value)
FILE: src/ClientApp/Controls/ToggleButton.cs
class ToggleButton (line 5) | public class ToggleButton : ContentView
method ToggleButton (line 29) | public ToggleButton()
method Initialize (line 81) | private void Initialize()
method OnParentSet (line 93) | protected override void OnParentSet()
method OnCheckedChanged (line 100) | private static async void OnCheckedChanged(BindableObject bindable, ob...
FILE: src/ClientApp/Converters/DoesNotHaveCountConverter.cs
class DoesNotHaveCountConverter (line 6) | public class DoesNotHaveCountConverter : BaseConverterOneWay<int, bool>
method ConvertFrom (line 10) | public override bool ConvertFrom(int value, CultureInfo culture)
FILE: src/ClientApp/Converters/DoubleConverter.cs
class DoubleConverter (line 6) | public class DoubleConverter : BaseConverter<double, string>
method ConvertBackTo (line 11) | public override double ConvertBackTo(string value, CultureInfo culture)
method ConvertFrom (line 16) | public override string ConvertFrom(double value, CultureInfo culture)
FILE: src/ClientApp/Converters/FirstValidationErrorConverter.cs
class FirstValidationErrorConverter (line 6) | public class FirstValidationErrorConverter : BaseConverterOneWay<IEnumer...
method ConvertFrom (line 10) | public override string ConvertFrom(IEnumerable<string> value, CultureI...
FILE: src/ClientApp/Converters/HasCountConverter.cs
class HasCountConverter (line 6) | public class HasCountConverter : BaseConverterOneWay<int, bool>
method ConvertFrom (line 10) | public override bool ConvertFrom(int value, CultureInfo culture)
FILE: src/ClientApp/Converters/ItemsToHeightConverter.cs
class ItemsToHeightConverter (line 6) | public class ItemsToHeightConverter : BaseConverterOneWay<int, int>
method ConvertFrom (line 12) | public override int ConvertFrom(int value, CultureInfo culture)
FILE: src/ClientApp/Converters/WebNavigatedEventArgsConverter.cs
class WebNavigatedEventArgsConverter (line 6) | public class WebNavigatedEventArgsConverter : BaseConverterOneWay<WebNav...
method ConvertFrom (line 10) | public override string ConvertFrom(WebNavigatedEventArgs value, Cultur...
FILE: src/ClientApp/Converters/WebNavigatingEventArgsConverter.cs
class WebNavigatingEventArgsConverter (line 6) | public class WebNavigatingEventArgsConverter : IValueConverter
method Convert (line 8) | public object Convert(object value, Type targetType, object parameter,...
method ConvertBack (line 18) | public object ConvertBack(object value, Type targetType, object parame...
FILE: src/ClientApp/Effects/EntryLineColorEffect.cs
class EntryLineColorEffect (line 3) | public class EntryLineColorEffect : RoutingEffect
method EntryLineColorEffect (line 5) | public EntryLineColorEffect()
FILE: src/ClientApp/Effects/ThemeEffects.cs
class ThemeEffects (line 3) | public static class ThemeEffects
method GetCircle (line 9) | public static bool GetCircle(BindableObject view)
method SetCircle (line 14) | public static void SetCircle(BindableObject view, bool circle)
method OnChanged (line 20) | private static void OnChanged<TEffect, TProp>(BindableObject bindable,...
class CircleEffect (line 42) | private class CircleEffect : RoutingEffect
method CircleEffect (line 44) | public CircleEffect()
FILE: src/ClientApp/Exceptions/ServiceAuthenticationException.cs
class ServiceAuthenticationException (line 3) | public class ServiceAuthenticationException : Exception
method ServiceAuthenticationException (line 5) | public ServiceAuthenticationException()
method ServiceAuthenticationException (line 9) | public ServiceAuthenticationException(string content)
FILE: src/ClientApp/Extensions/DictionaryExtensions.cs
class DictionaryExtensions (line 3) | public static class DictionaryExtensions
method ValueAsBool (line 5) | public static bool ValueAsBool(this IDictionary<string, object> dictio...
method ValueAsInt (line 12) | public static int ValueAsInt(this IDictionary<string, object> dictiona...
method ValueAs (line 19) | public static T ValueAs<T>(this IDictionary<string, object> dictionary...
FILE: src/ClientApp/Extensions/ICommandExtensions.cs
class ICommandExtensions (line 5) | public static class ICommandExtensions
method AttemptNotifyCanExecuteChanged (line 7) | public static void AttemptNotifyCanExecuteChanged<TCommand>(this TComm...
FILE: src/ClientApp/Extensions/VisualElementExtensions.cs
class VisualElementExtensions (line 6) | public static class VisualElementExtensions
method ColorTo (line 20) | public static Task<bool> ColorTo<TElement>(this TElement element, Expr...
method TransitionTo (line 67) | public static Task<bool> TransitionTo<TElement>(this TElement element,...
method TransitionTo (line 114) | public static Task<bool> TransitionTo<TElement>(this TElement element,...
method TransitionTo (line 161) | public static Task<bool> TransitionTo<TElement>(this TElement element,...
method TransitionTo (line 197) | public static Task<bool> TransitionTo<TElement>(this TElement element,...
method TransitionTo (line 233) | public static Task<bool> TransitionTo<TElement>(this TElement element,...
method TransitionTo (line 262) | public static Task<bool> TransitionTo<TElement>(this TElement element,...
method TransitionTo (line 291) | public static Task<bool> TransitionTo<TElement>(this TElement element,...
method TransitionTo (line 319) | public static Task<bool> TransitionTo<TElement>(this TElement element,...
method Lerp (line 354) | public static Color Lerp(this Color color, Color to, float amount)
method Lerp (line 371) | public static double Lerp(this double start, double end, double amount)
method Lerp (line 378) | public static float Lerp(this float start, float end, float amount)
method Lerp (line 385) | public static int Lerp(this int start, int end, double amount)
method Lerp (line 392) | public static byte Lerp(this byte start, byte end, double amount)
FILE: src/ClientApp/Helpers/EasingHelper.cs
class EasingHelper (line 5) | public static class EasingHelper
method GetEasing (line 7) | public static Easing GetEasing(EasingType type)
FILE: src/ClientApp/Helpers/UriHelper.cs
class UriHelper (line 3) | public static class UriHelper
method CombineUri (line 6) | public static string CombineUri(params string[] uriParts)
FILE: src/ClientApp/MauiProgram.cs
class MauiProgram (line 22) | public static class MauiProgram
method CreateMauiApp (line 24) | public static MauiApp CreateMauiApp()
method ConfigureHandlers (line 59) | public static MauiAppBuilder ConfigureHandlers(this MauiAppBuilder mau...
method RegisterAppServices (line 72) | public static MauiAppBuilder RegisterAppServices(this MauiAppBuilder m...
method RegisterViewModels (line 152) | public static MauiAppBuilder RegisterViewModels(this MauiAppBuilder ma...
method RegisterViews (line 169) | public static MauiAppBuilder RegisterViews(this MauiAppBuilder mauiApp...
FILE: src/ClientApp/Models/Basket/BasketItem.cs
class BasketItem (line 3) | public class BasketItem : BindableObject
method ToString (line 33) | public override string ToString()
FILE: src/ClientApp/Models/Basket/CustomerBasket.cs
class CustomerBasket (line 3) | public class CustomerBasket
method AddItemToBasket (line 11) | public void AddItemToBasket(BasketItem basketItem)
method RemoveItemFromBasket (line 25) | public void RemoveItemFromBasket(BasketItem basketItem)
method ClearBasket (line 37) | public void ClearBasket()
FILE: src/ClientApp/Models/Catalog/CatalogBrand.cs
class CatalogBrand (line 3) | public class CatalogBrand
method ToString (line 8) | public override string ToString()
FILE: src/ClientApp/Models/Catalog/CatalogItem.cs
class CatalogItem (line 3) | public class CatalogItem
FILE: src/ClientApp/Models/Catalog/CatalogRoot.cs
class CatalogRoot (line 3) | public class CatalogRoot
FILE: src/ClientApp/Models/Catalog/CatalogType.cs
class CatalogType (line 3) | public class CatalogType
method ToString (line 8) | public override string ToString()
FILE: src/ClientApp/Models/Location/GeolocationError.cs
type GeolocationError (line 3) | public enum GeolocationError
FILE: src/ClientApp/Models/Location/GeolocationException.cs
class GeolocationException (line 3) | public class GeolocationException : Exception
method GeolocationException (line 5) | public GeolocationException(GeolocationError error)
method GeolocationException (line 16) | public GeolocationException(GeolocationError error, Exception innerExc...
FILE: src/ClientApp/Models/Location/Location.cs
class Location (line 3) | public class Location
FILE: src/ClientApp/Models/Location/Position.cs
class Position (line 3) | public class Position
method Position (line 5) | public Position()
method Position (line 9) | public Position(double latitude, double longitude)
method Position (line 16) | public Position(Position position)
FILE: src/ClientApp/Models/Marketing/Campaign.cs
class Campaign (line 3) | public class Campaign
FILE: src/ClientApp/Models/Marketing/CampaignItem.cs
class CampaignItem (line 3) | public class CampaignItem
FILE: src/ClientApp/Models/Marketing/CampaignRoot.cs
class CampaignRoot (line 3) | public class CampaignRoot
FILE: src/ClientApp/Models/Navigation/TabParameter.cs
class TabParameter (line 3) | public class TabParameter
FILE: src/ClientApp/Models/Orders/CancelOrderCommand.cs
class CancelOrderCommand (line 3) | public class CancelOrderCommand
method CancelOrderCommand (line 5) | public CancelOrderCommand(int orderNumber)
FILE: src/ClientApp/Models/Orders/CardType.cs
class CardType (line 3) | public class CardType
FILE: src/ClientApp/Models/Orders/Order.cs
class Order (line 5) | public class Order
method Order (line 7) | public Order()
FILE: src/ClientApp/Models/Orders/OrderCheckout.cs
class OrderCheckout (line 6) | public class OrderCheckout
FILE: src/ClientApp/Models/Orders/OrderItem.cs
class OrderItem (line 5) | public class OrderItem
method ToString (line 26) | public override string ToString()
FILE: src/ClientApp/Models/Permissions/Permission.cs
type Permission (line 3) | public enum Permission
FILE: src/ClientApp/Models/Permissions/PermissionStatus.cs
type PermissionStatus (line 3) | public enum PermissionStatus
FILE: src/ClientApp/Models/Token/UserToken.cs
class UserToken (line 5) | public class UserToken
FILE: src/ClientApp/Models/User/Address.cs
class Address (line 3) | public class Address
FILE: src/ClientApp/Models/User/LogoutParameter.cs
class LogoutParameter (line 3) | public class LogoutParameter
FILE: src/ClientApp/Models/User/PaymentInfo.cs
class PaymentInfo (line 5) | public class PaymentInfo
FILE: src/ClientApp/Models/User/UserInfo.cs
class UserInfo (line 5) | public class UserInfo
FILE: src/ClientApp/Platforms/Android/MainActivity.cs
class MainActivity (line 6) | [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true,
method OnResume (line 13) | protected override void OnResume()
method OnNewIntent (line 20) | protected override void OnNewIntent(Android.Content.Intent intent)
FILE: src/ClientApp/Platforms/Android/MainApplication.cs
class MainApplication (line 6) | [Application]
method MainApplication (line 9) | public MainApplication(IntPtr handle, JniHandleOwnership ownership)
method CreateMauiApp (line 14) | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiAp...
FILE: src/ClientApp/Platforms/Android/WebAuthenticationCallbackActivity.cs
class WebAuthenticationCallbackActivity (line 6) | [Activity(NoHistory = true, LaunchMode = LaunchMode.SingleTop, Exported ...
FILE: src/ClientApp/Platforms/MacCatalyst/AppDelegate.cs
class AppDelegate (line 5) | [Register("AppDelegate")]
method CreateMauiApp (line 8) | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiAp...
FILE: src/ClientApp/Platforms/MacCatalyst/Program.cs
class Program (line 5) | public class Program
method Main (line 8) | static void Main(string[] args)
FILE: src/ClientApp/Platforms/Windows/App.xaml.cs
class App (line 9) | public partial class App : MauiWinUIApplication
method App (line 15) | public App() => this.InitializeComponent();
method CreateMauiApp (line 17) | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiAp...
FILE: src/ClientApp/Platforms/iOS/AppDelegate.cs
class AppDelegate (line 5) | [Register("AppDelegate")]
method CreateMauiApp (line 8) | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiAp...
FILE: src/ClientApp/Platforms/iOS/Program.cs
class Program (line 5) | public class Program
method Main (line 8) | static void Main(string[] args)
FILE: src/ClientApp/Services/AppEnvironment/AppEnvironmentService.cs
class AppEnvironmentService (line 8) | public class AppEnvironmentService : IAppEnvironmentService
method AppEnvironmentService (line 22) | public AppEnvironmentService(
method UpdateDependencies (line 49) | public void UpdateDependencies(bool useMockServices)
FILE: src/ClientApp/Services/AppEnvironment/IAppEnvironmentService.cs
type IAppEnvironmentService (line 8) | public interface IAppEnvironmentService
method UpdateDependencies (line 18) | void UpdateDependencies(bool useMockServices);
FILE: src/ClientApp/Services/Basket/BasketMockService.cs
class BasketMockService (line 5) | public class BasketMockService : IBasketService
method BasketMockService (line 9) | public BasketMockService()
method GetBasketAsync (line 35) | public async Task<CustomerBasket> GetBasketAsync()
method UpdateBasketAsync (line 42) | public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket cus...
method ClearBasketAsync (line 51) | public async Task ClearBasketAsync()
FILE: src/ClientApp/Services/Basket/BasketService.cs
class BasketService (line 13) | public class BasketService : IBasketService, IDisposable
method BasketService (line 22) | public BasketService(IIdentityService identityService, ISettingsServic...
method GetBasketAsync (line 32) | public async Task<CustomerBasket> GetBasketAsync()
method UpdateBasketAsync (line 66) | public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket cus...
method ClearBasketAsync (line 99) | public async Task ClearBasketAsync()
method Dispose (line 112) | public void Dispose()
method GetBasketClient (line 118) | private BasketGrpcClient.Basket.BasketClient GetBasketClient()
method CreateAuthenticationHeaders (line 132) | private Metadata CreateAuthenticationHeaders(string token)
method Dispose (line 139) | protected virtual void Dispose(bool disposing)
FILE: src/ClientApp/Services/Basket/IBasketService.cs
type IBasketService (line 5) | public interface IBasketService
method GetBasketAsync (line 8) | Task<CustomerBasket> GetBasketAsync();
method UpdateBasketAsync (line 9) | Task<CustomerBasket> UpdateBasketAsync(CustomerBasket customerBasket);
method ClearBasketAsync (line 10) | Task ClearBasketAsync();
FILE: src/ClientApp/Services/Basket/Protos/Basket.cs
class BasketReflection (line 15) | public static partial class BasketReflection {
method BasketReflection (line 24) | static BasketReflection() {
class GetBasketRequest (line 56) | [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
method GetBasketRequest (line 80) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method OnConstruction (line 86) | partial void OnConstruction();
method GetBasketRequest (line 88) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Clone (line 94) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Equals (line 100) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Equals (line 106) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method GetHashCode (line 118) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method ToString (line 128) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method WriteTo (line 134) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method InternalWriteTo (line 147) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method CalculateSize (line 156) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method MergeFrom (line 166) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method MergeFrom (line 175) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method InternalMergeFrom (line 197) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
class CustomerBasketResponse (line 217) | [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
method CustomerBasketResponse (line 241) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method OnConstruction (line 247) | partial void OnConstruction();
method CustomerBasketResponse (line 249) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Clone (line 256) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Equals (line 273) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Equals (line 279) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method GetHashCode (line 292) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method ToString (line 303) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method WriteTo (line 309) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method InternalWriteTo (line 323) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method CalculateSize (line 333) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method MergeFrom (line 344) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method MergeFrom (line 354) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method InternalMergeFrom (line 380) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
class BasketItem (line 404) | [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
method BasketItem (line 428) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method OnConstruction (line 434) | partial void OnConstruction();
method BasketItem (line 436) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Clone (line 444) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Equals (line 474) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Equals (line 480) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method GetHashCode (line 494) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method ToString (line 506) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method WriteTo (line 512) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method InternalWriteTo (line 533) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method CalculateSize (line 550) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method MergeFrom (line 566) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method MergeFrom (line 581) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method InternalMergeFrom (line 611) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
class UpdateBasketRequest (line 639) | [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
method UpdateBasketRequest (line 663) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method OnConstruction (line 669) | partial void OnConstruction();
method UpdateBasketRequest (line 671) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Clone (line 678) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Equals (line 695) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Equals (line 701) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method GetHashCode (line 714) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method ToString (line 725) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method WriteTo (line 731) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method InternalWriteTo (line 745) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method CalculateSize (line 755) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method MergeFrom (line 766) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method MergeFrom (line 776) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method InternalMergeFrom (line 802) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
class DeleteBasketRequest (line 826) | [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
method DeleteBasketRequest (line 850) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method OnConstruction (line 856) | partial void OnConstruction();
method DeleteBasketRequest (line 858) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Clone (line 864) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Equals (line 870) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Equals (line 876) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method GetHashCode (line 888) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method ToString (line 898) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method WriteTo (line 904) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method InternalWriteTo (line 917) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method CalculateSize (line 926) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method MergeFrom (line 936) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method MergeFrom (line 945) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method InternalMergeFrom (line 967) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
class DeleteBasketResponse (line 987) | [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
method DeleteBasketResponse (line 1011) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method OnConstruction (line 1017) | partial void OnConstruction();
method DeleteBasketResponse (line 1019) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Clone (line 1025) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Equals (line 1031) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method Equals (line 1037) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method GetHashCode (line 1049) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method ToString (line 1059) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method WriteTo (line 1065) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method InternalWriteTo (line 1078) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method CalculateSize (line 1087) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method MergeFrom (line 1097) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method MergeFrom (line 1106) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
method InternalMergeFrom (line 1128) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
FILE: src/ClientApp/Services/Basket/Protos/BasketGrpc.cs
class Basket (line 11) | public static partial class Basket
method __Helper_SerializeMessage (line 15) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", n...
class __Helper_MessageCache (line 30) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", n...
method __Helper_DeserializeMessage (line 36) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", n...
class BasketClient (line 90) | public partial class BasketClient : grpc::ClientBase<BasketClient>
method BasketClient (line 94) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method BasketClient (line 100) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method BasketClient (line 105) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method BasketClient (line 111) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method GetBasket (line 116) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method GetBasket (line 121) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method GetBasketAsync (line 126) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method GetBasketAsync (line 131) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method UpdateBasket (line 136) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method UpdateBasket (line 141) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method UpdateBasketAsync (line 146) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method UpdateBasketAsync (line 151) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method DeleteBasket (line 156) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method DeleteBasket (line 161) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method DeleteBasketAsync (line 166) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method DeleteBasketAsync (line 171) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
method NewInstance (line 177) | [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin",...
FILE: src/ClientApp/Services/Catalog/CatalogMockService.cs
class CatalogMockService (line 5) | public class CatalogMockService : ICatalogService
method GetCatalogAsync (line 78) | public async Task<IEnumerable<CatalogItem>> GetCatalogAsync()
method GetCatalogItemAsync (line 85) | public async Task<CatalogItem> GetCatalogItemAsync(int catalogItemId)
method FilterAsync (line 92) | public async Task<IEnumerable<CatalogItem>> FilterAsync(int catalogBra...
method GetCatalogBrandAsync (line 103) | public async Task<IEnumerable<CatalogBrand>> GetCatalogBrandAsync()
method GetCatalogTypeAsync (line 110) | public async Task<IEnumerable<CatalogType>> GetCatalogTypeAsync()
FILE: src/ClientApp/Services/Catalog/CatalogService.cs
class CatalogService (line 9) | public class CatalogService : ICatalogService
method CatalogService (line 18) | public CatalogService(ISettingsService settingsService, IRequestProvid...
method FilterAsync (line 26) | public async Task<IEnumerable<CatalogItem>> FilterAsync(int catalogBra...
method GetCatalogAsync (line 36) | public async Task<IEnumerable<CatalogItem>> GetCatalogAsync()
method GetCatalogItemAsync (line 51) | public async Task<CatalogItem> GetCatalogItemAsync(int catalogItemId)
method GetCatalogBrandAsync (line 67) | public async Task<IEnumerable<CatalogBrand>> GetCatalogBrandAsync()
method GetCatalogTypeAsync (line 76) | public async Task<IEnumerable<CatalogType>> GetCatalogTypeAsync()
FILE: src/ClientApp/Services/Catalog/ICatalogService.cs
type ICatalogService (line 5) | public interface ICatalogService
method GetCatalogBrandAsync (line 7) | Task<IEnumerable<CatalogBrand>> GetCatalogBrandAsync();
method FilterAsync (line 8) | Task<IEnumerable<CatalogItem>> FilterAsync(int catalogBrandId, int cat...
method GetCatalogTypeAsync (line 9) | Task<IEnumerable<CatalogType>> GetCatalogTypeAsync();
method GetCatalogAsync (line 10) | Task<IEnumerable<CatalogItem>> GetCatalogAsync();
method GetCatalogItemAsync (line 12) | Task<CatalogItem> GetCatalogItemAsync(int catalogItemId);
FILE: src/ClientApp/Services/Common/Common.cs
class Common (line 3) | public static class Common
FILE: src/ClientApp/Services/Dialog/DialogService.cs
class DialogService (line 3) | public class DialogService : IDialogService
method ShowAlertAsync (line 5) | public Task ShowAlertAsync(string message, string title, string button...
FILE: src/ClientApp/Services/Dialog/IDialogService.cs
type IDialogService (line 3) | public interface IDialogService
method ShowAlertAsync (line 5) | Task ShowAlertAsync(string message, string title, string buttonLabel);
FILE: src/ClientApp/Services/EShopJsonSerializerContext.cs
class EShopJsonSerializerContext (line 8) | [JsonSourceGenerationOptions(
FILE: src/ClientApp/Services/FixUri/FixUriService.cs
class FixUriService (line 10) | public class FixUriService : IFixUriService
method FixUriService (line 18) | public FixUriService(ISettingsService settingsService)
method FixCatalogItemPictureUri (line 23) | public void FixCatalogItemPictureUri(IEnumerable<CatalogItem> catalogI...
method FixBasketItemPictureUri (line 46) | public void FixBasketItemPictureUri(IEnumerable<BasketItem> basketItems)
method FixCampaignItemPictureUri (line 77) | public void FixCampaignItemPictureUri(IEnumerable<CampaignItem> campai...
FILE: src/ClientApp/Services/FixUri/IFixUriService.cs
type IFixUriService (line 7) | public interface IFixUriService
method FixCatalogItemPictureUri (line 9) | void FixCatalogItemPictureUri(IEnumerable<CatalogItem> catalogItems);
method FixBasketItemPictureUri (line 10) | void FixBasketItemPictureUri(IEnumerable<BasketItem> basketItems);
method FixCampaignItemPictureUri (line 11) | void FixCampaignItemPictureUri(IEnumerable<CampaignItem> campaignItems);
FILE: src/ClientApp/Services/Identity/AuthorizeRequest.cs
class AuthorizeRequest (line 5) | public class AuthorizeRequest
method AuthorizeRequest (line 9) | public AuthorizeRequest(string authorizeEndpoint)
method Create (line 14) | public string Create(IDictionary<string, string> values)
FILE: src/ClientApp/Services/Identity/IIdentityService.cs
type IIdentityService (line 5) | public interface IIdentityService
method SignInAsync (line 7) | Task<bool> SignInAsync();
method SignOutAsync (line 9) | Task<bool> SignOutAsync();
method GetUserInfoAsync (line 11) | Task<UserInfo> GetUserInfoAsync();
method GetAuthTokenAsync (line 13) | Task<string> GetAuthTokenAsync();
FILE: src/ClientApp/Services/Identity/IdentityMockService.cs
class IdentityMockService (line 5) | public class IdentityMockService : IIdentityService
method SignInAsync (line 9) | public Task<bool> SignInAsync()
method SignOutAsync (line 15) | public Task<bool> SignOutAsync()
method GetUserInfoAsync (line 21) | public Task<UserInfo> GetUserInfoAsync()
method GetAuthTokenAsync (line 49) | public Task<string> GetAuthTokenAsync()
FILE: src/ClientApp/Services/Identity/IdentityService.cs
class IdentityService (line 9) | public class IdentityService : IIdentityService
method IdentityService (line 15) | public IdentityService(IBrowser browser, ISettingsService settingsServ...
method SignInAsync (line 22) | public async Task<bool> SignInAsync()
method SignOutAsync (line 45) | public async Task<bool> SignOutAsync()
method GetUserInfoAsync (line 59) | public async Task<UserInfo> GetUserInfoAsync()
method GetAuthTokenAsync (line 98) | public async Task<string> GetAuthTokenAsync()
method GetClient (line 133) | private OidcClient GetClient()
FILE: src/ClientApp/Services/Location/ILocationService.cs
type ILocationService (line 3) | public interface ILocationService
method UpdateUserLocation (line 5) | Task UpdateUserLocation(Models.Location.Location newLocReq);
FILE: src/ClientApp/Services/Location/LocationService.cs
class LocationService (line 7) | public class LocationService : ILocationService
method LocationService (line 12) | public LocationService(IIdentityService identityService)
method UpdateUserLocation (line 17) | public async Task UpdateUserLocation(Models.Location.Location newLocReq)
FILE: src/ClientApp/Services/Navigation/INavigationService.cs
type INavigationService (line 3) | public interface INavigationService
method InitializeAsync (line 5) | Task InitializeAsync();
method NavigateToAsync (line 7) | Task NavigateToAsync(string route, IDictionary<string, object> routePa...
method PopAsync (line 9) | Task PopAsync();
FILE: src/ClientApp/Services/Navigation/MauiNavigationService.cs
class MauiNavigationService (line 6) | public class MauiNavigationService : INavigationService
method MauiNavigationService (line 10) | public MauiNavigationService(IAppEnvironmentService appEnvironmentServ...
method InitializeAsync (line 15) | public async Task InitializeAsync()
method NavigateToAsync (line 22) | public Task NavigateToAsync(string route, IDictionary<string, object> ...
method PopAsync (line 31) | public Task PopAsync()
FILE: src/ClientApp/Services/OpenUrl/IOpenUrlService.cs
type IOpenUrlService (line 3) | public interface IOpenUrlService
method OpenUrl (line 5) | Task OpenUrl(string url);
FILE: src/ClientApp/Services/OpenUrl/OpenUrlService.cs
class OpenUrlService (line 3) | public class OpenUrlService : IOpenUrlService
method OpenUrl (line 5) | public async Task OpenUrl(string url)
FILE: src/ClientApp/Services/Order/IOrderService.cs
type IOrderService (line 5) | public interface IOrderService
method CreateOrderAsync (line 7) | Task CreateOrderAsync(Models.Orders.Order newOrder);
method GetOrdersAsync (line 9) | Task<IEnumerable<Models.Orders.Order>> GetOrdersAsync();
method GetOrderAsync (line 11) | Task<Models.Orders.Order> GetOrderAsync(int orderId);
method CancelOrderAsync (line 13) | Task<bool> CancelOrderAsync(int orderId);
method MapOrderToBasket (line 15) | OrderCheckout MapOrderToBasket(Models.Orders.Order order);
FILE: src/ClientApp/Services/Order/OrderMockService.cs
class OrderMockService (line 7) | public class OrderMockService : IOrderService
method GetOrdersAsync (line 154) | public async Task<IEnumerable<Models.Orders.Order>> GetOrdersAsync()
method GetOrderAsync (line 163) | public async Task<Models.Orders.Order> GetOrderAsync(int orderId)
method CreateOrderAsync (line 171) | public async Task CreateOrderAsync(Models.Orders.Order newOrder)
method MapOrderToBasket (line 178) | public OrderCheckout MapOrderToBasket(Models.Orders.Order order)
method CancelOrderAsync (line 183) | public Task<bool> CancelOrderAsync(int orderId)
FILE: src/ClientApp/Services/Order/OrderService.cs
class OrderService (line 11) | public class OrderService : IOrderService
method OrderService (line 20) | public OrderService(IIdentityService identityService, ISettingsService...
method CreateOrderAsync (line 28) | public async Task CreateOrderAsync(Models.Orders.Order newOrder)
method GetOrdersAsync (line 42) | public async Task<IEnumerable<Models.Orders.Order>> GetOrdersAsync()
method GetOrderAsync (line 59) | public async Task<Models.Orders.Order> GetOrderAsync(int orderId)
method CancelOrderAsync (line 83) | public async Task<bool> CancelOrderAsync(int orderId)
method MapOrderToBasket (line 112) | public OrderCheckout MapOrderToBasket(Models.Orders.Order order)
FILE: src/ClientApp/Services/RequestProvider/HttpRequestExceptionEx.cs
class HttpRequestExceptionEx (line 5) | public class HttpRequestExceptionEx : HttpRequestException
method HttpRequestExceptionEx (line 7) | public HttpRequestExceptionEx(HttpStatusCode code) : this(code, null, ...
method HttpRequestExceptionEx (line 11) | public HttpRequestExceptionEx(HttpStatusCode code, string message) : t...
method HttpRequestExceptionEx (line 15) | public HttpRequestExceptionEx(HttpStatusCode code, string message, Exc...
FILE: src/ClientApp/Services/RequestProvider/IRequestProvider.cs
type IRequestProvider (line 3) | public interface IRequestProvider
method GetAsync (line 5) | Task<TResult> GetAsync<TResult>(string uri, string token = "");
method PostAsync (line 7) | Task<TResponse> PostAsync<TRequest, TResponse>(string uri, TRequest da...
method PostAsync (line 9) | Task<bool> PostAsync<TRequest>(string uri, TRequest data, string token...
method PostAsync (line 11) | Task<TResult> PostAsync<TResult>(string uri, string data, string clien...
method PutAsync (line 13) | Task<TResult> PutAsync<TResult>(string uri, TResult data, string token...
method DeleteAsync (line 15) | Task DeleteAsync(string uri, string token = "");
FILE: src/ClientApp/Services/RequestProvider/RequestProvider.cs
class RequestProvider (line 10) | public class RequestProvider(HttpMessageHandler _messageHandler) : IRequ...
method GetAsync (line 21) | public async Task<TResult?> GetAsync<TResult>(string uri, string token...
method PostAsync (line 33) | public async Task<TResult?> PostAsync<TRequest, TResult>(string uri, T...
method PostAsync (line 51) | public async Task<bool> PostAsync<TRequest>(string uri, TRequest data,...
method PostAsync (line 68) | public async Task<TResult?> PostAsync<TResult>(string uri, string data...
method PutAsync (line 88) | public async Task<TResult?> PutAsync<TResult>(string uri, TResult data...
method DeleteAsync (line 106) | public async Task DeleteAsync(string uri, string token = "")
method GetOrCreateHttpClient (line 112) | private HttpClient GetOrCreateHttpClient(string token = "")
method AddHeaderParameter (line 124) | private static void AddHeaderParameter(HttpClient httpClient, string p...
method AddBasicAuthenticationHeader (line 139) | private static void AddBasicAuthenticationHeader(HttpClient httpClient...
method HandleResponse (line 154) | private static async Task HandleResponse(HttpResponseMessage response)
method ReadFromJsonAsync (line 169) | private static async Task<T?> ReadFromJsonAsync<T>(HttpContent content)
method SerializeToJson (line 176) | private static JsonContent SerializeToJson<T>(T data)
FILE: src/ClientApp/Services/Settings/ISettingsService.cs
type ISettingsService (line 6) | public interface ISettingsService
method GetUserTokenAsync (line 35) | Task<UserToken?> GetUserTokenAsync();
method SetUserTokenAsync (line 37) | Task SetUserTokenAsync(UserToken? userToken);
FILE: src/ClientApp/Services/Settings/SettingsService.cs
class SettingsService (line 7) | public class SettingsService : ISettingsService
method SetUserTokenAsync (line 35) | public async Task SetUserTokenAsync(UserToken userToken)
method GetUserTokenAsync (line 42) | public async Task<UserToken> GetUserTokenAsync()
FILE: src/ClientApp/Services/Theme/ITheme.cs
type ITheme (line 3) | public interface ITheme
method SetStatusBarColor (line 5) | void SetStatusBarColor(Color color, bool darkStatusBarTint);
FILE: src/ClientApp/Services/Theme/Theme.shared.cs
class Theme (line 3) | public class Theme : ITheme
method SetStatusBarColor (line 5) | public void SetStatusBarColor(Color color, bool darkStatusBarTint)
FILE: src/ClientApp/Triggers/BeginAnimation.cs
class BeginAnimation (line 5) | public class BeginAnimation : TriggerAction<VisualElement>
method Invoke (line 9) | protected override async void Invoke(VisualElement sender)
FILE: src/ClientApp/Validations/IValidationRule.cs
type IValidationRule (line 3) | public interface IValidationRule<T>
method Check (line 7) | bool Check(T value);
FILE: src/ClientApp/Validations/IValidity.cs
type IValidity (line 3) | public interface IValidity
FILE: src/ClientApp/Validations/IsNotNullOrEmptyRule.cs
class IsNotNullOrEmptyRule (line 3) | public class IsNotNullOrEmptyRule<T> : IValidationRule<T>
method Check (line 7) | public bool Check(T value)
FILE: src/ClientApp/Validations/ValidatableObject.cs
class ValidatableObject (line 3) | public class ValidatableObject<T> : ObservableObject, IValidity
method ValidatableObject (line 9) | public ValidatableObject()
method Validate (line 35) | public bool Validate()
FILE: src/ClientApp/ViewModels/Base/IViewModelBase.cs
type IViewModelBase (line 5) | public interface IViewModelBase : IQueryAttributable
method InitializeAsync (line 15) | Task InitializeAsync();
FILE: src/ClientApp/ViewModels/Base/ViewModelBase.cs
class ViewModelBase (line 5) | public abstract partial class ViewModelBase : ObservableObject, IViewMod...
method ViewModelBase (line 11) | public ViewModelBase(INavigationService navigationService)
method ApplyQueryAttributes (line 31) | public virtual void ApplyQueryAttributes(IDictionary<string, object> q...
method InitializeAsync (line 35) | public virtual Task InitializeAsync()
method IsBusyFor (line 40) | protected async Task IsBusyFor(Func<Task> unitOfWork)
FILE: src/ClientApp/ViewModels/BasketViewModel.cs
class BasketViewModel (line 9) | public partial class BasketViewModel : ViewModelBase
method BasketViewModel (line 15) | public BasketViewModel(
method InitializeAsync (line 30) | public override async Task InitializeAsync()
method AddAsync (line 53) | [RelayCommand]
method AddBasketItemAsync (line 59) | private async Task AddBasketItemAsync(BasketItem item, IList<BasketIte...
method DeleteAsync (line 74) | [RelayCommand]
method ClearBasketItems (line 89) | public async Task ClearBasketItems()
method ReCalculateTotal (line 98) | private void ReCalculateTotal()
method CheckoutAsync (line 104) | [RelayCommand]
FILE: src/ClientApp/ViewModels/CatalogItemViewModel.cs
class CatalogItemViewModel (line 11) | public partial class CatalogItemViewModel : ViewModelBase
method CatalogItemViewModel (line 17) | public CatalogItemViewModel(IAppEnvironmentService appEnvironmentServi...
method ApplyQueryAttributes (line 23) | public override void ApplyQueryAttributes(IDictionary<string, object> ...
method AddCatalogItemAsync (line 30) | [RelayCommand]
method DismissAsync (line 60) | [RelayCommand]
FILE: src/ClientApp/ViewModels/CatalogViewModel.cs
class CatalogViewModel (line 11) | public partial class CatalogViewModel : ViewModelBase
method CatalogViewModel (line 37) | public CatalogViewModel(
method InitializeAsync (line 65) | public override async Task InitializeAsync()
method ViewCatalogItemAsync (line 90) | [RelayCommand]
method Filter (line 105) | [RelayCommand]
method SelectCatalogBrand (line 111) | [RelayCommand]
method SelectCatalogType (line 136) | [RelayCommand]
method ApplyFilterAsync (line 161) | [RelayCommand]
method ClearFilterAsync (line 178) | [RelayCommand]
method ViewBasket (line 192) | [RelayCommand]
class CatalogBrandSelectionViewModel (line 199) | public class CatalogBrandSelectionViewModel : SelectionViewModel<Catalog...
class CatalogTypeSelectionViewModel (line 203) | public class CatalogTypeSelectionViewModel : SelectionViewModel<CatalogT...
FILE: src/ClientApp/ViewModels/CheckoutViewModel.cs
class CheckoutViewModel (line 13) | public partial class CheckoutViewModel : ViewModelBase
method CheckoutViewModel (line 25) | public CheckoutViewModel(
method InitializeAsync (line 38) | public override async Task InitializeAsync()
method CheckoutAsync (line 104) | [RelayCommand]
method CreateOrderItems (line 136) | private static List<OrderItem> CreateOrderItems(IEnumerable<BasketItem...
method CalculateTotal (line 159) | private static decimal CalculateTotal(List<OrderItem> orderItems)
FILE: src/ClientApp/ViewModels/LoginViewModel.cs
class LoginViewModel (line 11) | public partial class LoginViewModel : ViewModelBase
method LoginViewModel (line 30) | public LoginViewModel(
method ApplyQueryAttributes (line 42) | public override async void ApplyQueryAttributes(IDictionary<string, ob...
method InitializeAsync (line 52) | public override Task InitializeAsync()
method MockSignInAsync (line 57) | [RelayCommand(CanExecute = nameof(IsValid))]
method SignInAsync (line 83) | [RelayCommand]
method RegisterAsync (line 98) | [RelayCommand]
method PerformLogoutAsync (line 104) | [RelayCommand]
method SettingsAsync (line 115) | [RelayCommand]
method Validate (line 121) | [RelayCommand]
method AddValidations (line 127) | private void AddValidations()
method InvalidateMock (line 133) | public void InvalidateMock()
FILE: src/ClientApp/ViewModels/MainViewModel.cs
class MainViewModel (line 6) | public partial class MainViewModel : ViewModelBase
method MainViewModel (line 8) | public MainViewModel(INavigationService navigationService)
method SettingsAsync (line 13) | [RelayCommand]
FILE: src/ClientApp/ViewModels/MapViewModel.cs
class MapViewModel (line 6) | public partial class MapViewModel : ViewModelBase
method MapViewModel (line 10) | public MapViewModel(INavigationService navigationService)
method InitializeAsync (line 15) | public override Task InitializeAsync()
type Store (line 32) | public record Store
FILE: src/ClientApp/ViewModels/ObservableCollectionEx.cs
class ObservableCollectionEx (line 7) | public class ObservableCollectionEx<T> : ObservableCollection<T>
method ObservableCollectionEx (line 9) | public ObservableCollectionEx()
method ObservableCollectionEx (line 13) | public ObservableCollectionEx(IEnumerable<T> collection) : base(collec...
method ObservableCollectionEx (line 17) | public ObservableCollectionEx(List<T> list) : base(list)
method ReloadData (line 21) | public void ReloadData(IEnumerable<T> items)
method ReloadData (line 33) | public void ReloadData(Action<IList<T>> innerListAction)
method ReloadDataAsync (line 44) | public async Task ReloadDataAsync(Func<IList<T>, Task> innerListAction)
FILE: src/ClientApp/ViewModels/OrderDetailViewModel.cs
class OrderDetailViewModel (line 9) | public partial class OrderDetailViewModel : ViewModelBase, IQueryAttribu...
method OrderDetailViewModel (line 22) | public OrderDetailViewModel(
method InitializeAsync (line 31) | public override async Task InitializeAsync()
method ToggleCancelOrderAsync (line 43) | [RelayCommand]
method ApplyQueryAttributes (line 61) | public override void ApplyQueryAttributes(IDictionary<string, object> ...
FILE: src/ClientApp/ViewModels/ProfileViewModel.cs
class ProfileViewModel (line 9) | public partial class ProfileViewModel : ViewModelBase
method ProfileViewModel (line 17) | public ProfileViewModel(
method InitializeAsync (line 30) | public override async Task InitializeAsync()
method LogoutAsync (line 35) | [RelayCommand]
method RefreshAsync (line 48) | [RelayCommand]
method OrderDetailAsync (line 66) | [RelayCommand]
FILE: src/ClientApp/ViewModels/SelectionViewModel.cs
class SelectionViewModel (line 3) | public partial class SelectionViewModel<T> : ObservableObject
FILE: src/ClientApp/ViewModels/SettingsViewModel.cs
class SettingsViewModel (line 13) | public class SettingsViewModel : ViewModelBase
method SettingsViewModel (line 33) | public SettingsViewModel(
method OnPropertyChanged (line 215) | protected override async void OnPropertyChanged(PropertyChangedEventAr...
method ToggleMockServices (line 225) | private void ToggleMockServices()
method ToggleFakeLocation (line 233) | private void ToggleFakeLocation()
method ToggleSendLocationAsync (line 240) | private async Task ToggleSendLocationAsync()
method ToggleAllowGpsLocation (line 250) | private void ToggleAllowGpsLocation()
method UpdateUseAzureServices (line 256) | private void UpdateUseAzureServices()
method UpdateIdentityEndpoint (line 262) | private void UpdateIdentityEndpoint()
method UpdateGatewayShoppingEndpoint (line 268) | private void UpdateGatewayShoppingEndpoint()
method UpdateGatewayOrdersEndpoint (line 273) | private void UpdateGatewayOrdersEndpoint()
method UpdateGatewayBasketEndpoint (line 278) | private void UpdateGatewayBasketEndpoint()
method UpdateFakeLocation (line 283) | private void UpdateFakeLocation()
method UpdateLatitude (line 288) | private void UpdateLatitude()
method UpdateLongitude (line 294) | private void UpdateLongitude()
method UpdateAllowGpsLocation (line 300) | private async Task UpdateAllowGpsLocation()
FILE: src/ClientApp/Views/BadgeView.cs
class BadgeView (line 5) | [ContentProperty(nameof(Content))]
method BadgeView (line 32) | public BadgeView()
method OnLayoutPropertyChanged (line 89) | private static void OnLayoutPropertyChanged(BindableObject bindable, o...
method OnHandlerChanging (line 94) | protected override void OnHandlerChanging(HandlerChangingEventArgs args)
method BadgeIndicatorSizeChanged (line 106) | private void BadgeIndicatorSizeChanged(object sender, EventArgs e)
method UpdateLayout (line 118) | private void UpdateLayout()
FILE: src/ClientApp/Views/BasketView.xaml.cs
class BasketView (line 3) | public partial class BasketView
method BasketView (line 5) | public BasketView(BasketViewModel viewModel)
FILE: src/ClientApp/Views/CatalogItemView.xaml.cs
class CatalogItemView (line 3) | public partial class CatalogItemView
method CatalogItemView (line 5) | public CatalogItemView(CatalogItemViewModel viewModel)
FILE: src/ClientApp/Views/CatalogView.xaml.cs
class CatalogView (line 6) | public partial class CatalogView
method CatalogView (line 8) | public CatalogView(CatalogViewModel viewModel)
method OnAppearing (line 15) | protected override void OnAppearing()
method OnDisappearing (line 33) | protected override void OnDisappearing()
method Products_OnScrolled (line 40) | private void Products_OnScrolled(object sender, ItemsViewScrolledEvent...
FILE: src/ClientApp/Views/CheckoutView.xaml.cs
class CheckoutView (line 3) | public partial class CheckoutView
method CheckoutView (line 5) | public CheckoutView(CheckoutViewModel viewModel)
FILE: src/ClientApp/Views/ContentPageBase.cs
class ContentPageBase (line 5) | public abstract class ContentPageBase : ContentPage
method ContentPageBase (line 7) | public ContentPageBase()
method OnAppearing (line 12) | protected override async void OnAppearing()
FILE: src/ClientApp/Views/CustomNavigationView.xaml.cs
class CustomNavigationView (line 3) | public partial class CustomNavigationView : NavigationPage
method CustomNavigationView (line 5) | public CustomNavigationView()
method CustomNavigationView (line 10) | public CustomNavigationView(Page root) : base(root)
FILE: src/ClientApp/Views/FiltersView.xaml.cs
class FiltersView (line 3) | public partial class FiltersView : ContentPage
method FiltersView (line 5) | public FiltersView(CatalogViewModel viewModel)
FILE: src/ClientApp/Views/LoginView.xaml.cs
class LoginView (line 3) | public partial class LoginView
method LoginView (line 7) | public LoginView(LoginViewModel viewModel)
method OnAppearing (line 14) | protected override void OnAppearing()
FILE: src/ClientApp/Views/MapView.xaml.cs
class MapView (line 7) | public partial class MapView
method MapView (line 9) | public MapView(MapViewModel viewModel)
method Pin_MarkerClicked (line 15) | private async void Pin_MarkerClicked(Object sender, PinClickedEventArg...
FILE: src/ClientApp/Views/MauiAuthenticationBrowser.cs
class MauiAuthenticationBrowser (line 7) | public class MauiAuthenticationBrowser : IBrowser
method InvokeAsync (line 9) | public async Task<BrowserResult> InvokeAsync(BrowserOptions options, C...
FILE: src/ClientApp/Views/OrderDetailView.xaml.cs
class OrderDetailView (line 3) | public partial class OrderDetailView
method OrderDetailView (line 5) | public OrderDetailView(OrderDetailViewModel viewModel)
FILE: src/ClientApp/Views/ProfileView.xaml.cs
class ProfileView (line 3) | public partial class ProfileView
method ProfileView (line 7) | public ProfileView(ProfileViewModel viewModel)
method OnAppearing (line 14) | protected override void OnAppearing()
FILE: src/ClientApp/Views/SettingsView.xaml.cs
class SettingsView (line 3) | public partial class SettingsView : ContentPage
method SettingsView (line 5) | public SettingsView(SettingsViewModel viewModel)
FILE: src/ClientApp/Views/Templates/BasketItemTemplate.xaml.cs
class BasketItemTemplate (line 3) | public partial class BasketItemTemplate
method BasketItemTemplate (line 5) | public BasketItemTemplate()
FILE: src/ClientApp/Views/Templates/CampaignTemplate.xaml.cs
class CampaignTemplate (line 3) | public partial class CampaignTemplate : ContentView
method CampaignTemplate (line 5) | public CampaignTemplate()
FILE: src/ClientApp/Views/Templates/OrderItemTemplate.xaml.cs
class OrderItemTemplate (line 3) | public partial class OrderItemTemplate : ContentView
method OrderItemTemplate (line 5) | public OrderItemTemplate()
FILE: src/ClientApp/Views/Templates/OrderTemplate.xaml.cs
class OrderTemplate (line 3) | public partial class OrderTemplate : ContentView
method OrderTemplate (line 5) | public OrderTemplate()
FILE: src/ClientApp/Views/Templates/ProductTemplate.xaml.cs
class ProductTemplate (line 3) | public partial class ProductTemplate : ContentView
method ProductTemplate (line 5) | public ProductTemplate()
FILE: src/EventBus/Abstractions/EventBusSubscriptionInfo.cs
class EventBusSubscriptionInfo (line 6) | public class EventBusSubscriptionInfo
method CreateDefaultTypeResolver (line 19) | private static IJsonTypeInfoResolver CreateDefaultTypeResolver()
FILE: src/EventBus/Abstractions/IEventBus.cs
type IEventBus (line 3) | public interface IEventBus
method PublishAsync (line 5) | Task PublishAsync(IntegrationEvent @event);
FILE: src/EventBus/Abstractions/IEventBusBuilder.cs
type IEventBusBuilder (line 3) | public interface IEventBusBuilder
FILE: src/EventBus/Abstractions/IIntegrationEventHandler.cs
type IIntegrationEventHandler (line 3) | public interface IIntegrationEventHandler<in TIntegrationEvent> : IInteg...
method Handle (line 6) | Task Handle(TIntegrationEvent @event);
method Handle (line 8) | Task IIntegrationEventHandler.Handle(IntegrationEvent @event) => Handl...
method Handle (line 13) | Task Handle(IntegrationEvent @event);
type IIntegrationEventHandler (line 11) | public interface IIntegrationEventHandler
method Handle (line 6) | Task Handle(TIntegrationEvent @event);
method Handle (line 8) | Task IIntegrationEventHandler.Handle(IntegrationEvent @event) => Handl...
method Handle (line 13) | Task Handle(IntegrationEvent @event);
FILE: src/EventBus/Events/IntegrationEvent.cs
type IntegrationEvent (line 3) | public record IntegrationEvent
FILE: src/EventBus/Extensions/EventBusBuilderExtensions.cs
class EventBusBuilderExtensions (line 8) | public static class EventBusBuilderExtensions
method ConfigureJsonOptions (line 10) | public static IEventBusBuilder ConfigureJsonOptions(this IEventBusBuil...
method AddSubscription (line 20) | public static IEventBusBuilder AddSubscription<T, [DynamicallyAccessed...
FILE: src/EventBus/Extensions/GenericTypeExtensions.cs
class GenericTypeExtensions (line 3) | public static class GenericTypeExtensions
method GetGenericTypeName (line 5) | public static string GetGenericTypeName(this Type type)
method GetGenericTypeName (line 22) | public static string GetGenericTypeName(this object @object)
FILE: src/EventBusRabbitMQ/EventBusOptions.cs
class EventBusOptions (line 3) | public class EventBusOptions
FILE: src/EventBusRabbitMQ/RabbitMQEventBus.cs
class RabbitMQEventBus (line 13) | public sealed class RabbitMQEventBus(
method PublishAsync (line 31) | public async Task PublishAsync(IntegrationEvent @event)
method SetActivityContext (line 113) | private static void SetActivityContext(Activity activity, string routi...
method Dispose (line 127) | public void Dispose()
method OnMessageReceived (line 132) | private async Task OnMessageReceived(object sender, BasicDeliverEventA...
method ProcessEvent (line 183) | private async Task ProcessEvent(string eventName, string message)
method DeserializeMessage (line 210) | [UnconditionalSuppressMessage("Trimming", "IL2026:RequiresUnreferenced...
method SerializeMessage (line 218) | [UnconditionalSuppressMessage("Trimming", "IL2026:RequiresUnreferenced...
method StartAsync (line 226) | public Task StartAsync(CancellationToken cancellationToken)
method StopAsync (line 297) | public Task StopAsync(CancellationToken cancellationToken)
method CreateResiliencePipeline (line 302) | private static ResiliencePipeline CreateResiliencePipeline(int retryCo...
FILE: src/EventBusRabbitMQ/RabbitMQTelemetry.cs
class RabbitMQTelemetry (line 6) | public class RabbitMQTelemetry
FILE: src/EventBusRabbitMQ/RabbitMqDependencyInjectionExtensions.cs
class RabbitMqDependencyInjectionExtensions (line 6) | public static class RabbitMqDependencyInjectionExtensions
method AddRabbitMqEventBus (line 17) | public static IEventBusBuilder AddRabbitMqEventBus(this IHostApplicati...
class EventBusBuilder (line 42) | private class EventBusBuilder(IServiceCollection services) : IEventBus...
FILE: src/HybridApp/App.xaml.cs
class App (line 3) | public partial class App : Application
method App (line 5) | public App()
method CreateWindow (line 10) | protected override Window CreateWindow(IActivationState? activationState)
FILE: src/HybridApp/MainPage.xaml.cs
class MainPage (line 3) | public partial class MainPage : ContentPage
method MainPage (line 5) | public MainPage()
FILE: src/HybridApp/MauiProgram.cs
class MauiProgram (line 6) | public static class MauiProgram
method CreateMauiApp (line 12) | public static MauiApp CreateMauiApp()
FILE: src/HybridApp/Platforms/Android/MainActivity.cs
class MainActivity (line 7) | [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, Config...
FILE: src/HybridApp/Platforms/Android/MainApplication.cs
class MainApplication (line 6) | [Application]
method MainApplication (line 9) | public MainApplication(IntPtr handle, JniHandleOwnership ownership)
method CreateMauiApp (line 14) | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiAp...
FILE: src/HybridApp/Platforms/MacCatalyst/AppDelegate.cs
class AppDelegate (line 5) | [Register("AppDelegate")]
method CreateMauiApp (line 8) | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiAp...
FILE: src/HybridApp/Platforms/MacCatalyst/Program.cs
class Program (line 6) | public class Program
method Main (line 9) | static void Main(string[] args)
FILE: src/HybridApp/Platforms/Tizen/Main.cs
class Program (line 7) | internal class Program : MauiApplication
method CreateMauiApp (line 9) | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiAp...
method Main (line 11) | static void Main(string[] args)
FILE: src/HybridApp/Platforms/Windows/App.xaml.cs
class App (line 11) | public partial class App : MauiWinUIApplication
method App (line 17) | public App()
method CreateMauiApp (line 22) | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiAp...
FILE: src/HybridApp/Platforms/iOS/AppDelegate.cs
class AppDelegate (line 5) | [Register("AppDelegate")]
method CreateMauiApp (line 8) | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiAp...
FILE: src/HybridApp/Platforms/iOS/Program.cs
class Program (line 6) | public class Program
method Main (line 9) | static void Main(string[] args)
FILE: src/HybridApp/Services/CatalogJsonContext.cs
class CatalogJsonContext (line 6) | [JsonSerializable(typeof(CatalogItem))]
FILE: src/HybridApp/Services/CatalogService.cs
class CatalogService (line 8) | public class CatalogService(HttpClient httpClient) : ICatalogService
method GetCatalogItem (line 13) | public Task<CatalogItem?> GetCatalogItem(int id)
method GetCatalogItems (line 19) | public async Task<CatalogResult> GetCatalogItems(int pageIndex, int pa...
method GetCatalogItems (line 26) | public async Task<List<CatalogItem>> GetCatalogItems(IEnumerable<int> ...
method GetCatalogItemsWithSemanticRelevance (line 33) | public Task<CatalogResult> GetCatalogItemsWithSemanticRelevance(int pa...
method GetBrands (line 40) | public async Task<IEnumerable<CatalogBrand>> GetBrands()
method GetTypes (line 47) | public async Task<IEnumerable<CatalogItemType>> GetTypes()
method GetAllCatalogItemsUri (line 54) | private static string GetAllCatalogItemsUri(string baseUri, int pageIn...
FILE: src/HybridApp/Services/ProductImageUrlProvider.cs
class ProductImageUrlProvider (line 5) | public class ProductImageUrlProvider : IProductImageUrlProvider
method GetProductImageUrl (line 7) | public string GetProductImageUrl(int productId)
FILE: src/Identity.API/Configuration/Config.cs
class Config (line 3) | public class Config
method GetApis (line 6) | public static IEnumerable<ApiResource> GetApis()
method GetApiScopes (line 18) | public static IEnumerable<ApiScope> GetApiScopes()
method GetResources (line 30) | public static IEnumerable<IdentityResource> GetResources()
method GetClients (line 40) | public static IEnumerable<Client> GetClients(IConfiguration configurat...
FILE: src/Identity.API/Data/ApplicationDbContext.cs
class ApplicationDbContext (line 8) | public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
method ApplicationDbContext (line 10) | public ApplicationDbContext(DbContextOptions<ApplicationDbContext> opt...
method OnModelCreating (line 15) | protected override void OnModelCreating(ModelBuilder builder)
FILE: src/Identity.API/Data/Migrations/20230925223402_InitialMigration.Designer.cs
class InitialMigration (line 14) | [DbContext(typeof(ApplicationDbContext))]
method BuildTargetModel (line 19) | protected override void BuildTargetModel(ModelBuilder modelBuilder)
FILE: src/Identity.API/Data/Migrations/20230925223402_InitialMigration.cs
class InitialMigration (line 10) | public partial class InitialMigration : Migration
method Up (line 13) | protected override void Up(MigrationBuilder migrationBuilder)
method Down (line 211) | protected override void Down(MigrationBuilder migrationBuilder)
FILE: src/Identity.API/Data/Migrations/ApplicationDbContextModelSnapshot.cs
class ApplicationDbContextModelSnapshot (line 13) | [DbContext(typeof(ApplicationDbContext))]
method BuildModel (line 16) | protected override void BuildModel(ModelBuilder modelBuilder)
FILE: src/Identity.API/Models/AccountViewModels/ForgotPasswordViewModel.cs
type ForgotPasswordViewModel (line 3) | public record ForgotPasswordViewModel
FILE: src/Identity.API/Models/AccountViewModels/LoggedOutViewModel.cs
type LoggedOutViewModel (line 3) | public record LoggedOutViewModel
FILE: src/Identity.API/Models/AccountViewModels/LoginViewModel.cs
type LoginViewModel (line 3) | public record LoginViewModel
FILE: src/Identity.API/Models/AccountViewModels/LogoutViewModel.cs
type LogoutViewModel (line 3) | public record LogoutViewModel
FILE: src/Identity.API/Models/AccountViewModels/RedirectViewModel.cs
class RedirectViewModel (line 3) | public class RedirectViewModel
FILE: src/Identity.API/Models/AccountViewModels/RegisterViewModel.cs
type RegisterViewModel (line 3) | public record RegisterViewModel
FILE: src/Identity.API/Models/AccountViewModels/ResetPasswordViewModel.cs
type ResetPasswordViewModel (line 3) | public record ResetPasswordViewModel
FILE: src/Identity.API/Models/AccountViewModels/SendCodeViewModel.cs
type SendCodeViewModel (line 3) | public record SendCodeViewModel
FILE: src/Identity.API/Models/AccountViewModels/VerifyCodeViewModel.cs
type VerifyCodeViewModel (line 3) | public record VerifyCodeViewModel
FILE: src/Identity.API/Models/ApplicationUser.cs
class ApplicationUser (line 4) | public class ApplicationUser : IdentityUser
FILE: src/Identity.API/Models/ConsentViewModels/ConsentInputModel.cs
class ConsentInputModel (line 3) | public class ConsentInputModel
FILE: src/Identity.API/Models/ConsentViewModels/ConsentOptions.cs
class ConsentOptions (line 3) | public class ConsentOptions
FILE: src/Identity.API/Models/ConsentViewModels/ConsentViewModel.cs
class ConsentViewModel (line 3) | public class ConsentViewModel : ConsentInputModel
FILE: src/Identity.API/Models/ConsentViewModels/ProcessConsentResult.cs
class ProcessConsentResult (line 3) | public class ProcessConsentResult
FILE: src/Identity.API/Models/ConsentViewModels/ScopeViewModel.cs
class ScopeViewModel (line 3) | public class ScopeViewModel
FILE: src/Identity.API/Models/ErrorViewModel.cs
type ErrorViewModel (line 5) | public record ErrorViewModel
FILE: src/Identity.API/Models/ManageViewModels/AddPhoneNumberViewModel.cs
type AddPhoneNumberViewModel (line 3) | public record AddPhoneNumberViewModel
FILE: src/Identity.API/Models/ManageViewModels/ChangePasswordViewModel.cs
type ChangePasswordViewModel (line 3) | public record ChangePasswordViewModel
FILE: src/Identity.API/Models/ManageViewModels/ConfigureTwoFactorViewModel.cs
type ConfigureTwoFactorViewModel (line 3) | public record ConfigureTwoFactorViewModel
FILE: src/Identity.API/Models/ManageViewModels/FactorViewModel.cs
type FactorViewModel (line 3) | public record FactorViewModel
FILE: src/Identity.API/Models/ManageViewModels/IndexViewModel.cs
type IndexViewModel (line 3) | public record IndexViewModel
FILE: src/Identity.API/Models/ManageViewModels/SetPasswordViewModel.cs
type SetPasswordViewModel (line 3) | public record SetPasswordViewModel
FILE: src/Identity.API/Models/ManageViewModels/VerifyPhoneNumberViewModel.cs
type VerifyPhoneNumberViewModel (line 3) | public record VerifyPhoneNumberViewModel
FILE: src/Identity.API/Quickstart/Account/AccountController.cs
class AccountController (line 6) | [SecurityHeaders]
method AccountController (line 18) | public AccountController(
method Login (line 39) | [HttpGet]
method Login (line 59) | [HttpPost]
method Logout (line 146) | [HttpGet]
method Logout (line 165) | [HttpPost]
method AccessDenied (line 196) | [HttpGet]
method BuildLoginViewModelAsync (line 206) | private async Task<LoginViewModel> BuildLoginViewModelAsync(string ret...
method BuildLoginViewModelAsync (line 264) | private async Task<LoginViewModel> BuildLoginViewModelAsync(LoginInput...
method BuildLogoutViewModelAsync (line 272) | private async Task<LogoutViewModel> BuildLogoutViewModelAsync(string l...
method BuildLoggedOutViewModelAsync (line 296) | private async Task<LoggedOutViewModel> BuildLoggedOutViewModelAsync(st...
FILE: src/Identity.API/Quickstart/Account/AccountOptions.cs
class AccountOptions (line 6) | public class AccountOptions
FILE: src/Identity.API/Quickstart/Account/ExternalController.cs
class ExternalController (line 3) | [SecurityHeaders]
method ExternalController (line 14) | public ExternalController(
method Challenge (line 33) | [HttpGet]
method Callback (line 63) | [HttpGet]
method FindUserFromExternalProviderAsync (line 135) | private async Task<(ApplicationUser user, string provider, string prov...
method AutoProvisionUserAsync (line 160) | private async Task<ApplicationUser> AutoProvisionUserAsync(string prov...
method ProcessLoginCallback (line 221) | private void ProcessLoginCallback(AuthenticateResult externalResult, L...
FILE: src/Identity.API/Quickstart/Account/ExternalProvider.cs
class ExternalProvider (line 6) | public class ExternalProvider
FILE: src/Identity.API/Quickstart/Account/LoggedOutViewModel.cs
class LoggedOutViewModel (line 7) | public class LoggedOutViewModel
FILE: src/Identity.API/Quickstart/Account/LoginInputModel.cs
class LoginInputModel (line 7) | public class LoginInputModel
FILE: src/Identity.API/Quickstart/Account/LoginViewModel.cs
class LoginViewModel (line 7) | public class LoginViewModel : LoginInputModel
FILE: src/Identity.API/Quickstart/Account/LogoutInputModel.cs
class LogoutInputModel (line 7) | public class LogoutInputModel
FILE: src/Identity.API/Quickstart/Account/LogoutViewModel.cs
class LogoutViewModel (line 7) | public class LogoutViewModel : LogoutInputModel
FILE: src/Identity.API/Quickstart/Account/RedirectViewModel.cs
class RedirectViewModel (line 8) | public class RedirectViewModel
FILE: src/Identity.API/Quickstart/Consent/ConsentController.cs
class ConsentController (line 9) | [SecurityHeaders]
method ConsentController (line 17) | public ConsentController(
method Index (line 32) | [HttpGet]
method Index (line 47) | [HttpPost]
method ProcessConsent (line 82) | private async Task<ProcessConsentResult> ProcessConsent(ConsentInputMo...
method BuildViewModelAsync (line 150) | private async Task<ConsentViewModel> BuildViewModelAsync(string return...
method CreateConsentViewModel (line 165) | private ConsentViewModel CreateConsentViewModel(
method CreateScopeViewModel (line 204) | private ScopeViewModel CreateScopeViewModel(IdentityResource identity,...
method CreateScopeViewModel (line 217) | public ScopeViewModel CreateScopeViewModel(ParsedScopeValue parsedScop...
method GetOfflineAccessScope (line 236) | private ScopeViewModel GetOfflineAccessScope(bool check)
FILE: src/Identity.API/Quickstart/Consent/ConsentInputModel.cs
class ConsentInputModel (line 7) | public class ConsentInputModel
FILE: src/Identity.API/Quickstart/Consent/ConsentOptions.cs
class ConsentOptions (line 7) | public class ConsentOptions
FILE: src/Identity.API/Quickstart/Consent/ConsentViewModel.cs
class ConsentViewModel (line 7) | public class ConsentViewModel : ConsentInputModel
FILE: src/Identity.API/Quickstart/Consent/ProcessConsentResult.cs
class ProcessConsentResult (line 6) | public class ProcessConsentResult
FILE: src/Identity.API/Quickstart/Consent/ScopeViewModel.cs
class ScopeViewModel (line 7) | public class ScopeViewModel
FILE: src/Identity.API/Quickstart/Device/DeviceAuthorizationInputModel.cs
class DeviceAuthorizationInputModel (line 7) | public class DeviceAuthorizationInputModel : ConsentInputModel
FILE: src/Identity.API/Quickstart/Device/DeviceAuthorizationViewModel.cs
class DeviceAuthorizationViewModel (line 7) | public class DeviceAuthorizationViewModel : ConsentViewModel
FILE: src/Identity.API/Quickstart/Device/DeviceController.cs
class DeviceController (line 6) | [Authorize]
method DeviceController (line 15) | public DeviceController(
method Index (line 27) | [HttpGet]
method UserCodeCapture (line 41) | [HttpPost]
method Callback (line 51) | [HttpPost]
method ProcessConsent (line 63) | private async Task<ProcessConsentResult> ProcessConsent(DeviceAuthoriz...
method BuildViewModelAsync (line 130) | private async Task<DeviceAuthorizationViewModel> BuildViewModelAsync(s...
method CreateConsentViewModel (line 141) | private DeviceAuthorizationViewModel CreateConsentViewModel(string use...
method CreateScopeViewModel (line 178) | private ScopeViewModel CreateScopeViewModel(IdentityResource identity,...
method CreateScopeViewModel (line 191) | public ScopeViewModel CreateScopeViewModel(ParsedScopeValue parsedScop...
method GetOfflineAccessScope (line 203) | private ScopeViewModel GetOfflineAccessScope(bool check)
FILE: src/Identity.API/Quickstart/Diagnostics/DiagnosticsController.cs
class DiagnosticsController (line 7) | [SecurityHeaders]
method Index (line 11) | public async Task<IActionResult> Index()
FILE: src/Identity.API/Quickstart/Diagnostics/DiagnosticsViewModel.cs
class DiagnosticsViewModel (line 10) | public class DiagnosticsViewModel
method DiagnosticsViewModel (line 12) | public DiagnosticsViewModel(AuthenticateResult result)
FILE: src/Identity.API/Quickstart/Extensions.cs
class Extensions (line 3) | public static class Extensions
method IsNativeClient (line 9) | public static bool IsNativeClient(this AuthorizationRequest context)
method LoadingPage (line 15) | public static IActionResult LoadingPage(this Controller controller, st...
FILE: src/Identity.API/Quickstart/Grants/GrantsController.cs
class GrantsController (line 9) | [SecurityHeaders]
method GrantsController (line 18) | public GrantsController(IIdentityServerInteractionService interaction,
method Index (line 32) | [HttpGet]
method Revoke (line 41) | [HttpPost]
method BuildViewModelAsync (line 51) | private async Task<GrantsViewModel> BuildViewModelAsync()
FILE: src/Identity.API/Quickstart/Grants/GrantsViewModel.cs
class GrantsViewModel (line 7) | public class GrantsViewModel
class GrantViewModel (line 12) | public class GrantViewModel
FILE: src/Identity.API/Quickstart/Home/ErrorViewModel.cs
class ErrorViewModel (line 6) | public class ErrorViewModel
method ErrorViewModel (line 8) | public ErrorViewModel()
method ErrorViewModel (line 12) | public ErrorViewModel(string error)
FILE: src/Identity.API/Quickstart/Home/HomeController.cs
class HomeController (line 6) | [SecurityHeaders]
method HomeController (line 14) | public HomeController(
method Index (line 24) | public IActionResult Index()
method Error (line 39) | public async Task<IActionResult> Error(string errorId)
FILE: src/Identity.API/Quickstart/SecurityHeadersAttribute.cs
class SecurityHeadersAttribute (line 7) | public class SecurityHeadersAttribute : ActionFilterAttribute
method OnResultExecuting (line 9) | public override void OnResultExecuting(ResultExecutingContext context)
FILE: src/Identity.API/Services/EFLoginService.cs
class EFLoginService (line 3) | public class EFLoginService : ILoginService<ApplicationUser>
method EFLoginService (line 8) | public EFLoginService(UserManager<ApplicationUser> userManager, SignIn...
method FindByUsername (line 14) | public async Task<ApplicationUser> FindByUsername(string user)
method ValidateCredentials (line 19) | public async Task<bool> ValidateCredentials(ApplicationUser user, stri...
method SignIn (line 24) | public Task SignIn(ApplicationUser user)
method SignInAsync (line 29) | public Task SignInAsync(ApplicationUser user, AuthenticationProperties...
FILE: src/Identity.API/Services/ILoginService.cs
type ILoginService (line 3) | public interface ILoginService<T>
method ValidateCredentials (line 5) | Task<bool> ValidateCredentials(T user, string password);
method FindByUsername (line 7) | Task<T> FindByUsername(string user);
method SignIn (line 9) | Task SignIn(T user);
method SignInAsync (line 11) | Task SignInAsync(T user, AuthenticationProperties properties, string a...
FILE: src/Identity.API/Services/IRedirectService.cs
type IRedirectService (line 3) | public interface IRedirectService
method ExtractRedirectUriFromReturnUrl (line 5) | string ExtractRedirectUriFromReturnUrl(string url);
FILE: src/Identity.API/Services/ProfileService.cs
class ProfileService (line 3) | public class ProfileService : IProfileService
method ProfileService (line 7) | public ProfileService(UserManager<ApplicationUser> userManager)
method GetProfileDataAsync (line 12) | public async Task GetProfileDataAsync(ProfileDataRequestContext context)
method IsActiveAsync (line 26) | public async Task IsActiveAsync(IsActiveContext context)
method GetClaimsFromUser (line 55) | private IEnumerable<Claim> GetClaimsFromUser(ApplicationUser user)
FILE: src/Identity.API/Services/RedirectService.cs
class RedirectService (line 3) | public class RedirectService : IRedirectService
method ExtractRedirectUriFromReturnUrl (line 5) | public string ExtractRedirectUriFromReturnUrl(string url)
FILE: src/Identity.API/UsersSeed.cs
class UsersSeed (line 4) | public class UsersSeed(ILogger<UsersSeed> logger, UserManager<Applicatio...
method SeedAsync (line 6) | public async Task SeedAsync(ApplicationDbContext context)
FILE: src/IntegrationEventLogEF/EventStateEnum.cs
type EventStateEnum (line 3) | public enum EventStateEnum
FILE: src/IntegrationEventLogEF/IntegrationEventLogEntry.cs
class IntegrationEventLogEntry (line 5) | public class IntegrationEventLogEntry
method IntegrationEventLogEntry (line 10) | private IntegrationEventLogEntry() { }
method IntegrationEventLogEntry (line 11) | public IntegrationEventLogEntry(IntegrationEvent @event, Guid transact...
method DeserializeJsonContent (line 35) | public IntegrationEventLogEntry DeserializeJsonContent(Type type)
FILE: src/IntegrationEventLogEF/IntegrationLogExtensions.cs
class IntegrationLogExtensions (line 3) | public static class IntegrationLogExtensions
method UseIntegrationEventLogs (line 5) | public static void UseIntegrationEventLogs(this ModelBuilder builder)
FILE: src/IntegrationEventLogEF/Services/IIntegrationEventLogService.cs
type IIntegrationEventLogService (line 3) | public interface IIntegrationEventLogService
method RetrieveEventLogsPendingToPublishAsync (line 5) | Task<IEnumerable<IntegrationEventLogEntry>> RetrieveEventLogsPendingTo...
method SaveEventAsync (line 6) | Task SaveEventAsync(IntegrationEvent @event, IDbContextTransaction tra...
method MarkEventAsPublishedAsync (line 7) | Task MarkEventAsPublishedAsync(Guid eventId);
method MarkEventAsInProgressAsync (line 8) | Task MarkEventAsInProgressAsync(Guid eventId);
method MarkEventAsFailedAsync (line 9) | Task MarkEventAsFailedAsync(Guid eventId);
FILE: src/IntegrationEventLogEF/Services/IntegrationEventLogService.cs
class IntegrationEventLogService (line 3) | public class IntegrationEventLogService<TContext> : IIntegrationEventLog...
method IntegrationEventLogService (line 10) | public IntegrationEventLogService(TContext context)
method RetrieveEventLogsPendingToPublishAsync (line 19) | public async Task<IEnumerable<IntegrationEventLogEntry>> RetrieveEvent...
method SaveEventAsync (line 34) | public Task SaveEventAsync(IntegrationEvent @event, IDbContextTransact...
method MarkEventAsPublishedAsync (line 46) | public Task MarkEventAsPublishedAsync(Guid eventId)
method MarkEventAsInProgressAsync (line 51) | public Task MarkEventAsInProgressAsync(Guid eventId)
method MarkEventAsFailedAsync (line 56) | public Task MarkEventAsFailedAsync(Guid eventId)
method UpdateEventStatus (line 61) | private Task UpdateEventStatus(Guid eventId, EventStateEnum status)
method Dispose (line 72) | protected virtual void Dispose(bool disposing)
method Dispose (line 86) | public void Dispose()
FILE: src/IntegrationEventLogEF/Utilities/ResilientTransaction.cs
class ResilientTransaction (line 3) | public class ResilientTransaction
method ResilientTransaction (line 6) | private ResilientTransaction(DbContext context) =>
method New (line 9) | public static ResilientTransaction New(DbContext context) => new(conte...
method ExecuteAsync (line 11) | public async Task ExecuteAsync(Func<Task> action)
FILE: src/OrderProcessor/BackgroundTaskOptions.cs
class BackgroundTaskOptions (line 3) | public class BackgroundTaskOptions
FILE: src/OrderProcessor/Events/GracePeriodConfirmedIntegrationEvent.cs
type GracePeriodConfirmedIntegrationEvent (line 5) | public record GracePeriodConfirmedIntegrationEvent : IntegrationEvent
FILE: src/OrderProcessor/Extensions/Extensions.cs
class Extensions (line 6) | public static class Extensions
method AddApplicationServices (line 8) | public static void AddApplicationServices(this IHostApplicationBuilder...
class IntegrationEventContext (line 22) | [JsonSerializable(typeof(GracePeriodConfirmedIntegrationEvent))]
FILE: src/OrderProcessor/Services/GracePeriodManagerService.cs
class GracePeriodManagerService (line 8) | public class GracePeriodManagerService(
method ExecuteAsync (line 16) | protected override async Task ExecuteAsync(CancellationToken stoppingT...
method CheckConfirmedGracePeriodOrders (line 44) | private async Task CheckConfirmedGracePeriodOrders()
method GetConfirmedGracePeriodOrders (line 63) | private async ValueTask<List<int>> GetConfirmedGracePeriodOrders()
FILE: src/Ordering.API/Apis/OrderServices.cs
class OrderServices (line 1) | public class OrderServices(
FILE: src/Ordering.API/Apis/OrdersApi.cs
class OrdersApi (line 5) | public static class OrdersApi
method MapOrdersApiV1 (line 7) | public static RouteGroupBuilder MapOrdersApiV1(this IEndpointRouteBuil...
method CancelOrderAsync (line 22) | public static async Task<Results<Ok, BadRequest<string>, ProblemHttpRe...
method ShipOrderAsync (line 51) | public static async Task<Results<Ok, BadRequest<string>, ProblemHttpRe...
method GetOrderAsync (line 80) | public static async Task<Results<Ok<Order>, NotFound>> GetOrderAsync(i...
method GetOrdersByUserAsync (line 93) | public static async Task<Ok<IEnumerable<OrderSummary>>> GetOrdersByUse...
method GetCardTypesAsync (line 100) | public static async Task<Ok<IEnumerable<CardType>>> GetCardTypesAsync(...
method CreateOrderDraftAsync (line 106) | public static async Task<OrderDraftDTO> CreateOrderDraftAsync(CreateOr...
method CreateOrderAsync (line 118) | public static async Task<Results<Ok, BadRequest<string>>> CreateOrderA...
type CreateOrderRequest (line 171) | public record CreateOrderRequest(
FILE: src/Ordering.API/Application/Behaviors/LoggingBehavior.cs
class LoggingBehavior (line 2) | public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TR...
method LoggingBehavior (line 5) | public LoggingBehavior(ILogger<LoggingBehavior<TRequest, TResponse>> l...
method Handle (line 7) | public async Task<TResponse> Handle(TRequest request, RequestHandlerDe...
FILE: src/Ordering.API/Application/Behaviors/TransactionBehavior.cs
class TransactionBehavior (line 5) | public class TransactionBehavior<TRequest, TResponse> : IPipelineBehavio...
method TransactionBehavior (line 11) | public TransactionBehavior(OrderingContext dbContext,
method Handle (line 20) | public async Task<TResponse> Handle(TRequest request, RequestHandlerDe...
FILE: src/Ordering.API/Application/Behaviors/ValidatorBehavior.cs
class ValidatorBehavior (line 3) | public class ValidatorBehavior<TRequest, TResponse> : IPipelineBehavior<...
method ValidatorBehavior (line 8) | public ValidatorBehavior(IEnumerable<IValidator<TRequest>> validators,...
method Handle (line 14) | public async Task<TResponse> Handle(TRequest request, RequestHandlerDe...
FILE: src/Ordering.API/Application/Commands/CancelOrderCommand.cs
type CancelOrderCommand (line 3) | public record CancelOrderCommand(int OrderNumber) : IRequest<bool>;
FILE: src/Ordering.API/Application/Commands/CancelOrderCommandHandler.cs
class CancelOrderCommandHandler (line 4) | public class CancelOrderCommandHandler : IRequestHandler<CancelOrderComm...
method CancelOrderCommandHandler (line 8) | public CancelOrderCommandHandler(IOrderRepository orderRepository)
method Handle (line 19) | public async Task<bool> Handle(CancelOrderCommand command, Cancellatio...
class CancelOrderIdentifiedCommandHandler (line 34) | public class CancelOrderIdentifiedCommandHandler : IdentifiedCommandHand...
method CancelOrderIdentifiedCommandHandler (line 36) | public CancelOrderIdentifiedCommandHandler(
method CreateResultForDuplicateRequest (line 44) | protected override bool CreateResultForDuplicateRequest()
FILE: src/Ordering.API/Application/Commands/CreateOrderCommand.cs
class CreateOrderCommand (line 15) | [DataContract]
method CreateOrderCommand (line 61) | public CreateOrderCommand()
method CreateOrderCommand (line 66) | public CreateOrderCommand(List<BasketItem> basketItems, string userId,...
FILE: src/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs
class CreateOrderCommandHandler (line 6) | public class CreateOrderCommandHandler
method CreateOrderCommandHandler (line 16) | public CreateOrderCommandHandler(IMediator mediator,
method Handle (line 29) | public async Task<bool> Handle(CreateOrderCommand message, Cancellatio...
class CreateOrderIdentifiedCommandHandler (line 57) | public class CreateOrderIdentifiedCommandHandler : IdentifiedCommandHand...
method CreateOrderIdentifiedCommandHandler (line 59) | public CreateOrderIdentifiedCommandHandler(
method CreateResultForDuplicateRequest (line 67) | protected override bool CreateResultForDuplicateRequest()
FILE: src/Ordering.API/Application/Commands/CreateOrderDraftCommand.cs
type CreateOrderDraftCommand (line 4) | public record CreateOrderDraftCommand(string BuyerId, IEnumerable<Basket...
FILE: src/Ordering.API/Application/Commands/CreateOrderDraftCommandHandler.cs
class CreateOrderDraftCommandHandler (line 7) | public class CreateOrderDraftCommandHandler
method Handle (line 10) | public Task<OrderDraftDTO> Handle(CreateOrderDraftCommand message, Can...
type OrderDraftDTO (line 23) | public record OrderDraftDTO
type OrderItemDTO (line 46) | public record OrderItemDTO
FILE: src/Ordering.API/Application/Commands/IdentifiedCommand.cs
class IdentifiedCommand (line 3) | public class IdentifiedCommand<T, R> : IRequest<R>
method IdentifiedCommand (line 8) | public IdentifiedCommand(T command, Guid id)
FILE: src/Ordering.API/Application/Commands/IdentifiedCommandHandler.cs
class IdentifiedCommandHandler (line 9) | public abstract class IdentifiedCommandHandler<T, R> : IRequestHandler<I...
method IdentifiedCommandHandler (line 16) | public IdentifiedCommandHandler(
method CreateResultForDuplicateRequest (line 31) | protected abstract R CreateResultForDuplicateRequest();
method Handle (line 39) | public async Task<R> Handle(IdentifiedCommand<T, R> message, Cancellat...
FILE: src/Ordering.API/Application/Commands/SetAwaitingValidationOrderStatusCommand.cs
type SetAwaitingValidationOrderStatusCommand (line 3) | public record SetAwaitingValidationOrderStatusCommand(int OrderNumber) :...
FILE: src/Ordering.API/Application/Commands/SetAwaitingValidationOrderStatusCommandHandler.cs
class SetAwaitingValidationOrderStatusCommandHandler (line 4) | public class SetAwaitingValidationOrderStatusCommandHandler : IRequestHa...
method SetAwaitingValidationOrderStatusCommandHandler (line 8) | public SetAwaitingValidationOrderStatusCommandHandler(IOrderRepository...
method Handle (line 19) | public async Task<bool> Handle(SetAwaitingValidationOrderStatusCommand...
class SetAwaitingValidationIdentifiedOrderStatusCommandHandler (line 34) | public class SetAwaitingValidationIdentifiedOrderStatusCommandHandler : ...
method SetAwaitingValidationIdentifiedOrderStatusCommandHandler (line 36) | public SetAwaitingValidationIdentifiedOrderStatusCommandHandler(
method CreateResultForDuplicateRequest (line 44) | protected override bool CreateResultForDuplicateRequest()
FILE: src/Ordering.API/Application/Commands/SetPaidOrderStatusCommand.cs
type SetPaidOrderStatusCommand (line 3) | public record SetPaidOrderStatusCommand(int OrderNumber) : IRequest<bool>;
FILE: src/Ordering.API/Application/Commands/SetPaidOrderStatusCommandHandler.cs
class SetPaidOrderStatusCommandHandler (line 4) | public class SetPaidOrderStatusCommandHandler : IRequestHandler<SetPaidO...
method SetPaidOrderStatusCommandHandler (line 8) | public SetPaidOrderStatusCommandHandler(IOrderRepository orderRepository)
method Handle (line 19) | public async Task<bool> Handle(SetPaidOrderStatusCommand command, Canc...
class SetPaidIdentifiedOrderStatusCommandHandler (line 37) | public class SetPaidIdentifiedOrderStatusCommandHandler : IdentifiedComm...
method SetPaidIdentifiedOrderStatusCommandHandler (line 39) | public SetPaidIdentifiedOrderStatusCommandHandler(
method CreateResultForDuplicateRequest (line 47) | protected override bool CreateResultForDuplicateRequest()
FILE: src/Ordering.API/Application/Commands/SetStockConfirmedOrderStatusCommand.cs
type SetStockConfirmedOrderStatusCommand (line 3) | public record SetStockConfirmedOrderStatusCommand(int OrderNumber) : IRe...
FILE: src/Ordering.API/Application/Commands/SetStockConfirmedOrderStatusCommandHandler.cs
class SetStockConfirmedOrderStatusCommandHandler (line 4) | public class SetStockConfirmedOrderStatusCommandHandler : IRequestHandle...
method SetStockConfirmedOrderStatusCommandHandler (line 8) | public SetStockConfirmedOrderStatusCommandHandler(IOrderRepository ord...
method Handle (line 19) | public async Task<bool> Handle(SetStockConfirmedOrderStatusCommand com...
class SetStockConfirmedOrderStatusIdentifiedCommandHandler (line 37) | public class SetStockConfirmedOrderStatusIdentifiedCommandHandler : Iden...
method SetStockConfirmedOrderStatusIdentifiedCommandHandler (line 39) | public SetStockConfirmedOrderStatusIdentifiedCommandHandler(
method CreateResultForDuplicateRequest (line 47) | protected override bool CreateResultForDuplicateRequest()
FILE: src/Ordering.API/Application/Commands/SetStockRejectedOrderStatusCommand.cs
type SetStockRejectedOrderStatusCommand (line 3) | public record SetStockRejectedOrderStatusCommand(int OrderNumber, List<i...
FILE: src/Ordering.API/Application/Commands/SetStockRejectedOrderStatusCommandHandler.cs
class SetStockRejectedOrderStatusCommandHandler (line 4) | public class SetStockRejectedOrderStatusCommandHandler : IRequestHandler...
method SetStockRejectedOrderStatusCommandHandler (line 8) | public SetStockRejectedOrderStatusCommandHandler(IOrderRepository orde...
method Handle (line 19) | public async Task<bool> Handle(SetStockRejectedOrderStatusCommand comm...
class SetStockRejectedOrderStatusIdentifiedCommandHandler (line 38) | public class SetStockRejectedOrderStatusIdentifiedCommandHandler : Ident...
method SetStockRejectedOrderStatusIdentifiedCommandHandler (line 40) | public SetStockRejectedOrderStatusIdentifiedCommandHandler(
method CreateResultForDuplicateRequest (line 48) | protected override bool CreateResultForDuplicateRequest()
FILE: src/Ordering.API/Application/Commands/ShipOrderCommand.cs
type ShipOrderCommand (line 3) | public record ShipOrderCommand(int OrderNumber) : IRequest<bool>;
FILE: src/Ordering.API/Application/Commands/ShipOrderCommandHandler.cs
class ShipOrderCommandHandler (line 4) | public class ShipOrderCommandHandler : IRequestHandler<ShipOrderCommand,...
method ShipOrderCommandHandler (line 8) | public ShipOrderCommandHandler(IOrderRepository orderRepository)
method Handle (line 19) | public async Task<bool> Handle(ShipOrderCommand command, CancellationT...
class ShipOrderIdentifiedCommandHandler (line 34) | public class ShipOrderIdentifiedCommandHandler : IdentifiedCommandHandle...
method ShipOrderIdentifiedCommandHandler (line 36) | public ShipOrderIdentifiedCommandHandler(
method CreateResultForDuplicateRequest (line 44) | protected override bool CreateResultForDuplicateRequest()
FILE: src/Ordering.API/Application/DomainEventHandlers/OrderCancelledDomainEventHandler.cs
class OrderCancelledDomainEventHandler (line 3) | public partial class OrderCancelledDomainEventHandler
method OrderCancelledDomainEventHandler (line 11) | public OrderCancelledDomainEventHandler(
method Handle (line 23) | public async Task Handle(OrderCancelledDomainEvent domainEvent, Cancel...
FILE: src/Ordering.API/Application/DomainEventHandlers/OrderShippedDomainEventHandler.cs
class OrderShippedDomainEventHandler (line 3) | public class OrderShippedDomainEventHandler
method OrderShippedDomainEventHandler (line 11) | public OrderShippedDomainEventHandler(
method Handle (line 23) | public async Task Handle(OrderShippedDomainEvent domainEvent, Cancella...
FILE: src/Ordering.API/Application/DomainEventHandlers/OrderStatusChangedToAwaitingValidationDomainEventHandler.cs
class OrderStatusChangedToAwaitingValidationDomainEventHandler (line 3) | public class OrderStatusChangedToAwaitingValidationDomainEventHandler
method OrderStatusChangedToAwaitingValidationDomainEventHandler (line 11) | public OrderStatusChangedToAwaitingValidationDomainEventHandler(
method Handle (line 23) | public async Task Handle(OrderStatusChangedToAwaitingValidationDomainE...
FILE: src/Ordering.API/Application/DomainEventHandlers/OrderStatusChangedToPaidDomainEventHandler.cs
class OrderStatusChangedToPaidDomainEventHandler (line 3) | public class OrderStatusChangedToPaidDomainEventHandler : INotificationH...
method OrderStatusChangedToPaidDomainEventHandler (line 10) | public OrderStatusChangedToPaidDomainEventHandler(
method Handle (line 22) | public async Task Handle(OrderStatusChangedToPaidDomainEvent domainEve...
FILE: src/Ordering.API/Application/DomainEventHandlers/OrderStatusChangedToStockConfirmedDomainEventHandler.cs
class OrderStatusChangedToStockConfirmedDomainEventHandler (line 3) | public class OrderStatusChangedToStockConfirmedDomainEventHandler
method OrderStatusChangedToStockConfirmedDomainEventHandler (line 11) | public OrderStatusChangedToStockConfirmedDomainEventHandler(
method Handle (line 23) | public async Task Handle(OrderStatusChangedToStockConfirmedDomainEvent...
FILE: src/Ordering.API/Application/DomainEventHandlers/UpdateOrderWhenBuyerAndPaymentMethodVerifiedDomainEventHandler.cs
class UpdateOrderWhenBuyerAndPaymentMethodVerifiedDomainEventHandler (line 3) | public class UpdateOrderWhenBuyerAndPaymentMethodVerifiedDomainEventHand...
method UpdateOrderWhenBuyerAndPaymentMethodVerifiedDomainEventHandler (line 8) | public UpdateOrderWhenBuyerAndPaymentMethodVerifiedDomainEventHandler(
method Handle (line 19) | public async Task Handle(BuyerAndPaymentMethodVerifiedDomainEvent doma...
FILE: src/Ordering.API/Application/DomainEventHandlers/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs
class ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler (line 3) | public class ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler
method ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler (line 10) | public ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler(
method Handle (line 20) | public async Task Handle(OrderStartedDomainEvent domainEvent, Cancella...
FILE: src/Ordering.API/Application/IntegrationEvents/EventHandling/GracePeriodConfirmedIntegrationEventHandler.cs
class GracePeriodConfirmedIntegrationEventHandler (line 3) | public class GracePeriodConfirmedIntegrationEventHandler(
method Handle (line 15) | public async Task Handle(GracePeriodConfirmedIntegrationEvent @event)
FILE: src/Ordering.API/Application/IntegrationEvents/EventHandling/OrderPaymentFailedIntegrationEventHandler.cs
class OrderPaymentFailedIntegrationEventHandler (line 3) | public class OrderPaymentFailedIntegrationEventHandler(
method Handle (line 8) | public async Task Handle(OrderPaymentFailedIntegrationEvent @event)
FILE: src/Ordering.API/Application/IntegrationEvents/EventHandling/OrderPaymentSucceededIntegrationEventHandler.cs
class OrderPaymentSucceededIntegrationEventHandler (line 3) | public class OrderPaymentSucceededIntegrationEventHandler(
method Handle (line 8) | public async Task Handle(OrderPaymentSucceededIntegrationEvent @event)
FILE: src/Ordering.API/Application/IntegrationEvents/EventHandling/OrderStockConfirmedIntegrationEventHandler.cs
class OrderStockConfirmedIntegrationEventHandler (line 3) | public class OrderStockConfirmedIntegrationEventHandler(
method Handle (line 8) | public async Task Handle(OrderStockConfirmedIntegrationEvent @event)
FILE: src/Ordering.API/Application/IntegrationEvents/EventHandling/OrderStockRejectedIntegrationEventHandler.cs
class OrderStockRejectedIntegrationEventHandler (line 2) | public class OrderStockRejectedIntegrationEventHandler(
method Handle (line 6) | public async Task Handle(OrderStockRejectedIntegrationEvent @event)
FILE: src/Ordering.API/Application/IntegrationEvents/Events/GracePeriodConfirmedIntegrationEvent.cs
type GracePeriodConfirmedIntegrationEvent (line 3) | public record GracePeriodConfirmedIntegrationEvent : IntegrationEvent
FILE: src/Ordering.API/Application/IntegrationEvents/Events/OrderPaymentFailedIntegrationEvent .cs
type OrderPaymentFailedIntegrationEvent (line 3) | public record OrderPaymentFailedIntegrationEvent : IntegrationEvent
FILE: src/Ordering.API/Application/IntegrationEvents/Events/OrderPaymentSucceededIntegrationEvent.cs
type OrderPaymentSucceededIntegrationEvent (line 3) | public record OrderPaymentSucceededIntegrationEvent : IntegrationEvent
FILE: src/Ordering.API/Application/IntegrationEvents/Events/OrderStartedIntegrationEvent.cs
type OrderStartedIntegrationEvent (line 6) | public record OrderStartedIntegrationEvent : IntegrationEvent
FILE: src/Ordering.API/Application/IntegrationEvents/Events/OrderStatusChangedToAwaitingValidationIntegrationEvent.cs
type OrderStatusChangedToAwaitingValidationIntegrationEvent (line 3) | public record OrderStatusChangedToAwaitingValidationIntegrationEvent : I...
type OrderStockItem (line 23) | public record OrderStockItem
FILE: src/Ordering.API/Application/IntegrationEvents/Events/OrderStatusChangedToCancelledIntegrationEvent.cs
type OrderStatusChangedToCancelledIntegrationEvent (line 3) | public record OrderStatusChangedToCancelledIntegrationEvent : Integratio...
FILE: src/Ordering.API/Application/IntegrationEvents/Events/OrderStatusChangedToPaidIntegrationEvent.cs
type OrderStatusChangedToPaidIntegrationEvent (line 3) | public record OrderStatusChangedToPaidIntegrationEvent : IntegrationEvent
FILE: src/Ordering.API/Application/IntegrationEvents/Events/OrderStatusChangedToShippedIntegrationEvent.cs
type OrderStatusChangedToShippedIntegrationEvent (line 3) | public record OrderStatusChangedToShippedIntegrationEvent : IntegrationE...
FILE: src/Ordering.API/Application/IntegrationEvents/Events/OrderStatusChangedToStockConfirmedIntegrationEvent.cs
type OrderStatusChangedToStockConfirmedIntegrationEvent (line 3) | public record OrderStatusChangedToStockConfirmedIntegrationEvent : Integ...
FILE: src/Ordering.API/Application/IntegrationEvents/Events/OrderStatusChangedTosubmittedIntegrationEvent.cs
type OrderStatusChangedToSubmittedIntegrationEvent (line 3) | public record OrderStatusChangedToSubmittedIntegrationEvent : Integratio...
FILE: src/Ordering.API/Application/IntegrationEvents/Events/OrderStockConfirmedIntegrationEvent.cs
type OrderStockConfirmedIntegrationEvent (line 3) | public record OrderStockConfirmedIntegrationEvent : IntegrationEvent
FILE: src/Ordering.API/Application/IntegrationEvents/Events/OrderStockRejectedIntegrationEvent.cs
type OrderStockRejectedIntegrationEvent (line 3) | public record OrderStockRejectedIntegrationEvent : IntegrationEvent
type ConfirmedOrderStockItem (line 17) | public record ConfirmedOrderStockItem
FILE: src/Ordering.API/Application/IntegrationEvents/IOrderingIntegrationEventService.cs
type IOrderingIntegrationEventService (line 3) | public interface IOrderingIntegrationEventService
method PublishEventsThroughEventBusAsync (line 5) | Task PublishEventsThroughEventBusAsync(Guid transactionId);
method AddAndSaveEventAsync (line 6) | Task AddAndSaveEventAsync(IntegrationEvent evt);
FILE: src/Ordering.API/Application/IntegrationEvents/OrderingIntegrationEventService.cs
class OrderingIntegrationEventService (line 3) | public class OrderingIntegrationEventService(IEventBus eventBus,
method PublishEventsThroughEventBusAsync (line 13) | public async Task PublishEventsThroughEventBusAsync(Guid transactionId)
method AddAndSaveEventAsync (line 36) | public async Task AddAndSaveEventAsync(IntegrationEvent evt)
FILE: src/Ordering.API/Application/Models/BasketItem.cs
class BasketItem (line 3) | public class BasketItem
FILE: src/Ordering.API/Application/Models/CustomerBasket.cs
class CustomerBasket (line 3) | public class CustomerBasket
method CustomerBasket (line 8) | public CustomerBasket(string buyerId, List<BasketItem> items)
FILE: src/Ordering.API/Application/Queries/IOrderQueries.cs
type IOrderQueries (line 3) | public interface IOrderQueries
method GetOrderAsync (line 5) | Task<Order> GetOrderAsync(int id);
method GetOrdersFromUserAsync (line 7) | Task<IEnumerable<OrderSummary>> GetOrdersFromUserAsync(string userId);
method GetCardTypesAsync (line 9) | Task<IEnumerable<CardType>> GetCardTypesAsync();
FILE: src/Ordering.API/Application/Queries/OrderQueries.cs
class OrderQueries (line 3) | public class OrderQueries(OrderingContext context)
method GetOrderAsync (line 6) | public async Task<Order> GetOrderAsync(int id)
method GetOrdersFromUserAsync (line 37) | public async Task<IEnumerable<OrderSummary>> GetOrdersFromUserAsync(st...
method GetCardTypesAsync (line 51) | public async Task<IEnumerable<CardType>> GetCardTypesAsync() =>
FILE: src/Ordering.API/Application/Queries/OrderViewModel.cs
type Orderitem (line 3) | public record Orderitem
type Order (line 11) | public record Order
type OrderSummary (line 26) | public record OrderSummary
type CardType (line 34) | public record CardType
FILE: src/Ordering.API/Application/Validations/CancelOrderCommandValidator.cs
class CancelOrderCommandValidator (line 3) | public class CancelOrderCommandValidator : AbstractValidator<CancelOrder...
method CancelOrderCommandValidator (line 5) | public CancelOrderCommandValidator(ILogger<CancelOrderCommandValidator...
FILE: src/Ordering.API/Application/Validations/CreateOrderCommandValidator.cs
class CreateOrderCommandValidator (line 2) | public class CreateOrderCommandValidator : AbstractValidator<CreateOrder...
method CreateOrderCommandValidator (line 4) | public CreateOrderCommandValidator(ILogger<CreateOrderCommandValidator...
method BeValidExpirationDate (line 24) | private bool BeValidExpirationDate(DateTime dateTime)
method ContainOrderItems (line 29) | private bool ContainOrderItems(IEnumerable<OrderItemDTO> orderItems)
FILE: src/Ordering.API/Application/Validations/IdentifiedCommandValidator.cs
class IdentifiedCommandValidator (line 3) | public class IdentifiedCommandValidator : AbstractValidator<IdentifiedCo...
method IdentifiedCommandValidator (line 5) | public IdentifiedCommandValidator(ILogger<IdentifiedCommandValidator> ...
FILE: src/Ordering.API/Application/Validations/ShipOrderCommandValidator.cs
class ShipOrderCommandValidator (line 3) | public class ShipOrderCommandValidator : AbstractValidator<ShipOrderComm...
method ShipOrderCommandValidator (line 5) | public ShipOrderCommandValidator(ILogger<ShipOrderCommandValidator> lo...
FILE: src/Ordering.API/Extensions/BasketItemExtensions.cs
class BasketItemExtensions (line 3) | public static class BasketItemExtensions
method ToOrderItemsDTO (line 5) | public static IEnumerable<OrderItemDTO> ToOrderItemsDTO(this IEnumerab...
method ToOrderItemDTO (line 13) | public static OrderItemDTO ToOrderItemDTO(this BasketItem item)
FILE: src/Ordering.API/Extensions/Extensions.cs
class Extensions (line 3) | internal static class Extensions
method AddApplicationServices (line 5) | public static void AddApplicationServices(this IHostApplicationBuilder...
method AddEventBusSubscriptions (line 53) | private static void AddEventBusSubscriptions(this IEventBusBuilder eve...
FILE: src/Ordering.API/Extensions/LinqSelectExtensions.cs
class LinqSelectExtensions (line 3) | public static class LinqSelectExtensions
method SelectTry (line 5) | public static IEnumerable<SelectTryResult<TSource, TResult>> SelectTry...
method OnCaughtException (line 22) | public static IEnumerable<TResult> OnCaughtException<TSource, TResult>...
method OnCaughtException (line 27) | public static IEnumerable<TResult> OnCaughtException<TSource, TResult>...
class SelectTryResult (line 32) | public class SelectTryResult<TSource, TResult>
method SelectTryResult (line 34) | internal SelectTryResult(TSource source, TResult result, Exception e...
FILE: src/Ordering.API/Extensions/OrderingApiTrace.cs
class OrderingApiTrace (line 3) | internal static partial class OrderingApiTrace
method LogOrderStatusUpdated (line 5) | [LoggerMessage(EventId = 1, EventName = "OrderStatusUpdated", Level = ...
method LogOrderPaymentMethodUpdated (line 8) | [LoggerMessage(EventId = 2, EventName = "PaymentMethodUpdated", Level ...
method LogOrderBuyerAndPaymentValidatedOrUpdated (line 11) | [LoggerMessage(EventId = 3, EventName = "BuyerAndPaymentValidatedOrUpd...
FILE: src/Ordering.API/Infrastructure/OrderingContextSeed.cs
class OrderingContextSeed (line 5) | public class OrderingContextSeed: IDbSeeder<OrderingContext>
method SeedAsync (line 7) | public async Task SeedAsync(OrderingContext context)
method GetPredefinedCardTypes (line 19) | private static IEnumerable<CardType> GetPredefinedCardTypes()
FILE: src/Ordering.API/Infrastructure/Services/IIdentityService.cs
type IIdentityService (line 3) | public interface IIdentityService
method GetUserIdentity (line 5) | string GetUserIdentity();
method GetUserName (line 7) | string GetUserName();
FILE: src/Ordering.API/Infrastructure/Services/IdentityService.cs
class IdentityService (line 3) | public class IdentityService(IHttpContextAccessor context) : IIdentitySe...
method GetUserIdentity (line 5) | public string GetUserIdentity()
method GetUserName (line 8) | public string GetUserName()
FILE: src/Ordering.API/Program.Testing.cs
class Program (line 6) | public partial class Program { }
FILE: src/Ordering.Domain/AggregatesModel/BuyerAggregate/Buyer.cs
class Buyer (line 5) | public class Buyer
method Buyer (line 17) | protected Buyer()
method Buyer (line 23) | public Buyer(string identity, string name) : this()
method VerifyOrAddPaymentMethod (line 29) | public PaymentMethod VerifyOrAddPaymentMethod(
FILE: src/Ordering.Domain/AggregatesModel/BuyerAggregate/CardType.cs
class CardType (line 3) | public sealed class CardType
FILE: src/Ordering.Domain/AggregatesModel/BuyerAggregate/IBuyerRepository.cs
type IBuyerRepository (line 6) | public interface IBuyerRepository : IRepository<Buyer>
method Add (line 8) | Buyer Add(Buyer buyer);
method Update (line 9) | Buyer Update(Buyer buyer);
method FindAsync (line 10) | Task<Buyer> FindAsync(string BuyerIdentityGuid);
method FindByIdAsync (line 11) | Task<Buyer> FindByIdAsync(int id);
FILE: src/Ordering.Domain/AggregatesModel/BuyerAggregate/PaymentMethod.cs
class PaymentMethod (line 5) | public class PaymentMethod : Entity
method PaymentMethod (line 19) | protected PaymentMethod() { }
method PaymentMethod (line 21) | public PaymentMethod(int cardTypeId, string alias, string cardNumber, ...
method IsEqualTo (line 37) | public bool IsEqualTo(int cardTypeId, string cardNumber, DateTime expi...
FILE: src/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs
class Address (line 5) | public class Address : ValueObject
method Address (line 13) | public Address() { }
method Address (line 15) | public Address(string street, string city, string state, string countr...
method GetEqualityComponents (line 24) | protected override IEnumerable<object> GetEqualityComponents()
FILE: src/Ordering.Domain/AggregatesModel/OrderAggregate/IOrderRepository.cs
type IOrderRepository (line 6) | public interface IOrderRepository : IRepository<Order>
method Add (line 8) | Order Add(Order order);
method Update (line 10) | void Update(Order order);
method GetAsync (line 12) | Task<Order> GetAsync(int orderId);
FILE: src/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs
class Order (line 5) | public class Order
method NewDraft (line 37) | public static Order NewDraft()
method Order (line 46) | protected Order()
method Order (line 52) | public Order(string userId, string userName, Address address, int card...
method AddOrderItem (line 71) | public void AddOrderItem(int productId, string productName, decimal un...
method SetPaymentMethodVerified (line 93) | public void SetPaymentMethodVerified(int buyerId, int paymentId)
method SetAwaitingValidationStatus (line 99) | public void SetAwaitingValidationStatus()
method SetStockConfirmedStatus (line 108) | public void SetStockConfirmedStatus()
method SetPaidStatus (line 119) | public void SetPaidStatus()
method SetShippedStatus (line 130) | public void SetShippedStatus()
method SetCancelledStatus (line 142) | public void SetCancelledStatus()
method SetCancelledStatusWhenStockIsRejected (line 155) | public void SetCancelledStatusWhenStockIsRejected(IEnumerable<int> ord...
method AddOrderStartedDomainEvent (line 170) | private void AddOrderStartedDomainEvent(string userId, string userName...
method StatusChangeException (line 180) | private void StatusChangeException(OrderStatus orderStatusToChange)
method GetTotal (line 185) | public decimal GetTotal() => _orderItems.Sum(o => o.Units * o.UnitPrice);
FILE: src/Ordering.Domain/AggregatesModel/OrderAggregate/OrderItem.cs
class OrderItem (line 5) | public class OrderItem
method OrderItem (line 21) | protected OrderItem() { }
method OrderItem (line 23) | public OrderItem(int productId, string productName, decimal unitPrice,...
method SetNewDiscount (line 44) | public void SetNewDiscount(decimal discount)
method AddUnits (line 54) | public void AddUnits(int units)
FILE: src/Ordering.Domain/AggregatesModel/OrderAggregate/OrderStatus.cs
type OrderStatus (line 5) | [JsonConverter(typeof(JsonStringEnumConverter))]
FILE: src/Ordering.Domain/Events/BuyerPaymentMethodVerifiedDomainEvent.cs
class BuyerAndPaymentMethodVerifiedDomainEvent (line 3) | public class BuyerAndPaymentMethodVerifiedDomainEvent
method BuyerAndPaymentMethodVerifiedDomainEvent (line 10) | public BuyerAndPaymentMethodVerifiedDomainEvent(Buyer buyer, PaymentMe...
FILE: src/Ordering.Domain/Events/OrderCancelledDomainEvent.cs
class OrderCancelledDomainEvent (line 3) | public class OrderCancelledDomainEvent : INotification
method OrderCancelledDomainEvent (line 7) | public OrderCancelledDomainEvent(Order order)
FILE: src/Ordering.Domain/Events/OrderShippedDomainEvent.cs
class OrderShippedDomainEvent (line 3) | public class OrderShippedDomainEvent : INotification
method OrderShippedDomainEvent (line 7) | public OrderShippedDomainEvent(Order order)
FILE: src/Ordering.Domain/Events/OrderStartedDomainEvent.cs
type OrderStartedDomainEvent (line 7) | public record class OrderStartedDomainEvent(
FILE: src/Ordering.Domain/Events/OrderStatusChangedToAwaitingValidationDomainEvent.cs
class OrderStatusChangedToAwaitingValidationDomainEvent (line 6) | public class OrderStatusChangedToAwaitingValidationDomainEvent
method OrderStatusChangedToAwaitingValidationDomainEvent (line 12) | public OrderStatusChangedToAwaitingValidationDomainEvent(int orderId,
FILE: src/Ordering.Domain/Events/OrderStatusChangedToPaidDomainEvent.cs
class OrderStatusChangedToPaidDomainEvent (line 6) | public class OrderStatusChangedToPaidDomainEvent
method OrderStatusChangedToPaidDomainEvent (line 12) | public OrderStatusChangedToPaidDomainEvent(int orderId,
FILE: src/Ordering.Domain/Events/OrderStatusChangedToStockConfirmedDomainEvent.cs
class OrderStatusChangedToStockConfirmedDomainEvent (line 6) | public class OrderStatusChangedToStockConfirmedDomainEvent
method OrderStatusChangedToStockConfirmedDomainEvent (line 11) | public OrderStatusChangedToStockConfirmedDomainEvent(int orderId)
FILE: src/Ordering.Domain/Exceptions/OrderingDomainException.cs
class OrderingDomainException (line 6) | public class OrderingDomainException : Exception
method OrderingDomainException (line 8) | public OrderingDomainException()
method OrderingDomainException (line 11) | public OrderingDomainException(string message)
method OrderingDomainException (line 15) | public OrderingDomainException(string message, Exception innerException)
FILE: src/Ordering.Domain/SeedWork/Entity.cs
class Entity (line 3) | public abstract class Entity
method AddDomainEvent (line 22) | public void AddDomainEvent(INotification eventItem)
method RemoveDomainEvent (line 28) | public void RemoveDomainEvent(INotification eventItem)
method ClearDomainEvents (line 33) | public void ClearDomainEvents()
method IsTransient (line 38) | public bool IsTransient()
method Equals (line 43) | public override bool Equals(object obj)
method GetHashCode (line 62) | public override int GetHashCode()
FILE: src/Ordering.Domain/SeedWork/IAggregateRoot.cs
type IAggregateRoot (line 3) | public interface IAggregateRoot { }
FILE: src/Ordering.Domain/SeedWork/IRepository.cs
type IRepository (line 3) | public interface IRepository<T> where T : IAggregateRoot
FILE: src/Ordering.Domain/SeedWork/IUnitOfWork.cs
type IUnitOfWork (line 3) | public interface IUnitOfWork : IDisposable
method SaveChangesAsync (line 5) | Task<int> SaveChangesAsync(CancellationToken cancellationToken = defau...
method SaveEntitiesAsync (line 6) | Task<bool> SaveEntitiesAsync(CancellationToken cancellationToken = def...
FILE: src/Ordering.Domain/SeedWork/ValueObject.cs
class ValueObject (line 3) | public abstract class ValueObject
method EqualOperator (line 5) | protected static bool EqualOperator(ValueObject left, ValueObject right)
method NotEqualOperator (line 14) | protected static bool NotEqualOperator(ValueObject left, ValueObject r...
method GetEqualityComponents (line 19) | protected abstract IEnumerable<object> GetEqualityComponents();
method Equals (line 21) | public override bool Equals(object obj)
method GetHashCode (line 33) | public override int GetHashCode()
method GetCopy (line 40) | public ValueObject GetCopy()
FILE: src/Ordering.Infrastructure/EntityConfigurations/BuyerEntityTypeConfiguration.cs
class BuyerEntityTypeConfiguration (line 3) | class BuyerEntityTypeConfiguration
method Configure (line 6) | public void Configure(EntityTypeBuilder<Buyer> buyerConfiguration)
FILE: src/Ordering.Infrastructure/EntityConfigurations/CardTypeEntityTypeConfiguration.cs
class CardTypeEntityTypeConfiguration (line 3) | class CardTypeEntityTypeConfiguration
method Configure (line 6) | public void Configure(EntityTypeBuilder<CardType> cardTypesConfiguration)
FILE: src/Ordering.Infrastructure/EntityConfigurations/ClientRequestEntityTypeConfiguration.cs
class ClientRequestEntityTypeConfiguration (line 3) | class ClientRequestEntityTypeConfiguration
method Configure (line 6) | public void Configure(EntityTypeBuilder<ClientRequest> requestConfigur...
FILE: src/Ordering.Infrastructure/EntityConfigurations/OrderEntityTypeConfiguration.cs
class OrderEntityTypeConfiguration (line 3) | class OrderEntityTypeConfiguration : IEntityTypeConfiguration<Order>
method Configure (line 5) | public void Configure(EntityTypeBuilder<Order> orderConfiguration)
FILE: src/Ordering.Infrastructure/EntityConfigurations/OrderItemEntityTypeConfiguration.cs
class OrderItemEntityTypeConfiguration (line 3) | class OrderItemEntityTypeConfiguration
method Configure (line 6) | public void Configure(EntityTypeBuilder<OrderItem> orderItemConfigurat...
FILE: src/Ordering.Infrastructure/EntityConfigurations/PaymentMethodEntityTypeConfiguration.cs
class PaymentMethodEntityTypeConfiguration (line 3) | class PaymentMethodEntityTypeConfiguration
method Configure (line 6) | public void Configure(EntityTypeBuilder<PaymentMethod> paymentConfigur...
FILE: src/Ordering.Infrastructure/Idempotency/ClientRequest.cs
class ClientRequest (line 5) | public class ClientRequest
FILE: src/Ordering.Infrastructure/Idempotency/IRequestManager.cs
type IRequestManager (line 3) | public interface IRequestManager
method ExistAsync (line 5) | Task<bool> ExistAsync(Guid id);
method CreateRequestForCommandAsync (line 7) | Task CreateRequestForCommandAsync<T>(Guid id);
FILE: src/Ordering.Infrastructure/Idempotency/RequestManager.cs
class RequestManager (line 3) | public class RequestManager : IRequestManager
method RequestManager (line 7) | public RequestManager(OrderingContext context)
method ExistAsync (line 13) | public async Task<bool> ExistAsync(Guid id)
method CreateRequestForCommandAsync (line 21) | public async Task CreateRequestForCommandAsync<T>(Guid id)
FILE: src/Ordering.Infrastructure/MediatorExtension.cs
class MediatorExtension (line 3) | static class MediatorExtension
method DispatchDomainEventsAsync (line 5) | public static async Task DispatchDomainEventsAsync(this IMediator medi...
FILE: src/Ordering.Infrastructure/Migrations/20230925222426_Initial.Designer.cs
class Initial (line 14) | [DbContext(typeof(OrderingContext))]
method BuildTargetModel (line 19) | protected override void BuildTargetModel(ModelBuilder modelBuilder)
FILE: src/Ordering.Infrastructure/Migrations/20230925222426_Initial.cs
class Initial (line 9) | public partial class Initial : Migration
method Up (line 12) | protected override void Up(MigrationBuilder migrationBuilder)
method Down (line 235) | protected override void Down(MigrationBuilder migrationBuilder)
FILE: src/Ordering.Infrastructure/Migrations/20231021004633_FixOrderitemseqSchema.Designer.cs
class FixOrderitemseqSchema (line 14) | [DbContext(typeof(OrderingContext))]
method BuildTargetModel (line 19) | protected override void BuildTargetModel(ModelBuilder modelBuilder)
FILE: src/Ordering.Infrastructure/Migrations/20231021004633_FixOrderitemseqSchema.cs
class FixOrderitemseqSchema (line 8) | public partial class FixOrderitemseqSchema : Migration
method Up (line 11) | protected override void Up(MigrationBuilder migrationBuilder)
method Down (line 40) | protected override void Down(MigrationBuilder migrationBuilder)
FILE: src/Ordering.Infrastructure/Migrations/20231026091055_Outbox.Designer.cs
class Outbox (line 14) | [DbContext(typeof(OrderingContext))]
method BuildTargetModel (line 19) | protected override void BuildTargetModel(ModelBuilder modelBuilder)
FILE: src/Ordering.Infrastructure/Migrations/20231026091055_Outbox.cs
class Outbox (line 9) | public partial class Outbox : Migration
method Up (line 12) | protected override void Up(MigrationBuilder migrationBuilder)
method Down (line 34) | protected override void Down(MigrationBuilder migrationBuilder)
FILE: src/Ordering.Infrastructure/Migrations/20240106121712_UseEnumForOrderStatus.Designer.cs
class UseEnumForOrderStatus (line 14) | [DbContext(typeof(OrderingContext))]
method BuildTargetModel (line 19) | protected override void BuildTargetModel(ModelBuilder modelBuilder)
FILE: src/Ordering.Infrastructure/Migrations/20240106121712_UseEnumForOrderStatus.cs
class UseEnumForOrderStatus (line 8) | public partial class UseEnumForOrderStatus : Migration
method Up (line 11) | protected override void Up(MigrationBuilder migrationBuilder)
method Down (line 51) | protected override void Down(MigrationBuilder migrationBuilder)
FILE: src/Ordering.Infrastructure/Migrations/OrderingContextModelSnapshot.cs
class OrderingContextModelSnapshot (line 13) | [DbContext(typeof(OrderingContext))]
method BuildModel (line 16) | protected override void BuildModel(ModelBuilder modelBuilder)
FILE: src/Ordering.Infrastructure/OrderingContext.cs
class OrderingContext (line 10) | public class OrderingContext : DbContext, IUnitOfWork
method OrderingContext (line 21) | public OrderingContext(DbContextOptions<OrderingContext> options) : ba...
method GetCurrentTransaction (line 23) | public IDbContextTransaction GetCurrentTransaction() => _currentTransa...
method OrderingContext (line 27) | public OrderingContext(DbContextOptions<OrderingContext> options, IMed...
method OnModelCreating (line 35) | protected override void OnModelCreating(ModelBuilder modelBuilder)
method SaveEntitiesAsync (line 47) | public async Task<bool> SaveEntitiesAsync(CancellationToken cancellati...
method BeginTransactionAsync (line 64) | public async Task<IDbContextTransaction> BeginTransactionAsync()
method CommitTransactionAsync (line 73) | public async Task CommitTransactionAsync(IDbContextTransaction transac...
method RollbackTransaction (line 98) | public void RollbackTransaction()
FILE: src/Ordering.Infrastructure/Repositories/BuyerRepository.cs
class BuyerRepository (line 3) | public class BuyerRepository
method BuyerRepository (line 9) | public BuyerRepository(OrderingContext context)
method Add (line 14) | public Buyer Add(Buyer buyer)
method Update (line 26) | public Buyer Update(Buyer buyer)
method FindAsync (line 33) | public async Task<Buyer> FindAsync(string identity)
method FindByIdAsync (line 43) | public async Task<Buyer> FindByIdAsync(int id)
FILE: src/Ordering.Infrastructure/Repositories/OrderRepository.cs
class OrderRepository (line 3) | public class OrderRepository
method OrderRepository (line 10) | public OrderRepository(OrderingContext context)
method Add (line 15) | public Order Add(Order order)
method GetAsync (line 21) | public async Task<Order> GetAsync(int orderId)
method Update (line 34) | public void Update(Order order)
FILE: src/PaymentProcessor/IntegrationEvents/EventHandling/OrderStatusChangedToStockConfirmedIntegrationEventHandler.cs
class OrderStatusChangedToStockConfirmedIntegrationEventHandler (line 3) | public class OrderStatusChangedToStockConfirmedIntegrationEventHandler(
method Handle (line 9) | public async Task Handle(OrderStatusChangedToStockConfirmedIntegration...
FILE: src/PaymentProcessor/IntegrationEvents/Events/OrderPaymentFailedIntegrationEvent.cs
type OrderPaymentFailedIntegrationEvent (line 3) | public record OrderPaymentFailedIntegrationEvent(int OrderId) : Integrat...
FILE: src/PaymentProcessor/IntegrationEvents/Events/OrderPaymentSucceededIntegrationEvent.cs
type OrderPaymentSucceededIntegrationEvent (line 3) | public record OrderPaymentSucceededIntegrationEvent(int OrderId) : Integ...
FILE: src/PaymentProcessor/IntegrationEvents/Events/OrderStatusChangedToStockConfirmedIntegrationEvent.cs
type OrderStatusChangedToStockConfirmedIntegrationEvent (line 3) | public record OrderStatusChangedToStockConfirmedIntegrationEvent(int Ord...
FILE: src/PaymentProcessor/PaymentOptions.cs
class PaymentOptions (line 3) | public class PaymentOptions
FILE: src/Shared/ActivityExtensions.cs
class ActivityExtensions (line 3) | internal static class ActivityExtensions
method SetExceptionTags (line 6) | public static void SetExceptionTags(this Activity activity, Exception ex)
FILE: src/Shared/MigrateDbContextExtensions.cs
class MigrateDbContextExtensions (line 5) | internal static class MigrateDbContextExtensions
method AddMigration (line 10) | public static IServiceCollection AddMigration<TContext>(this IServiceC...
method AddMigration (line 14) | public static IServiceCollection AddMigration<TContext>(this IServiceC...
method AddMigration (line 23) | public static IServiceCollection AddMigration<TContext, TDbSeeder>(thi...
method MigrateDbContextAsync (line 31) | private static async Task MigrateDbContextAsync<TContext>(this IServic...
method InvokeSeeder (line 58) | private static async Task InvokeSeeder<TContext>(Func<TContext, IServi...
class MigrationHostedService (line 76) | private class MigrationHostedService<TContext>(IServiceProvider servic...
method StartAsync (line 79) | public override Task StartAsync(CancellationToken cancellationToken)
method ExecuteAsync (line 84) | protected override Task ExecuteAsync(CancellationToken stoppingToken)
type IDbSeeder (line 90) | public interface IDbSeeder<in TContext> where TContext : DbContext
method SeedAsync (line 92) | Task SeedAsync(TContext context);
FILE: src/WebApp/Components/Chatbot/ChatState.cs
class ChatState (line 9) | public class ChatState
method ChatState (line 19) | public ChatState(
method AddUserMessageAsync (line 69) | public async Task AddUserMessageAsync(string userText, Action onMessag...
method GetUserInfo (line 96) | [Description("Gets information about the chat user")]
method SearchCatalog (line 117) | [Description("Searches the AdventureWorks catalog for a provided produ...
method AddToCart (line 136) | [Description("Adds a product to the user's shopping cart.")]
method GetCartContents (line 155) | [Description("Gets information about the contents of the user's shoppi...
method Error (line 169) | private string Error(Exception e, string message)
FILE: src/WebApp/Components/Chatbot/Chatbot.razor.js
function scrollToEnd (line 1) | function scrollToEnd(element) {
function submitOnEnter (line 5) | function submitOnEnter(element) {
FILE: src/WebApp/Components/Chatbot/MessageProcessor.cs
class MessageProcessor (line 8) | public static partial class MessageProcessor
method AllowImages (line 10) | public static MarkupString AllowImages(string message)
method FindMarkdownImages (line 33) | [GeneratedRegex(@"\!?\[([^\]]+)\]\s*\(([^\)]+)\)")]
FILE: src/WebApp/Extensions/Extensions.cs
class Extensions (line 11) | public static class Extensions
method AddApplicationServices (line 13) | public static void AddApplicationServices(this IHostApplicationBuilder...
method AddEventBusSubscriptions (line 43) | public static void AddEventBusSubscriptions(this IEventBusBuilder even...
method AddAuthenticationServices (line 53) | public static void AddAuthenticationServices(this IHostApplicationBuil...
method AddAIServices (line 94) | private static void AddAIServices(this IHostApplicationBuilder builder)
method GetBuyerIdAsync (line 111) | public static async Task<string?> GetBuyerIdAsync(this AuthenticationS...
method GetUserNameAsync (line 118) | public static async Task<string?> GetUserNameAsync(this Authentication...
FILE: src/WebApp/Services/BasketCheckoutInfo.cs
class BasketCheckoutInfo (line 5) | public class BasketCheckoutInfo
FILE: src/WebApp/Services/BasketItem.cs
class BasketItem (line 3) | public class BasketItem
FILE: src/WebApp/Services/BasketService.cs
class BasketService (line 7) | public class BasketService(GrpcBasketClient basketClient)
method GetBasketAsync (line 9) | public async Task<IReadOnlyCollection<BasketQuantity>> GetBasketAsync()
method DeleteBasketAsync (line 15) | public async Task DeleteBasketAsync()
method UpdateBasketAsync (line 20) | public async Task UpdateBasketAsync(IReadOnlyCollection<BasketQuantity...
method MapToBasket (line 37) | private static List<BasketQuantity> MapToBasket(CustomerBasketResponse...
type BasketQuantity (line 49) | public record BasketQuantity(int ProductId, int Quantity);
FILE: src/WebApp/Services/BasketState.cs
class BasketState (line 9) | public class BasketState(
method DeleteBasketAsync (line 18) | public Task DeleteBasketAsync()
method GetBasketItemsAsync (line 21) | public async Task<IReadOnlyCollection<BasketItem>> GetBasketItemsAsync()
method NotifyOnChange (line 26) | public IDisposable NotifyOnChange(EventCallback callback)
method AddAsync (line 33) | public async Task AddAsync(CatalogItem item)
method SetQuantityAsync (line 58) | public async Task SetQuantityAsync(int productId, int quantity)
method CheckoutAsync (line 78) | public async Task CheckoutAsync(BasketCheckoutInfo checkoutInfo)
method NotifyChangeSubscribersAsync (line 111) | private Task NotifyChangeSubscribersAsync()
method GetUserAsync (line 114) | private async Task<ClaimsPrincipal> GetUserAsync()
method FetchBasketItemsAsync (line 117) | private Task<IReadOnlyCollection<BasketItem>> FetchBasketItemsAsync()
class BasketStateChangedSubscription (line 151) | private class BasketStateChangedSubscription(BasketState Owner, EventC...
method NotifyAsync (line 153) | public Task NotifyAsync() => Callback.InvokeAsync();
method Dispose (line 154) | public void Dispose() => Owner._changeSubscriptions.Remove(this);
type CreateOrderRequest (line 158) | public record CreateOrderRequest(
FILE: src/WebApp/Services/IBasketState.cs
type IBasketState (line 5) | public interface IBasketState
method GetBasketItemsAsync (line 7) | public Task<IReadOnlyCollection<BasketItem>> GetBasketItemsAsync();
method AddAsync (line 9) | public Task AddAsync(CatalogItem item);
FILE: src/WebApp/Services/LogOutService.cs
class LogOutService (line 7) | public class LogOutService
method LogOutAsync (line 9) | public async Task LogOutAsync(HttpContext httpContext)
FILE: src/WebApp/Services/OrderStatus/IntegrationEvents/EventHandling/OrderStatusChangedToAwaitingValidationIntegrationEventHandler.cs
class OrderStatusChangedToAwaitingValidationIntegrationEventHandler (line 5) | public class OrderStatusChangedToAwaitingValidationIntegrationEventHandler(
method Handle (line 10) | public async Task Handle(OrderStatusChangedToAwaitingValidationIntegra...
FILE: src/WebApp/Services/OrderStatus/IntegrationEvents/EventHandling/OrderStatusChangedToCancelledIntegrationEventHandler.cs
class OrderStatusChangedToCancelledIntegrationEventHandler (line 5) | public class OrderStatusChangedToCancelledIntegrationEventHandler(
method Handle (line 10) | public async Task Handle(OrderStatusChangedToCancelledIntegrationEvent...
FILE: src/WebApp/Services/OrderStatus/IntegrationEvents/EventHandling/OrderStatusChangedToPaidIntegrationEventHandler.cs
class OrderStatusChangedToPaidIntegrationEventHandler (line 5) | public class OrderStatusChangedToPaidIntegrationEventHandler(
method Handle (line 10) | public async Task Handle(OrderStatusChangedToPaidIntegrationEvent @event)
FILE: src/WebApp/Services/OrderStatus/IntegrationEvents/EventHandling/OrderStatusChangedToShippedIntegrationEventHandler.cs
class OrderStatusChangedToShippedIntegrationEventHandler (line 5) | public class OrderStatusChangedToShippedIntegrationEventHandler(
method Handle (line 10) | public async Task Handle(OrderStatusChangedToShippedIntegrationEvent @...
FILE: src/WebApp/Services/OrderStatus/IntegrationEvents/EventHandling/OrderStatusChangedToStockConfirmedIntegrationEventHandler.cs
class OrderStatusChangedToStockConfirmedIntegrationEventHandler (line 5) | public class OrderStatusChangedToStockConfirmedIntegrationEventHandler(
method Handle (line 10) | public async Task Handle(OrderStatusChangedToStockConfirmedIntegration...
FILE: src/WebApp/Services/OrderStatus/IntegrationEvents/EventHandling/OrderStatusChangedToSubmittedIntegrationEventHandler.cs
class OrderStatusChangedToSubmittedIntegrationEventHandler (line 5) | public class OrderStatusChangedToSubmittedIntegrationEventHandler(
method Handle (line 10) | public async Task Handle(OrderStatusChangedToSubmittedIntegrationEvent...
FILE: src/WebApp/Services/OrderStatus/IntegrationEvents/Events/OrderStatusChangedToAwaitingValidationIntegrationEvent.cs
type OrderStatusChangedToAwaitingValidationIntegrationEvent (line 5) | public record OrderStatusChangedToAwaitingValidationIntegrationEvent : I...
FILE: src/WebApp/Services/OrderStatus/IntegrationEvents/Events/OrderStatusChangedToCancelledIntegrationEvent.cs
type OrderStatusChangedToCancelledIntegrationEvent (line 5) | public record OrderStatusChangedToCancelledIntegrationEvent : Integratio...
FILE: src/WebApp/Services/OrderStatus/IntegrationEvents/Events/OrderStatusChangedToPaidIntegrationEvent.cs
type OrderStatusChangedToPaidIntegrationEvent (line 5) | public record OrderStatusChangedToPaidIntegrationEvent : IntegrationEvent
FILE: src/WebApp/Services/OrderStatus/IntegrationEvents/Events/OrderStatusChangedToShippedIntegrationEvent.cs
type OrderStatusChangedToShippedIntegrationEvent (line 5) | public record OrderStatusChangedToShippedIntegrationEvent : IntegrationE...
FILE: src/WebApp/Services/OrderStatus/IntegrationEvents/Events/OrderStatusChangedToStockConfirmedIntegrationEvent.cs
type OrderStatusChangedToStockConfirmedIntegrationEvent (line 5) | public record OrderStatusChangedToStockConfirmedIntegrationEvent : Integ...
FILE: src/WebApp/Services/OrderStatus/IntegrationEvents/Events/OrderStatusChangedToSubmittedIntegrationEvent.cs
type OrderStatusChangedToSubmittedIntegrationEvent (line 5) | public record OrderStatusChangedToSubmittedIntegrationEvent : Integratio...
FILE: src/WebApp/Services/OrderStatus/OrderStatusNotificationService.cs
class OrderStatusNotificationService (line 3) | public class OrderStatusNotificationService
method SubscribeToOrderStatusNotifications (line 9) | public IDisposable SubscribeToOrderStatusNotifications(string buyerId,...
method NotifyOrderStatusChangedAsync (line 27) | public Task NotifyOrderStatusChangedAsync(string buyerId)
method Unsubscribe (line 37) | private void Unsubscribe(string buyerId, Subscription subscription)
class Subscription (line 52) | private class Subscription(OrderStatusNotificationService owner, strin...
method NotifyAsync (line 54) | public Task NotifyAsync()
method Dispose (line 59) | public void Dispose()
FILE: src/WebApp/Services/OrderingService.cs
class OrderingService (line 3) | public class OrderingService(HttpClient httpClient)
method GetOrders (line 7) | public Task<OrderRecord[]> GetOrders()
method CreateOrder (line 12) | public Task CreateOrder(CreateOrderRequest request, Guid requestId)
type OrderRecord (line 21) | public record OrderRecord(
FILE: src/WebApp/Services/ProductImageUrlProvider.cs
class ProductImageUrlProvider (line 5) | public class ProductImageUrlProvider : IProductImageUrlProvider
method GetProductImageUrl (line 7) | public string GetProductImageUrl(int productId)
FILE: src/WebAppComponents/Catalog/CatalogItem.cs
type CatalogItem (line 3) | public record CatalogItem(
type CatalogResult (line 14) | public record CatalogResult(int PageIndex, int PageSize, int Count, List...
type CatalogBrand (line 15) | public record CatalogBrand(int Id, string Brand);
type CatalogItemType (line 16) | public record CatalogItemType(int Id, string Type);
FILE: src/WebAppComponents/Item/ItemHelper.cs
class ItemHelper (line 5) | public static class ItemHelper
method Url (line 7) | public static string Url(CatalogItem item)
FILE: src/WebAppComponents/Services/CatalogService.cs
class CatalogService (line 7) | public class CatalogService(HttpClient httpClient) : ICatalogService
method GetCatalogItem (line 11) | public Task<CatalogItem?> GetCatalogItem(int id)
method GetCatalogItems (line 17) | public async Task<CatalogResult> GetCatalogItems(int pageIndex, int pa...
method GetCatalogItems (line 24) | public async Task<List<CatalogItem>> GetCatalogItems(IEnumerable<int> ...
method GetCatalogItemsWithSemanticRelevance (line 31) | public Task<CatalogResult> GetCatalogItemsWithSemanticRelevance(int pa...
method GetBrands (line 38) | public async Task<IEnumerable<CatalogBrand>> GetBrands()
method GetTypes (line 45) | public async Task<IEnumerable<CatalogItemType>> GetTypes()
method GetAllCatalogItemsUri (line 52) | private static string GetAllCatalogItemsUri(string baseUri, int pageIn...
FILE: src/WebAppComponents/Services/ICatalogService.cs
type ICatalogService (line 7) | public interface ICatalogService
method GetCatalogItem (line 9) | Task<CatalogItem?> GetCatalogItem(int id);
method GetCatalogItems (line 10) | Task<CatalogResult> GetCatalogItems(int pageIndex, int pageSize, int? ...
method GetCatalogItems (line 11) | Task<List<CatalogItem>> GetCatalogItems(IEnumerable<int> ids);
method GetCatalogItemsWithSemanticRelevance (line 12) | Task<CatalogResult> GetCatalogItemsWithSemanticRelevance(int page, int...
method GetBrands (line 13) | Task<IEnumerable<CatalogBrand>> GetBrands();
method GetTypes (line 14) | Task<IEnumerable<CatalogItemType>> GetTypes();
FILE: src/WebAppComponents/Services/IProductImageUrlProvider.cs
type IProductImageUrlProvider (line 5) | public interface IProductImageUrlProvider
method GetProductImageUrl (line 7) | string GetProductImageUrl(CatalogItem item)
method GetProductImageUrl (line 10) | string GetProductImageUrl(int productId);
FILE: src/WebhookClient/Endpoints/AuthenticationEndpoints.cs
class AuthenticationEndpoints (line 8) | public static class AuthenticationEndpoints
method MapAuthenticationEndpoints (line 10) | public static IEndpointRouteBuilder MapAuthenticationEndpoints(this IE...
FILE: src/WebhookClient/Endpoints/WebhookEndpoints.cs
class WebhookEndpoints (line 6) | public static class WebhookEndpoints
method MapWebhookEndpoints (line 8) | public static IEndpointRouteBuilder MapWebhookEndpoints(this IEndpoint...
FILE: src/WebhookClient/Extensions/Extensions.cs
class Extensions (line 8) | public static class Extensions
method AddApplicationServices (line 10) | public static void AddApplicationServices(this IHostApplicationBuilder...
method AddAuthenticationServices (line 24) | public static void AddAuthenticationServices(this IHostApplicationBuil...
FILE: src/WebhookClient/Services/HooksRepository.cs
class HooksRepository (line 5) | public class HooksRepository
method AddNew (line 10) | public Task AddNew(WebHookReceived hook)
method GetAll (line 30) | public Task<IEnumerable<WebHookReceived>> GetAll()
method Subscribe (line 35) | public IDisposable Subscribe(Func<Task> callback)
class OnChangeSubscription (line 42) | private class OnChangeSubscription(Func<Task> callback, HooksRepositor...
method NotifyAsync (line 44) | public Task NotifyAsync() => callback();
method Dispose (line 46) | public void Dispose() => owner._onChangeSubscriptions.Remove(this, o...
FILE: src/WebhookClient/Services/WebHookReceived.cs
class WebHookReceived (line 3) | public class WebHookReceived
FILE: src/WebhookClient/Services/WebHooksClient.cs
class WebhooksClient (line 3) | public class WebhooksClient(HttpClient client)
method AddWebHookAsync (line 5) | public Task<HttpResponseMessage> AddWebHookAsync(WebhookSubscriptionRe...
method LoadWebhooks (line 10) | public async Task<IEnumerable<WebhookResponse>> LoadWebhooks()
FILE: src/WebhookClient/Services/WebhookClientOptions.cs
class WebhookClientOptions (line 3) | public class WebhookClientOptions
FILE: src/WebhookClient/Services/WebhookData.cs
class WebhookData (line 5) | public class WebhookData
FILE: src/WebhookClient/Services/WebhookResponse.cs
class WebhookResponse (line 3) | public class WebhookResponse
FILE: src/WebhookClient/Services/WebhookSubscriptionRequest.cs
class WebhookSubscriptionRequest (line 3) | public class WebhookSubscriptionRequest
FILE: src/WebhookClient/Services/WebhookType.cs
type WebhookType (line 3) | public enum WebhookType
FILE: src/Webhooks.API/Apis/WebHooksApi.cs
class WebHooksApi (line 7) | public static class WebHooksApi
method MapWebHooksApiV1 (line 9) | public static RouteGroupBuilder MapWebHooksApiV1(this IEndpointRouteBu...
FILE: src/Webhooks.API/Exceptions/WebhooksDomainException.cs
class WebhooksDomainException (line 3) | public class WebhooksDomainException : Exception
FILE: src/Webhooks.API/Extensions/Extensions.cs
class Extensions (line 1) | internal static class Extensions
method AddApplicationServices (line 3) | public static void AddApplicationServices(this IHostApplicationBuilder...
method AddEventBusSubscriptions (line 19) | private static void AddEventBusSubscriptions(this IEventBusBuilder eve...
FILE: src/Webhooks.API/Extensions/RouteHandlerBuilderExtensions.cs
class RouteHandlerBuilderExtensions (line 3) | public static class RouteHandlerBuilderExtensions
method ValidateWebhookSubscriptionRequest (line 5) | public static RouteHandlerBuilder ValidateWebhookSubscriptionRequest(t...
method ToErrors (line 27) | private static Dictionary<string, string[]> ToErrors(this IEnumerable<...
FILE: src/Webhooks.API/Infrastructure/WebhooksContext.cs
class WebhooksContext (line 8) | public class WebhooksContext(DbContextOptions<WebhooksContext> options) ...
method OnModelCreating (line 12) | protected override void OnModelCreating(ModelBuilder modelBuilder)
FILE: src/Webhooks.API/IntegrationEvents/OrderStatusChangedToPaidIntegrationEvent.cs
type OrderStatusChangedToPaidIntegrationEvent (line 3) | public record OrderStatusChangedToPaidIntegrationEvent(int OrderId, IEnu...
FILE: src/Webhooks.API/IntegrationEvents/OrderStatusChangedToPaidIntegrationEventHandler.cs
class OrderStatusChangedToPaidIntegrationEventHandler (line 3) | public class OrderStatusChangedToPaidIntegrationEventHandler(
method Handle (line 8) | public async Task Handle(OrderStatusChangedToPaidIntegrationEvent @event)
FILE: src/Webhooks.API/IntegrationEvents/OrderStatusChangedToShippedIntegrationEvent.cs
type OrderStatusChangedToShippedIntegrationEvent (line 3) | public record OrderStatusChangedToShippedIntegrationEvent(int OrderId, s...
FILE: src/Webhooks.API/IntegrationEvents/OrderStatusChangedToShippedIntegrationEventHandler.cs
class OrderStatusChangedToShippedIntegrationEventHandler (line 3) | public class OrderStatusChangedToShippedIntegrationEventHandler(
method Handle (line 8) | public async Task Handle(OrderStatusChangedToShippedIntegrationEvent @...
FILE: src/Webhooks.API/IntegrationEvents/OrderStockItem.cs
type OrderStockItem (line 3) | public record OrderStockItem(int ProductId, int Units);
FILE: src/Webhooks.API/IntegrationEvents/ProductPriceChangedIntegrationEvent.cs
type ProductPriceChangedIntegrationEvent (line 3) | public record ProductPriceChangedIntegrationEvent(int ProductId, decimal...
FILE: src/Webhooks.API/IntegrationEvents/ProductPriceChangedIntegrationEventHandler.cs
class ProductPriceChangedIntegrationEventHandler (line 3) | public class ProductPriceChangedIntegrationEventHandler : IIntegrationEv...
method Handle (line 5) | public Task Handle(ProductPriceChangedIntegrationEvent @event)
FILE: src/Webhooks.API/Migrations/20230925222606_Initial.Designer.cs
class Initial (line 14) | [DbContext(typeof(WebhooksContext))]
method BuildTargetModel (line 19) | protected override void BuildTargetModel(ModelBuilder modelBuilder)
FILE: src/Webhooks.API/Migrations/20230925222606_Initial.cs
class Initial (line 10) | public partial class Initial : Migration
method Up (line 13) | protected override void Up(MigrationBuilder migrationBuilder)
method Down (line 34) | protected override void Down(MigrationBuilder migrationBuilder)
FILE: src/Webhooks.API/Migrations/WebhooksContextModelSnapshot.cs
class WebhooksContextModelSnapshot (line 13) | [DbContext(typeof(WebhooksContext))]
method BuildModel (line 16) | protected override void BuildModel(ModelBuilder modelBuilder)
FILE: src/Webhooks.API/Model/WebhookData.cs
class WebhookData (line 3) | public class WebhookData
method WebhookData (line 11) | public WebhookData(WebhookType hookType, object data)
FILE: src/Webhooks.API/Model/WebhookSubscription.cs
class WebhookSubscription (line 3) | public class WebhookSubscription
FILE: src/Webhooks.API/Model/WebhookSubscriptionRequest.cs
class WebhookSubscriptionRequest (line 3) | public class WebhookSubscriptionRequest : IValidatableObject
method Validate (line 10) | public IEnumerable<ValidationResult> Validate(ValidationContext valida...
FILE: src/Webhooks.API/Model/WebhookType.cs
type WebhookType (line 3) | public enum WebhookType
FILE: src/Webhooks.API/Services/GrantUrlTesterService.cs
class GrantUrlTesterService (line 3) | class GrantUrlTesterService(IHttpClientFactory factory, ILogger<IGrantUr...
method TestGrantUrl (line 5) | public async Task<bool> TestGrantUrl(string urlHook, string url, strin...
method CheckSameOrigin (line 37) | private static bool CheckSameOrigin(string urlHook, string url)
FILE: src/Webhooks.API/Services/IGrantUrlTesterService.cs
type IGrantUrlTesterService (line 3) | public interface IGrantUrlTesterService
method TestGrantUrl (line 5) | Task<bool> TestGrantUrl(string urlHook, string url, string token);
FILE: src/Webhooks.API/Services/IWebhooksRetriever.cs
type IWebhooksRetriever (line 3) | public interface IWebhooksRetriever
method GetSubscriptionsOfType (line 6) | Task<IEnumerable<WebhookSubscription>> GetSubscriptionsOfType(WebhookT...
FILE: src/Webhooks.API/Services/IWebhooksSender.cs
type IWebhooksSender (line 3) | public interface IWebhooksSender
method SendAll (line 5) | Task SendAll(IEnumerable<WebhookSubscription> receivers, WebhookData d...
FILE: src/Webhooks.API/Services/WebhooksRetriever.cs
class WebhooksRetriever (line 3) | public class WebhooksRetriever(WebhooksContext db) : IWebhooksRetriever
method GetSubscriptionsOfType (line 5) | public async Task<IEnumerable<WebhookSubscription>> GetSubscriptionsOf...
FILE: src/Webhooks.API/Services/WebhooksSender.cs
class WebhooksSender (line 3) | public class WebhooksSender(IHttpClientFactory httpClientFactory, ILogge...
method SendAll (line 5) | public async Task SendAll(IEnumerable<WebhookSubscription> receivers, ...
method OnSendData (line 13) | private Task OnSendData(WebhookSubscription subs, string jsonData, Htt...
FILE: src/eShop.AppHost/Extensions.cs
type OpenAITarget (line 9) | internal enum OpenAITarget
class Extensions (line 17) | internal static class Extensions
method AddForwardedHeaders (line 22) | public static IDistributedApplicationBuilder AddForwardedHeaders(this ...
class AddForwardHeadersSubscriber (line 28) | private class AddForwardHeadersSubscriber : IDistributedApplicationEve...
method SubscribeAsync (line 30) | public Task SubscribeAsync(IDistributedApplicationEventing eventing,...
method AddOpenAI (line 52) | public static IDistributedApplicationBuilder AddOpenAI(this IDistribut...
method AddOllama (line 164) | public static IDistributedApplicationBuilder AddOllama(this IDistribut...
method ConfigureMobileBffRoutes (line 185) | public static IResourceBuilder<YarpResource> ConfigureMobileBffRoutes(...
FILE: src/eShop.ServiceDefaults/AuthenticationExtensions.cs
class AuthenticationExtensions (line 8) | public static class AuthenticationExtensions
method AddDefaultAuthentication (line 10) | public static IServiceCollection AddDefaultAuthentication(this IHostAp...
FILE: src/eShop.ServiceDefaults/ClaimsPrincipalExtensions.cs
class ClaimsPrincipalExtensions (line 5) | public static class ClaimsPrincipalExtensions
method GetUserId (line 7) | public static string? GetUserId(this ClaimsPrincipal principal)
method GetUserName (line 10) | public static string? GetUserName(this ClaimsPrincipal principal) =>
FILE: src/eShop.ServiceDefaults/ConfigurationExtensions.cs
class ConfigurationExtensions (line 3) | public static class ConfigurationExtensions
method GetRequiredValue (line 5) | public static string GetRequiredValue(this IConfiguration configuratio...
FILE: src/eShop.ServiceDefaults/Extensions.cs
class Extensions (line 14) | public static partial class Extensions
method AddServiceDefaults (line 16) | public static IHostApplicationBuilder AddServiceDefaults(this IHostApp...
method AddBasicServiceDefaults (line 40) | public static IHostApplicationBuilder AddBasicServiceDefaults(this IHo...
method ConfigureOpenTelemetry (line 50) | public static IHostApplicationBuilder ConfigureOpenTelemetry(this IHos...
method AddOpenTelemetryExporters (line 85) | private static IHostApplicationBuilder AddOpenTelemetryExporters(this ...
method AddDefaultHealthChecks (line 99) | public static IHostApplicationBuilder AddDefaultHealthChecks(this IHos...
method MapDefaultEndpoints (line 108) | public static WebApplication MapDefaultEndpoints(this WebApplication app)
FILE: src/eShop.ServiceDefaults/HttpClientExtensions.cs
class HttpClientExtensions (line 9) | public static class HttpClientExtensions
method AddAuthToken (line 11) | public static IHttpClientBuilder AddAuthToken(this IHttpClientBuilder ...
class HttpClientAuthorizationDelegatingHandler (line 22) | private class HttpClientAuthorizationDelegatingHandler : DelegatingHan...
method HttpClientAuthorizationDelegatingHandler (line 26) | public HttpClientAuthorizationDelegatingHandler(IHttpContextAccessor...
method HttpClientAuthorizationDelegatingHandler (line 31) | public HttpClientAuthorizationDelegatingHandler(IHttpContextAccessor...
method SendAsync (line 36) | protected override async Task<HttpResponseMessage> SendAsync(HttpReq...
FILE: src/eShop.ServiceDefaults/OpenApi.Extensions.cs
class Extensions (line 12) | public static partial class Extensions
method UseDefaultOpenApi (line 14) | public static IApplicationBuilder UseDefaultOpenApi(this WebApplicatio...
method AddDefaultOpenApi (line 39) | public static IHostApplicationBuilder AddDefaultOpenApi(
FILE: src/eShop.ServiceDefaults/OpenApiOptionsExtensions.cs
class OpenApiOptionsExtensions (line 14) | internal static class OpenApiOptionsExtensions
method ApplyApiVersionInfo (line 16) | public static OpenApiOptions ApplyApiVersionInfo(this OpenApiOptions o...
method BuildDescription (line 35) | private static string BuildDescription(ApiVersionDescription api, stri...
method ApplySecuritySchemeDefinitions (line 102) | public static OpenApiOptions ApplySecuritySchemeDefinitions(this OpenA...
method ApplyAuthorizationChecks (line 108) | public static OpenApiOptions ApplyAuthorizationChecks(this OpenApiOpti...
method ApplyOperationDeprecatedStatus (line 138) | public static OpenApiOptions ApplyOperationDeprecatedStatus(this OpenA...
method ApplyApiVersionDescription (line 149) | public static OpenApiOptions ApplyApiVersionDescription(this OpenApiOp...
class SecuritySchemeDefinitionsTransformer (line 175) | private class SecuritySchemeDefinitionsTransformer(IConfiguration conf...
method TransformAsync (line 177) | public Task TransformAsync(OpenApiDocument document, OpenApiDocument...
FILE: tests/Basket.UnitTests/BasketServiceTests.cs
class BasketServiceTests (line 11) | [TestClass]
method GetBasketReturnsEmptyForNoUser (line 16) | [TestMethod]
method GetBasketReturnsItemsForValidUserId (line 30) | [TestMethod]
method GetBasketReturnsEmptyForInvalidUserId (line 48) | [TestMethod]
FILE: tests/Basket.UnitTests/Helpers/TestServerCallContext.cs
class TestServerCallContext (line 5) | public class TestServerCallContext : ServerCallContext
method TestServerCallContext (line 16) | private TestServerCallContext(Metadata requestHeaders, CancellationTok...
method CreatePropagationTokenCore (line 36) | protected override ContextPropagationToken CreatePropagationTokenCore(...
method WriteResponseHeadersAsyncCore (line 41) | protected override Task WriteResponseHeadersAsyncCore(Metadata respons...
method SetUserState (line 54) | internal void SetUserState(object key, object value)
method Create (line 57) | public static TestServerCallContext Create(Metadata requestHeaders = n...
FILE: tests/Catalog.FunctionalTests/CatalogApiFixture.cs
class CatalogApiFixture (line 10) | public sealed class CatalogApiFixture : WebApplicationFactory<Program>, ...
method CatalogApiFixture (line 17) | public CatalogApiFixture()
method CreateHost (line 27) | protected override IHost CreateHost(IHostBuilder builder)
method DisposeAsync (line 39) | public new async Task DisposeAsync()
method InitializeAsync (line 53) | public async ValueTask InitializeAsync()
FILE: tests/Catalog.FunctionalTests/CatalogApiTests.cs
class CatalogApiTests (line 10) | public sealed class CatalogApiTests : IClassFixture<CatalogApiFixture>
method CatalogApiTests (line 15) | public CatalogApiTests(CatalogApiFixture fixture)
method CreateHttpClient (line 20) | private HttpClient CreateHttpClient(ApiVersion apiVersion)
method GetCatalogItemsRespectsPageSize (line 26) | [Theory]
method UpdateCatalogItemWorksWithoutPriceUpdate (line 47) | [Theory]
method UpdateCatalogItemWorksWithPriceUpdate (line 82) | [Theory]
method GetCatalogItemsbyIds (line 119) | [Theory]
method GetCatalogItemWithId (line 138) | [Theory]
method GetCatalogItemWithExactName (line 158) | [Theory]
method GetCatalogItemWithPartialName (line 186) | [Theory]
method GetCatalogItemPicWithId (line 214) | [Theory]
method GetCatalogItemWithsemanticrelevance (line 232) | [Theory]
method GetCatalogItemWithTypeIdBrandId (line 259) | [Theory]
method GetAllCatalogTypeItemWithBrandId (line 288) | [Theory]
method GetAllCatalogTypes (line 316) | [Theory]
method GetAllCatalogBrands (line 336) | [Theory]
method AddCatalogItem (line 356) | [Theory]
method DeleteCatalogItem (line 398) | [Theory]
FILE: tests/ClientApp.UnitTests/Mocks/MockDialogService.cs
class MockDialogService (line 3) | public class MockDialogService : IDialogService
method ShowAlertAsync (line 5) | public Task ShowAlertAsync(string message, string title, string button...
FILE: tests/ClientApp.UnitTests/Mocks/MockNavigationService.cs
class MockNavigationService (line 3) | public class MockNavigationService : INavigationService
method InitializeAsync (line 5) | public Task InitializeAsync()
method NavigateToAsync (line 10) | public Task NavigateToAsync(string route, IDictionary<string, object>?...
method PopAsync (line 15) | public Task PopAsync()
FILE: tests/ClientApp.UnitTests/Mocks/MockSettingsService.cs
class MockSettingsService (line 5) | public class MockSettingsService : ISettingsService
method GetUserTokenAsync (line 44) | public Task<UserToken?> GetUserTokenAsync()
method SetUserTokenAsync (line 49) | public Task SetUserTokenAsync(UserToken? userToken)
method AddOrUpdateValue (line 164) | public void AddOrUpdateValue(string key, bool value) => AddOrUpdateVal...
method AddOrUpdateValue (line 165) | public void AddOrUpdateValue(string key, string value) => AddOrUpdateV...
method GetValueOrDefault (line 166) | public bool GetValueOrDefault(string key, bool defaultValue) => GetVal...
method GetValueOrDefault (line 167) | public string GetValueOrDefault(string key, string defaultValue) => Ge...
method AddOrUpdateValueInternal (line 169) | void AddOrUpdateValueInternal<T>(string key, T value)
method GetValueOrDefaultInternal (line 181) | T GetValueOrDefaultInternal<T>(string key, T defaultValue = default!) =>
method Remove (line 185) | void Remove(string key)
FILE: tests/ClientApp.UnitTests/Mocks/MockViewModel.cs
class MockViewModel (line 6) | public class MockViewModel : ViewModelBase
method MockViewModel (line 12) | public MockViewModel(INavigationService navigationService)
method Validate (line 22) | public bool Validate()
FILE: tests/ClientApp.UnitTests/Services/BasketServiceTests.cs
class BasketServiceTests (line 3) | [TestClass]
method GetFakeBasketTest (line 6) | [TestMethod]
FILE: tests/ClientApp.UnitTests/Services/CatalogServiceTests.cs
class CatalogServiceTests (line 3) | [TestClass]
method GetFakeCatalogTest (line 6) | [TestMethod]
method GetFakeCatalogBrandTest (line 15) | [TestMethod]
method GetFakeCatalogTypeTest (line 24) | [TestMethod]
FILE: tests/ClientApp.UnitTests/Services/OrdersServiceTests.cs
class OrdersServiceTests (line 5) | [TestClass]
method OrdersServiceTests (line 10) | public OrdersServiceTests()
method GetFakeOrderTest (line 15) | [TestMethod]
method GetFakeOrdersTest (line 24) | [TestMethod]
FILE: tests/ClientApp.UnitTests/TestingExtensions.cs
class TestingExtensions (line 6) | public static class TestingExtensions
method ExecuteUntilComplete (line 8) | public static async Task ExecuteUntilComplete(this ICommand command, o...
FILE: tests/ClientApp.UnitTests/ViewModels/CatalogItemViewModelTests.cs
class CatalogItemViewModelTests (line 9) | [TestClass]
method CatalogItemViewModelTests (line 15) | public CatalogItemViewModelTests()
method AddCatalogItemCommandIsNotNullTest (line 33) | [TestMethod]
method AddCatalogItemCommandSendsAddProductMessageTest (line 40) | [TestMethod]
FILE: tests/ClientApp.UnitTests/ViewModels/CatalogViewModelTests.cs
class CatalogViewModelTests (line 6) | [TestClass]
method CatalogViewModelTests (line 12) | public CatalogViewModelTests()
method FilterCommandIsNotNullTest (line 31) | [TestMethod]
method ClearFilterCommandIsNotNullTest (line 38) | [TestMethod]
method ProductsPropertyIsEmptyWhenViewModelInstantiatedTest (line 45) | [TestMethod]
method BrandsPropertyIsEmptyWhenViewModelInstantiatedTest (line 52) | [TestMethod]
method BrandPropertyIsNullWhenViewModelInstantiatedTest (line 59) | [TestMethod]
method TypesPropertyIsEmptyWhenViewModelInstantiatedTest (line 66) | [TestMethod]
method TypePropertyIsNullWhenViewModelInstantiatedTest (line 73) | [TestMethod]
method IsFilterPropertyIsFalseWhenViewModelInstantiatedTest (line 80) | [TestMethod]
method ProductsPropertyIsNotNullAfterViewModelInitializationTest (line 87) | [TestMethod]
method BrandsPropertyIsNotNullAfterViewModelInitializationTest (line 97) | [TestMethod]
method TypesPropertyIsNotNullAfterViewModelInitializationTest (line 107) | [TestMethod]
method SettingBadgeCountPropertyShouldRaisePropertyChanged (line 117) | [TestMethod]
method ClearFilterCommandResetsPropertiesTest (line 136) | [TestMethod]
FILE: tests/ClientApp.UnitTests/ViewModels/MainViewModelTests.cs
class MainViewModelTests (line 5) | [TestClass]
method MainViewModelTests (line 10) | public MainViewModelTests()
method SettingsCommandIsNotNullWhenViewModelInstantiatedTest (line 15) | [TestMethod]
method IsBusyPropertyIsFalseWhenViewModelInstantiatedTest (line 22) | [TestMethod]
FILE: tests/ClientApp.UnitTests/ViewModels/MockViewModelTests.cs
class MockViewModelTests (line 5) | [TestClass]
method MockViewModelTests (line 10) | public MockViewModelTests()
method CheckValidationFailsWhenPropertiesAreEmptyTest (line 15) | [TestMethod]
method CheckValidationFailsWhenOnlyForenameHasDataTest (line 31) | [TestMethod]
method CheckValidationPassesWhenOnlySurnameHasDataTest (line 48) | [TestMethod]
method CheckValidationPassesWhenBothPropertiesHaveDataTest (line 65) | [TestMethod]
method SettingForenamePropertyShouldRaisePropertyChanged (line 83) | [TestMethod]
method SettingSurnamePropertyShouldRaisePropertyChanged (line 101) | [TestMethod]
FILE: tests/ClientApp.UnitTests/ViewModels/OrderViewModelTests.cs
class OrderViewModelTests (line 6) | [TestClass]
method OrderViewModelTests (line 13) | public OrderViewModelTests()
method OrderPropertyIsNullWhenViewModelInstantiatedTest (line 33) | [TestMethod]
method OrderPropertyIsNotNullAfterViewModelInitializationTest (line 40) | [TestMethod]
method SettingOrderPropertyShouldRaisePropertyChanged (line 53) | [TestMethod]
FILE: tests/Ordering.FunctionalTests/AutoAuthorizeMiddleware.cs
class AutoAuthorizeMiddleware (line 3) | class AutoAuthorizeMiddleware
method AutoAuthorizeMiddleware (line 9) | public AutoAuthorizeMiddleware(RequestDelegate rd)
method Invoke (line 14) | public async Task Invoke(HttpContext httpContext)
FILE: tests/Ordering.FunctionalTests/OrderingApiFixture.cs
class OrderingApiFixture (line 9) | public sealed class OrderingApiFixture : WebApplicationFactory<Program>,...
method OrderingApiFixture (line 19) | public OrderingApiFixture()
method CreateHost (line 29) | protected override IHost CreateHost(IHostBuilder builder)
method DisposeAsync (line 46) | public new async Task DisposeAsync()
method InitializeAsync (line 60) | public async ValueTask InitializeAsync()
class AutoAuthorizeStartupFilter (line 66) | private class AutoAuthorizeStartupFilter : IStartupFilter
method Configure (line 68) | public Action<IApplicationBuilder> Configure(Action<IApplicationBuil...
FILE: tests/Ordering.FunctionalTests/OrderingApiTests.cs
class OrderingApiTests (line 13) | public sealed class OrderingApiTests : IClassFixture<OrderingApiFixture>
method OrderingApiTests (line 18) | public OrderingApiTests(OrderingApiFixture fixture)
method GetAllStoredOrdersWorks (line 26) | [Fact]
method CancelWithEmptyGuidFails (line 38) | [Fact]
method CancelNonExistentOrderFails (line 53) | [Fact]
method ShipWithEmptyGuidFails (line 68) | [Fact]
method ShipNonExistentOrderFails (line 83) | [Fact]
method GetAllOrdersCardType (line 97) | [Fact]
method GetStoredOrdersWithOrderId (line 109) | [Fact]
method AddNewEmptyOrder (line 120) | [Fact]
method AddNewOrder (line 135) | [Fact]
method PostDraftOrder (line 162) | [Fact]
method CreateOrderDraftSucceeds (line 188) | [Fact]
method FakeOrderDraftCommand (line 207) | private CreateOrderDraftCommand FakeOrderDraftCommand()
method AssertThatOrderItemsAreTheSameAsRequestPayloadItems (line 226) | private static void AssertThatOrderItemsAreTheSameAsRequestPayloadItem...
method BuildOrder (line 235) | string BuildOrder()
FILE: tests/Ordering.UnitTests/Application/IdentifiedCommandHandlerTest.cs
class IdentifiedCommandHandlerTest (line 3) | [TestClass]
method IdentifiedCommandHandlerTest (line 10) | public IdentifiedCommandHandlerTest()
method Handler_sends_command_when_order_no_exists (line 17) | [TestMethod]
method Handler_sends_no_command_when_order_already_exists (line 39) | [TestMethod]
method FakeOrderRequest (line 60) | private CreateOrderCommand FakeOrderRequest(Dictionary<string, object>...
FILE: tests/Ordering.UnitTests/Application/NewOrderCommandHandlerTest.cs
class NewOrderRequestHandlerTest (line 6) | [TestClass]
method NewOrderRequestHandlerTest (line 14) | public NewOrderRequestHandlerTest()
method Handle_return_false_if_order_is_not_persisted (line 23) | [TestMethod]
method Handle_throws_exception_when_no_buyerId (line 49) | [TestMethod]
method FakeBuyer (line 56) | private Buyer FakeBuyer()
method FakeOrder (line 61) | private Order FakeOrder()
method FakeOrderRequestWithBuyer (line 66) | private CreateOrderCommand FakeOrderRequestWithBuyer(Dictionary<string...
FILE: tests/Ordering.UnitTests/Application/OrdersWebApiTest.cs
class OrdersWebApiTest (line 8) | [TestClass]
method OrdersWebApiTest (line 16) | public OrdersWebApiTest()
method Cancel_order_with_requestId_success (line 24) | [TestMethod]
method Cancel_order_bad_request (line 39) | [TestMethod]
method Ship_order_with_requestId_success (line 54) | [TestMethod]
method Ship_order_bad_request (line 70) | [TestMethod]
method Get_orders_success (line 85) | [TestMethod]
method Get_order_success (line 105) | [TestMethod]
method Get_order_fails (line 123) | [TestMethod]
method Get_cardTypes_success (line 141) | [TestMethod]
FILE: tests/Ordering.UnitTests/Application/SetStockRejectedOrderStatusCommandTest.cs
class SetStockRejectedOrderStatusCommandTest (line 5) | [TestClass]
method Set_Stock_Rejected_OrderStatusCommand_Check_Serialization (line 8) | [TestMethod]
FILE: tests/Ordering.UnitTests/Builders.cs
class AddressBuilder (line 5) | public class AddressBuilder
method Build (line 7) | public Address Build()
class OrderBuilder (line 13) | public class OrderBuilder
method OrderBuilder (line 17) | public OrderBuilder(Address address)
method AddOne (line 30) | public OrderBuilder AddOne(
method Build (line 42) | public Order Build()
FILE: tests/Ordering.UnitTests/Domain/BuyerAggregateTest.cs
class BuyerAggregateTest (line 3) | [TestClass]
method BuyerAggregateTest (line 6) | public BuyerAggregateTest()
method Create_buyer_item_success (line 9) | [TestMethod]
method Create_buyer_item_fail (line 23) | [TestMethod]
method add_payment_success (line 34) | [TestMethod]
method create_payment_method_success (line 56) | [TestMethod]
method create_payment_method_expiration_fail (line 75) | [TestMethod]
method payment_method_isEqualTo (line 90) | [TestMethod]
method Add_new_PaymentMethod_raises_new_event (line 109) | [TestMethod]
FILE: tests/Ordering.UnitTests/Domain/OrderAggregateTest.cs
class OrderAggregateTest (line 6) | [TestClass]
method OrderAggregateTest (line 9) | public OrderAggregateTest()
method Create_order_item_success (line 12) | [TestMethod]
method Invalid_number_of_units (line 30) | [TestMethod]
method Invalid_total_of_order_item_lower_than_discount_applied (line 45) | [TestMethod]
method Invalid_discount_setting (line 60) | [TestMethod]
method Invalid_units_setting (line 78) | [TestMethod]
method when_add_two_times_on_the_same_item_then_the_total_of_order_should_be_the_sum_of_the_two_items (line 96) | [TestMethod]
method Add_new_Order_raises_new_event (line 108) | [TestMethod]
method Add_event_Order_explicitly_raises_new_event (line 131) | [TestMethod]
method Remove_event_Order_explicitly (line 154) | [TestMethod]
FILE: tests/Ordering.UnitTests/Domain/SeedWork/ValueObjectTests.cs
class ValueObjectTests (line 3) | [TestClass]
method Equals_EqualValueObjects_ReturnsTrue (line 6) | [TestMethod]
method Equals_NonEqualValueObjects_ReturnsFalse (line 17) | [TestMethod]
class ValueObjectA (line 116) | private class ValueObjectA : ValueObject
method ValueObjectA (line 118) | public ValueObjectA(int a, string b, Guid c, ComplexObject d, string...
method GetEqualityComponents (line 133) | protected override IEnumerable<object> GetEqualityComponents()
class ValueObjectB (line 142) | private class ValueObjectB : ValueObject
method ValueObjectB (line 144) | public ValueObjectB(int a, string b, params int[] c)
method GetEqualityComponents (line 156) | protected override IEnumerable<object> GetEqualityComponents()
class ComplexObject (line 168) | private class ComplexObject : IEquatable<ComplexObject>
method ComplexObject (line 170) | public ComplexObject(int a, string b)
method Equals (line 180) | public override bool Equals(object obj)
method Equals (line 185) | public bool Equals(ComplexObject other)
method GetHashCode (line 192) | public override int GetHashCode()
Condensed preview — 779 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,509K chars).
[
{
"path": ".aspire/settings.json",
"chars": 64,
"preview": "{\n \"appHostPath\": \"../src/eShop.AppHost/eShop.AppHost.csproj\"\n}"
},
{
"path": ".config/CredScanSuppressions.json",
"chars": 228,
"preview": "{\n \"tool\": \"Credential Scanner\",\n \"suppressions\": [\n {\n \"placeholder\": \"Pass123$\",\n \"_justification\": \"Du"
},
{
"path": ".config/configuration.vs.winget",
"chars": 4412,
"preview": "# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2\nproperties:\n configurationVersion: 0.2.0\n "
},
{
"path": ".config/configuration.vsCode.winget",
"chars": 6158,
"preview": "# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2\nproperties:\n configurationVersion: 0.2.0\n "
},
{
"path": ".config/tsaoptions.json",
"chars": 342,
"preview": "{\n \"areaPath\": \"DevDiv\\\\ASP.NET Core\\\\Policy Violations\",\n \"codebaseName\": \"eShop\",\n \"instanceUrl\": \"https://de"
},
{
"path": ".devcenter/catalog/definitions/imagedefinition.yaml",
"chars": 15,
"preview": "Initial Commit\n"
},
{
"path": ".editorconfig",
"chars": 6126,
"preview": "###############################\n# Core EditorConfig Options #\n###############################\nroot = true\n# All files\n"
},
{
"path": ".gitattributes",
"chars": 2737,
"preview": "###############################################################################\n# Set default behavior to automatically "
},
{
"path": ".github/dependabot.yml",
"chars": 1412,
"preview": "version: 2\nregistries:\n public-nuget:\n type: nuget-feed\n url: https://api.nuget.org/v3/index.json\nupdates:\n - pa"
},
{
"path": ".github/workflows/markdownlint-problem-matcher.json",
"chars": 406,
"preview": "{\n \"problemMatcher\": [\n {\n \"owner\": \"markdownlint\",\n \"pattern\": [\n {\n "
},
{
"path": ".github/workflows/markdownlint.yml",
"chars": 573,
"preview": "name: Markdownlint\n\npermissions:\n contents: read\n\n# run even on changes without markdown changes, so that we can\n# make"
},
{
"path": ".github/workflows/playwright.yml",
"chars": 1349,
"preview": "name: Playwright Tests for eShop\non:\n push:\n branches: [ main ]\n paths-ignore:\n - '**.md'\n - 'src/Clien"
},
{
"path": ".github/workflows/pr-validation-maui.yml",
"chars": 1126,
"preview": "name: eShop Pull Request Validation - .NET MAUI\r\n\r\non:\r\n pull_request:\r\n branches:\r\n - '**'\r\n paths:\r\n "
},
{
"path": ".github/workflows/pr-validation.yml",
"chars": 738,
"preview": "name: eShop Pull Request Validation\n\non:\n pull_request:\n paths-ignore:\n - '**.md'\n - 'src/ClientApp/**'\n "
},
{
"path": ".gitignore",
"chars": 8069,
"preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
},
{
"path": ".markdownlint.json",
"chars": 972,
"preview": "{\n \"default\": true,\n \"ul-indent\": false,\n \"ul-style\": false,\n \""
},
{
"path": ".markdownlintignore",
"chars": 80,
"preview": "# This is for editors; keep .github/workflows/markdownlint.yml in sync\n.dotnet/\n"
},
{
"path": ".spectral.yml",
"chars": 1010,
"preview": "extends: spectral:oas\nrules:\n info-contact: off\n\n success-response:\n description: All operations should have a succ"
},
{
"path": "CODE-OF-CONDUCT.md",
"chars": 259,
"preview": "# Code of Conduct\n\nThis project has adopted the code of conduct defined by the Contributor Covenant\nto clarify expected "
},
{
"path": "CONTRIBUTING.md",
"chars": 2675,
"preview": "# Contributing to eShop\n\nThank you for your interest in contributing to eShop! We're excited to collaborate with you and"
},
{
"path": "Directory.Build.props",
"chars": 825,
"preview": "<Project>\n\n <PropertyGroup>\n <WarnOnPackingNonPackableProject>false</WarnOnPackingNonPackableProject>\n <TreatWarn"
},
{
"path": "Directory.Build.targets",
"chars": 352,
"preview": "<Project>\n\n <PropertyGroup Condition=\"'$(PublishAot)' == 'true'\">\n <!-- EventSource is disabled by default for non-A"
},
{
"path": "Directory.Packages.props",
"chars": 6790,
"preview": "<Project>\n <PropertyGroup>\n <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>\n <CentralPackag"
},
{
"path": "LICENSE",
"chars": 1084,
"preview": "MIT License\n\nCopyright (c) .NET Foundation and Contributors\n\nPermission is hereby granted, free of charge, to any person"
},
{
"path": "README.md",
"chars": 6518,
"preview": "# eShop Reference Application - \"AdventureWorks\"\n\nA reference .NET application implementing an e-commerce website using "
},
{
"path": "build/acr-build/queue-all.ps1",
"chars": 2127,
"preview": "Param(\n [parameter(Mandatory=$false)][string]$acrName,\n [parameter(Mandatory=$false)][string]$gitUser,\n [parame"
},
{
"path": "build/multiarch-manifests/create-manifests.ps1",
"chars": 1436,
"preview": "Param(\n [parameter(Mandatory=$true)][string]$registry\n)\n\nif ([String]::IsNullOrEmpty($registry)) {\n Write-Host \"Re"
},
{
"path": "ci.yml",
"chars": 1076,
"preview": "# Configure which branches trigger builds\ntrigger:\n batch: true\n branches:\n include:\n - main\n\nvariables:\n - n"
},
{
"path": "e2e/AddItemTest.spec.ts",
"chars": 711,
"preview": "import { test, expect } from '@playwright/test';\n\ntest('Add item to the cart', async ({ page }) => {\n await page.goto('"
},
{
"path": "e2e/BrowseItemTest.spec.ts",
"chars": 476,
"preview": "import { test, expect } from '@playwright/test';\n\ntest('Browse Items', async ({ page }) => {\n await page.goto('/');\n\n "
},
{
"path": "e2e/RemoveItemTest.spec.ts",
"chars": 911,
"preview": "import { test, expect } from '@playwright/test';\n\ntest('Remove item from cart', async ({ page }) => {\n await page.goto("
},
{
"path": "e2e/login.setup.ts",
"chars": 902,
"preview": "import { test as setup, expect } from '@playwright/test';\nimport { STORAGE_STATE } from '../playwright.config';\nimport {"
},
{
"path": "eShop.Web.slnf",
"chars": 1224,
"preview": "{\n \"solution\": {\n \"path\": \"eShop.slnx\",\n \"projects\": [\n \"src\\\\Basket.API\\\\Basket.API.csproj\",\n \"src\\\\Ca"
},
{
"path": "eShop.slnx",
"chars": 1874,
"preview": "<Solution>\n <Folder Name=\"/src/\">\n <Project Path=\"src/eShop.AppHost/eShop.AppHost.csproj\" />\n <Project Path=\"src"
},
{
"path": "es-metadata.yml",
"chars": 181,
"preview": "schemaVersion: 0.0.1\nisProduction: true\naccountableOwners:\n service: 4db45fa9-fb0f-43ce-b523-ad1da773dfbc\nrouting:\n de"
},
{
"path": "global.json",
"chars": 221,
"preview": "{\n \"sdk\": {\n \"version\": \"10.0.100\",\n \"rollForward\": \"latestFeature\",\n \"allowPrerelease\": true\n },\n \"test\": {"
},
{
"path": "nuget.config",
"chars": 527,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n <packageSources>\n <!--To inherit the global NuGet package s"
},
{
"path": "package.json",
"chars": 399,
"preview": "{\n \"name\": \"eshop\",\n \"version\": \"1.0.0\",\n \"description\": \"A reference .NET application implementing an eCommerce web "
},
{
"path": "playwright.config.ts",
"chars": 2694,
"preview": "import { defineConfig, devices } from '@playwright/test';\nrequire(\"dotenv\").config({ path: \"./.env\" });\nimport path from"
},
{
"path": "src/Basket.API/Basket.API.csproj",
"chars": 815,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n <PropertyGroup>\n <TargetFramework>net10.0</TargetFramework>\n <UserSecrets"
},
{
"path": "src/Basket.API/Extensions/Extensions.cs",
"chars": 929,
"preview": "using System.Text.Json.Serialization;\nusing eShop.Basket.API.Repositories;\nusing eShop.Basket.API.IntegrationEvents.Eve"
},
{
"path": "src/Basket.API/Extensions/ServerCallContextIdentityExtensions.cs",
"chars": 406,
"preview": "#nullable enable\n\nnamespace eShop.Basket.API.Extensions;\n\ninternal static class ServerCallContextIdentityExtensions\n{\n "
},
{
"path": "src/Basket.API/GlobalUsings.cs",
"chars": 420,
"preview": "global using System.ComponentModel.DataAnnotations;\nglobal using System.Security.Claims;\nglobal using System.Text.Json;"
},
{
"path": "src/Basket.API/Grpc/BasketService.cs",
"chars": 3352,
"preview": "using System.Diagnostics.CodeAnalysis;\nusing eShop.Basket.API.Repositories;\nusing eShop.Basket.API.Extensions;\nusing eS"
},
{
"path": "src/Basket.API/IntegrationEvents/EventHandling/OrderStartedIntegrationEventHandler.cs",
"chars": 629,
"preview": "using eShop.Basket.API.Repositories;\nusing eShop.Basket.API.IntegrationEvents.EventHandling.Events;\n\nnamespace eShop.Ba"
},
{
"path": "src/Basket.API/IntegrationEvents/Events/OrderStartedIntegrationEvent.cs",
"chars": 389,
"preview": "namespace eShop.Basket.API.IntegrationEvents.EventHandling.Events;\n\n// Integration Events notes:\n// An Event is \"someth"
},
{
"path": "src/Basket.API/Model/BasketItem.cs",
"chars": 693,
"preview": "namespace eShop.Basket.API.Model;\n\npublic class BasketItem : IValidatableObject\n{\n public string Id { get; set; }\n "
},
{
"path": "src/Basket.API/Model/CustomerBasket.cs",
"chars": 284,
"preview": "namespace eShop.Basket.API.Model;\n\npublic class CustomerBasket\n{\n public string BuyerId { get; set; }\n\n public Li"
},
{
"path": "src/Basket.API/Program.cs",
"chars": 256,
"preview": "var builder = WebApplication.CreateBuilder(args);\n\nbuilder.AddBasicServiceDefaults();\nbuilder.AddApplicationServices();"
},
{
"path": "src/Basket.API/Properties/launchSettings.json",
"chars": 291,
"preview": "{\n \"profiles\": {\n \"http\": {\n \"commandName\": \"Project\",\n \"launchBrowser\": true,\n \"applicationUrl\": \"ht"
},
{
"path": "src/Basket.API/Proto/basket.proto",
"chars": 647,
"preview": "syntax = \"proto3\";\n\noption csharp_namespace = \"eShop.Basket.API.Grpc\";\n\npackage BasketApi;\n\nservice Basket {\n rpc Ge"
},
{
"path": "src/Basket.API/Repositories/IBasketRepository.cs",
"chars": 285,
"preview": "using eShop.Basket.API.Model;\n\nnamespace eShop.Basket.API.Repositories;\n\npublic interface IBasketRepository\n{\n Task<"
},
{
"path": "src/Basket.API/Repositories/RedisBasketRepository.cs",
"chars": 1896,
"preview": "using System.Text.Json.Serialization;\nusing eShop.Basket.API.Model;\n\nnamespace eShop.Basket.API.Repositories;\n\npublic c"
},
{
"path": "src/Basket.API/appsettings.Development.json",
"chars": 6,
"preview": "{\n \n}"
},
{
"path": "src/Basket.API/appsettings.json",
"chars": 395,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft.AspNetCore\": \"Warning\"\n }\n },\n "
},
{
"path": "src/Catalog.API/Apis/CatalogApi.cs",
"chars": 18571,
"preview": "using System.ComponentModel;\nusing System.ComponentModel.DataAnnotations;\nusing Microsoft.AspNetCore.Http.HttpResults;\nu"
},
{
"path": "src/Catalog.API/Catalog.API.csproj",
"chars": 2016,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n <PropertyGroup>\n <TargetFramework>net10.0</TargetFramework>\n <Nullable>e"
},
{
"path": "src/Catalog.API/Catalog.API.http",
"chars": 910,
"preview": "@Catalog.API_HostAddress = http://localhost:5222\n@ApiVersion = 1.0\n\nGET {{Catalog.API_HostAddress}}/openapi/v1.json\n\n##"
},
{
"path": "src/Catalog.API/Catalog.API.json",
"chars": 29424,
"preview": "{\n \"openapi\": \"3.1.1\",\n \"info\": {\n \"title\": \"eShop - Catalog HTTP API\",\n \"description\": \"The Catalog Microservic"
},
{
"path": "src/Catalog.API/Catalog.API_v2.json",
"chars": 23156,
"preview": "{\n \"openapi\": \"3.1.1\",\n \"info\": {\n \"title\": \"eShop - Catalog HTTP API\",\n \"description\": \"The Catalog Microservic"
},
{
"path": "src/Catalog.API/CatalogOptions.cs",
"chars": 158,
"preview": "namespace eShop.Catalog.API;\n\npublic class CatalogOptions\n{\n public string? PicBaseUrl { get; set; }\n public bool"
},
{
"path": "src/Catalog.API/Extensions/Extensions.cs",
"chars": 2135,
"preview": "using eShop.Catalog.API.Services;\n\npublic static class Extensions\n{\n public static void AddApplicationServices(this "
},
{
"path": "src/Catalog.API/Extensions/HostEnvironmentExtensions.cs",
"chars": 560,
"preview": "using System.Reflection;\n\nnamespace Microsoft.Extensions.Hosting;\n\ninternal static class HostEnvironmentExtensions\n{\n "
},
{
"path": "src/Catalog.API/GlobalUsings.cs",
"chars": 914,
"preview": "global using Asp.Versioning;\nglobal using Asp.Versioning.Conventions;\nglobal using eShop.Catalog.API;\nglobal using eSho"
},
{
"path": "src/Catalog.API/Infrastructure/CatalogContext.cs",
"chars": 1066,
"preview": "namespace eShop.Catalog.API.Infrastructure;\n\n/// <remarks>\n/// Add migrations using the following command inside the 'C"
},
{
"path": "src/Catalog.API/Infrastructure/CatalogContextSeed.cs",
"chars": 3778,
"preview": "using System.Text.Json;\nusing eShop.Catalog.API.Services;\nusing Pgvector;\n\nnamespace eShop.Catalog.API.Infrastructure;\n\n"
},
{
"path": "src/Catalog.API/Infrastructure/EntityConfigurations/CatalogBrandEntityTypeConfiguration.cs",
"chars": 352,
"preview": "namespace eShop.Catalog.API.Infrastructure.EntityConfigurations;\n\nclass CatalogBrandEntityTypeConfiguration\n : IEnti"
},
{
"path": "src/Catalog.API/Infrastructure/EntityConfigurations/CatalogItemEntityTypeConfiguration.cs",
"chars": 616,
"preview": "namespace eShop.Catalog.API.Infrastructure.EntityConfigurations;\n\nclass CatalogItemEntityTypeConfiguration\n : IEntit"
},
{
"path": "src/Catalog.API/Infrastructure/EntityConfigurations/CatalogTypeEntityTypeConfiguration.cs",
"chars": 347,
"preview": "namespace eShop.Catalog.API.Infrastructure.EntityConfigurations;\n\nclass CatalogTypeEntityTypeConfiguration\n : IEntit"
},
{
"path": "src/Catalog.API/Infrastructure/Exceptions/CatalogDomainException.cs",
"chars": 428,
"preview": "namespace eShop.Catalog.API.Infrastructure.Exceptions;\n\n/// <summary>\n/// Exception type for app exceptions\n/// </summa"
},
{
"path": "src/Catalog.API/Infrastructure/Migrations/20231009153249_Initial.Designer.cs",
"chars": 5197,
"preview": "// <auto-generated />\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Mi"
},
{
"path": "src/Catalog.API/Infrastructure/Migrations/20231009153249_Initial.cs",
"chars": 4781,
"preview": "using Microsoft.EntityFrameworkCore.Migrations;\nusing Pgvector;\n\n#nullable disable\n\nnamespace eShop.Catalog.API.Infrast"
},
{
"path": "src/Catalog.API/Infrastructure/Migrations/20231018163051_RemoveHiLoAndIndexCatalogName.Designer.cs",
"chars": 5014,
"preview": "// <auto-generated />\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Mi"
},
{
"path": "src/Catalog.API/Infrastructure/Migrations/20231018163051_RemoveHiLoAndIndexCatalogName.cs",
"chars": 3664,
"preview": "using Microsoft.EntityFrameworkCore.Migrations;\nusing Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;\n\n#nullable disabl"
},
{
"path": "src/Catalog.API/Infrastructure/Migrations/20231026091140_Outbox.Designer.cs",
"chars": 6075,
"preview": "// <auto-generated />\nusing System;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastruc"
},
{
"path": "src/Catalog.API/Infrastructure/Migrations/20231026091140_Outbox.cs",
"chars": 1476,
"preview": "using System;\nusing Microsoft.EntityFrameworkCore.Migrations;\n\n#nullable disable\n\nnamespace eShop.Catalog.API.Infrastru"
},
{
"path": "src/Catalog.API/Infrastructure/Migrations/CatalogContextModelSnapshot.cs",
"chars": 5990,
"preview": "// <auto-generated />\nusing System;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastruc"
},
{
"path": "src/Catalog.API/IntegrationEvents/CatalogIntegrationEventService.cs",
"chars": 2306,
"preview": "namespace eShop.Catalog.API.IntegrationEvents;\n\npublic sealed class CatalogIntegrationEventService(ILogger<CatalogInteg"
},
{
"path": "src/Catalog.API/IntegrationEvents/EventHandling/AnyFutureIntegrationEventHandler.cs.txt",
"chars": 52,
"preview": "\n\n// To implement ProductPriceChangedEvent.cs here\n"
},
{
"path": "src/Catalog.API/IntegrationEvents/EventHandling/OrderStatusChangedToAwaitingValidationIntegrationEventHandler.cs",
"chars": 1708,
"preview": "namespace eShop.Catalog.API.IntegrationEvents.EventHandling;\n\npublic class OrderStatusChangedToAwaitingValidationIntegr"
},
{
"path": "src/Catalog.API/IntegrationEvents/EventHandling/OrderStatusChangedToPaidIntegrationEventHandler.cs",
"chars": 852,
"preview": "namespace eShop.Catalog.API.IntegrationEvents.EventHandling;\n\npublic class OrderStatusChangedToPaidIntegrationEventHand"
},
{
"path": "src/Catalog.API/IntegrationEvents/Events/ConfirmedOrderStockItem.cs",
"chars": 125,
"preview": "namespace eShop.Catalog.API.IntegrationEvents.Events;\n\npublic record ConfirmedOrderStockItem(int ProductId, bool HasSto"
},
{
"path": "src/Catalog.API/IntegrationEvents/Events/OrderStatusChangedToAwaitingValidationIntegrationEvent.cs",
"chars": 203,
"preview": "namespace eShop.Catalog.API.IntegrationEvents.Events;\n\npublic record OrderStatusChangedToAwaitingValidationIntegrationE"
},
{
"path": "src/Catalog.API/IntegrationEvents/Events/OrderStatusChangedToPaidIntegrationEvent.cs",
"chars": 189,
"preview": "namespace eShop.Catalog.API.IntegrationEvents.Events;\n\npublic record OrderStatusChangedToPaidIntegrationEvent(int Order"
},
{
"path": "src/Catalog.API/IntegrationEvents/Events/OrderStockConfirmedIntegrationEvent.cs",
"chars": 139,
"preview": "namespace eShop.Catalog.API.IntegrationEvents.Events;\n\npublic record OrderStockConfirmedIntegrationEvent(int OrderId) :"
},
{
"path": "src/Catalog.API/IntegrationEvents/Events/OrderStockItem.cs",
"chars": 112,
"preview": "namespace eShop.Catalog.API.IntegrationEvents.Events;\n\npublic record OrderStockItem(int ProductId, int Units);\n"
},
{
"path": "src/Catalog.API/IntegrationEvents/Events/OrderStockRejectedIntegrationEvent.cs",
"chars": 185,
"preview": "namespace eShop.Catalog.API.IntegrationEvents.Events;\n\npublic record OrderStockRejectedIntegrationEvent(int OrderId, Li"
},
{
"path": "src/Catalog.API/IntegrationEvents/Events/ProductPriceChangedIntegrationEvent.cs",
"chars": 431,
"preview": "namespace eShop.Catalog.API.IntegrationEvents.Events;\n\n// Integration Events notes: \n// An Event is “something that has"
},
{
"path": "src/Catalog.API/IntegrationEvents/ICatalogIntegrationEventService.cs",
"chars": 233,
"preview": "namespace eShop.Catalog.API.IntegrationEvents;\n\npublic interface ICatalogIntegrationEventService\n{\n Task SaveEventAn"
},
{
"path": "src/Catalog.API/Model/CatalogBrand.cs",
"chars": 268,
"preview": "using System.ComponentModel.DataAnnotations;\n\nnamespace eShop.Catalog.API.Model;\n\npublic class CatalogBrand\n{\n public"
},
{
"path": "src/Catalog.API/Model/CatalogItem.cs",
"chars": 3612,
"preview": "using System.ComponentModel.DataAnnotations;\nusing System.Text.Json.Serialization;\nusing Pgvector;\n\nnamespace eShop.Cata"
},
{
"path": "src/Catalog.API/Model/CatalogServices.cs",
"chars": 627,
"preview": "using eShop.Catalog.API.Services;\nusing Microsoft.AspNetCore.Mvc;\n\npublic class CatalogServices(\n CatalogContext con"
},
{
"path": "src/Catalog.API/Model/CatalogType.cs",
"chars": 262,
"preview": "using System.ComponentModel.DataAnnotations;\n\nnamespace eShop.Catalog.API.Model;\n\npublic class CatalogType\n{\n public "
},
{
"path": "src/Catalog.API/Model/PaginatedItems.cs",
"chars": 395,
"preview": "using System.Text.Json.Serialization;\n\nnamespace eShop.Catalog.API.Model;\n\npublic class PaginatedItems<TEntity>(int pag"
},
{
"path": "src/Catalog.API/Model/PaginationRequest.cs",
"chars": 373,
"preview": "using System.ComponentModel;\n\nnamespace eShop.Catalog.API.Model;\n\npublic record PaginationRequest(\n [property: Descr"
},
{
"path": "src/Catalog.API/Program.Testing.cs",
"chars": 263,
"preview": "// Require a public Program class to implement the\n// fixture for the WebApplicationFactory in the\n// integration tests."
},
{
"path": "src/Catalog.API/Program.cs",
"chars": 461,
"preview": "using Asp.Versioning.Builder;\nusing System.Reflection;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.AddS"
},
{
"path": "src/Catalog.API/Properties/launchSettings.json",
"chars": 242,
"preview": "{\n \"profiles\": {\n \"http\": {\n \"commandName\": \"Project\",\n \"launchBrowser\": true,\n \"applicationUrl\": \"ht"
},
{
"path": "src/Catalog.API/Services/CatalogAI.cs",
"chars": 2608,
"preview": "using System.Diagnostics;\nusing Microsoft.Extensions.AI;\nusing Pgvector;\n\nnamespace eShop.Catalog.API.Services;\n\npublic "
},
{
"path": "src/Catalog.API/Services/ICatalogAI.cs",
"chars": 637,
"preview": "using Pgvector;\n\nnamespace eShop.Catalog.API.Services;\n\npublic interface ICatalogAI\n{\n /// <summary>Gets whether the"
},
{
"path": "src/Catalog.API/Setup/catalog.json",
"chars": 50409,
"preview": "[\n {\n \"Id\": 1,\n \"Type\": \"Footwear\",\n \"Brand\": \"Daybird\",\n \"Name\": \"Wanderer Black Hiking Boots\",\n \"Descr"
},
{
"path": "src/Catalog.API/appsettings.Development.json",
"chars": 132,
"preview": "{\n \"ConnectionStrings\": {\n \"CatalogDB\": \"Host=localhost;Database=CatalogDB;Username=postgres;Password=yourWeak(!)Pas"
},
{
"path": "src/Catalog.API/appsettings.json",
"chars": 578,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft.AspNetCore\": \"Warning\"\n }\n },\n "
},
{
"path": "src/ClientApp/Animations/Base/AnimationBase.cs",
"chars": 3354,
"preview": "using System.Diagnostics;\n\nnamespace eShop.ClientApp.Animations.Base;\n\npublic abstract class AnimationBase : BindableOb"
},
{
"path": "src/ClientApp/Animations/Base/EasingType.cs",
"chars": 221,
"preview": "namespace eShop.ClientApp.Animations.Base;\n\npublic enum EasingType\n{\n BounceIn,\n BounceOut,\n CubicIn,\n Cubi"
},
{
"path": "src/ClientApp/Animations/FadeToAnimation.cs",
"chars": 4303,
"preview": "using eShop.ClientApp.Animations.Base;\nusing eShop.ClientApp.Helpers;\n\nnamespace eShop.ClientApp.Animations;\n\npublic cla"
},
{
"path": "src/ClientApp/Animations/StoryBoard.cs",
"chars": 954,
"preview": "using eShop.ClientApp.Animations.Base;\n\nnamespace eShop.ClientApp.Animations;\n\n[ContentProperty(\"Animations\")]\npublic c"
},
{
"path": "src/ClientApp/App.xaml",
"chars": 596,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n\n<Application\n x:Class=\"eShop.ClientApp.App\"\n xmlns=\"http://schemas.micro"
},
{
"path": "src/ClientApp/App.xaml.cs",
"chars": 4669,
"preview": "using System.Diagnostics;\nusing System.Globalization;\nusing eShop.ClientApp.Services;\nusing eShop.ClientApp.Services.Ap"
},
{
"path": "src/ClientApp/AppActions.cs",
"chars": 192,
"preview": "namespace eShop.ClientApp;\n\npublic static class AppActions\n{\n public static readonly AppAction\n ViewProfileAc"
},
{
"path": "src/ClientApp/AppShell.xaml",
"chars": 3110,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n\n<Shell\n x:Class=\"eShop.ClientApp.AppShell\"\n xmlns=\"http://schemas.micros"
},
{
"path": "src/ClientApp/AppShell.xaml.cs",
"chars": 1099,
"preview": "using eShop.ClientApp.Services;\nusing eShop.ClientApp.Views;\n\nnamespace eShop.ClientApp;\n\npublic partial class AppShell"
},
{
"path": "src/ClientApp/ClientApp.csproj",
"chars": 6166,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFrameworks>net10.0-android;net10.0-ios;net10.0-maccataly"
},
{
"path": "src/ClientApp/ClientApp.sln",
"chars": 1996,
"preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.5.002."
},
{
"path": "src/ClientApp/Controls/AddBasketButton.xaml",
"chars": 633,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n\n<Grid\n x:Class=\"eShop.ClientApp.Controls.AddBasketButton\"\n xmlns=\"http:/"
},
{
"path": "src/ClientApp/Controls/AddBasketButton.xaml.cs",
"chars": 158,
"preview": "namespace eShop.ClientApp.Controls;\n\npublic partial class AddBasketButton : Grid\n{\n public AddBasketButton()\n {\n "
},
{
"path": "src/ClientApp/Controls/CustomTabbedPage.cs",
"chars": 951,
"preview": "namespace eShop.ClientApp.Controls;\n\npublic class CustomTabbedPage : TabbedPage\n{\n public static BindableProperty Ba"
},
{
"path": "src/ClientApp/Controls/ToggleButton.cs",
"chars": 3553,
"preview": "using System.Windows.Input;\n\nnamespace eShop.ClientApp.Controls;\n\npublic class ToggleButton : ContentView\n{\n public "
},
{
"path": "src/ClientApp/Converters/DoesNotHaveCountConverter.cs",
"chars": 368,
"preview": "using System.Globalization;\nusing CommunityToolkit.Maui.Converters;\n\nnamespace eShop.ClientApp.Converters;\n\npublic clas"
},
{
"path": "src/ClientApp/Converters/DoubleConverter.cs",
"chars": 639,
"preview": "using System.Globalization;\nusing CommunityToolkit.Maui.Converters;\n\nnamespace eShop.ClientApp.Converters;\n\npublic clas"
},
{
"path": "src/ClientApp/Converters/FirstValidationErrorConverter.cs",
"chars": 459,
"preview": "using System.Globalization;\nusing CommunityToolkit.Maui.Converters;\n\nnamespace eShop.ClientApp.Converters;\n\npublic clas"
},
{
"path": "src/ClientApp/Converters/HasCountConverter.cs",
"chars": 359,
"preview": "using System.Globalization;\nusing CommunityToolkit.Maui.Converters;\n\nnamespace eShop.ClientApp.Converters;\n\npublic clas"
},
{
"path": "src/ClientApp/Converters/ItemsToHeightConverter.cs",
"chars": 416,
"preview": "using System.Globalization;\nusing CommunityToolkit.Maui.Converters;\n\nnamespace eShop.ClientApp.Converters;\n\npublic clas"
},
{
"path": "src/ClientApp/Converters/WebNavigatedEventArgsConverter.cs",
"chars": 438,
"preview": "using System.Globalization;\nusing CommunityToolkit.Maui.Converters;\n\nnamespace eShop.ClientApp.Converters;\n\npublic clas"
},
{
"path": "src/ClientApp/Converters/WebNavigatingEventArgsConverter.cs",
"chars": 655,
"preview": "using System.Globalization;\nusing Microsoft.Maui.Controls;\n\nnamespace eShop.ClientApp.Converters;\n\npublic class WebNavi"
},
{
"path": "src/ClientApp/Effects/EntryLineColorEffect.cs",
"chars": 186,
"preview": "namespace eShop.ClientApp.Effects;\n\npublic class EntryLineColorEffect : RoutingEffect\n{\n public EntryLineColorEffect"
},
{
"path": "src/ClientApp/Effects/ThemeEffects.cs",
"chars": 1259,
"preview": "namespace eShop.ClientApp.Effects;\n\npublic static class ThemeEffects\n{\n public static readonly BindableProperty Circ"
},
{
"path": "src/ClientApp/Exceptions/ServiceAuthenticationException.cs",
"chars": 290,
"preview": "namespace eShop.ClientApp.Exceptions;\n\npublic class ServiceAuthenticationException : Exception\n{\n public ServiceAuth"
},
{
"path": "src/ClientApp/Extensions/DictionaryExtensions.cs",
"chars": 839,
"preview": "namespace eShop.ClientApp;\n\npublic static class DictionaryExtensions\n{\n public static bool ValueAsBool(this IDiction"
},
{
"path": "src/ClientApp/Extensions/ICommandExtensions.cs",
"chars": 338,
"preview": "using System.Windows.Input;\n\nnamespace eShop.ClientApp;\n\npublic static class ICommandExtensions\n{\n public static voi"
},
{
"path": "src/ClientApp/Extensions/VisualElementExtensions.cs",
"chars": 14057,
"preview": "using System.Linq.Expressions;\nusing System.Reflection;\n\nnamespace eShop.ClientApp;\n\npublic static class VisualElementE"
},
{
"path": "src/ClientApp/GlobalSuppressions.cs",
"chars": 471,
"preview": "// This file is used by Code Analysis to maintain SuppressMessage\n// attributes that are applied to this project.\n// Pr"
},
{
"path": "src/ClientApp/GlobalUsings.cs",
"chars": 135,
"preview": "global using eShop.ClientApp.ViewModels;\nglobal using CommunityToolkit.Mvvm.ComponentModel;\nglobal using CommunityToolk"
},
{
"path": "src/ClientApp/Helpers/EasingHelper.cs",
"chars": 812,
"preview": "using eShop.ClientApp.Animations.Base;\n\nnamespace eShop.ClientApp.Helpers;\n\npublic static class EasingHelper\n{\n publ"
},
{
"path": "src/ClientApp/Helpers/UriHelper.cs",
"chars": 582,
"preview": "namespace eShop.ClientApp.Helpers;\n\npublic static class UriHelper\n{\n private static readonly char[] _trims = {'\\\\', "
},
{
"path": "src/ClientApp/MauiProgram.cs",
"chars": 7758,
"preview": "using CommunityToolkit.Maui;\nusing eShop.ClientApp.Services;\nusing eShop.ClientApp.Services.AppEnvironment;\nusing eShop"
},
{
"path": "src/ClientApp/Messages/ProductCountChangedMessage.cs",
"chars": 173,
"preview": "using CommunityToolkit.Mvvm.Messaging.Messages;\n\nnamespace eShop.ClientApp.Messages;\n\npublic class ProductCountChangedM"
},
{
"path": "src/ClientApp/Models/Basket/BasketItem.cs",
"chars": 751,
"preview": "namespace eShop.ClientApp.Models.Basket;\n\npublic class BasketItem : BindableObject\n{\n private int _quantity;\n\n pu"
},
{
"path": "src/ClientApp/Models/Basket/CustomerBasket.cs",
"chars": 941,
"preview": "namespace eShop.ClientApp.Models.Basket;\n\npublic class CustomerBasket\n{\n private readonly List<BasketItem> _items = "
},
{
"path": "src/ClientApp/Models/Catalog/CatalogBrand.cs",
"chars": 217,
"preview": "namespace eShop.ClientApp.Models.Catalog;\n\npublic class CatalogBrand\n{\n public int Id { get; set; }\n public strin"
},
{
"path": "src/ClientApp/Models/Catalog/CatalogItem.cs",
"chars": 459,
"preview": "namespace eShop.ClientApp.Models.Catalog;\n\npublic class CatalogItem\n{\n public int Id { get; set; }\n public string "
},
{
"path": "src/ClientApp/Models/Catalog/CatalogRoot.cs",
"chars": 233,
"preview": "namespace eShop.ClientApp.Models.Catalog;\n\npublic class CatalogRoot\n{\n public int PageIndex { get; set; }\n public"
},
{
"path": "src/ClientApp/Models/Catalog/CatalogType.cs",
"chars": 214,
"preview": "namespace eShop.ClientApp.Models.Catalog;\n\npublic class CatalogType\n{\n public int Id { get; set; }\n public string"
},
{
"path": "src/ClientApp/Models/Location/GeolocationError.cs",
"chars": 120,
"preview": "namespace eShop.ClientApp.Models.Location;\n\npublic enum GeolocationError\n{\n PositionUnavailable,\n Unauthorized\n}\n"
},
{
"path": "src/ClientApp/Models/Location/GeolocationException.cs",
"chars": 865,
"preview": "namespace eShop.ClientApp.Models.Location;\n\npublic class GeolocationException : Exception\n{\n public GeolocationExcep"
},
{
"path": "src/ClientApp/Models/Location/Location.cs",
"chars": 154,
"preview": "namespace eShop.ClientApp.Models.Location;\n\npublic class Location\n{\n public double Longitude { get; set; }\n publi"
},
{
"path": "src/ClientApp/Models/Location/Position.cs",
"chars": 1101,
"preview": "namespace eShop.ClientApp.Models.Location;\n\npublic class Position\n{\n public Position()\n {\n }\n\n public Posit"
},
{
"path": "src/ClientApp/Models/Marketing/Campaign.cs",
"chars": 309,
"preview": "namespace eShop.ClientApp.Models.Marketing;\n\npublic class Campaign\n{\n public int Id { get; set; }\n\n public string"
},
{
"path": "src/ClientApp/Models/Marketing/CampaignItem.cs",
"chars": 357,
"preview": "namespace eShop.ClientApp.Models.Marketing;\n\npublic class CampaignItem\n{\n public int Id { get; set; }\n\n public st"
},
{
"path": "src/ClientApp/Models/Marketing/CampaignRoot.cs",
"chars": 237,
"preview": "namespace eShop.ClientApp.Models.Marketing;\n\npublic class CampaignRoot\n{\n public int PageIndex { get; set; }\n pub"
},
{
"path": "src/ClientApp/Models/Navigation/TabParameter.cs",
"chars": 115,
"preview": "namespace eShop.ClientApp.Models.Navigation;\n\npublic class TabParameter\n{\n public int TabIndex { get; set; }\n}\n"
},
{
"path": "src/ClientApp/Models/Orders/CancelOrderCommand.cs",
"chars": 210,
"preview": "namespace eShop.ClientApp.Models.Orders;\n\npublic class CancelOrderCommand\n{\n public CancelOrderCommand(int orderNumb"
},
{
"path": "src/ClientApp/Models/Orders/CardType.cs",
"chars": 138,
"preview": "namespace eShop.ClientApp.Models.Orders;\n\npublic class CardType\n{\n public int Id { get; set; }\n public string Nam"
},
{
"path": "src/ClientApp/Models/Orders/Order.cs",
"chars": 1403,
"preview": "using System.Text.Json.Serialization;\n\nnamespace eShop.ClientApp.Models.Orders;\n\npublic class Order\n{\n public Order()"
},
{
"path": "src/ClientApp/Models/Orders/OrderCheckout.cs",
"chars": 852,
"preview": "using System.ComponentModel.DataAnnotations;\nusing eShop.ClientApp.Models.Orders;\n\nnamespace eShop.ClientApp.Models.Bask"
},
{
"path": "src/ClientApp/Models/Orders/OrderItem.cs",
"chars": 743,
"preview": "using System.Text.Json.Serialization;\n\nnamespace eShop.ClientApp.Models.Orders;\n\npublic class OrderItem\n{\n public lon"
},
{
"path": "src/ClientApp/Models/Permissions/Permission.cs",
"chars": 144,
"preview": "namespace eShop.ClientApp.Models.Permissions;\n\npublic enum Permission\n{\n Unknown,\n Location,\n LocationAlways,\n"
},
{
"path": "src/ClientApp/Models/Permissions/PermissionStatus.cs",
"chars": 148,
"preview": "namespace eShop.ClientApp.Models.Permissions;\n\npublic enum PermissionStatus\n{\n Denied,\n Disabled,\n Granted,\n "
},
{
"path": "src/ClientApp/Models/Token/UserToken.cs",
"chars": 436,
"preview": "using System.Text.Json.Serialization;\n\nnamespace eShop.ClientApp.Models.Token;\n\npublic class UserToken\n{\n [JsonProper"
},
{
"path": "src/ClientApp/Models/User/Address.cs",
"chars": 462,
"preview": "namespace eShop.ClientApp.Models.User;\n\npublic class Address\n{\n public Guid Id { get; set; }\n public string Stree"
},
{
"path": "src/ClientApp/Models/User/LogoutParameter.cs",
"chars": 111,
"preview": "namespace eShop.ClientApp.Models.User;\n\npublic class LogoutParameter\n{\n public bool Logout { get; set; }\n}\n"
},
{
"path": "src/ClientApp/Models/User/PaymentInfo.cs",
"chars": 453,
"preview": "using eShop.ClientApp.Models.Orders;\n\nnamespace eShop.ClientApp.Models.User;\n\npublic class PaymentInfo\n{\n public Gui"
},
{
"path": "src/ClientApp/Models/User/UserInfo.cs",
"chars": 1430,
"preview": "using System.Text.Json.Serialization;\n\nnamespace eShop.ClientApp.Models.User;\n\npublic class UserInfo\n{\n [JsonPropert"
},
{
"path": "src/ClientApp/Platforms/Android/AndroidManifest.xml",
"chars": 922,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <appli"
},
{
"path": "src/ClientApp/Platforms/Android/MainActivity.cs",
"chars": 811,
"preview": "using Android.App;\nusing Android.Content.PM;\n\nnamespace eShop.ClientApp;\n\n[Activity(Theme = \"@style/Maui.SplashTheme\", "
},
{
"path": "src/ClientApp/Platforms/Android/MainApplication.cs",
"chars": 335,
"preview": "using Android.App;\nusing Android.Runtime;\n\nnamespace eShop.ClientApp;\n\n[Application]\npublic class MainApplication : Mau"
},
{
"path": "src/ClientApp/Platforms/Android/Resources/values/colors.xml",
"chars": 207,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"colorPrimary\">#512BD4</color>\n <color name=\"color"
},
{
"path": "src/ClientApp/Platforms/Android/Resources/xml/network_security_config.xml",
"chars": 224,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n <domain-config cleartextTrafficPermitted=\"true\">\n "
},
{
"path": "src/ClientApp/Platforms/Android/WebAuthenticationCallbackActivity.cs",
"chars": 498,
"preview": "using Android.App;\nusing Android.Content.PM;\n\nnamespace eShop.ClientApp;\n\n[Activity(NoHistory = true, LaunchMode = Laun"
},
{
"path": "src/ClientApp/Platforms/MacCatalyst/AppDelegate.cs",
"chars": 210,
"preview": "using Foundation;\n\nnamespace eShop.ClientApp;\n\n[Register(\"AppDelegate\")]\npublic class AppDelegate : MauiUIApplicationDe"
},
{
"path": "src/ClientApp/Platforms/MacCatalyst/Entitlements.Debug.plist",
"chars": 415,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/"
},
{
"path": "src/ClientApp/Platforms/MacCatalyst/Entitlements.Release.plist",
"chars": 452,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/"
},
{
"path": "src/ClientApp/Platforms/MacCatalyst/Info.plist",
"chars": 1440,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "src/ClientApp/Platforms/MacCatalyst/Program.cs",
"chars": 357,
"preview": "using UIKit;\n\nnamespace eShop.ClientApp;\n\npublic class Program\n{\n // This is the main entry point of the application"
},
{
"path": "src/ClientApp/Platforms/Windows/App.xaml",
"chars": 314,
"preview": "<maui:MauiWinUIApplication\n x:Class=\"eShop.ClientApp.WinUI.App\"\n xmlns=\"http://schemas.microsoft.com/winfx/2006/x"
},
{
"path": "src/ClientApp/Platforms/Windows/App.xaml.cs",
"chars": 685,
"preview": "// To learn more about WinUI, the WinUI project structure,\n// and more about our project templates, see: http://aka.ms/"
},
{
"path": "src/ClientApp/Platforms/Windows/Package.appxmanifest",
"chars": 1135,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Package\n xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windo"
},
{
"path": "src/ClientApp/Platforms/Windows/app.manifest",
"chars": 792,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n <as"
},
{
"path": "src/ClientApp/Platforms/iOS/AppDelegate.cs",
"chars": 210,
"preview": "using Foundation;\n\nnamespace eShop.ClientApp;\n\n[Register(\"AppDelegate\")]\npublic class AppDelegate : MauiUIApplicationDe"
},
{
"path": "src/ClientApp/Platforms/iOS/Entitlements.plist",
"chars": 305,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "src/ClientApp/Platforms/iOS/Info.plist",
"chars": 1500,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "src/ClientApp/Platforms/iOS/Program.cs",
"chars": 357,
"preview": "using UIKit;\n\nnamespace eShop.ClientApp;\n\npublic class Program\n{\n // This is the main entry point of the application"
},
{
"path": "src/ClientApp/Properties/launchSettings.json",
"chars": 121,
"preview": "{\n \"profiles\": {\n \"Windows Machine\": {\n \"commandName\": \"MsixPackage\",\n \"nativeDebugging\": false\n }\n }\n"
},
{
"path": "src/ClientApp/Resources/Raw/AboutAssets.txt",
"chars": 491,
"preview": "Any raw assets you want to be deployed with your application can be placed in\nthis directory (and child directories) an"
},
{
"path": "src/ClientApp/Resources/Styles/Colors.xaml",
"chars": 2040,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<?xaml-comp compile=\"true\" ?>\n\n<ResourceDictionary xmlns=\"http://schemas.micros"
},
{
"path": "src/ClientApp/Resources/Styles/Styles.xaml",
"chars": 14679,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<?xaml-comp compile=\"true\" ?>\n<ResourceDictionary\n xmlns=\"http://schemas.mic"
},
{
"path": "src/ClientApp/Services/AppEnvironment/AppEnvironmentService.cs",
"chars": 2208,
"preview": "using eShop.ClientApp.Services.Basket;\nusing eShop.ClientApp.Services.Catalog;\nusing eShop.ClientApp.Services.Identity;\n"
},
{
"path": "src/ClientApp/Services/AppEnvironment/IAppEnvironmentService.cs",
"chars": 482,
"preview": "using eShop.ClientApp.Services.Basket;\nusing eShop.ClientApp.Services.Catalog;\nusing eShop.ClientApp.Services.Identity;\n"
},
{
"path": "src/ClientApp/Services/Basket/BasketMockService.cs",
"chars": 1526,
"preview": "using eShop.ClientApp.Models.Basket;\n\nnamespace eShop.ClientApp.Services.Basket;\n\npublic class BasketMockService : IBask"
},
{
"path": "src/ClientApp/Services/Basket/BasketService.cs",
"chars": 4347,
"preview": "using eShop.ClientApp.BasketGrpcClient;\nusing eShop.ClientApp.Models.Basket;\nusing eShop.ClientApp.Services.FixUri;\nusin"
},
{
"path": "src/ClientApp/Services/Basket/IBasketService.cs",
"chars": 325,
"preview": "using eShop.ClientApp.Models.Basket;\n\nnamespace eShop.ClientApp.Services.Basket;\n\npublic interface IBasketService\n{\n "
},
{
"path": "src/ClientApp/Services/Basket/Protos/Basket.cs",
"chars": 42660,
"preview": "// <auto-generated>\n// Generated by the protocol buffer compiler. DO NOT EDIT!\n// source: Services/Basket/Proto"
},
{
"path": "src/ClientApp/Services/Basket/Protos/BasketGrpc.cs",
"chars": 13431,
"preview": "// <auto-generated>\n// Generated by the protocol buffer compiler. DO NOT EDIT!\n// source: Services/Basket/Proto"
},
{
"path": "src/ClientApp/Services/Basket/Protos/basket.proto",
"chars": 658,
"preview": "syntax = \"proto3\";\n\noption csharp_namespace = \"eShop.ClientApp.BasketGrpcClient\";\n\npackage BasketApi;\n\nservice Basket {"
},
{
"path": "src/ClientApp/Services/Catalog/CatalogMockService.cs",
"chars": 5754,
"preview": "using eShop.ClientApp.Models.Catalog;\n\nnamespace eShop.ClientApp.Services.Catalog;\n\npublic class CatalogMockService : I"
},
{
"path": "src/ClientApp/Services/Catalog/CatalogService.cs",
"chars": 3134,
"preview": "using eShop.ClientApp.Helpers;\nusing eShop.ClientApp.Models.Catalog;\nusing eShop.ClientApp.Services.FixUri;\nusing eShop."
},
{
"path": "src/ClientApp/Services/Catalog/ICatalogService.cs",
"chars": 443,
"preview": "using eShop.ClientApp.Models.Catalog;\n\nnamespace eShop.ClientApp.Services.Catalog;\n\npublic interface ICatalogService\n{\n "
},
{
"path": "src/ClientApp/Services/Common/Common.cs",
"chars": 400,
"preview": "namespace eShop.ClientApp.Services.Common;\n\npublic static class Common\n{\n public static int MockCatalogItemId01 = 1;"
},
{
"path": "src/ClientApp/Services/Dialog/DialogService.cs",
"chars": 254,
"preview": "namespace eShop.ClientApp.Services;\n\npublic class DialogService : IDialogService\n{\n public Task ShowAlertAsync(strin"
},
{
"path": "src/ClientApp/Services/Dialog/IDialogService.cs",
"chars": 149,
"preview": "namespace eShop.ClientApp.Services;\n\npublic interface IDialogService\n{\n Task ShowAlertAsync(string message, string t"
}
]
// ... and 579 more files (download for full content)
About this extraction
This page contains the full source code of the dotnet/eShop GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 779 files (1.3 MB), approximately 327.1k tokens, and a symbol index with 1706 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.