Implemented comprehensive domain layer for MCP module following DDD principles: Domain Entities & Aggregates: - PendingChange aggregate root with approval workflow (Pending/Approved/Rejected/Expired/Applied) - TaskLock aggregate root for concurrency control with 5-minute expiration - Business rule enforcement at domain level Value Objects: - DiffPreview for CREATE/UPDATE/DELETE operations with validation - DiffField for field-level change tracking - PendingChangeStatus and TaskLockStatus enums Domain Events (8 total): - PendingChange: Created, Approved, Rejected, Expired, Applied - TaskLock: Acquired, Released, Expired Repository Interfaces: - IPendingChangeRepository with query methods for status, entity, and expiration - ITaskLockRepository with concurrency control queries Domain Services: - DiffPreviewService for generating diffs via reflection and JSON comparison - TaskLockService for lock acquisition, release, and expiration management Unit Tests (112 total, all passing): - DiffFieldTests: 13 tests for value object behavior and equality - DiffPreviewTests: 20 tests for operation validation and factory methods - PendingChangeTests: 29 tests for aggregate lifecycle and business rules - TaskLockTests: 26 tests for lock management and expiration - Test coverage > 90% for domain layer Technical Implementation: - Follows DDD aggregate root pattern with encapsulation - Uses factory methods for entity creation with validation - Domain events for audit trail and loose coupling - Immutable value objects with equality comparison - Business rules enforced in domain entities (not services) - 24-hour expiration for PendingChange, 5-minute for TaskLock - Supports diff preview with before/after snapshots (JSON) Story 5.3 completed - provides solid foundation for Phase 3 Diff Preview and approval workflow. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
16 lines
359 B
C#
16 lines
359 B
C#
using ColaFlow.Shared.Kernel.Events;
|
|
|
|
namespace ColaFlow.Modules.Mcp.Domain.Events;
|
|
|
|
/// <summary>
|
|
/// Domain event raised when a task lock is released
|
|
/// </summary>
|
|
public sealed record TaskLockReleasedEvent(
|
|
Guid LockId,
|
|
string ResourceType,
|
|
Guid ResourceId,
|
|
string LockHolderType,
|
|
Guid LockHolderId,
|
|
Guid TenantId
|
|
) : DomainEvent;
|