Files
ClaudeDo/src/ClaudeDo.Data/Configuration/TaskAttachmentEntityConfiguration.cs
Mika Kuns 3f9f047955 feat(attachments): data layer for task file attachments
TaskAttachmentEntity (+config, cascade FK), TaskAttachmentRepository, and an
AttachmentStore that writes files under ~/.todo-app/attachments/<taskId>/ with
a path-traversal guard and a 5 MB cap. TaskPromptComposer gains an optional
read-only 'Reference files' section. Migration AddTaskAttachments.
2026-06-26 16:11:48 +02:00

28 lines
1.0 KiB
C#

using ClaudeDo.Data.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace ClaudeDo.Data.Configuration;
public class TaskAttachmentEntityConfiguration : IEntityTypeConfiguration<TaskAttachmentEntity>
{
public void Configure(EntityTypeBuilder<TaskAttachmentEntity> builder)
{
builder.ToTable("task_attachments");
builder.HasKey(a => a.Id);
builder.Property(a => a.Id).HasColumnName("id");
builder.Property(a => a.TaskId).HasColumnName("task_id").IsRequired();
builder.Property(a => a.FileName).HasColumnName("file_name").IsRequired();
builder.Property(a => a.ByteSize).HasColumnName("byte_size").IsRequired();
builder.Property(a => a.CreatedAt).HasColumnName("created_at").IsRequired();
builder.HasOne(a => a.Task)
.WithMany()
.HasForeignKey(a => a.TaskId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasIndex(a => a.TaskId).HasDatabaseName("idx_task_attachments_task_id");
}
}