Skip to content
CAI
Software that uses CAICheck a score

hamed-shirbandi/TaskoMask

37.0

Weak · 21 September 2026

14.6k

lines of production code

C#

primary language

3

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

TaskoMask is a task management platform built on a microservices architecture, separating concerns into distinct write and read services for owners, boards, and tasks. It employs a CQRS pattern with MongoDB for read-optimized data storage and event-driven synchronization via RabbitMQ to maintain consistency across services. The system provides a Blazor WebAssembly client for user interaction, accessed through an API Gateway that aggregates data from the backend services.

How it got here

2020–2022 — Initial project scaffolding and core domain implementation

71 changes.

The project was initialized with a comprehensive .NET 8 solution structure, establishing building blocks for domain events, contracts, and infrastructure. Core microservices for identity, boards, and tasks were developed alongside a Blazor WebAssembly client and API gateway, implementing full CRUD capabilities for the Kanban-style task management domain.

2023 — Microservices implementation and testing

60 changes.

This period focused on implementing core microservices for Identity, Owners, Boards, and Tasks, establishing their write-side domain models and read-side MongoDB projections. The work included building out CQRS architectures, integrating gRPC communication, and setting up event-driven synchronization between services. Comprehensive test coverage was added across all services, alongside infrastructure improvements like Docker Compose environments and Nuke-based build automation.

2024 — Building blocks infrastructure implementation

6 changes.

This period focused on establishing the core application architecture by introducing essential building blocks, including domain services, caching, validation, and event handling behaviors. It standardized cross-cutting concerns through centralized infrastructure registration and integrated observability tools like OpenTelemetry and Serilog for structured logging and distributed tracing.

Features

API endpoints for creating, updating, and deleting organizations

The Owners Write API now exposes HTTP endpoints to manage organizations. Owners can create a new organization (POST /organizations), update an existing one (PUT /organizations/{id}), or delete it (DELETE /organizations/{id}). Each operation includes input validation, such as enforcing name length limits and ensuring the description does not match the name, and publishes integration events to notify other services of the changes.

src/2-Services/Owners/Api/Owners.Write.Api/UseCases/Organizations · high confidence

Acceptance tests now support API-level execution alongside UI tests

The acceptance test suite has been restructured to allow tests to run against the API gateway directly, rather than only through the browser UI. A new core layer provides a factory that dynamically resolves test tasks and questions to either UI or API implementations based on a configuration tag (API-Level or UI-Level). This enables running the same business scenarios against the backend services for faster feedback, while the existing UI-based Selenium tests remain available for end-to-end verification.

src/5-Tests/Acceptance · high confidence

Add Board and Project detail pages to the User Panel

The User Panel now includes dedicated pages for viewing individual Boards and Projects. The new Board page (at /board/{BoardId}) displays board details, cards, and supports opening task details in a modal, while the Project page (at /project/{ProjectId}) shows project information and lists its associated boards. Both pages fetch data via their respective API services and handle loading states and error notifications.

src/4-Clients/UserPanel/Pages/Boards, src/4-Clients/UserPanel/Pages/Projects · high confidence

Add BoardCardType enum for contract definitions

A new BoardCardType enum has been introduced in the Contracts building blocks to define the lifecycle stages of a board card. This enum includes Backlog, ToDo, Doing, and Done values, each associated with localized display names via the ContractsMetadata resource, enabling consistent representation of card status across the application.

src/1-BuildingBlocks/Contracts/Enums · high confidence

Add Docker Compose development environment configuration

This change introduces the Docker Compose setup for the \src/7-Docker\ location, enabling developers to run the full application stack locally. It includes \Infrastructure.yml\ to spin up dependencies (MongoDB, Redis, SQL Server, RabbitMQ, Seq) and \docker-compose.yml\ to define and build the microservices (Owners, Boards, Tasks APIs, Identity, Aggregator, API Gateway, and clients) with their specific network and port mappings. The \docker-compose.override.yml\ configures development-specific settings like environment variables and volume mounts for secrets/HTTPS, while \docker-compose.dcproj\ and \launchSettings.json\ provide Visual Studio integration for debugging these services.

src/7-Docker · high confidence

Add GetActivityDto for activity retrieval

A new GetActivityDto class has been introduced in the Activities contracts to define the data structure returned when retrieving an activity. This Data Transfer Object includes fields for the activity's unique identifier, associated task ID, description, and creation time details, providing a standardized contract for activity data exposure.

src/1-BuildingBlocks/Contracts/Dtos/Activities · high confidence

Add Identity Server UI and security headers

The Identity service now includes a basic UI for the Identity Server, featuring a welcome page and layout structure. To enhance security, a custom filter is applied to enforce strict HTTP security headers, including Content-Security-Policy, X-Frame-Options, and Referrer-Policy. Additionally, the UI integration includes support for CAPTCHA validation via the DNTCaptcha library.

src/2-Services/Identity/Api/Identity.Api/Pages · high confidence

Add IdentityServer UI layout and validation summary components

The Identity service now includes a dedicated UI for authentication flows. A new shared layout (\_Layout.cshtml) provides the page structure, styling via Bootstrap, and script includes for the login and logout pages. Additionally, a shared validation summary component (\_ValidationSummary.cshtml) has been added to display model state errors to users.

src/2-Services/Identity/Api/Identity.Api/Pages/Shared · high confidence

Add IdentityServer login page with CAPTCHA protection

The login interface now includes a CAPTCHA challenge (sum of two numbers) to prevent automated access, and displays validation errors directly on the page. Users can also register via a link if a client URI is configured.

src/2-Services/Identity/Api/Identity.Api/Pages/Account/Login · high confidence

Add common DTO and model classes to BuildingBlocks

New shared contract types have been introduced in the BuildingBlocks layer to standardize data structures across the application. The \CreationTimeDto\ class provides a standardized way to expose creation and modification timestamps along with their string representations and date components, while the \SelectListItem\ class offers a simple model for dropdown selection options. These additions support consistent data transfer and UI binding patterns.

src/1-BuildingBlocks/Contracts/Dtos/Common, src/1-BuildingBlocks/Contracts/Models · high confidence

Add endpoint to retrieve board details with cards and tasks

Users can now fetch a board's full details, including its cards and associated tasks, via a new GET endpoint at /boards/{id}. This feature aggregates data from multiple gRPC services (board, cards, and tasks) and returns a comprehensive BoardDetailsViewModel, enabling the user panel to display complete board information in a single request.

src/3-ApiGateways/UserPanel/Aggregator/Features/GetBoardById · high confidence

Add endpoint to retrieve detailed task information

Users can now fetch comprehensive task details via a new GET /tasks/{id} endpoint. This feature aggregates data from multiple backend services, combining the core task information, associated comments, and activity history into a single response.

src/3-ApiGateways/UserPanel/Aggregator/Features/GetTaskById · high confidence

Add endpoint to retrieve user's organizations with projects and boards

The User Panel Aggregator now exposes a new GET /organizations endpoint that returns detailed information for all organizations owned by the authenticated user. This feature aggregates data from multiple gRPC services, fetching the organization list, associated projects, and boards, and presents them in a single response. Currently, organization reports are initialized as empty placeholders pending a future implementation.

src/3-ApiGateways/UserPanel/Aggregator/Features/GetOrganizationsByOwnerId · high confidence

Add integration event contracts for board, task, identity, and owner domains

