--- task_id: task_1 story_id: story_0 sprint_id: sprint_4 status: not_started type: backend assignee: backend created_date: 2025-11-05 completion_date: null --- # Task 1: Add AcceptanceCriteria and Tags Fields to Story Entity ## What to do Update the Story domain entity to include AcceptanceCriteria and Tags fields. These fields will be stored as JSON arrays in the database and exposed through the API. **AcceptanceCriteria**: A list of testable criteria that define when a Story is complete. **Tags**: A list of labels/categories for organizing and filtering Stories. ## Files to modify - `colaflow-api/src/Modules/ProjectManagement/ColaFlow.Modules.ProjectManagement.Domain/Aggregates/ProjectAggregate/Story.cs` - `colaflow-api/src/Modules/ProjectManagement/ColaFlow.Modules.ProjectManagement.Infrastructure/Persistence/Configurations/StoryConfiguration.cs` ## Implementation ### Story.cs Changes Add properties: ```csharp public List AcceptanceCriteria { get; private set; } = new(); public List Tags { get; private set; } = new(); ``` Add methods: ```csharp public void UpdateAcceptanceCriteria(List criteria) { if (criteria != null && criteria.Count > 20) throw new DomainException("Cannot have more than 20 acceptance criteria"); if (criteria != null && criteria.Any(c => c.Length > 500)) throw new DomainException("Each acceptance criterion cannot exceed 500 characters"); AcceptanceCriteria = criteria ?? new List(); UpdatedAt = DateTime.UtcNow; } public void UpdateTags(List tags) { if (tags != null && tags.Count > 10) throw new DomainException("Cannot have more than 10 tags"); if (tags != null && tags.Any(t => t.Length > 50)) throw new DomainException("Each tag cannot exceed 50 characters"); if (tags != null && tags.Any(t => !Regex.IsMatch(t, @"^[a-zA-Z0-9_-]+$"))) throw new DomainException("Tags can only contain alphanumeric characters, hyphens, and underscores"); Tags = tags ?? new List(); UpdatedAt = DateTime.UtcNow; } ``` ### StoryConfiguration.cs Changes Add JSON column configuration: ```csharp builder.Property(s => s.AcceptanceCriteria) .HasColumnType("nvarchar(max)") .HasConversion( v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null), v => JsonSerializer.Deserialize>(v, (JsonSerializerOptions)null) ?? new List()) .IsRequired(false); builder.Property(s => s.Tags) .HasColumnType("nvarchar(max)") .HasConversion( v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null), v => JsonSerializer.Deserialize>(v, (JsonSerializerOptions)null) ?? new List()) .IsRequired(false); ``` ## Acceptance - [ ] Story entity has AcceptanceCriteria property - [ ] Story entity has Tags property - [ ] UpdateAcceptanceCriteria method validates input - [ ] UpdateTags method validates input - [ ] EF Core configuration serializes to JSON - [ ] Code compiles successfully - [ ] Domain validation tests written - [ ] Tests passing