Implemented complete Sprint data access layer: - Extended IProjectRepository with Sprint operations - Created SprintConfiguration for EF Core mapping - Added Sprint DbSet and multi-tenant query filter to PMDbContext - Implemented 4 Sprint repository methods (Get, GetByProject, GetActive, GetProjectWithSprint) - Created EF Core migration for Sprints table with JSONB TaskIds column - Multi-tenant isolation enforced via Global Query Filter Database schema: - Sprints table with indexes on (TenantId, ProjectId), (TenantId, Status), StartDate, EndDate - TaskIds stored as JSONB array for performance Story 3 Task 2/6 completed. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
436 lines
16 KiB
C#
436 lines
16 KiB
C#
// <auto-generated />
|
|
using System;
|
|
using ColaFlow.Modules.ProjectManagement.Infrastructure.Persistence;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
using Microsoft.EntityFrameworkCore.Migrations;
|
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|
|
|
#nullable disable
|
|
|
|
namespace ColaFlow.Modules.ProjectManagement.Infrastructure.Migrations
|
|
{
|
|
[DbContext(typeof(PMDbContext))]
|
|
[Migration("20251104231026_AddSprintEntity")]
|
|
partial class AddSprintEntity
|
|
{
|
|
/// <inheritdoc />
|
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
|
{
|
|
#pragma warning disable 612, 618
|
|
modelBuilder
|
|
.HasDefaultSchema("project_management")
|
|
.HasAnnotation("ProductVersion", "9.0.10")
|
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
|
|
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
|
|
|
modelBuilder.Entity("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.Epic", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTime>("CreatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<Guid>("CreatedBy")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("Description")
|
|
.IsRequired()
|
|
.HasMaxLength(2000)
|
|
.HasColumnType("character varying(2000)");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)");
|
|
|
|
b.Property<string>("Priority")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)");
|
|
|
|
b.Property<Guid>("ProjectId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<DateTime?>("UpdatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("CreatedAt");
|
|
|
|
b.HasIndex("ProjectId");
|
|
|
|
b.HasIndex("TenantId")
|
|
.HasDatabaseName("ix_epics_tenant_id");
|
|
|
|
b.ToTable("Epics", "project_management");
|
|
});
|
|
|
|
modelBuilder.Entity("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.Project", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTime>("CreatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<string>("Description")
|
|
.IsRequired()
|
|
.HasMaxLength(2000)
|
|
.HasColumnType("character varying(2000)");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)");
|
|
|
|
b.Property<Guid>("OwnerId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTime?>("UpdatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("CreatedAt");
|
|
|
|
b.HasIndex("OwnerId");
|
|
|
|
b.HasIndex("TenantId");
|
|
|
|
b.ToTable("Projects", "project_management");
|
|
});
|
|
|
|
modelBuilder.Entity("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.Sprint", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTime>("CreatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<Guid>("CreatedBy")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTime>("EndDate")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<string>("Goal")
|
|
.HasMaxLength(1000)
|
|
.HasColumnType("character varying(1000)");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)");
|
|
|
|
b.Property<Guid>("ProjectId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTime>("StartDate")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(20)
|
|
.HasColumnType("character varying(20)");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTime?>("UpdatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<string>("_taskIds")
|
|
.IsRequired()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("TaskIds");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("EndDate")
|
|
.HasDatabaseName("IX_Sprints_EndDate");
|
|
|
|
b.HasIndex("StartDate")
|
|
.HasDatabaseName("IX_Sprints_StartDate");
|
|
|
|
b.HasIndex("TenantId", "ProjectId")
|
|
.HasDatabaseName("IX_Sprints_TenantId_ProjectId");
|
|
|
|
b.HasIndex("TenantId", "Status")
|
|
.HasDatabaseName("IX_Sprints_TenantId_Status");
|
|
|
|
b.ToTable("Sprints", "project_management");
|
|
});
|
|
|
|
modelBuilder.Entity("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.Story", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<decimal?>("ActualHours")
|
|
.HasColumnType("numeric");
|
|
|
|
b.Property<Guid?>("AssigneeId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTime>("CreatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<Guid>("CreatedBy")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("Description")
|
|
.IsRequired()
|
|
.HasMaxLength(4000)
|
|
.HasColumnType("character varying(4000)");
|
|
|
|
b.Property<Guid>("EpicId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<decimal?>("EstimatedHours")
|
|
.HasColumnType("numeric");
|
|
|
|
b.Property<string>("Priority")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("Title")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)");
|
|
|
|
b.Property<DateTime?>("UpdatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("AssigneeId");
|
|
|
|
b.HasIndex("CreatedAt");
|
|
|
|
b.HasIndex("EpicId");
|
|
|
|
b.HasIndex("TenantId")
|
|
.HasDatabaseName("ix_stories_tenant_id");
|
|
|
|
b.ToTable("Stories", "project_management");
|
|
});
|
|
|
|
modelBuilder.Entity("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.WorkTask", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<decimal?>("ActualHours")
|
|
.HasColumnType("numeric");
|
|
|
|
b.Property<Guid?>("AssigneeId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTime>("CreatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<Guid>("CreatedBy")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("Description")
|
|
.IsRequired()
|
|
.HasMaxLength(4000)
|
|
.HasColumnType("character varying(4000)");
|
|
|
|
b.Property<decimal?>("EstimatedHours")
|
|
.HasColumnType("numeric");
|
|
|
|
b.Property<string>("Priority")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)");
|
|
|
|
b.Property<Guid>("StoryId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("Title")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)");
|
|
|
|
b.Property<DateTime?>("UpdatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("AssigneeId");
|
|
|
|
b.HasIndex("CreatedAt");
|
|
|
|
b.HasIndex("StoryId");
|
|
|
|
b.HasIndex("TenantId")
|
|
.HasDatabaseName("ix_tasks_tenant_id");
|
|
|
|
b.ToTable("Tasks", "project_management");
|
|
});
|
|
|
|
modelBuilder.Entity("ColaFlow.Modules.ProjectManagement.Domain.Entities.AuditLog", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("Action")
|
|
.IsRequired()
|
|
.HasMaxLength(20)
|
|
.HasColumnType("character varying(20)");
|
|
|
|
b.Property<Guid>("EntityId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("EntityType")
|
|
.IsRequired()
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)");
|
|
|
|
b.Property<string>("NewValues")
|
|
.HasColumnType("jsonb");
|
|
|
|
b.Property<string>("OldValues")
|
|
.HasColumnType("jsonb");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTime>("Timestamp")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<Guid?>("UserId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("Timestamp")
|
|
.IsDescending()
|
|
.HasDatabaseName("IX_AuditLogs_Timestamp");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("IX_AuditLogs_UserId");
|
|
|
|
b.HasIndex("TenantId", "EntityType", "EntityId")
|
|
.HasDatabaseName("IX_AuditLogs_TenantId_EntityType_EntityId");
|
|
|
|
b.ToTable("AuditLogs", "project_management");
|
|
});
|
|
|
|
modelBuilder.Entity("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.Epic", b =>
|
|
{
|
|
b.HasOne("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.Project", null)
|
|
.WithMany("Epics")
|
|
.HasForeignKey("ProjectId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.Project", b =>
|
|
{
|
|
b.OwnsOne("ColaFlow.Modules.ProjectManagement.Domain.ValueObjects.ProjectKey", "Key", b1 =>
|
|
{
|
|
b1.Property<Guid>("ProjectId")
|
|
.HasColumnType("uuid");
|
|
|
|
b1.Property<string>("Value")
|
|
.IsRequired()
|
|
.HasMaxLength(20)
|
|
.HasColumnType("character varying(20)")
|
|
.HasColumnName("Key");
|
|
|
|
b1.HasKey("ProjectId");
|
|
|
|
b1.HasIndex("Value")
|
|
.IsUnique();
|
|
|
|
b1.ToTable("Projects", "project_management");
|
|
|
|
b1.WithOwner()
|
|
.HasForeignKey("ProjectId");
|
|
});
|
|
|
|
b.Navigation("Key")
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.Story", b =>
|
|
{
|
|
b.HasOne("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.Epic", null)
|
|
.WithMany("Stories")
|
|
.HasForeignKey("EpicId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.WorkTask", b =>
|
|
{
|
|
b.HasOne("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.Story", null)
|
|
.WithMany("Tasks")
|
|
.HasForeignKey("StoryId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.Epic", b =>
|
|
{
|
|
b.Navigation("Stories");
|
|
});
|
|
|
|
modelBuilder.Entity("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.Project", b =>
|
|
{
|
|
b.Navigation("Epics");
|
|
});
|
|
|
|
modelBuilder.Entity("ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate.Story", b =>
|
|
{
|
|
b.Navigation("Tasks");
|
|
});
|
|
#pragma warning restore 612, 618
|
|
}
|
|
}
|
|
}
|