New integration event contracts have been introduced to support cross-service communication for core domain activities. The changes define specific event records for board operations (BoardAdded, BoardDeleted, BoardUpdated, CardAdded, CardDeleted, CardUpdated), task management (TaskAdded, TaskDeleted, TaskUpdated, TaskMovedToAnotherCard, CommentAdded, CommentDeleted, CommentUpdated), user identity (UserRegistered, UserUpdated), and owner/organization/project lifecycle (OwnerRegistered, OwnerRegisterationCompleted, OwnerProfileUpdated, OwnerUpdatingProfileCompleted, OrganizationAdded, OrganizationDeleted, OrganizationUpdated, ProjectAdded, ProjectDeleted, ProjectUpdated). All events implement the new IIntegrationEvent marker interface, establishing a standardized contract for these domain interactions.

src/1-BuildingBlocks/Contracts/Events · high confidence

Add website controllers for home and error pages

The Website client now includes dedicated controllers to handle navigation to the home page and display error states. The HomeController exposes an Index action to render the main landing view, while the ErrorController provides actions to render both known and unknown error views, ensuring users receive appropriate feedback when issues occur.

src/4-Clients/Website/Controllers · high confidence

Added API endpoints to retrieve cards by board ID

The Boards Read API now exposes a new capability to fetch all cards associated with a specific board. This is implemented via a REST endpoint at \boards/{boardId}/cards\ (requiring user-read-access) and a corresponding gRPC service. Both endpoints delegate to a MediatR handler that queries the MongoDB read-model database and returns the results as \GetCardDto\ objects.

src/2-Services/Boards/Api/Boards.Read.Api/Features/Cards/GetCardsByBoardId · high confidence

Added IdentityServer logout UI pages

The Identity API now includes Razor Pages for handling user logout flows via Duende IdentityServer. This adds an Index page that initiates the sign-out process (deleting local cookies and handling federated sign-outs) and a LoggedOut page that redirects users to their post-logout URI or the home page.

src/2-Services/Identity/Api/Identity.Api/Pages/Account/Logout · high confidence

Added MassTransit RabbitMQ transport configuration

The application now supports configuring MassTransit with a RabbitMQ transport via a new extension method. This change introduces a \RabbitMqOptions\ class to map connection settings (host, exchange name, username, password) from configuration and registers the necessary MassTransit services, including consumer discovery and receive endpoint setup, within the infrastructure building block.

src/1-BuildingBlocks/Infrastructure/MassTransit · high confidence

Added OpenTelemetry and Serilog configuration for application observability

The Web.MVC building block now includes built-in support for structured logging and distributed tracing via Serilog and OpenTelemetry. Developers can enable these capabilities by configuring the 'Serilog' and 'OpenTelemetry' sections in their app settings, which allows for automatic collection of logs, metrics, and traces (including ASP.NET Core and HTTP client instrumentation) exported via OTLP endpoints.

src/1-BuildingBlocks/Web.MVC/Configuration/Observation · high confidence

Added common mapping profile and DI extension for AutoMapper

The building blocks infrastructure now includes a default AutoMapper configuration. A new CommonMappingProfile maps the CreationTime value object to its DTO equivalent, formatting date properties as long date strings. Additionally, a MapperExtensions helper was added to simplify dependency injection registration by automatically scanning the specified assembly for mapping profiles and including the common profile.

src/1-BuildingBlocks/Infrastructure/Mapping · high confidence

Added data annotation validation extension

A new static extension method \Validate\ has been added to the \DataAnnotationExtension\ class, allowing objects to be validated against their data annotation attributes and returning a collection of validation results.

src/1-BuildingBlocks/Contracts/Extensions · high confidence

Added gRPC contract definitions for task management entities

New Protocol Buffers definitions have been added to the contracts layer to support gRPC communication for core task management entities. This includes a base schema with common creation time fields and specific service definitions for retrieving Projects, Boards, Cards, Tasks, Organizations, Activities, and Comments by their respective identifiers (e.g., \GetProjectByIdGrpcService\, \GetCardsByBoardIdGrpcService\). These contracts establish the request and response structures for these read operations, enabling clients to fetch hierarchical data such as boards within a project or tasks within a card.

src/1-BuildingBlocks/Contracts/Protos · high confidence

Added global exception handling for HTTP and gRPC services

The Web.MVC building block now includes global exception handlers for both HTTP and gRPC endpoints. The new HttpGlobalExceptionHandler intercepts unhandled exceptions in HTTP requests, logs the error, and returns a standardized JSON failure response with a 500 status code. Similarly, the new GrpcGlobalExceptionHandler catches exceptions in gRPC unary calls, logs the request details, and returns a Cancelled RPC status with the exception message. A new MessageConsumerFaultException class is also provided for specific consumer-related error scenarios.

src/1-BuildingBlocks/Web.MVC/Exceptions · high confidence

Added localized domain error messages and entity metadata resources

The application now includes strongly-typed resource classes for domain-level feedback and metadata. Users will see specific validation error messages for scenarios such as duplicate emails, invalid credentials, and entity count limits (e.g., maximum boards per project). Additionally, standardized display names for core entities like Board, Card, Task, and User are now available for localization.

src/1-BuildingBlocks/Domain/Resources · high confidence

Added message consumers for board and card lifecycle events

The Boards.Read.Api service now includes consumers that keep the read-side MongoDB database synchronized with domain events. BoardAdded, BoardUpdated, and BoardDeleted events trigger insert, update, or delete operations on the Boards collection, with board creation also fetching project details via a gRPC client. Organization and Project update events propagate name changes to all affected boards. Similarly, CardAdded, CardUpdated, and CardDeleted events manage the Cards collection, and board updates also refresh the board name on associated cards.

src/2-Services/Boards/Api/Boards.Read.Api/Consumers · high confidence

Added message consumers for owner registration and profile update events

The Owners Write API now includes consumers to handle identity service events: FaultOwnerRegisteredConsumer deletes an owner record if identity registration fails, while UserRegisteredConsumer and UserUpdatedConsumer publish OwnerRegisterationCompleted and OwnerUpdatingProfileCompleted events respectively to notify the read service of successful registration or profile updates.

src/2-Services/Owners/Api/Owners.Write.Api/Consumers · high confidence

Added owner profile update modal component

A new Blazor component for updating owner profile details (display name and email) has been added to the Owner section of the User Panel. This modal form fetches the current owner data upon initialization and submits changes via the OwnerApiService, providing user feedback through toast notifications and closing the modal upon completion.

src/4-Clients/UserPanel/Pages/Owner/Components · high confidence

Added strongly-typed resource classes for application messages and metadata

The Owners.Write.Api service now includes auto-generated strongly-typed resource classes (ApplicationMessages and ApplicationMetadata) alongside their corresponding .resx files. This enables the API to look up localized strings and metadata in a type-safe manner, supporting internationalization and consistent message handling within the owners service.

src/2-Services/Owners/Api/Owners.Write.Api/Resources · high confidence

Adds centralized HTTP client service with automatic retry logic

The Web building block now includes a reusable HTTP client service (IHttpClientService) that wraps standard HTTP operations (Get, Post, Put, Delete) and integrates an automatic retry mechanism (HttpClientRetryHelper) to handle transient failures. A startup extension method (AddHttpClientService) is provided to register this service in the dependency injection container, allowing applications to consume HTTP endpoints with built-in resilience without implementing retry logic manually.

src/1-BuildingBlocks/Web · high confidence

Adds preconfigured gRPC setup with global exception handling

The Web.MVC building block now includes a new \GrpcConfiguration\ class that provides an \AddGrpcPreConfigured\ extension method. This method registers gRPC services and automatically adds a global exception interceptor (\GrpcGlobalExceptionHandler\), ensuring that gRPC errors are consistently handled across the application without requiring manual configuration in each project.

src/1-BuildingBlocks/Web.MVC/Configuration/Grpc · high confidence

