---
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<string> AcceptanceCriteria { get; private set; } = new();
public List<string> Tags { get; private set; } = new();
```

Add methods:
```csharp
public void UpdateAcceptanceCriteria(List<string> 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<string>();
    UpdatedAt = DateTime.UtcNow;
}

public void UpdateTags(List<string> 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<string>();
    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<List<string>>(v, (JsonSerializerOptions)null) ?? new List<string>())
    .IsRequired(false);

builder.Property(s => s.Tags)
    .HasColumnType("nvarchar(max)")
    .HasConversion(
        v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null),
        v => JsonSerializer.Deserialize<List<string>>(v, (JsonSerializerOptions)null) ?? new List<string>())
    .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
