feat(backend): Implement complete Issue Management Module
Implemented full-featured Issue Management module following Clean Architecture,
DDD, CQRS and Event Sourcing patterns to support Kanban board functionality.
## Domain Layer
- Issue aggregate root with business logic
- IssueType, IssueStatus, IssuePriority enums
- Domain events: IssueCreated, IssueUpdated, IssueStatusChanged, IssueAssigned, IssueDeleted
- IIssueRepository and IUnitOfWork interfaces
- Domain exceptions (DomainException, NotFoundException)
## Application Layer
- **Commands**: CreateIssue, UpdateIssue, ChangeIssueStatus, AssignIssue, DeleteIssue
- **Queries**: GetIssueById, ListIssues, ListIssuesByStatus
- Command/Query handlers with validation
- FluentValidation validators for all commands
- Event handlers for domain events
- IssueDto for data transfer
- ValidationBehavior pipeline
## Infrastructure Layer
- IssueManagementDbContext with EF Core 9.0
- IssueConfiguration for entity mapping
- IssueRepository implementation
- UnitOfWork implementation
- Multi-tenant support with TenantId filtering
- Optimized indexes for query performance
## API Layer
- IssuesController with full REST API
- GET /api/v1/projects/{projectId}/issues (list with optional status filter)
- GET /api/v1/projects/{projectId}/issues/{id} (get by id)
- POST /api/v1/projects/{projectId}/issues (create)
- PUT /api/v1/projects/{projectId}/issues/{id} (update)
- PUT /api/v1/projects/{projectId}/issues/{id}/status (change status for Kanban)
- PUT /api/v1/projects/{projectId}/issues/{id}/assign (assign to user)
- DELETE /api/v1/projects/{projectId}/issues/{id} (delete)
- Request models: CreateIssueRequest, UpdateIssueRequest, ChangeStatusRequest, AssignIssueRequest
- JWT authentication required
- Real-time SignalR notifications integrated
## Module Registration
- Added AddIssueManagementModule extension method
- Registered in Program.cs
- Added IMDatabase connection string
- Added project references to ColaFlow.API.csproj
## Architecture Patterns
- ✅ Clean Architecture (Domain, Application, Infrastructure, API layers)
- ✅ DDD (Aggregate roots, value objects, domain events)
- ✅ CQRS (Command/Query separation)
- ✅ Event Sourcing (Domain events with MediatR)
- ✅ Repository Pattern (IIssueRepository)
- ✅ Unit of Work (Transactional consistency)
- ✅ Dependency Injection
- ✅ FluentValidation
- ✅ Multi-tenancy support
## Real-time Features
- SignalR integration via IRealtimeNotificationService
- NotifyIssueCreated, NotifyIssueUpdated, NotifyIssueStatusChanged, NotifyIssueAssigned, NotifyIssueDeleted
- Project-level broadcasting for collaborative editing
## Next Steps
1. Stop running API process if exists
2. Run: dotnet ef migrations add InitialIssueModule --context IssueManagementDbContext --startup-project ../../../ColaFlow.API
3. Run: dotnet ef database update --context IssueManagementDbContext --startup-project ../../../ColaFlow.API
4. Create test scripts
5. Verify all CRUD operations and real-time notifications
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,9 @@ using ColaFlow.Modules.ProjectManagement.Application.Commands.CreateProject;
|
||||
using ColaFlow.Modules.ProjectManagement.Domain.Repositories;
|
||||
using ColaFlow.Modules.ProjectManagement.Infrastructure.Persistence;
|
||||
using ColaFlow.Modules.ProjectManagement.Infrastructure.Repositories;
|
||||
using ColaFlow.Modules.IssueManagement.Application.Commands.CreateIssue;
|
||||
using ColaFlow.Modules.IssueManagement.Infrastructure.Persistence;
|
||||
using ColaFlow.Modules.IssueManagement.Infrastructure.Persistence.Repositories;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
|
||||
namespace ColaFlow.API.Extensions;
|
||||
@@ -35,7 +38,7 @@ public static class ModuleExtensions
|
||||
|
||||
// Register repositories
|
||||
services.AddScoped<IProjectRepository, ProjectRepository>();
|
||||
services.AddScoped<IUnitOfWork, UnitOfWork>();
|
||||
services.AddScoped<IUnitOfWork, ColaFlow.Modules.ProjectManagement.Infrastructure.Persistence.UnitOfWork>();
|
||||
|
||||
// Register MediatR handlers from Application assembly (v13.x syntax)
|
||||
services.AddMediatR(cfg =>
|
||||
@@ -54,4 +57,43 @@ public static class ModuleExtensions
|
||||
|
||||
return services;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Register IssueManagement Module
|
||||
/// </summary>
|
||||
public static IServiceCollection AddIssueManagementModule(
|
||||
this IServiceCollection services,
|
||||
IConfiguration configuration,
|
||||
IHostEnvironment? environment = null)
|
||||
{
|
||||
// Only register PostgreSQL DbContext in non-Testing environments
|
||||
if (environment == null || environment.EnvironmentName != "Testing")
|
||||
{
|
||||
// Register DbContext
|
||||
var connectionString = configuration.GetConnectionString("IMDatabase");
|
||||
services.AddDbContext<IssueManagementDbContext>(options =>
|
||||
options.UseNpgsql(connectionString));
|
||||
}
|
||||
|
||||
// Register repositories
|
||||
services.AddScoped<ColaFlow.Modules.IssueManagement.Domain.Repositories.IIssueRepository, IssueRepository>();
|
||||
services.AddScoped<ColaFlow.Modules.IssueManagement.Domain.Repositories.IUnitOfWork, ColaFlow.Modules.IssueManagement.Infrastructure.Persistence.Repositories.UnitOfWork>();
|
||||
|
||||
// Register MediatR handlers from Application assembly
|
||||
services.AddMediatR(cfg =>
|
||||
{
|
||||
cfg.LicenseKey = configuration["MediatR:LicenseKey"];
|
||||
cfg.RegisterServicesFromAssembly(typeof(CreateIssueCommand).Assembly);
|
||||
});
|
||||
|
||||
// Register FluentValidation validators
|
||||
services.AddValidatorsFromAssembly(typeof(CreateIssueCommand).Assembly);
|
||||
|
||||
// Register pipeline behaviors
|
||||
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ColaFlow.Modules.IssueManagement.Application.Behaviors.ValidationBehavior<,>));
|
||||
|
||||
Console.WriteLine("[IssueManagement] Module registered");
|
||||
|
||||
return services;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user