Automatic user account creation and email update for new owners

The Identity service now automatically handles user identity lifecycle events for new owners. When an owner registers, the new OwnerRegisteredConsumer triggers the creation of a corresponding user account (login/logout capability). Similarly, if an owner's profile email is updated, the OwnerProfileUpdatedConsumer ensures the user account's email is synchronized. This removes the need for manual user provisioning steps after owner registration.

src/2-Services/Identity/Api/Identity.Api/Consumers · high confidence

Card management UI components added to User Panel

The User Panel now includes dedicated Razor components for managing cards within a board. The AddCard component allows users to create new cards by specifying a name and type, while the UpdateCard component enables editing existing card details and includes functionality to delete a card after confirmation. Both components integrate with the CardApiService to handle data submission and display appropriate feedback via toast notifications.

src/4-Clients/UserPanel/Pages/Cards · high confidence

Centralized ASP.NET Core application configuration via new extension methods

The Web.MVC building block now provides three new static configuration classes—MvcConfiguration, RazorPagesConfiguration, and WebApiConfiguration—to standardize how ASP.NET Core applications are bootstrapped. MvcConfiguration offers pre-configured pipelines for MVC apps, including Kestrel synchronous I/O settings and a CurrentUserService registration. RazorPagesConfiguration provides a similar streamlined setup for Razor Pages, including authentication and developer exception pages. WebApiConfiguration introduces a dedicated pipeline for API applications that includes JWT authentication, CORS, Swagger integration, and a global HTTP exception handler middleware to manage errors consistently.

src/1-BuildingBlocks/Web.MVC/Configuration/MVC · high confidence

Centralized Swagger configuration with XML comments and security setup

The Web.MVC building block now includes a centralized Swagger configuration that automatically includes XML documentation comments from all XML files in the application's base directory, configures Bearer token (JWT) security schemes, and hides specific API paths (such as DNTCaptchaImage) from the generated documentation. This change simplifies Swagger setup for consuming applications by providing pre-configured middleware extensions.

src/1-BuildingBlocks/Web.MVC/Configuration/Swagger · high confidence

Configured IdentityServer authorization handler for API gateway access

The User Panel now includes an IdentityServerAuthorizationHandler that automatically attaches access tokens to requests sent to the API gateway. This handler is configured to target the URL specified in the 'Url:ApiGateway' setting and requests the scopes defined in the 'oidc:DefaultScopes' configuration section, ensuring authenticated communication with backend services.

src/4-Clients/UserPanel/Configuration · high confidence

Establishes infrastructure for the Boards Read API

The Boards Read API now includes its core infrastructure layer, introducing a MongoDB-based data access strategy. This change adds a dedicated \BoardReadDbContext\ to manage \Board\ and \Card\ collections, along with an initialization routine that creates necessary database indexes for efficient querying. Dependency injection is configured via \ModuleExtensions\ to wire up the MongoDB context, AutoMapper profiles for DTO-to-protobuf mapping, and shared building block services. This provides the foundational persistence and serialization capabilities required for the read-side of the Boards service.

src/2-Services/Boards/Api/Boards.Read.Api/Infrastructure · high confidence

Grpc service registration and client configuration for Boards Read API

The Boards Read API now explicitly registers its internal gRPC endpoints (GetBoardById, GetCardsByBoardId, GetBoardsByProjectId, GetBoardsByOrganizationId, GetCardById) and configures a gRPC client for the Owner Read Service's GetProjectById endpoint. This centralizes the wiring of gRPC communication within the service's configuration layer.

src/2-Services/Boards/Api/Boards.Read.Api/Configuration · high confidence

Identity service infrastructure and database initialization added

The Identity API's infrastructure layer now includes the core setup for ASP.NET Core Identity, including the \IdentityDbContext\ mapped to SQL Server tables (Users, Roles, Claims, etc.), a DI module to register these services, and an EF Core migration for the initial schema. Additionally, a database initialization routine is provided that automatically creates the database and seeds a super-user account based on configuration values.

src/2-Services/Identity/Api/Identity.Api/Infrastructure · high confidence

Implement user login use case with validation and authentication logic

Added the UserLogin use case components (request, handler, and validator) to the Identity API. The login flow now validates required username and password fields, authenticates credentials via ASP.NET Core Identity, checks for active user status, and registers a local login provider association upon success.

src/2-Services/Identity/Api/Identity.Api/UseCases/UserLogin · high confidence

Initial IdentityServer configuration for service authentication

The Identity API now includes explicit configuration for Duende IdentityServer, defining the available identity resources (OpenID, Profile), API scopes (read/write access for Owners, Boards, and Tasks services), and API resources (including a new Aggregator API). A single client, 'UserPanel', is configured to authenticate via the Authorization Code flow with PKCE, allowing it to access the defined scopes. These configurations are registered in the service collection via the new IdentityServerExtensions, enabling the identity service to issue tokens for the specified microservices.

src/2-Services/Identity/Api/Identity.Api/Configuration · high confidence

Initial Website client with Docker support and configuration

The Website client application is introduced, providing the entry point for the web interface. It includes a Dockerfile based on .NET 8 to enable containerized deployment, along with standard ASP.NET Core setup files (Program.cs, Startup.cs) that configure MVC and Serilog request logging. The application is configured via appsettings files for Development, Staging, and Production environments, defining service URLs and OpenTelemetry endpoints for metrics and tracing.

src/4-Clients/Website · high confidence

Initial project scaffolding and build configuration

The repository is initialized with a comprehensive .NET solution structure, including a new \TaskoMask.sln\ that defines the project hierarchy (BuildingBlocks, Services, Clients, Tests). A Nuke-based build system is introduced via \build.ps1\, \build.sh\, and \build.cmd\ scripts to automate compilation. Code quality and formatting are standardized through a new \.editorconfig\ with strict C\# style rules, a \.csharpierrc.yaml\ for CSharpier, and a \Directory.Build.props\ file to enforce code style during builds. Additionally, \.dockerignore\ and an updated \.gitignore\ are added to manage build artifacts and container contexts.

(repo-wide) · high confidence

Initial release of the Boards Write API service

This change introduces the new Boards Write API, a .NET 8 service responsible for managing board and card lifecycle operations. The service implements the core domain model for Boards and Cards, including value objects for names and descriptions, and enforces business rules such as unique board names within a project, unique card names within a board, and maximum card count limits. It uses MongoDB for persistence, with specific indexes created for board IDs and project IDs. The API exposes endpoints for creating, updating, and deleting boards and cards, emitting domain events for these actions. Configuration includes MongoDB connection strings, RabbitMQ settings for messaging, and JWT authentication policies for user read access.

src/2-Services/Boards/Api/Boards.Write.Api, src/2-Services/Identity/Api/Identity.Api, src/2-Services/Tasks/Api/Tasks.Write.Api · high confidence

Initial release of the UserPanel API Gateway

This change introduces the UserPanel API Gateway, a new .NET 8 service that acts as the entry point for the User Panel. It is built on Ocelot for routing and integrates with IdentityServer for JWT-based authentication. The gateway includes configuration for Serilog (logging to console, file, and Seq), OpenTelemetry (metrics and tracing), and Swagger UI for API documentation. It is containerized via a new Dockerfile targeting .NET 8 and includes development and production appsettings.

src/3-ApiGateways/UserPanel/ApiGateway · high confidence

Initial release of the UserPanel Blazor WebAssembly client

This change introduces the new UserPanel client, a Blazor WebAssembly application that provides the user interface for the platform. The client is configured with OIDC authentication via IdentityServer, integrates Blazored Toast and Modal libraries for UI feedback, and registers HTTP clients to communicate with the API Gateway for both protected and public endpoints. It includes a Dockerfile for containerization using .NET 8 and Nginx, along with static asset bundling configuration.

