Backend APIs are 100% ready for Sprint 4 frontend implementation. Created comprehensive verification report and optional enhancement story for advanced UX fields. Changes: - Created backend_api_verification.md (detailed API analysis) - Created Story 0: Backend API Enhancements (optional P2) - Created 6 tasks for Story 0 implementation - Updated Sprint 4 to include backend verification status - Verified Story/Task CRUD APIs are complete - Documented missing optional fields (AcceptanceCriteria, Tags, StoryPoints, Order) - Provided workarounds for Sprint 4 MVP Backend Status: - Story API: 100% complete (8 endpoints) - Task API: 100% complete (9 endpoints) - Security: Multi-tenant isolation verified - Missing optional fields: Can be deferred to future sprint Frontend can proceed with P0/P1 Stories without blockers. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
3.0 KiB
3.0 KiB
task_id, story_id, sprint_id, status, type, assignee, created_date, completion_date
| task_id | story_id | sprint_id | status | type | assignee | created_date | completion_date |
|---|---|---|---|---|---|---|---|
| task_1 | story_0 | sprint_4 | not_started | backend | backend | 2025-11-05 | 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.cscolaflow-api/src/Modules/ProjectManagement/ColaFlow.Modules.ProjectManagement.Infrastructure/Persistence/Configurations/StoryConfiguration.cs
Implementation
Story.cs Changes
Add properties:
public List<string> AcceptanceCriteria { get; private set; } = new();
public List<string> Tags { get; private set; } = new();
Add methods:
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:
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