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.
28 lines
1.0 KiB
C#
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");
|
|
}
|
|
}
|