src/4-Clients/UserPanel · high confidence

Initial website view structure and layout

The website's Razor view layer has been established with a new shared layout (\_Layout.cshtml) that includes navigation links to the user panel and a footer with GitHub source attribution. The home page (Index.cshtml) now displays the application's value proposition and a dynamic link to the user panel registration, alongside an image of GitHub contributors. Supporting views include a shared error handling template (Error.cshtml, KnownError.cshtml) and a domain validation summary component, all configured via \_ViewImports and \_ViewStart to use the new layout and necessary tag helpers.

src/4-Clients/Website/Views · high confidence

Initializes MongoDB read-model infrastructure for the Tasks service

The Tasks.Read.Api service now includes its core infrastructure layer, establishing the data access and mapping foundation for read operations. This introduces a dedicated TaskReadDbContext to interact with MongoDB collections for Tasks, Comments, and Activities, along with automatic database initialization logic that creates necessary indexes (including unique constraints on IDs) upon startup. Dependency injection is configured to wire up these components, and AutoMapper profiles are registered to handle translations between domain entities, DTOs, and gRPC responses, enabling the service to query and return task-related data.

src/2-Services/Tasks/Api/Tasks.Read.Api/Infrastructure · high confidence

Introduce BaseConsumer for standardized message consumption

A new abstract BaseConsumer class has been added to the building blocks, providing a standardized base for implementing MassTransit consumers. This class implements the IConsumer interface and injects an IRequestDispatcher, allowing derived consumer classes to focus on specific business logic via the abstract ConsumeMessage method while handling the standard Consume lifecycle.

src/1-BuildingBlocks/Web.MVC/Consumers · high confidence

Introduce BasePageModel with request dispatcher injection

A new BasePageModel class has been added to the Web.MVC building blocks, inheriting from PageModel and injecting an IRequestDispatcher service. This provides a standardized base for Razor Pages to access the in-memory bus for handling requests, reducing boilerplate in individual page models.

src/1-BuildingBlocks/Web.MVC/Pages · high confidence

Introduce UserPanel Aggregator API Gateway

The UserPanel Aggregator service is now available as a .NET 8 Web API, providing a unified entry point for client requests. It aggregates data from the Owner, Board, and Task read services via gRPC clients and enforces JWT authentication against the Identity service. The service includes configuration for RabbitMQ messaging, response caching, OpenTelemetry observability, and Swagger documentation, with support for Development and Staging environments.

src/3-ApiGateways/UserPanel/Aggregator · high confidence

Introduce project-specific data transfer objects

Added a new set of Data Transfer Objects (DTOs) for the Projects module, including AddProjectDto, GetProjectDto, UpdateProjectDto, ProjectReportDto, and the base ProjectBaseDto. These classes define the structure for project creation, retrieval, updates, and reporting, incorporating validation attributes for fields such as name, description, and organization ID.

src/1-BuildingBlocks/Contracts/Dtos/Projects · high confidence

Introduce task-specific Data Transfer Objects for creation, updates, retrieval, and reporting

New DTOs have been added to the contracts layer to support task management operations. AddTaskDto and UpdateTaskDto define the input structures for creating and modifying tasks, including validation rules for title length and required fields. GetTaskDto exposes the full set of fields returned when retrieving a task, such as card name, board, project, and organization identifiers, along with creation time. TaskReportDto provides aggregated counts for tasks in various states (To-Do, Doing, Done, Backlog). These changes establish the data contracts for the task write service and reporting capabilities.

src/1-BuildingBlocks/Contracts/Dtos/Tasks · high confidence

Introduces AutoMapper configuration for gRPC response mapping

The aggregator now includes a new MappingProfile that configures AutoMapper to convert gRPC responses (CreationTimeGrpcResponse, GetOrganizationGrpcResponse, GetProjectGrpcResponse, GetBoardGrpcResponse, GetCardGrpcResponse) into their corresponding DTOs. This ensures consistent data transformation between the gRPC client layer and the internal domain models.

src/3-ApiGateways/UserPanel/Aggregator/Infrastructure/Mapper · high confidence

Introduces application building blocks for command/query dispatch, event publishing, and event storage

This change adds the core abstractions and infrastructure implementations for the application layer's service contracts. It defines interfaces for the current authenticated user, an event publisher (implemented via MassTransit for out-of-process communication), a request dispatcher (implemented via MediatR for in-process commands, queries, and domain events), and a notification service. Additionally, it introduces an event store abstraction with a Redis-based implementation for persisting and retrieving domain events, enabling the application to track entity history and state changes.

src/1-BuildingBlocks/Application/Services, src/1-BuildingBlocks/Infrastructure/Services · high confidence

Introduces domain model for Owners, Organizations, and Projects

This change adds the core domain entities, value objects, and specifications for the Owners service. Users can now register owners, create and manage organizations, and add, update, or delete projects within those organizations. The domain enforces business rules such as unique email addresses for owners, unique organization and project names, maximum limits for organizations and projects, and constraints that names and descriptions cannot be identical. It also defines domain events for owner registration, profile updates, and organization/project lifecycle changes.

src/2-Services/Owners/Api/Owners.Write.Api/Domain · high confidence

Introduces infrastructure behaviors for caching, event storing, validation, and exception handling

The building blocks infrastructure now includes pipeline behaviors and exception handlers to standardize request processing. CachingBehavior automatically caches responses for queries marked with ICacheableQuery, respecting global and per-request configuration. EventStoringBehavior ensures domain events are persisted via the event store. ValidationBehaviour enforces both FluentValidation and data annotations, reporting errors through the notification service. ManagedExceptionHandler and UnmanagedExceptionHandler provide centralized error handling, logging requests and exceptions while populating the notification service for consistent user feedback.

src/1-BuildingBlocks/Infrastructure/Behaviors, src/1-BuildingBlocks/Infrastructure/Exceptions · high confidence

Introduces query caching support via BaseQuery and ICacheableQuery

The application now supports optional caching for queries through the new \BaseQuery\ abstract class and \ICacheableQuery\ interface in the BuildingBlocks layer. Queries inheriting from \BaseQuery\ are marked as cacheable, with caching disabled by default; users can explicitly enable it by calling \EnableCaching()\ on the query instance before sending it. This change encapsulates caching logic at the base query level, allowing the \CachingBehavior\ to detect and handle cached queries automatically.

src/1-BuildingBlocks/Application/Queries · high confidence

Introduction of BaseValueObject and CreationTime value objects

The domain building block now includes a reusable base class for value objects (\BaseValueObject\) that implements standard equality and hashing logic, along with a concrete \CreationTime\ value object. This allows domain entities to track creation and modification timestamps while ensuring value-based equality semantics.

src/1-BuildingBlocks/Domain/ValueObjects · high confidence

Introduction of Board and Card domain entities

The read-side domain model for the Boards service now includes explicit entity classes for Board and Card. These classes inherit from a common base entity, enforce non-null IDs via constructor validation, and expose properties for core attributes such as name, description, and associated organization or project identifiers. This establishes the foundational data structures for reading board and card information within this service.

src/2-Services/Boards/Api/Boards.Read.Api/Domain · high confidence

Introduction of Comment Data Transfer Objects

New Data Transfer Objects (DTOs) have been added to the building blocks contracts to support comment operations. This includes a base DTO (CommentBaseDto) defining common fields like content and task ID with validation rules, along with specific DTOs for adding (AddCommentDto), retrieving (GetCommentDto, which includes creation time), and updating (UpdateCommentDto) comments.

