JBeni/BlazorShop
48.3
Weak · 21 September 2026
18.9k
lines of production code
C#
primary language
4
measurements over time
What this system is
BlazorShop is a multi-layered e-commerce and content management system built on .NET 7, featuring a Blazor WebAssembly client, a RESTful API, and a background worker service. It provides comprehensive CRUD operations for managing users, roles, and subscriptions, alongside domain-specific entities like clothing, music, orders, and invoices. The architecture leverages the CQRS pattern with MediatR, enforcing strict validation and error handling across all application commands and queries.
How it got here
2021 — Initial project scaffolding and architecture
30 changes.
This period marks the initial creation of the BlazorShop solution, establishing a complete layered architecture including Domain, Application, Infrastructure, Web API, and Web Client projects. The work focused on setting up core infrastructure, such as database contexts, authentication services, and UI layouts, while defining the foundational domain models and API endpoints.
2022–2023 — Full-stack feature expansion and architectural hardening
82 changes.
The codebase expanded significantly to support a complete e-commerce and content management system, introducing new domains for music, subscriptions, invoices, and task management alongside existing clothing sales. This period also solidified the application's architecture by implementing comprehensive CQRS handlers, strict validation rules, and robust error logging across the entire stack.
Features
Add Music browsing and details pages
Users can now browse a list of available music titles on the Musics index page, where they can search, filter, and view individual music details. The Musics index page displays a grid of music cards with titles, images, and a link to view each music's specific details. The new MusicDetails page shows the title, description, author, release date, and an image for a specific music title, allowing users to see more information about a particular music item.
BlazorShop.WebClient/Pages/Musics · high confidence
Add My Orders, Order View, and Order Success pages
The Orders section of the web client now includes three new Razor pages: MyOrders.razor, which displays a list of the user's past orders with search and filter capabilities; OrderView.razor, which shows detailed information for a specific order including line items and total amount; and OrderSuccess.razor, which displays a confirmation message after a successful order placement. These pages are protected by an authorization policy requiring the 'Customer' role and utilize the IOrderService to fetch data.
BlazorShop.WebClient/Pages/Orders · high confidence
Add account management pages for Blazor Web Client
Introduced new Razor components for user authentication and account management in the Blazor Web Client. The update adds Login, Register, ResetPassword, and Logout pages, each utilizing MudBlazor UI components and FluentValidation validators. Additionally, a VerifyAuth page was added to display user authentication state, roles, and claims for debugging or administrative verification.
BlazorShop.WebClient/Pages/Account · high confidence
Add admin subscribers management page
A new admin page at /admin/subscribers has been introduced, allowing administrators to view a list of subscribers with details such as status, dates, customer name, and subscription name. The page includes functionality to delete subscribers via a confirmation modal, utilizing the MudBlazor UI library for the table and button components.
BlazorShop.WebClient/Pages/Admin/Subscribers · high confidence
Add and edit music management interface for the admin panel
The admin section now includes a new Musics page that allows administrators to view a list of all music titles, add new music entries, edit existing ones, and delete them. The interface provides a table displaying music details (ID, title, description, author, release date, and image information) with options to edit or delete each entry. A dedicated form component supports creating and updating music records, handling both add and edit scenarios within a single interface.
BlazorShop.WebClient/Pages/Admin/Musics · high confidence
Add and edit subscription management pages
Admin users can now create, edit, and delete subscriptions via new Blazor pages. The AddEditSubscription component provides a form for creating and updating subscription details (name, price, options, etc.), while the Subscriptions component displays a table of all subscriptions with options to edit or delete them.
BlazorShop.WebClient/Pages/Admin/Subscriptions · high confidence
Add domain enums for subscription and todo item states
The domain layer now includes new enumerations to represent business states: SubscriptionStatus (Active, Inactive), TodoItemPriority (None, Low, Medium, High), and TodoItemState (NotStarted, InProgress, Blocked, Done). These enums provide structured, type-safe options for managing subscription statuses and organizing todo items by priority and progress.
BlazorShop.Domain/Enums · high confidence
Add home page with product showcase for authorized users
A new home page (Index.razor) has been added to the BlazorShop.WebClient. It displays a grid of product images (clothes) and includes a 'Shop Items' link. The page uses an AuthorizeView to conditionally render content: authorized users see the full product grid, while unauthenticated users see a similar layout but with a non-functional link. The page also includes embedded CSS styles for the card layout and image hover effects.
BlazorShop.WebClient/Pages · medium confidence
Add input validation for user management commands and queries
New validators have been introduced in the BlazorShop.Application layer to enforce data integrity for user-related operations. Specifically, the system now validates that user IDs are positive integers for activation, deletion, and retrieval commands and queries. For user creation and updates, the application enforces non-null and non-empty constraints on first name, last name, and role fields, with maximum length limits. Email fields across creation, update, and query operations are validated for format and length, ensuring that only properly formatted email addresses are accepted. These changes provide immediate feedback to users regarding invalid input before processing.
BlazorShop.Application/Validators/UserValidator · high confidence
Add shopping cart page with quantity updates and checkout flow
Users can now view their shopping cart, update item quantities, remove items, and proceed to checkout. The page displays a list of cart items with their prices and allows for real-time quantity adjustments and deletion of items. A total price is calculated and displayed, and a 'Proceed to checkout' button initiates the order placement process.
BlazorShop.WebClient/Pages/Cart · high confidence
Add user profile page with validation
A new User Profile page has been added at /profile, allowing authenticated users to view and edit their first name, last name, and email, as well as change their password and update their email address. The page includes FluentValidation-based validation for all form fields, displaying inline error messages for each input.
BlazorShop.WebClient/Pages/User · high confidence
Add validation for subscription commands and queries
New validators have been introduced for subscription-related commands and queries, enforcing rules such as non-empty and non-null fields, maximum string lengths, and uniqueness checks for subscription names. Specifically, CreateSubscriptionCommandValidator and UpdateSubscriptionCommandValidator validate fields like Name, Price, Options, ImageName, and ImagePath, while DeleteSubscriptionCommandValidator and GetSubscriptionByIdQueryValidator ensure the Id is greater than zero.
BlazorShop.Application/Validators/SubscriptionValidator · high confidence
Add validation rules for order commands and queries
New validators have been introduced for the Order domain, enforcing constraints on Create, Update, and Delete commands as well as GetById and GetOrders queries. Specifically, CreateOrderCommandValidator ensures the user email is non-empty and under 100 characters, the order date is not empty and is within the last day, line items are populated and under 10,000, and the total amount is positive. DeleteOrderCommandValidator and GetOrderByIdQueryValidator require a valid, positive ID. GetOrdersQueryValidator validates the user email format. These changes ensure that order-related requests are validated before processing.
BlazorShop.Application/Validators/OrderValidator · high confidence
Add validation rules for subscriber commands and queries
New validators are introduced for subscriber-related commands and queries, including CreateSubscriberCommand, UpdateSubscriberCommand, UpdateCreatedSubscriberCommand, UpdateSubscriberStatusCommand, DeleteSubscriberCommand, GetSubscriberByIdQuery, and GetUserSubscribersQuery. Each validator enforces specific constraints—such as ensuring IDs are positive, dates are not in the future, and string fields are not empty or null—providing clear error messages to users when input fails validation.
BlazorShop.Application/Validators/SubscriberValidator · high confidence
Added API exception handling and JWT token validation middleware
The API now includes a new ApiExceptionFilterAttribute that standardizes error responses for validation failures, invalid model states, and unknown exceptions, returning a consistent RequestResponse model. Additionally, a JwtTokenMiddleware was added to intercept requests and validate bearer tokens against the configured issuer, audience, and secret key, ensuring only valid tokens are processed.
BlazorShop.WebApi/Filters · high confidence
Added Admin Todos management pages
Introduced new Blazor components for the Admin Todos feature, including the main Index page, and sub-components for managing TodoLists and TodoItems. The TodoState component provides shared state and service injection (ITodoListService, ITodoItemService) to coordinate list selection, item editing, and list creation within the admin interface.
BlazorShop.WebClient/Pages/Admin/Todos · high confidence
Added CQRS command models for creating, updating, and deleting clothing items
The application layer now includes new command models for managing clothing products: CreateClotheCommand (with name, description, price, amount, image name/path, and active status), UpdateClotheCommand (with id, name, description, price, amount, image name/path), and DeleteClotheCommand (with id). These are standard CQRS command classes implementing IRequest\<RequestResponse\>, enabling the application to process these specific business operations.
BlazorShop.Application/Commands/ClotheCommand · high confidence
Added CQRS command models for order management
Introduced three new CQRS command classes in the BlazorShop.Application layer to support order operations: CreateOrderCommand (for placing an order with email, date, line items, and total amount), UpdateOrderCommand (for modifying an existing order's details), and DeleteOrderCommand (for removing an order by ID). These models define the data contracts used by the Mediator to process these specific order-related commands.
BlazorShop.Application/Commands/OrderCommand · high confidence
Added Clothe query models for retrieving clothing items
New query models, GetClotheByIdQuery and GetClothesQuery, have been added to the BlazorShop.Application layer. These classes implement the IRequest interface to support fetching individual and multiple clothing items, each returning a ClotheResponse.
BlazorShop.Application/Queries/ClotheQuery · high confidence
Added TodoList command and query models
New command models for creating, updating, and deleting TodoLists, along with query models for retrieving a single TodoList by ID and fetching all TodoLists, have been added to the application layer.
BlazorShop.Application/Commands/TodoListCommand, BlazorShop.Application/Queries/TodoListQuery · medium confidence
Added application-layer pipeline behaviors for validation, authorization, logging, and exception handling
The application now includes four new pipeline behaviors in the \BlazorShop.Application/Common/Behaviours\ directory. \ValidationBehaviour\ automatically validates incoming requests using FluentValidation, throwing a \ValidationException\ if rules fail. \AuthorizationBehaviour\ enforces user authentication and role/policy-based access control before processing requests. \LoggingBehaviour\ records incoming request details for observability. \UnhandledExceptionBehaviour\ catches and logs any unhandled exceptions during request processing. These behaviors are applied to the MediatR pipeline to provide cross-cutting concerns for all commands and queries.
BlazorShop.Application/Common/Behaviours · high confidence
Added base domain entity and event classes
The BlazorShop.Domain.Common namespace now includes two new base classes: EntityBase, which provides a standard Id property and methods to manage a collection of domain events, and BaseEvent, an abstract class implementing MediatR's INotification interface to serve as the foundation for domain events.
BlazorShop.Domain/Common · high confidence
Added cart command models for cart management
New command models have been introduced in the BlazorShop.Application layer to support cart operations. Specifically, CreateCartCommand, UpdateCartCommand, DeleteCartCommand, and DeleteAllCartsCommand are now available, each implementing the IRequest interface to handle their respective cart actions (create, update, delete single, delete all).
BlazorShop.Application/Commands/CartCommand · high confidence
Added cart query models for retrieving, counting, and listing carts
New query models have been introduced in the BlazorShop.Application layer to support cart operations. Specifically, GetCartByIdQuery allows fetching a specific cart by its ID, GetCartsQuery retrieves a list of carts, and GetCartsCountQuery provides a count of carts. These models define the input parameters (such as cart ID and user ID) required for these read operations.
BlazorShop.Application/Queries/CartQuery · high confidence
Added client-side configuration and UI library assets
The Blazor WebAssembly client now includes an appsettings.json file containing JWT token configuration (secret key, issuer, and audience) for local development. The index.html entry point has been updated to include CSS and JavaScript references for multiple UI libraries: Radzen.Blazor, MatBlazor, Blazored.Toast, and MudBlazor. Additionally, a custom JavaScript helper file (BlazorShop.js) was added to manage session storage and Bootstrap modal interactions.
BlazorShop.WebClient/wwwroot · high confidence
Added clothes shop pages with product listing and detail views
Introduced new Blazor Web Client pages for the clothes shop: a list view at /clothes that displays all available items with search and filter capabilities, and a detail view at /clothes/view/{Id:int} that shows individual product information. Both pages include an 'Add to Cart' button, allowing users to add items to their shopping cart directly from the product list or detail page.
BlazorShop.WebClient/Pages/Clothes · high confidence
Added command and query models for TodoItem operations
New command models (CreateTodoItemCommand, UpdateTodoItemCommand, DeleteTodoItemCommand) and query models (GetTodoItemByIdQuery, GetTodoItemsQuery) were added to the BlazorShop.Application layer. These files define the data structures used to create, update, delete, and retrieve TodoItem entities, establishing the interface for these operations within the application's command and query handlers.
BlazorShop.Application/Commands/TodoItemCommand, BlazorShop.Application/Queries/TodoItemQuery · high confidence
Added command handlers for creating, updating, and deleting TodoItems and TodoLists
The application now includes new command handlers for managing TodoItems and TodoLists. Specifically, the system can now create, update, and delete both individual TodoItems and TodoLists. These handlers interact with the database via the application's data context and use a mapper to convert entities to response models. Each handler implements the Mediatree pattern, handling the corresponding command and returning a result indicating success or failure.
BlazorShop.Application/Handlers/Commands/TodoItemHandler, BlazorShop.Application/Handlers/Commands/TodoListHandler · high confidence
Added command handlers for subscriber management
The application now includes new command handlers for managing subscribers, including creating, deleting, and updating subscriber records. These handlers implement the IRequestHandler interface and interact with the application's database context and user service to perform operations such as creating a new subscriber, deleting an existing one, updating subscription details, and modifying subscriber status. Each handler includes error handling and logging, ensuring that any issues during these operations are properly recorded and reported.
BlazorShop.Application/Handlers/Commands/SubscriberHandler · high confidence
Added command models for creating, updating, and deleting music
New command classes (CreateMusicCommand, UpdateMusicCommand, DeleteMusicCommand) have been introduced in the BlazorShop.Application layer. These models define the data structures required to create, update, and delete music entries, each inheriting from IRequest\<RequestResponse\> and containing relevant fields such as title, description, author, and release date.
BlazorShop.Application/Commands/MusicCommand · high confidence
Added command models for invoice CRUD operations
New command models have been introduced to support creating, updating, and deleting invoices. The CreateInvoiceCommand includes fields for user email, name, sub-total, total amount, and quantity. The UpdateInvoiceCommand mirrors these fields plus an ID. The DeleteInvoiceCommand handles removal by ID. These are the application-layer request models for invoice management.
BlazorShop.Application/Commands/InvoiceCommand · high confidence
Added custom exception classes for access and validation errors
The application now includes two new exception classes, ForbiddenAccessException and ValidationException, located in the BlazorShop.Application.Common.Exceptions namespace. ForbiddenAccessException is a simple exception for handling forbidden access scenarios. ValidationException provides structured validation error handling, including a dictionary of property names to their corresponding error messages, which allows for more granular error reporting in the UI.
BlazorShop.Application/Common/Exceptions · high confidence
Added database configuration for multiple entity types
The persistence layer now includes explicit Entity Framework Core configuration classes for Cart, Clothe, Invoice, Music, Order, Receipt, Subscriber, Subscription, TodoItem, and TodoList entities. Each class defines table names, primary keys, and property constraints (e.g., max length, required status), ensuring the database schema aligns with the domain model.
BlazorShop.Infrastructure/Persistence/Configurations · high confidence
Added default CSS styles for the Blazor web client
The BlazorShop.WebClient now includes a default stylesheet (app.css) that defines the application's base typography, link colors, and validation feedback styles. Additionally, the project now ships with the Bootstrap 5.1.0 minified CSS, providing standard layout and component styling for the user interface.
BlazorShop.WebClient/wwwroot/css · high confidence
Added domain entities for identity, commerce, and content management
The domain model has been expanded with new entity classes to support user authentication and authorization, product and order management, and content subscriptions. Specifically, the diff introduces \Cart\, \Clothe\, \Invoice\, \Order\, \Receipt\, \Music\, \Subscriber\, \Subscription\, \TodoItem\, and \TodoList\ entities, alongside a full set of Identity-related entities (\User\, \Role\, \UserClaim\, \UserLogin\, \UserToken\, \UserRole\, \UserToken\) to support user management and access control.
BlazorShop.Domain/Entities · high confidence
Added input validation for account management commands
New validators have been introduced for the ChangePassword, Login, Register, and ResetPassword commands. These enforce field-level constraints such as maximum string lengths, non-empty/non-null requirements, and value equality checks (e.g., confirming a new password matches the confirmation field). For email fields, a custom validation rule ensures the address is syntactically valid. These changes provide immediate feedback to users when their input does not meet the required criteria.
BlazorShop.Application/Validators/AccountValidator · high confidence
Added music command handlers for create, update, and delete operations
The application now includes new command handlers for managing music entities. CreateMusicCommandHandler, UpdateMusicCommandHandler, and DeleteMusicCommandHandler have been added to handle their respective commands. Each handler implements IRequestHandler, interacts with the IApplicationDbContext to perform database operations, and utilizes an ILogger for error logging. The handlers return a RequestResponse object indicating success or failure, with error messages derived from an ErrorsManager.
BlazorShop.Application/Handlers/Commands/MusicHandler · high confidence
Added music query models for retrieving music by ID and listing all music
New query models were introduced to support fetching music data: GetMusicByIdQuery allows retrieving a single music item by its ID, while GetMusicsQuery supports retrieving a collection of music items. These models implement the IRequest interface to facilitate the application's command/query pattern for music-related data retrieval.
BlazorShop.Application/Queries/MusicQuery · high confidence
Added project configuration and documentation files
The repository now includes essential configuration and documentation files to support development and usage. An .editorconfig file has been added to enforce C\# coding standards and suppress specific compiler warnings. A .gitattributes file ensures consistent line endings across the repository. A .gitignore file has been introduced to exclude build artifacts and user-specific files from version control. The solution file (BlazorShop.sln) has been created to define the project structure. Additionally, a LICENSE file (MIT) and updated README.md documentation have been added to clarify the project's setup, architecture, and features.
(repo-wide) · high confidence
Added query handlers for retrieving Todo items and lists
New query handlers have been introduced to fetch individual and all Todo items and lists. Specifically, GetTodoItemByIdQueryHandler, GetTodoItemsQueryHandler, GetTodoListByIdQueryHandler, and GetTodoListsQueryHandler are now available to process their respective queries, enabling the application to retrieve and map Todo data via the Mediator pattern.
BlazorShop.Application/Handlers/Queries/TodoItemHandler, BlazorShop.Application/Handlers/Queries/TodoListHandler · high confidence
Added query models for retrieving invoices
New query models, GetInvoiceByIdQuery and GetInvoicesQuery, have been introduced in the BlazorShop.Application layer. These classes implement the IRequest interface to support fetching invoice data by ID and retrieving a list of invoices, respectively.
BlazorShop.Application/Queries/InvoiceQuery · high confidence
Added query models for retrieving orders
Introduced new query models, GetOrderByIdQuery and GetOrdersQuery, which allow users to retrieve individual orders by ID or fetch a list of orders associated with a user's email address.
BlazorShop.Application/Queries/OrderQuery · high confidence
Added query models for retrieving receipts
Introduced two new query models, GetReceiptByIdQuery and GetReceiptsQuery, within the BlazorShop.Application layer. These models define the input parameters for fetching a single receipt by ID or retrieving a list of receipts by user email, enabling the application to query receipt data.
BlazorShop.Application/Queries/ReceiptQuery · high confidence
Added query models for retrieving subscribers
New query models have been introduced in the application layer to support fetching subscriber data. Specifically, GetSubscriberByIdQuery allows retrieving a single subscriber by user ID, while GetSubscribersQuery and GetUserSubscribersQuery provide mechanisms to retrieve lists of subscribers, with the latter also scoped by user ID. These changes enable the underlying application logic to handle subscriber retrieval requests.
BlazorShop.Application/Queries/SubscriberQuery · high confidence
Added receipt command models for CRUD operations
New command models have been introduced in the BlazorShop.Application layer to handle receipt management. Specifically, CreateReceiptCommand, UpdateReceiptCommand, and DeleteReceiptCommand classes have been added. These models define the data structures required to create, update, and delete receipts, each implementing the IRequest\<RequestResponse\> interface. The Create and Update commands include fields for user email, receipt date, name, and URL, while the Delete command requires a receipt ID.
BlazorShop.Application/Commands/ReceiptCommand · high confidence
Added receipts page for customers
A new 'My Receipts' page has been added to the BlazorShop.WebClient. This page allows authenticated customers to view a list of their past receipts, search by name, and access individual receipt details. The component handles loading states, empty states, and client-side filtering of the receipts list.
BlazorShop.WebClient/Pages/Receipts · high confidence
Added role management commands
The application now includes command models for creating, updating, and deleting roles. These new files (CreateRoleCommand, UpdateRoleCommand, and DeleteRoleCommand) define the data structures used to handle role modification requests, each implementing the IRequest\<RequestResponse\> interface.
BlazorShop.Application/Commands/RoleCommand · high confidence
Added role query models for retrieving roles by ID, normalizedName, and admin lists
New query models have been introduced in the application layer to support fetching role data: GetRoleByIdQuery for retrieving a specific role by its ID, GetRoleByNormalizedNameQuery for lookups by normalized name, and GetRolesQuery/GetRolesForAdminQuery for listing roles. These classes implement the IRequest\<Result\<RoleResponse\>\> interface, indicating they are part of a CQRS-style command/query pattern, allowing the application to request role information in a structured, decoupled way.
BlazorShop.Application/Queries/RoleQuery · high confidence
Added seed models for admin and role initialization
New data models, AdminSeedModel and RolesSeedModel, have been introduced in the BlazorShop.Infrastructure/Utils directory. These classes define the structure for seeding initial admin user details and role configurations, providing the necessary data contracts for setting up default roles and the first administrator account.
BlazorShop.Infrastructure/Utils · high confidence
Added subscriber command models for CRUD operations
The application layer now includes new command models for managing subscribers, including CreateSubscriberCommand, UpdateSubscriberCommand, UpdateCreatedSubscriberCommand, UpdateSubscriberStatusCommand, and DeleteSubscriberCommand. These commands handle creating, updating, and deleting subscriber records, with fields for dates, customer IDs, subscription IDs, and Stripe integration details.
BlazorShop.Application/Commands/SubscriberCommand · high confidence
Added subscriber query handlers with structured error logging
The BlazorShop application now includes three new query handlers for the Subscriber domain: GetSubscriberByIdQueryHandler, GetSubscribersQueryHandler, and GetUserSubscribersQueryHandler. Each handler implements the Mediatree IRequestHandler interface and includes robust error handling that logs exceptions via the ILogger interface, ensuring that query failures are captured in logs rather than causing unhandled exceptions.
BlazorShop.Application/Handlers/Queries/SubscriberHandler · high confidence
Added subscription command models for CRUD operations
New command models have been introduced to handle subscription management within the application's command layer. Specifically, CreateSubscriptionCommand, UpdateSubscriptionCommand, and DeleteSubscriptionCommand have been added. These classes define the data structures required to create, update, and delete subscription records, each inheriting from IRequest\<RequestResponse\> and containing relevant fields such as Id, Name, Price, and Stripe integration identifiers.
BlazorShop.Application/Commands/SubscriptionCommand · high confidence
Added subscription management and success pages
The subscription area now includes new Razor components for managing and confirming subscription actions. A new 'My Subscriptions' page allows customers to view their active and inactive subscriptions, activate new plans via a modal, search and filter subscription lists, and cancel or view receipts for existing plans. Additionally, dedicated success pages have been added to confirm the activation ('/subscription-success') and updating ('/update-subscription-success') of subscription plans, each displaying a success message and redirecting the user after a brief delay.
BlazorShop.WebClient/Pages/Subscriptions · high confidence
Added user management command models
The application layer now includes new command models for user management, including creating, updating, deleting, and activating users, as well as assigning users to roles and updating email addresses. These commands serve as the data transfer objects for these specific user operations.
BlazorShop.Application/Commands/UserCommand · high confidence
Added user query models for retrieving users
Introduced new query models in the BlazorShop.Application layer to support fetching user data. Specifically, the diff adds four new C\# files: GetUserByEmailQuery, GetUserByIdQuery, GetUsersQuery, and GetUsersInactiveQuery. These models implement the IRequest interface to facilitate user retrieval operations, with specific properties for email and ID, and dedicated queries for listing all users or inactive users.
BlazorShop.Application/Queries/UserQuery · high confidence
Added validation rules for role management commands and queries
New validators have been introduced for role-related commands and queries, including CreateRoleCommandValidator, UpdateRoleCommandValidator, DeleteRoleCommandValidator, GetRoleByIdQueryValidator, and GetRoleByNormalizedNameQueryValidator. These validators enforce constraints such as maximum length, non-empty, non-null checks for names, and positive ID requirements, ensuring that role data is validated before processing.
BlazorShop.Application/Validators/RoleValidator · high confidence
Added web client services for account, cart, clothing, music, orders, receipts, roles, storage, Stripe, subscribers, and subscriptions
The Blazor web client now includes a comprehensive set of new services that handle communication with the backend API. These include AccountService for password management, CartService for managing shopping carts, and services for managing content (ClotheService, MusicService), e-commerce operations (OrderService, ReceiptService), and user management (RoleService, SubscriberService, SubscriptionService). Additionally, a StripeService was added to handle payment-related actions like canceling memberships, and a SessionStorageService was introduced to manage browser session storage. All services utilize a consistent pattern of HTTP requests with automatic retry logic and user feedback via snackbars.
BlazorShop.WebClient/Services · high confidence
Admin user management pages added
The admin interface now includes dedicated Razor components for managing users. The 'Users' page displays a list of active users with options to edit or delete them, and also lists inactive users with an option to activate them. The 'AddEditUser' page provides a form to create new users or edit existing ones, including fields for first name, last name, email, and role selection.
BlazorShop.WebClient/Pages/Admin/Users · high confidence
Application layer bootstrapping and code standards
The BlazorShop.Application project now includes a dedicated dependency injection registration method that configures AutoMapper, FluentValidation, and MediatR with global pipeline behaviors for exception handling and validation. Additionally, a new \_Imports.cs file provides global using directives for the application's commands, queries, and common interfaces, while a stylecop.json file enforces consistent code styling and documentation rules across the project.
BlazorShop.Application · medium confidence
Centralized infrastructure dependency injection and configuration
The infrastructure layer now provides a dedicated entry point for registering services via the new \AddInfrastructureLayer\ extension method. This method configures the \ApplicationDbContext\ with SQL Server, registers application services (account, user, role, datetime, email, CSV), and sets up ASP.NET Core Identity with specific password and user requirements. It also defines authorization policies for Admin, User, and Default roles. Global using statements and StyleCop configuration have been added to support these changes.
BlazorShop.Infrastructure · medium confidence
Custom role-based authorization policies for Admin, Customer, Default, and User roles
The Blazor web client now enforces access control through new custom authorization requirements and handlers for Admin, Customer, Default, and User roles. Each role has a corresponding requirement class and a handler that validates the user's claims against the expected role, allowing the application to restrict pages and actions based on these specific user types.
BlazorShop.WebClient/AuthPolicies · high confidence
Implemented cart command handlers with logging and error handling
Added new command handlers for creating, updating, and deleting shopping cart items, as well as clearing all items for a user. Each handler now includes structured logging via ILogger and consistent error handling that logs exceptions and returns failure responses with detailed error messages from the ErrorsManager.
BlazorShop.Application/Handlers/Commands/CartHandler · high confidence
Implemented invoice command handlers for create, update, and delete operations
Added CreateInvoiceCommandHandler, UpdateInvoiceCommandHandler, and DeleteInvoiceCommandHandler to manage invoice lifecycle. Each handler accepts an IApplicationDbContext and ILogger, performs the corresponding database operation (Add/SaveChanges, Update/SaveChanges, or Remove/SaveChanges), and returns a RequestResponse. Errors are logged and wrapped in a failure response.
BlazorShop.Application/Handlers/Commands/InvoiceHandler · high confidence
Initial Blazor WebAssembly client scaffolding and configuration
The BlazorShop.WebClient project is introduced with a complete bootstrap configuration. This includes the main App.razor root component with routing and authorization views, global \_Imports files to reduce boilerplate, and Program.cs to register services such as Blazored LocalStorage and Toast, MudBlazor, Polly for retries, and custom authorization handlers. Error pages for 404, server errors, and unauthorized states are added, along with a stylecop.json for code styling.
BlazorShop.WebClient · high confidence
Initial Web API project scaffolding and configuration
The BlazorShop.WebApi project has been initialized with a complete startup configuration. This includes setting up Serilog for structured JSON and file-based logging, configuring CORS to allow the Blazor client origin, and establishing JWT Bearer authentication with specific token validation parameters. The application also integrates Fluent Validation for request validation, registers application and infrastructure layers, and configures Stripe for payment processing. Additionally, the project includes a database seeding process for roles, admin users, and initial data, all controlled by a 'RunSeedingOnStartup' flag. Security headers and a custom exception filter are also applied to the request pipeline.
BlazorShop.WebApi · high confidence
Introduce Blazor Web Client Authentication Implementation
Added the core authentication infrastructure for the Blazor Web Client, including the \AuthStateProvider\ to manage user login, logout, and state persistence via local storage, and the \AuthenticationService\ to handle login, registration, and logout operations. The implementation includes a \JwtTokenParser\ to extract user claims and roles from JWT tokens, and integrates with a toast notification service to display authentication errors to the user.
BlazorShop.WebClient/Auth · high confidence
Introduce CurrentUserService to expose the authenticated user's identity
A new CurrentUserService implementation is added to the WebApi services layer. It provides a centralized way for API endpoints to retrieve the current user's ID by extracting the NameIdentifier claim from the HTTP context, enabling features that require knowing the active user's identity.
BlazorShop.WebApi/Services · high confidence
Introduce common application models for configuration, authentication, and data handling
Added new shared models to the application layer to support email configuration, JWT token management, and standardized request/response handling. Specifically, the update introduces EmailSettings for email service configuration, JwtTokenConfig and JwtTokenResponse for managing JWT authentication tokens, a generic Result\<T\> and RequestResponse for consistent API response structures, and a PaginatedList\<T\> for handling paginated data sets. These models provide a unified way to handle configuration, security tokens, and common data structures across the application.
BlazorShop.Application/Common/Models · high confidence
Introduce database context and seed data for initial setup
The \ApplicationDbContext\ is introduced to manage the application's data layer, exposing DbSets for entities such as Cart, Clothe, Invoice, Music, Order, Subscriber, Subscription, Receipt, TodoItem, and TodoList, along with their corresponding configuration classes. Additionally, \ApplicationDbContextSeed\ is added to populate the database with initial roles (Admin, Default, User) and an admin user, as well as sample clothing products, ensuring the application starts with necessary baseline data.
BlazorShop.Infrastructure/Persistence · high confidence
Introduce new infrastructure services for account, email, and user management
The BlazorShop application now includes new infrastructure services to handle core identity and communication tasks. The AccountService manages user authentication (login, register, password changes, and token generation), while the EmailService provides SMTP-based email sending capabilities. Additionally, the UserService handles user creation, retrieval, and updates, and the RoleService manages role assignments and queries. These services implement their respective interfaces and integrate with the existing UserManager and RoleManager to support the application's security and user management features.
BlazorShop.Infrastructure/Services · high confidence
Introduce reflection-based mapping infrastructure for automated object mapping
Added new files in the application's common mappings directory to support automated, reflection-based object mapping. This includes an \IMapFrom\<T\>\ interface and a \MappingProfile\ that uses reflection to discover and apply mappings from the assembly, alongside extension methods (\ProjectToListAsync\, \PaginatedListAsync\) to simplify mapping query results to destination types.
BlazorShop.Application/Common/Mappings · high confidence
New API controllers for core domain entities
The Web API now exposes RESTful endpoints for managing accounts, carts, clothes, invoices, music, orders, payments, receipts, roles, subscribers, subscriptions, and todo items. Each controller implements standard CRUD operations (create, read, update, delete) and delegates execution to MediatR commands and queries. Access is controlled via role-based authorization, with specific roles like Admin, User, and Default determining access to endpoints such as creating subscriptions, managing shopping carts, or updating user passwords.
BlazorShop.WebApi/Controllers · high confidence
New admin role management pages added
Added new Blazor components for managing roles in the admin area. The \Roles.razor\ page provides a list view of all roles with support for filtering, editing, and deleting roles. The \AddEditRole.razor\ component enables creating new roles and editing existing ones, utilizing FluentValidation for form validation and MudBlazor UI components for the interface.
BlazorShop.WebClient/Pages/Admin/Roles · high confidence
New application service interfaces for authentication, user management, and data access
The application layer now exposes a set of new interfaces that define the contracts for core services: IAccountService (for password reset, change, login, register, and token generation), IUserService (for user CRUD, role assignment, and authorization), IRoleService (for role management and checks), ICurrentUserService (to identify the active user), IDateTimeService, IEmailService, and ICsvFileBuilder. Additionally, IApplicationDbContext is introduced to abstract the Entity Framework context, exposing sets for entities like Cart, Order, Invoice, and Todo items. These interfaces enable the implementation of account, user, and role management features.
BlazorShop.Application/Common/Interfaces · high confidence
New background worker service for subscription management
A new Blazor Worker Service has been introduced to handle background tasks, specifically targeting the deactivation of expired subscriptions. The service registers an \ApplicationDbContext\ connected to a SQL Server database and a \Worker\ background service that periodically queries active subscriptions. When a subscription's current period ends, the worker calls an external API to cancel the subscription and updates the local database status to 'Inactive'. Configuration for the database connection and logging is provided in \appsettings.json\, and the service is wired up in \Program.cs\.
BlazorShop.WorkerService · high confidence
New response models for domain entities
Added response models for Cart, Clothe, Invoice, Music, Order, Receipt, Role, Subscriber, Subscription, TodoItem, TodoList, and User. Each model maps to its corresponding entity and includes properties for the relevant data, enabling the application to return structured data for these entities.
BlazorShop.Application/Responses · high confidence
New security, infrastructure, and file export capabilities
The application introduces a new \AuthorizeAttribute\ for enforcing role-based and policy-based access control on classes. Infrastructure gains a \MediatorExtensions\ utility to automatically dispatch domain events via MediatR, and a new \CsvFileBuilder\ implementation that exports \TodoItem\ records to CSV files using CsvHelper mappings.
BlazorShop.Application/Common/Security, BlazorShop.Infrastructure/Common, BlazorShop.Infrastructure/Files · medium confidence
New service interfaces for account, cart, and content management
The Blazor web client now exposes a comprehensive set of new service interfaces to define the contract for client-side interactions. These include IAccountService for password management, ICartService for managing shopping carts, and dedicated interfaces for content and commerce entities: IClotheService, IMusicService, IOrderService, IReceiptService, IRoleService, ISubscriberService, ISubscriptionService, ITodoItemService, ITodoListService, and IUserService. Additionally, IStripeService was added to handle subscription cancellations. These interfaces standardize how the web client communicates with backend services for user management, e-commerce operations, and content retrieval.
BlazorShop.WebClient/Interfaces · high confidence
New shared layout and navigation components for the Blazor web client
Added new shared components to the Blazor web client: a global application state manager (AppState) that persists a counter in session storage, a main layout (MainLayout) that integrates the sidebar, top bar with user/cart info, and MudBlazor UI providers, and a responsive navigation menu (NavMenu) with role-based links for customers, admins, and general users. These files establish the core UI structure and state management for the client application.
BlazorShop.WebClient/Shared · medium confidence
Subscription command handlers added with logging and error handling
The application layer now includes new command handlers for creating, updating, and deleting subscriptions. Each handler implements IRequestHandler for its respective command, utilizing dependency injection for the application database context and an ILogger instance. The implementation includes try-catch blocks that log errors via the logger and return a standardized failure response, ensuring that subscription operations are properly tracked and errors are handled gracefully.
BlazorShop.Application/Handlers/Commands/SubscriptionHandler · high confidence
Validation rules added for TodoItem and TodoList commands and queries
New validators have been introduced for TodoItem and TodoList commands and queries, enforcing constraints such as unique titles, non-empty fields, and ID validity. This ensures that user inputs for creating, updating, or deleting items and lists are validated before processing, providing clear error messages for invalid data.
BlazorShop.Application/Validators/TodoItemValidator, BlazorShop.Application/Validators/TodoListValidator · high confidence
Behavioural changes
Account command handlers now include structured error logging
The command handlers for account operations (ChangePassword, Login, Register, and ResetPassword) have been updated to include an ILogger dependency. This change ensures that any exceptions thrown during these operations are caught and logged with the specific error context, providing better visibility into account-related failures for users and administrators.
BlazorShop.Application/Handlers/Commands/AccountHandler · high confidence
Account command models updated with improved property names and documentation
The account command models (ChangePassword, Login, Register, ResetPassword) have been updated to include XML documentation comments for all public properties, improving code readability and IntelliSense support. Additionally, the ChangePasswordCommand model was modified to include a 'ConfirmNewPassword' property and a 'UserId' property, while the ResetPasswordCommand model was updated to include a 'NewConfirmPassword' property. These changes enhance the clarity and completeness of the account-related command structures.
BlazorShop.Application/Commands/AccountCommand · high confidence
Add HTTP response interception for error handling
A new HTTP interceptor service has been introduced to automatically handle server-side HTTP errors. When the client receives a 404, 401, or 403 response, the application now automatically redirects the user to specific error pages (e.g., /not-found, /unauthorized, /server-error) and throws a custom HttpResponseException. This centralizes error handling logic within the Blazor client.
BlazorShop.WebClient/Interceptor · high confidence
Add and edit clothes management interface
The admin interface for managing clothes has been updated with new Razor components for adding and editing items. The list view now displays a table of all clothes with options to edit or delete individual entries, including a confirmation modal for removal. The add/edit form allows administrators to input name, description, price, amount, and image details using MudBlazor components.
BlazorShop.WebClient/Pages/Admin/Clothes · medium confidence
Add validation rules for Clothe commands and queries
New validators have been introduced for the Clothe aggregate, enforcing data integrity on create, update, and delete operations. CreateClotheCommandValidator ensures the name is unique, non-empty, and within length limits, while also validating description, price, amount, and image fields. UpdateClotheCommandValidator applies similar constraints for updates, including a uniqueness check. Delete and query validators (DeleteClotheCommandValidator, GetClotheByIdQueryValidator) enforce that the identifier is greater than zero. These changes mean that attempts to create, update, or query clothes with invalid or missing data will now be rejected with specific error messages.
BlazorShop.Application/Validators/ClotheValidator · high confidence
Add validation rules for music commands and queries
New validators have been introduced for music-related commands and queries, enforcing constraints on fields such as Title, Description, Author, DateRelease, ImageName, and ImagePath. Users will now see specific error messages for invalid inputs, including checks for maximum length, non-empty/non-null requirements, and uniqueness of the music title.
BlazorShop.Application/Validators/MusicValidator · high confidence
Added default error and home view templates
The application now includes default HTML templates for error and home pages. Users will see a basic 'Error page' and 'Index page' when accessing these routes, providing a fallback UI for these endpoints.
BlazorShop.WebApi/Views · high confidence
Added explicit Entity Framework Core configurations for Identity entities
New configuration classes have been added for the Identity domain, including RoleClaim, Role, UserClaim, User, UserLogin, UserRole, and UserToken. These files define the database table names (e.g., AppRoles, AppUserClaims) and column constraints (e.g., max length, required fields) for the underlying database schema, ensuring the application's data access layer explicitly maps these entities to the database.
BlazorShop.Infrastructure/Persistence/Configurations/Identity · high confidence
Added global using directives and code styling configuration
A new \_Imports.cs file was added to the BlazorShop.Domain project, establishing global using directives for domain common, identity entities, enums, and ASP.NET Core Identity. Additionally, a stylecop.json configuration file was introduced to enforce code styling standards, including import ordering and documentation headers.
BlazorShop.Domain · medium confidence
Added query models for retrieving subscription data
New query models, GetSubscriptionByIdQuery and GetSubscriptionsQuery, have been added to the application layer. These classes implement the IRequest interface to facilitate fetching subscription details and lists, enabling the application to retrieve subscription information by ID or as a collection.
BlazorShop.Application/Queries/SubscriptionQuery · high confidence
Added role command handlers with structured error logging
The application now includes dedicated command handlers for creating, updating, and deleting roles. Each handler (Create, Update, Delete) is implemented as a separate class that delegates to the corresponding IRoleService method. A key behavioral change is the addition of structured logging: if a service call fails, the handler catches the exception, logs the error via ILogger, and returns a failure response that includes the error message and inner exception details, rather than letting the exception propagate unhandled.
BlazorShop.Application/Handlers/Commands/RoleHandler · high confidence
Added validation for invoice commands and queries
New validators have been introduced for invoice-related commands and queries, enforcing business rules and data integrity. Specifically, CreateInvoiceCommandValidator and UpdateInvoiceCommandValidator now validate fields such as UserEmail, Name, AmountSubTotal, AmountTotal, and Quantity, including checks for non-empty values, maximum lengths, and uniqueness of the invoice name. DeleteInvoiceCommandValidator and GetInvoiceByIdQueryValidator ensure that the invoice ID is greater than zero. These changes ensure that invalid data is rejected early in the application layer.
BlazorShop.Application/Validators/InvoiceValidator · high confidence
Added validation rules for receipt commands and queries
New validators have been introduced for the receipt-related commands and queries, enforcing constraints on fields such as UserEmail, ReceiptDate, ReceiptName, ReceiptUrl, and Id. These validators ensure that required fields are not empty or null, that string lengths do not exceed specified limits, and that dates are within acceptable ranges, providing users with specific error messages when validation fails.
BlazorShop.Application/Validators/ReceiptValidator · high confidence
Cart query handlers now log errors and use TagWith for SQL tracking
The cart query handlers (GetCartById, GetCarts, and GetCartsCount) have been updated to include structured error logging via ILogger, ensuring that exceptions during cart retrieval are recorded rather than silently failing. Additionally, the database queries now use the TagWith extension, which appends a descriptive tag to the generated SQL, making it easier to identify and trace these specific queries in database logs.
BlazorShop.Application/Handlers/Queries/CartHandler · high confidence
Centralized error messages and role string constants
The application now provides a centralized way to handle and display error messages for various operations, including authentication (login, register, password reset), e-commerce (cart, invoice, order, receipt), content management (clothe, music), and user management (roles, subscribers, subscriptions). Additionally, string constants for identity roles (Admin, User, Default, Customer) and user claims (UserId, Name, Email, Role) are now defined in dedicated utility classes, ensuring consistent messaging and role management across the application.
BlazorShop.Application/Utils · medium confidence
Clothe command handlers now use the IRequestHandler interface and structured logging
The Create, Update, and Delete command handlers for the Clothe entity have been refactored to implement the generic IRequestHandler interface, replacing the previous CommandHandler base class. Each handler now accepts an ILogger for structured error logging and returns a RequestResponse object, providing consistent success/failure handling across the application.
BlazorShop.Application/Handlers/Commands/ClotheHandler · high confidence
Clothe query handlers now log errors and handle exceptions
The GetClotheByIdQueryHandler and GetClothesQueryHandler implementations have been updated to include structured error logging via ILogger. If a query fails, the error is logged and a Result object containing the error message is returned to the caller, rather than allowing the exception to propagate unhandled.
BlazorShop.Application/Handlers/Queries/ClotheHandler · high confidence
Improved error handling and logging for invoice query handlers
The GetInvoiceByIdQueryHandler and GetInvoicesQueryHandler now wrap their database operations in try-catch blocks to log errors via the injected ILogger and return structured error messages to the caller, rather than allowing exceptions to propagate unhandled.
BlazorShop.Application/Handlers/Queries/InvoiceHandler · high confidence
Improved error handling and logging for receipt query handlers
The receipt query handlers (GetReceiptById and GetReceipts) now include structured error logging via ILogger and return detailed error messages in the Result object when exceptions occur, rather than failing silently or with generic errors. This improves debugging and visibility into issues when retrieving receipt data.
BlazorShop.Application/Handlers/Queries/ReceiptHandler · high confidence
Improved error handling and logging in music query handlers
The music query handlers (GetMusicById and GetMusics) now include structured error handling and logging. If a query fails, the application logs the error and returns a failure result with a descriptive message, rather than allowing the exception to propagate unhandled. This improves reliability and observability for music-related operations.
BlazorShop.Application/Handlers/Queries/MusicHandler · high confidence
Initial database schema and subsequent schema evolutions for the BlazorShop application
The application's database schema has been established and evolved through a series of Entity Framework Core migrations. The initial migration (Migration\_1) created the foundational tables for the application's domain, including Carts, Clothes, Musics, Orders, Subscriptions, and Identity entities (Users, Roles, Claims). Subsequent migrations refined this structure: Migration\_2 removed obsolete columns from the Orders table and introduced new tables for Invoices and Receipts; Migration\_3 added an OrderName column to the Orders table; Migration\_4 added a UserEmail column to the Receipts table; and Migration\_5 added a StripeSubscriptionId column to the Subscriptions table. These changes collectively define the data storage structure for the BlazorShop infrastructure.
BlazorShop.Infrastructure/Migrations · high confidence
Order command handlers now include structured logging and consistent error handling
The CreateOrder, DeleteOrder, and UpdateOrder command handlers have been updated to inject and use an ILogger instance for error logging. Each handler now wraps its business logic in a try/catch block that logs the exception via the logger and returns a standardized failure response containing the error message and inner exception details, improving observability and error reporting for order operations.
BlazorShop.Application/Handlers/Commands/OrderHandler · high confidence
Order query handlers now log errors and handle exceptions gracefully
The GetOrderByIdQueryHandler and GetOrdersQueryHandler have been updated to wrap their database operations in try/catch blocks. If an exception occurs while fetching order data, the system logs the error and returns a failure result containing the exception message, rather than crashing or returning an unhandled exception. This improves reliability by ensuring that errors during order retrieval are captured and reported via the standard Result pattern.
BlazorShop.Application/Handlers/Queries/OrderHandler · high confidence
Receipt command handlers now include structured logging and improved error handling
The Create, Update, and Delete receipt command handlers have been updated to inject and use an ILogger for error logging. Each handler now wraps its database operations in a try-catch block that logs the exception via the logger and returns a detailed failure response including the error message and inner exception, rather than failing silently or with a generic error.
BlazorShop.Application/Handlers/Commands/ReceiptHandler · high confidence
Role query handlers now include structured error logging
The role query handlers (GetRoleById, GetRoleByNormalizedName, GetRolesForAdmin, and GetRoles) have been updated to log errors using the injected ILogger. When a query fails, the handler catches the exception, logs it with a specific error message key, and returns a Result object containing the error details, improving observability and debugging for role-related operations.
BlazorShop.Application/Handlers/Queries/RoleHandler · high confidence
Subscription query handlers now log errors and use structured error responses
The GetSubscriptionByIdQueryHandler and GetSubscriptionsQueryHandler have been updated to include ILogger injection and structured error handling. Previously, exceptions in these handlers likely caused unhandled crashes or generic failures; now, any exception during query execution is logged via the logger, and the handler returns a Result object containing the error message. This improves observability and provides a consistent error response format for subscription queries.
BlazorShop.Application/Handlers/Queries/SubscriptionHandler · high confidence
User command handlers now include structured error logging
The user command handlers (Activate, AssignRole, Create, Delete, Update, and UpdateEmail) have been updated to capture and log exceptions via the ILogger interface. This ensures that any failures during user management operations are recorded with detailed error information, improving observability and debugging capabilities for these specific commands.
BlazorShop.Application/Handlers/Commands/UserHandler · high confidence
User query handlers now log errors and provide detailed error messages
The user query handlers (GetUserByEmail, GetUserById, GetUsers, and GetUsersInactive) have been updated to catch exceptions and log errors using the ILogger interface. This ensures that any failures during user data retrieval are properly recorded and that users receive more descriptive error messages in the event of a failure.
BlazorShop.Application/Handlers/Queries/UserHandler · high confidence
Validation rules added for cart commands and queries
Validation logic has been introduced for cart-related commands and queries, including CreateCartCommand, UpdateCartCommand, DeleteCartCommand, DeleteAllCartsCommand, GetCartByIdQuery, GetCartsQuery, and GetCartsCountQuery. Each validator enforces specific constraints, such as ensuring IDs and user IDs are greater than zero, validating name length and uniqueness, and checking that price and amount are positive. This ensures that requests to create, update, delete, or retrieve cart data are properly validated before processing.
BlazorShop.Application/Validators/CartValidator · high confidence
Test coverage
Added unit tests for application command handlers
Added unit tests for the following command handlers: ChangePassword, Login, Register, ResetPassword, CreateCart, DeleteAllCarts, DeleteCart, UpdateCart, CreateClothe, DeleteClothe, UpdateClothe, CreateInvoice, DeleteInvoice, UpdateInvoice, CreateMusic, and DeleteMusic. These tests verify the behavior of the corresponding command handlers, ensuring that the application logic for account management, cart operations, and product/invoice/music commands functions as expected.
BlazorShop.UnitTests, BlazorShop.UnitTests/Application/Handlers/Commands, BlazorShop.UnitTests/Application/Handlers/Queries · high confidence
Dependencies
Upgrade to .NET 7 and add new project layers
The solution has been upgraded to .NET 7, with all project files now targeting \net7.0\. This change introduces several new project layers: \BlazorShop.Application\, \BlazorShop.Domain\, \BlazorShop.Infrastructure\, \BlazorShop.UnitTests\, \BlazorShop.WebApi\, \BlazorShop.WebClient\, and \BlazorShop.WorkerService\. These projects include updated NuGet package references, such as \AutoMapper\, \FluentValidation\, \MediatR\, \Serilog\, \Stripe.net\, \Blazored.Toast\, \MudBlazor\, and \Polly\, establishing a modern, layered architecture for the application.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.
Score
- CAI 47 → 48 (+1.1)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 81 → 78 (-2.9)
- Architecture 92 → 93 (+0.4)
- Maturity 45 → 45 (+0.0)
- Readiness 48 → 44 (-4.5)
- Security 58 → 63 (+4.6)
- Event-Driven 100 → 100 (+0.0)
- Accessibility 40 → 43 (+3.5)
Resolved (32)
- Bounded contexts not declared
- Change coupling: AccountService.cs ↔ CartService.cs (BlazorShop.WebClient/Services/AccountService.cs)
- Change coupling: AccountService.cs ↔ ClotheService.cs (BlazorShop.WebClient/Services/AccountService.cs)
- Change coupling: AccountService.cs ↔ RoleService.cs (BlazorShop.WebClient/Services/AccountService.cs)
- Change coupling: AccountService.cs ↔ UserService.cs (BlazorShop.WebClient/Services/AccountService.cs)
- Change coupling: CartService.cs ↔ ClotheService.cs (BlazorShop.WebClient/Services/CartService.cs)
- Change coupling: CartService.cs ↔ UserService.cs (BlazorShop.WebClient/Services/CartService.cs)
- Change coupling: ClotheService.cs ↔ RoleService.cs (BlazorShop.WebClient/Services/ClotheService.cs)
- Change coupling: ClotheService.cs ↔ UserService.cs (BlazorShop.WebClient/Services/ClotheService.cs)
- Change coupling: OrderService.cs ↔ ReceiptService.cs (BlazorShop.WebClient/Services/OrderService.cs)
- Change coupling: RoleService.cs ↔ UserService.cs (BlazorShop.WebClient/Services/RoleService.cs)
- Duplicated block (13 lines × 2) (BlazorShop.WebClient/Services/RoleService.cs)
- Duplicated block (13 lines × 2) (BlazorShop.WebClient/Services/UserService.cs)
- Duplicated block (16 lines × 2) (BlazorShop.Application/Validators/CartValidator/CreateCartCommandValidator.cs)
- Duplicated block (19 lines × 2) (BlazorShop.WebClient/Pages/Subscriptions/MySubscriptions.razor)
- Duplicated block (21 lines × 2) (BlazorShop.Application/Validators/InvoiceValidator/CreateInvoiceCommandValidator.cs)
- Duplicated block (7 lines × 2) (BlazorShop.WebClient/Pages/Orders/MyOrders.razor)
- Duplicated block (7 lines × 3) (BlazorShop.WebClient/Pages/User/Profile.razor)
- High CVE: System.Linq.Dynamic.Core 1.2.12
- High: security finding (details withheld)
- …and 12 more
New (83)
- AnalyzerSeverityNone (.editorconfig)
- AnalyzerSeverityNone (.editorconfig)
- AnalyzerSeverityNone (.editorconfig)
- AnalyzerSeverityNone (.editorconfig)
- AnalyzerSeverityNone (.editorconfig)
- AnalyzerSeverityNone (.editorconfig)
- AnalyzerSeverityNone (.editorconfig)
- AnalyzerSeverityNone (.editorconfig)
- AnalyzerSeverityNone (.editorconfig)
- AnalyzerSeverityNone (.editorconfig)
- AnalyzerSeverityNone (.editorconfig)
- AnalyzerSeverityNone (.editorconfig)
- AnalyzerSeverityNone (.editorconfig)
- Assertions commented out: ChangePasswordUserAsync_ShouldCallChangePasswordAsync_WhenAllConditionsAreMet (BlazorShop.UnitTests/Infrastructure/AccountServiceTests.cs)
- CommentedOutCode (BlazorShop.WebApi/Controllers/PaymentsController.cs)
- CommentedOutCode (BlazorShop.WebApi/Controllers/PaymentsController.cs)
- Documentation: no architecture or design documentation (README.md)
- Documentation: no installation or build instructions (README.md)
- Duplicated block (10 lines × 4) (BlazorShop.Application/Validators/CartValidator/CreateCartCommandValidator.cs)
- Duplicated block (11 lines × 2) (BlazorShop.Application/Validators/MusicValidator/CreateMusicCommandValidator.cs)
- …and 63 more
API surface
- Unchanged — 79 HTTP endpoints
Architecture
- Unchanged — 3 containers · 1 contexts · 0 edges
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
JBeni/BlazorShop was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 26a1b08da3e57c1b6500c355a0a1fc61e31bfc7b — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-28e75b8e3254.