$mermaidjs
Clean Architecture Demo
Loading...
Searching...
No Matches
TaskItem.cs
Go to the documentation of this file.
3
5
50public class TaskItem
51{
52 public Guid Id {
53 get; private set;
54 }
55
56 public string Title { get; private set; } = string.Empty;
57
58 public string Description { get; private set; } = string.Empty;
59
61 get; private set;
62 }
63
65 get; private set;
66 }
67
68 public DateTime? DueDate {
69 get; private set;
70 }
71
72 public DateTime CreatedAt {
73 get; private set;
74 }
75
76 public DateTime? CompletedAt {
77 get; private set;
78 }
79
80 public Guid CreatedBy {
81 get; private set;
82 }
83
84 public Guid? AssignedTo {
85 get; private set;
86 }
87
88 // Eventos del dominio para desacoplamiento de la infraestructura y facilidad del testing.
89 private readonly List<DomainEvent> _domainEvents = [];
90
91 public IReadOnlyCollection<DomainEvent> DomainEvents => _domainEvents.AsReadOnly();
92
93 // Constructor protegido de EF Core
94 protected TaskItem()
95 {
96 }
97
98 public static Result<TaskItem> Create(
99 string title,
100 string description,
101 TaskPriority priority,
102 DateTime? dueDate,
103 Guid createdBy)
104 {
105 ArgumentNullException.ThrowIfNull(description);
106
107 var validation = Validate(title, description, dueDate);
108 if (validation.IsFailure)
109 return Result.Failure<TaskItem>(validation.Errors);
110 var task = new TaskItem {
111 Id = Guid.NewGuid(),
112 Title = title.Trim(),
113 Description = description.Trim(),
114 Status = TaskStatus.Todo,
115 Priority = priority,
116 DueDate = dueDate,
117 CreatedAt = DateTime.UtcNow,
118 CreatedBy = createdBy
119 };
120 task.AddDomainEvent(new TaskCreatedEvent(task.Id, task.Title, createdBy));
121 return Result.Success(task);
122 }
123 public Result AssignTo(Guid userId)
124 {
125 if (Status == TaskStatus.Completed)
127 var previousAssignee = AssignedTo;
128 AssignedTo = userId;
129 AddDomainEvent(new TaskAssignedEvent(Id, userId, previousAssignee));
130 return Result.Success();
131 }
132
134 {
135 if (Status == TaskStatus.Completed)
137 Status = TaskStatus.Completed;
138 CompletedAt = DateTime.UtcNow;
139 AddDomainEvent(new TaskCompletedEvent(Id, CompletedAt.Value));
140 return Result.Success();
141 }
142
144 {
145 if (Status == TaskStatus.Completed)
147 var oldPriority = Priority;
148 Priority = newPriority;
149 AddDomainEvent(new TaskPriorityChangedEvent(Id, oldPriority, newPriority));
150 return Result.Success();
151 }
152
153 public void ClearDomainEvents() => _domainEvents.Clear();
154
155 private void AddDomainEvent(DomainEvent eventItem) => _domainEvents.Add(eventItem);
156
157 private static Result Validate(string title, string description, DateTime? dueDate)
158 {
159 var errors = new List<string>();
160 if (string.IsNullOrWhiteSpace(title))
161 errors.Add("Title is required.");
162 else if (title.Length > 200)
163 errors.Add("Title cannot exceed 200 characters.");
164 if (description.Length > 2000)
165 errors.Add("Description cannot exceed 2000 characters.");
166 if (dueDate.HasValue && dueDate.Value < DateTime.UtcNow.Date)
167 errors.Add("Due date cannot be in the past.");
168 return errors.Count > 0
169 ? Result.Failure(errors)
170 : Result.Success();
171 }
172}
Result es un tipo de unión discriminada que implementa el patrón Result para manejo de errores.
Definition Result.cs:71
static Result Failure(string error)
TaskErrors es un repositorio central para todos los mensajes de error del dominio de tareas.
Definition TaskErrors.cs:37
TaskItem es una entidad del dominio que representa una tarea en el sistema.
Definition TaskItem.cs:51
IReadOnlyCollection< DomainEvent > DomainEvents
Definition TaskItem.cs:91
static Result< TaskItem > Create(string title, string description, TaskPriority priority, DateTime? dueDate, Guid createdBy)
Definition TaskItem.cs:98
Result UpdatePriority(TaskPriority newPriority)
Definition TaskItem.cs:143
DomainEvent es una clase base abstracta para todos los eventos del dominio en el sistema.
TaskPriority
TaskPriority es un objeto valor del dominio que representa niveles de prioridad de tarea.
TaskStatus
TaskStatus es un objeto valor del dominio que representa posibles estados de una tarea.
Definition TaskStatus.cs:25