src/1-BuildingBlocks/Contracts/Dtos/Comments · high confidence

Introduction of DomainException class

A new DomainException class has been added to the BuildingBlocks.Domain.Exceptions namespace. This class inherits from ManagedException and provides a simple constructor accepting a message, serving as the base exception type for domain-level errors within the application.

src/1-BuildingBlocks/Domain/Exceptions · high confidence

Introduction of ManagedException class

A new ManagedException class has been added to the Contracts/Exceptions building block. This class inherits from the standard System.Exception and provides a simple constructor that accepts a message string, establishing a specific exception type for managed error handling within the application's contract layer.

src/1-BuildingBlocks/Contracts/Exceptions · high confidence

Introduction of Organization Data Transfer Objects

New Data Transfer Objects (DTOs) have been added to the building blocks contracts to support organization management. This includes base and specific DTOs for adding, updating, and retrieving organizations (AddOrganizationDto, UpdateOrganizationDto, GetOrganizationDto), a base definition (OrganizationBaseDto) with validation attributes for name and description, and a report DTO (OrganizationReportDto) that extends project reporting to include a projects count.

src/1-BuildingBlocks/Contracts/Dtos/Organizations · high confidence

Introduction of core domain service interfaces

New interfaces have been added to the domain services layer to standardize data access and query logic. IBaseRepository defines standard CRUD operations (Add, Update, Delete, GetById, GetList, Count) and disposal for entities, while IBaseAggregateRepository extends this with a ConcurrencySafeUpdate method for aggregate roots. Additionally, ISpecification introduces a pattern for evaluating whether entities satisfy specific criteria via the IsSatisfiedBy method.

src/1-BuildingBlocks/Domain/Services · high confidence

Introduction of domain entities for the Owners Read API

The Owners Read API now includes core domain models for Organization, Owner, and Project. These entities define the structure for reading owner-related data, including properties such as Name, Description, Email, and DisplayName, and enforce validation by throwing domain exceptions for null IDs during instantiation.

src/2-Services/Owners/Api/Owners.Read.Api/Domain · high confidence

Introduction of domain entity base classes

The domain building block now includes a hierarchy of base entity classes: Entity, BaseEntity, and AggregateRoot. Entity provides a basic identifier, BaseEntity adds creation and modification timestamps, and AggregateRoot introduces versioning for concurrency control and a mechanism to track and clear domain events.

src/1-BuildingBlocks/Domain/Entities · high confidence

Introduction of generic DomainEvent base class

A new generic DomainEvent base class has been added to the BuildingBlocks.Domain.Events namespace. This class implements MediatR's INotification interface and provides a standardized structure for domain events, including properties for EntityId, EntityType, EventType, and OccurredOn. This change establishes a common foundation for domain event handling within the application's building blocks.

src/1-BuildingBlocks/Domain/Events · high confidence

Introduction of new Card DTOs for card management operations

The system now exposes a set of Data Transfer Objects (DTOs) in the \TaskoMask.BuildingBlocks.Contracts.Dtos.Cards\ namespace to handle card-related data contracts. This includes \AddCardDto\ and \UpdateCardDto\ for creating and modifying cards, inheriting from a new \CardBaseDto\ that enforces validation rules for card name, board association, and type. \GetCardDto\ extends this base to include read-only details such as board name, project/organization/owner identifiers, and creation time. Additionally, \CardReportDto\ is introduced to expose task count metrics for cards.

src/1-BuildingBlocks/Contracts/Dtos/Cards · high confidence

Introduction of read-model domain entities for tasks

The Tasks.Read.Api service now includes explicit domain models for Task, Comment, and Activity. These entities define the structure of the read-side data, including task details (title, description, board/project context), comment content, and activity logs, establishing the foundation for the read-optimized view of task data.

src/2-Services/Tasks/Api/Tasks.Read.Api/Domain · high confidence

Introduction of shared MVC building blocks for API controllers and user context

The Web.MVC layer now includes a new BaseApiController that provides derived controllers with access to the current user's identity and a request dispatcher, alongside an ErrorViewModel for consistent error handling and an ICurrentUser implementation that extracts user details from the HTTP context. These additions establish a standardized foundation for MVC-based API endpoints within the building blocks.

src/1-BuildingBlocks/Web.MVC/Controllers · high confidence

New GetCardById feature exposes card retrieval via REST and gRPC

The Boards Read API now includes a new feature to retrieve a specific card by its ID. This change adds the necessary request handler, query model, and two endpoint implementations: a REST controller accessible at /cards/{id} with user-read-access authorization, and a gRPC service method. The handler queries the MongoDB read database and maps the result to a DTO, throwing an application exception if the card is not found.

src/2-Services/Boards/Api/Boards.Read.Api/Features/Cards/GetCardById · high confidence

New JWT authentication configuration with per-policy authentication requirements

The application now includes a new JWT configuration module that registers authentication and authorization services. Users can define specific authorization policies in the 'Jwt' configuration section, where each policy can optionally require the user to be authenticated via the new 'RequireAuthenticatedUser' flag, in addition to requiring specific scopes.

src/1-BuildingBlocks/Web.MVC/Configuration/Jwt · high confidence

New UpdateTask use case with validation and concurrency handling

The Tasks Write API now exposes a dedicated endpoint to update existing tasks via an HTTP PUT request at /tasks/{id}. This change introduces a structured use-case implementation that includes request validation (ensuring the description differs from the title), concurrency-safe updates to the task aggregate, and the publishing of domain and integration events upon successful modification.

src/2-Services/Tasks/Api/Tasks.Write.Api/UseCases/Tasks/UpdateTask · high confidence

New base command handler for domain and integration event publishing

The application now provides a new BaseCommandHandler in the BuildingBlocks that centralizes event publishing logic. Command handlers inheriting from this base class can now easily publish domain events (in-process) and integration events (out-process) using the injected IEventPublisher and IRequestDispatcher, simplifying the implementation of command handlers that need to raise events.

src/1-BuildingBlocks/Application/Commands · high confidence

New board management UI components

The User Panel now includes a set of Razor components for managing boards, cards, and tasks. Users can add new boards with organization and project selection, update or delete existing boards, and navigate via a breadcrumb that also allows adding cards. The interface supports drag-and-drop reordering of tasks between cards and provides modals for viewing task details, updating cards, and adding new cards.

src/4-Clients/UserPanel/Pages/Boards/Components · high confidence

New comment management components added to User Panel

The User Panel now includes dedicated Blazor components for managing comments: AddComment.razor allows users to submit new comments for a specific task, while UpdateComment.razor enables editing existing comments and includes functionality to delete them with a confirmation step. These components interact with the CommentApiService to handle data operations and provide user feedback via toast notifications.

src/4-Clients/UserPanel/Pages/Comments · high confidence

New contract helpers and localized resource strings

The BuildingBlocks.Contracts layer now includes helper classes for command results (CommandResult) and generic operation results (Result and Result\<TValue\>), along with an email validation utility and a set of domain constant values for entity length limits. Additionally, strongly-typed resource classes (ContractsMessages and ContractsMetadata) with corresponding .resx files have been added to provide localized strings for operation statuses, validation errors, and UI labels.

src/1-BuildingBlocks/Contracts/Helpers · high confidence

New dashboard components for workspace management and reporting

The User Panel's Dashboard now includes a set of new Razor components (Workspace, TabNav, Projects, Reports, Tips) that provide a tabbed interface for managing organizations. Users can view organization details, switch between Boards, Projects, and Reports tabs, and add or update projects and organizations via modals directly from the dashboard view.

src/4-Clients/UserPanel/Pages/Dashboard/Components · high confidence

