FlowAPI / FlowAPI.Infrastructure /Data /AppDbContext.cs
danylokhodus's picture
Implement custom templates and subscription tiers backend changes
7039b6a
Raw
History Blame Contribute Delete
6.73 kB
using FlowAPI.Domain.Entities;
using FlowAPI.Domain.Enums;
using Microsoft.EntityFrameworkCore;
namespace FlowAPI.Infrastructure.Data
{
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
public DbSet<User> Users => Set<User>();
public DbSet<Graph> Graphs => Set<Graph>();
public DbSet<TaskNode> TaskNodes => Set<TaskNode>();
public DbSet<Edge> Edges => Set<Edge>();
public DbSet<HabitRecord> HabitRecords => Set<HabitRecord>();
public DbSet<Achievement> Achievements => Set<Achievement>();
public DbSet<UserAchievement> UserAchievements => Set<UserAchievement>();
public DbSet<SharedGraph> SharedGraphs => Set<SharedGraph>();
public DbSet<CustomTemplate> CustomTemplates => Set<CustomTemplate>();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// User
modelBuilder.Entity<User>(entity =>
{
entity.HasKey(e => e.Id);
entity.HasIndex(e => e.Email).IsUnique();
entity.Property(e => e.Email).IsRequired().HasMaxLength(256);
entity.Property(e => e.PasswordHash).IsRequired();
entity.Property(e => e.DisplayName).HasMaxLength(100);
entity.Property(e => e.SubscriptionTier).HasDefaultValue("Free").HasMaxLength(50);
});
// Graph
modelBuilder.Entity<Graph>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Title).IsRequired().HasMaxLength(200);
entity.Property(e => e.Description).HasMaxLength(1000);
entity.HasOne(e => e.User)
.WithMany(u => u.Graphs)
.HasForeignKey(e => e.UserId)
.OnDelete(DeleteBehavior.Cascade);
});
// TaskNode
modelBuilder.Entity<TaskNode>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Label).IsRequired().HasMaxLength(1000);
entity.Property(e => e.State)
.HasConversion<string>()
.HasDefaultValue(NodeState.Pending);
entity.Property(e => e.Type).HasMaxLength(100).HasDefaultValue("sketch");
entity.Property(e => e.Decision).HasMaxLength(1000000);
entity.Property(e => e.Data).HasMaxLength(10000000); // Support up to ~10MB images
entity.Property(e => e.Description).HasMaxLength(10000);
entity.Property(e => e.Color).HasMaxLength(100);
entity.HasOne(e => e.Graph)
.WithMany(g => g.Nodes)
.HasForeignKey(e => e.GraphId)
.OnDelete(DeleteBehavior.Cascade);
});
// Edge
modelBuilder.Entity<Edge>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Condition).HasMaxLength(500);
entity.HasOne(e => e.Graph)
.WithMany(g => g.Edges)
.HasForeignKey(e => e.GraphId)
.OnDelete(DeleteBehavior.Cascade);
entity.HasOne(e => e.FromNode)
.WithMany(n => n.OutgoingEdges)
.HasForeignKey(e => e.FromNodeId)
.OnDelete(DeleteBehavior.Cascade);
entity.HasOne(e => e.ToNode)
.WithMany(n => n.IncomingEdges)
.HasForeignKey(e => e.ToNodeId)
.OnDelete(DeleteBehavior.Cascade);
});
// HabitRecord
modelBuilder.Entity<HabitRecord>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.HabitName).IsRequired().HasMaxLength(100);
entity.HasOne(e => e.User)
.WithMany(u => u.HabitRecords)
.HasForeignKey(e => e.UserId)
.OnDelete(DeleteBehavior.Cascade);
});
// Achievement
modelBuilder.Entity<Achievement>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Title).IsRequired().HasMaxLength(200);
entity.Property(e => e.Category).HasMaxLength(100);
entity.Property(e => e.TriggerEventName).HasMaxLength(100);
});
// UserAchievement
modelBuilder.Entity<UserAchievement>(entity =>
{
entity.HasKey(e => e.Id);
entity.HasOne(e => e.User)
.WithMany(u => u.UserAchievements)
.HasForeignKey(e => e.UserId)
.OnDelete(DeleteBehavior.Cascade);
entity.HasOne(e => e.Achievement)
.WithMany()
.HasForeignKey(e => e.AchievementId)
.OnDelete(DeleteBehavior.Cascade);
});
// SharedGraph
modelBuilder.Entity<SharedGraph>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Permission).IsRequired().HasMaxLength(50).HasDefaultValue("Read");
entity.HasOne(e => e.Graph)
.WithMany(g => g.SharedGraphs)
.HasForeignKey(e => e.GraphId)
.OnDelete(DeleteBehavior.Cascade);
entity.HasOne(e => e.SharedWithUser)
.WithMany(u => u.SharedGraphs)
.HasForeignKey(e => e.SharedWithUserId)
.OnDelete(DeleteBehavior.Cascade);
entity.HasIndex(e => new { e.GraphId, e.SharedWithUserId }).IsUnique();
});
// CustomTemplate
modelBuilder.Entity<CustomTemplate>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Title).IsRequired().HasMaxLength(200);
entity.Property(e => e.Description).HasMaxLength(1000);
entity.Property(e => e.Category).HasMaxLength(100);
entity.Property(e => e.Icon).HasMaxLength(100);
entity.Property(e => e.ContentJson).IsRequired().HasMaxLength(10000000);
entity.HasOne(e => e.User)
.WithMany()
.HasForeignKey(e => e.UserId)
.OnDelete(DeleteBehavior.Cascade);
});
}
}
}