New endpoint to move tasks between cards

Users can now move a task to a different card via a new PUT endpoint at /tasks/{taskId}/moveto/{cardId}. This change introduces the MoveTaskToAnotherCard use case, which validates the request, updates the task's card assignment with concurrency control, and publishes the resulting domain and integration events.

src/2-Services/Tasks/Api/Tasks.Write.Api/UseCases/Tasks/MoveTaskToAnotherCard · high confidence

New endpoint to retrieve project details with associated boards

Users can now fetch comprehensive project information via a new GET /projects/{id} endpoint. This feature aggregates data by calling underlying gRPC services to retrieve the core project details and a stream of associated boards, returning a unified ProjectDetailsViewModel that includes both the project entity and its board collection.

src/3-ApiGateways/UserPanel/Aggregator/Features/GetProjectById · high confidence

New helper utilities for the User Panel client

The User Panel client now includes a set of helper classes to streamline UI interactions and data management. CommandResultHandler and QueryResultHandler provide a fluent API to automatically display success or error toasts, publish component messages, and close modals based on operation results. HtmlParser assists in formatting error lists for toast notifications. ReloadDataHelper determines which specific views (such as Dashboard, Project, or Board indexes) need to refresh based on incoming message types, while MagicKey defines constants for API gateway client names.

src/4-Clients/UserPanel/Helpers · high confidence

New project management UI components for the User Panel

The User Panel now includes dedicated Razor components for managing projects within the Projects area. Users can add new projects via the AddProject component, which collects name, description, and organization selection. Existing projects can be updated or deleted using the UpdateProject component, which loads current details and provides a confirmation flow for deletion. Additionally, the Breadcrumb component provides navigation context, displaying the organization and project name to help users orient themselves within the application hierarchy.

src/4-Clients/UserPanel/Pages/Projects/Components · high confidence

New read endpoints for organizations, owners, and projects

The Owners Read API now exposes new query endpoints to retrieve data for organizations, owners, and projects. Users can fetch a single organization by ID, list all organizations for a specific owner, retrieve owner details, get a single project by ID, and list all projects within an organization. These capabilities are available via both REST and gRPC interfaces, utilizing the MediatR pattern for request handling and MongoDB for data retrieval.

src/2-Services/Owners/Api/Owners.Read.Api/Features/Organizations, src/2-Services/Owners/Api/Owners.Read.Api/Features/Owners, src/2-Services/Owners/Api/Owners.Read.Api/Features/Projects, src/2-Services/Tasks/Api/Tasks.Read.Api/Features/Activities, src/2-Services/Tasks/Api/Tasks.Read.Api/Features/Comments, src/2-Services/Tasks/Api/Tasks.Read.Api/Features/Tasks · high confidence

New read-only endpoints for retrieving boards by ID, organization, and project

The Boards Read API now exposes three new query capabilities: fetching a single board by its ID, listing all boards for a specific organization, and listing all boards for a specific project. These features are implemented using a CQRS pattern with MediatR handlers that query the MongoDB read database, and are exposed via both REST endpoints (under the 'Boards' tag) and gRPC services. The organization and project listing endpoints require 'user-read-access' authorization, while the single board lookup is publicly accessible.

src/2-Services/Boards/Api/Boards.Read.Api/Features/Boards · high confidence

New shared UI components for authentication, navigation, and board management

The User Panel now includes a set of shared Razor components that define the core user interface structure. Authentication flows are handled via a new Authentication.razor page and a LoginRedirect.razor component that directs unauthenticated users to the identity provider. The main layout (MainLayout.razor) integrates a Blazored Toast notification system, while the navigation menu (NavMenu.razor) provides role-based access controls, allowing users to add workspaces, projects, and boards, update their profile, or sign out. Additionally, a Boards.razor component displays board cards with links to update or add new boards, and a Confirmation.razor component provides a reusable modal dialog for delete confirmations.

src/4-Clients/UserPanel/Shared · high confidence

New task management interface with full CRUD and activity tracking

The User Panel now includes a comprehensive task management view. Users can create new tasks via the AddTask component, edit or delete existing tasks through the UpdateTask modal, and move tasks between cards using the Move component. The task details page displays basic information, comments, and a chronological list of activities. The dashboard has also been updated to show an organization workspace view.

src/4-Clients/UserPanel/Pages/Tasks · high confidence

New user registration and email update capabilities in Identity service

The Identity API now supports creating new user accounts and updating existing user email addresses. The RegisterUser use case allows users to sign up with an owner ID, email, and password, handling duplicate email checks and publishing domain and integration events upon success. The UpdateUser use case enables changing a user's email address by specifying the old and new email, also triggering relevant events. Both operations include validation logic and error handling via the notification service.

src/2-Services/Identity/Api/Identity.Api/UseCases/RegisterUser, src/2-Services/Identity/Api/Identity.Api/UseCases/UpdateUser · high confidence

Owner registration page added to User Panel

A new registration page is now available at /register, allowing users to create an owner account by submitting their display name, email, and password. The page includes client-side validation, a loading state during submission, and redirects to the home page upon successful registration or displays error messages if the operation fails.

src/4-Clients/UserPanel/Pages/Owner · high confidence

Read-model synchronization for Owners, Organizations, and Projects via event consumers

The Owners.Read.Api service now maintains its MongoDB read-model by consuming domain events for Owners, Organizations, and Projects. New consumers handle creation, updates, and deletions: owner registration and profile updates sync owner data; organization add/update/delete events sync organization records and cascade name updates to associated projects; and project add/update/delete events keep the project collection current. A new gRPC extension registers the corresponding read-endpoints (GetOrganizationsByOwnerId, GetProjectById, GetProjectsByOrganizationId) to expose this synchronized data.

src/2-Services/Owners/Api/Owners.Read.Api/Consumers · high confidence

User Panel adds OIDC authentication and environment-specific URL configurations

The User Panel client now supports OpenID Connect (OIDC) authentication, configured via new appsettings files for Development, Staging, and production environments. These configurations define the OIDC authority, client ID, scopes, and redirect URIs, alongside specific service URLs for the Website, User Panel, and API Gateway. Additionally, static assets including Bootstrap v4.3.1, Blazored Modal, and Blazored Toast CSS have been added to support the UI components.

src/4-Clients/UserPanel/wwwroot · high confidence

Website now includes Bootstrap v4.3.1 CSS

The website's static assets now include the minified CSS for Bootstrap v4.3.1. This adds the standard Bootstrap styling, grid system, and form components to the site, enabling consistent UI rendering across different screen sizes and devices.

src/4-Clients/Website/wwwroot · high confidence

Architecture

Centralized gRPC client registration for User Panel Aggregator

The User Panel Aggregator now registers all its gRPC service clients (including GetBoardById, GetProjectById, GetBoardsByProjectId, and others) through a single \AddGrpcClients\ extension method. This change centralizes the configuration of client addresses based on the underlying read services (Owner-Read-Service, Board-Read-Service, Task-Read-Service), simplifying the dependency injection setup and ensuring consistent client wiring for the aggregator's data retrieval operations.

src/3-ApiGateways/UserPanel/Aggregator/Configuration · high confidence

Behavioural changes

Add and update organization forms now include delete capability

The Organization management interface in the User Panel has been updated to support full CRUD operations. While the Add Organization form allows users to create new organizations, the Update Organization form now includes a Delete button that triggers a confirmation modal before removing an existing organization. Both forms utilize the updated DTOs from the contracts layer for data binding and validation.

src/4-Clients/UserPanel/Pages/Organizations · high confidence

Card management endpoints moved to UseCases

The API endpoints for creating, updating, and deleting cards have been restructured into the UseCases layer. This change introduces dedicated endpoint classes (AddCardEndpoint, UpdateCardEndpoint, DeleteCardEndpoint) that route requests to corresponding command handlers, ensuring that card modifications are processed through the application's command pattern while maintaining existing authorization and validation logic.

src/2-Services/Boards/Api/Boards.Write.Api/UseCases/Cards · high confidence

Centralized CAPTCHA configuration via dedicated service extension

The CAPTCHA setup logic has been consolidated into a new \CaptchaConfiguration\ class, which exposes an \AddCaptcha\ extension method for registering the DNTCaptcha service. This change standardizes the initialization of CAPTCHA settings—including cookie storage, expiration, visual noise, encryption, and input field names—making it easier to manage and reuse across the application.

src/1-BuildingBlocks/Web.MVC/Configuration/Captcha · high confidence

Centralized infrastructure dependency injection configuration

The Owners Write API now consolidates its infrastructure service registrations into a dedicated module. Users benefit from a unified entry point that automatically configures the MongoDB context, registers the owner validator service, and wires up the owner aggregate repository, ensuring consistent setup of backend data access and validation components.

src/2-Services/Owners/Api/Owners.Write.Api/Infrastructure/CrossCutting · high confidence

Centralized infrastructure dependency injection for the Aggregator

A new DI module has been introduced to the Aggregator's infrastructure layer, consolidating the registration of core services. This change configures the application to automatically discover and register building block infrastructure components (consumers, handlers, validators) and establishes the object mapping configuration, ensuring these foundational services are available to the Aggregator without manual wiring in the entry point.

src/3-ApiGateways/UserPanel/Aggregator/Infrastructure/DI · high confidence

Centralized infrastructure service registration for building blocks

The infrastructure layer now provides a unified \AddBuildingBlocksInfrastructure\ extension method to configure core application services. This single registration point sets up the in-memory message bus via MediatR, integrates MassTransit with RabbitMQ for event publishing, and configures validation, caching (EasyCaching), and event-storing behaviors within the request pipeline. It also registers the Redis-based event store service and applies both managed and unmanaged exception handlers, simplifying the startup configuration required to enable these cross-cutting concerns.

src/1-BuildingBlocks/Infrastructure · high confidence

Comment management endpoints moved to UseCases

The API endpoints for adding, updating, and deleting comments have been reorganized into the UseCases layer. This change introduces dedicated endpoint classes (AddCommentEndpoint, UpdateCommentEndpoint, DeleteCommentEndpoint) that route HTTP requests to corresponding command handlers, ensuring that comment modifications are processed through the application's command pattern while maintaining existing authorization and validation logic.

src/2-Services/Tasks/Api/Tasks.Write.Api/UseCases/Comments · high confidence

Establishes read-side infrastructure for Owners, Organizations, and Projects

The Owners Read API now includes the core infrastructure layer required to serve read queries. This introduces a dedicated MongoDB context (OwnerReadDbContext) exposing collections for Owners, Organizations, and Projects, along with automatic database initialization that creates specific indexes (e.g., unique IDs, email, and foreign keys) to support query performance. Dependency injection is centralized in ModuleExtensions to wire up the MongoDB connection, AutoMapper profiles, and shared building-block services. The included mapping profiles define how domain entities are converted into DTOs and gRPC responses, ensuring consistent data shapes for API consumers.

src/2-Services/Owners/Api/Owners.Read.Api/Infrastructure · high confidence

Identity domain model and events restructured

The identity service's domain layer has been refactored to introduce explicit domain entities and events. New entity classes (User, UserLogin, UserToken) now inherit from ASP.NET Core Identity base types with string keys, and the User entity includes an IsActive flag. Additionally, domain events (UserRegisteredEvent, UserUpdatedEvent) have been added to capture user lifecycle changes, integrating with the shared building block event infrastructure.

src/2-Services/Identity/Api/Identity.Api/Domain · high confidence

Introduce Nuke-based build automation with mutation testing and linting

The build system has been replaced with a Nuke script (src/6-Build/Build.cs) that orchestrates the entire build pipeline. This new build process automatically restores .NET tools, compiles the solution, and enforces code quality via CSharpier and dotnet format linting checks before running tests. Unit tests are executed with code coverage collection (OpenCover format), and the default build target now includes Stryker mutation testing, which reports results to a dashboard in CI environments. The build also includes specific configuration files for JetBrains Rider (Build.csproj.DotSettings) and MSBuild props/targets to support this new tooling.

src/6-Build · high confidence

Introduce dedicated detail view models for core entities

New view models have been added to the BuildingBlocks.Contracts layer to structure detailed data for key domain entities. Specifically, BoardDetailsViewModel, CardDetailsViewModel, OrganizationDetailsViewModel, OwnerDetailsViewModel, ProjectDetailsViewModel, TaskDetailsViewModel, and PanelDashboardViewModel now encapsulate specific DTOs (such as GetBoardDto, GetCardDto, GetTaskDto, etc.) and their related collections. This change provides a standardized contract for presenting detailed information about boards, cards, tasks, organizations, owners, and projects, replacing the previous ad-hoc or less structured data transfer patterns.

src/1-BuildingBlocks/Contracts/ViewModels · high confidence

Introduces MongoDB-backed data access and initialization for the Owners service

The Owners Write API now uses MongoDB as its persistence layer, replacing previous storage mechanisms. This change introduces a new \OwnerWriteDbContext\ to manage the connection, an \OwnerAggregateRepository\ to handle data retrieval (including lookups by email, organization, and project), and an \OwnerValidatorService\ to enforce unique email constraints. Additionally, a \DbInitialization\ component ensures the database is properly seeded and indexes (unique on ID and email, non-unique on display name) are created upon startup.

src/2-Services/Owners/Api/Owners.Write.Api/Infrastructure/Data · high confidence

Introduction of structured application exception types

The application now exposes specific exception classes, ApplicationException and ValidationException, which inherit from a common ManagedException base. This change allows the system to distinguish between general application errors and validation failures, enabling more precise error handling and reporting for users encountering issues during request processing.

src/1-BuildingBlocks/Application/Exceptions · high confidence

Owners Read and Write APIs restructured with .NET 8 Dockerfiles and OpenTelemetry support

The Owners Read and Write API services have been re-architected to use .NET 8 base images in their Dockerfiles, replacing previous build configurations. The startup logic has been refactored into explicit \Program.cs\ and \Startup.cs\ files, where the Read API now initializes gRPC services and the Write API handles database seeding. Both APIs now include configuration for OpenTelemetry (metrics, tracing, and logging endpoints) and updated JWT authority settings for staging environments, while the Write API additionally configures Redis for event storage.

src/2-Services/Owners/Api/Owners.Read.Api, src/2-Services/Owners/Api/Owners.Write.Api · high confidence

Owners write API endpoints moved to UseCases folder

The API endpoints for registering and updating owner profiles have been reorganized into the UseCases directory structure. This change refactors the service architecture by moving the endpoint definitions, request models, use case handlers, and validation logic for owner registration and profile updates into dedicated folders under the UseCases namespace, aligning with the application's clean architecture patterns.

src/2-Services/Boards/Api/Boards.Write.Api/UseCases/Boards, src/2-Services/Owners/Api/Owners.Write.Api/UseCases/Owners · high confidence

Project management endpoints moved to UseCases architecture

The API endpoints for creating, updating, and deleting projects have been restructured into the UseCases layer. This change introduces dedicated endpoint controllers, command requests, and validation logic for each operation, ensuring that project modifications are handled through a consistent command-based flow with concurrency-safe updates and integration event publishing.

src/2-Services/Owners/Api/Owners.Write.Api/UseCases/Projects · high confidence

Refactored MongoDB infrastructure to use options pattern and separate aggregate repository

The MongoDB building block has been restructured to improve configuration management and domain modeling. MongoDbContext now uses the IOptions\<MongoDbOptions\> pattern for connection settings, replacing direct configuration access. A new MongoDbBaseAggregateRepository has been introduced to handle concurrency-safe updates for aggregate roots, checking version changes before replacement. The base repository remains for standard entity operations, while unused methods and interfaces like IMongoDbContext have been removed to simplify the API.

src/1-BuildingBlocks/Infrastructure/MongoDB · high confidence

Refactored board data transfer objects to align with ubiquitous language

The board-related Data Transfer Objects (DTOs) in the contracts layer have been reorganized and renamed to better reflect the domain's ubiquitous language. This change introduces a new \BoardBaseDto\ containing shared properties like Name, Description, and ProjectId, which is inherited by \AddBoardDto\ and \GetBoardDto\. \GetBoardDto\ now explicitly includes owner, organization, project name, and creation time details. \UpdateBoardDto\ has been simplified to focus only on mutable fields (Id, Name, Description), and \BoardReportDto\ now inherits from \TaskReportDto\. These structural adjustments ensure consistent validation attributes and clearer separation of concerns for board creation, retrieval, and updates.

src/1-BuildingBlocks/Contracts/Dtos/Boards · high confidence

Refactored owner DTOs to align with ubiquitous language

The owner Data Transfer Objects in the contracts layer have been renamed and reorganized to follow the domain's ubiquitous language. This change introduces \GetOwnerDto\ for retrieving owner details, \RegisterOwnerDto\ for new owner registration (including validation for display name, email, and password), and \UpdateOwnerProfileDto\ for modifying existing owner profiles. These files define the specific contract structures used for owner-related API interactions.

src/1-BuildingBlocks/Contracts/Dtos/Owners · high confidence

Task creation and deletion endpoints moved to UseCases

The API endpoints for adding and deleting tasks have been restructured into the UseCases layer. The AddTask endpoint now accepts a POST request to /tasks with a card ID, board ID, title, and description, enforcing validation that the title and description must not be identical. The DeleteTask endpoint handles HTTP DELETE requests to /tasks/{id}, ensuring the task exists before removal. Both operations now utilize a command-dispatch pattern to handle domain logic and publish integration events.

src/2-Services/Tasks/Api/Tasks.Write.Api/UseCases/Tasks/AddTask · high confidence

Tasks Read API now maintains a local read-model via event consumers

The Tasks Read API now synchronizes its local MongoDB state by consuming domain events (TaskAdded, TaskDeleted, TaskUpdated, TaskMovedToAnotherCard, CardUpdated, CommentAdded, CommentDeleted, CommentUpdated) through new MassTransit consumers. When a task is added or moved, the service calls the Board Read Service's gRPC endpoint to fetch card details (name, type, project/organization/owner IDs) and enriches the stored task record. Task and comment updates/deletions are applied directly to the local database, ensuring the read model stays consistent with the write side.

src/2-Services/Tasks/Api/Tasks.Read.Api/Consumers · high confidence

Updated Identity.Api to use Bootstrap v4.3.1

The Identity.Api service now serves Bootstrap v4.3.1 for its frontend styling. This update to the static CSS assets in the wwwroot directory ensures that the login, registration, and other identity-related pages render with the latest Bootstrap 4.3.1 components and utilities, affecting the visual appearance and layout of these user-facing views.

src/2-Services/Identity/Api/Identity.Api/wwwroot · high confidence

User Panel API clients and inter-component communication services

The User Panel client now uses a standardized \BaseApiService\ to route all external requests through the API gateway, ensuring consistent HTTP client configuration and resolving previous runtime lookup errors. Dedicated API services (Board, Card, Comment, Organization, Owner, Project, Task) have been implemented to handle domain operations, with URLs aligned to the monolith's read/write endpoints (e.g., \/owners-read/\, \/owners-write/\, \/aggregator/\). Additionally, a \ComponentMessageService\ and \DragDropService\ have been added to enable internal state synchronization and drag-and-drop data sharing between UI components.

src/4-Clients/UserPanel/Services · high confidence

Test coverage

Added Stryker mutation testing reports to Identity unit tests; Added integration test fixtures for Board and Card collections; Added integration test infrastructure for the Owners service; Added integration tests for Identity service user registration and login; Added integration tests for Organization and Project CRUD operations; Added integration tests for Owners Read service features; Added integration tests for Tasks.Read service queries; Added integration tests for board and card write operations; Added integration tests for card retrieval features; Added integration tests for owner registration and profile update; Added integration tests for task and comment CRUD operations; Added test data builders for Board entities; Added test helpers and data builders for Identity unit tests; Added test infrastructure base classes and data generation utilities; Added unit test fixture for Boards Write service; Added unit test fixture for Identity service mocks; Added unit tests for Organization and Project use cases; Added unit tests for comment management use cases; Added unit tests for owner registration and profile update use cases; Added unit tests for task write operations; Added unit tests for user registration and login use cases.

Dependencies

Upgrade to .NET 8 and standardize project configurations

All projects in the solution, including the BuildingBlocks, Services, ApiGateways, Clients, and Tests, have been upgraded to target the .NET 8 runtime. This change updates the \TargetFramework\ property across all \.csproj\ files. Additionally, the diff shows the addition of standard project properties such as \AssemblyName\ and \RootNamespace\ to ensure consistent naming conventions, and the adoption of \\<ImplicitUsings\>enable\</ImplicitUsings\>\ in many projects to simplify code imports.

(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

Baseline

  • First survey — no prior run to compare against. CAI 37.

Lenses

  • Code Health 38
  • Architecture 82
  • Maturity 59
  • Readiness 30
  • Security 57
  • Domain Modelling 66
  • Event-Driven 100
  • Accessibility 33

Changes since last survey

  • 300 commits — 251 feature/other, 49 fixes

By area

  • src/2-Services — 170 commits
  • src/1-BuildingBlocks — 29 commits
  • (repo) — 25 commits
  • .github/workflows — 18 commits
  • .github/README.md — 14 commits
  • src/3-ApiGateways — 10 commits
  • (root) — 7 commits
  • .config/dotnet-tools.json — 7 commits
  • src/6-Build — 7 commits
  • src/4-Clients — 5 commits
  • .nuke/build.schema.json — 2 commits
  • docs/images — 2 commits
  • src/7-Docker — 2 commits
  • docs/Branch-Conventions.md — 1 commit
  • src/6-Docker — 1 commit

Notable commits

  • fix: Fix porject name bug in solution
  • fix: Revert "fix: remove map razor page into use end point"
  • fix: chore: fix a naming mistake for card tests namespace
  • fix: chore: fix docker-compose address in comments
  • fix: chore: fix linter
  • fix: fix: Swagger and DNTCaptcha conflict
  • fix: fix: a compile error with docker-compose project
  • fix: fix: add captcha validation into identity
  • fix: fix: add card mapping config
  • fix: fix: add task domain services to DI configs
  • fix: fix: ci workflow
  • fix: fix: contributers image url
  • fix: fix: docker files
  • fix: fix: dotnet-tools config
  • fix: fix: edit message and text captcha
  • fix: fix: fix a compile error
  • fix: fix: fix a parameter naming mistake
  • fix: fix: fix card endpoint route
  • fix: fix: fix some compile errors
  • fix: fix: fix some compile errors
  • …and 280 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

hamed-shirbandi/TaskoMask 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 32c1697f3b3cda889e6d3708018eb97c1bbdf44b — 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.