using Manager.DTOs; using ManagerService.Data.SubSection; using ManagerService.DTOs; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Text.Json; using static ManagerService.Data.SubSection.SectionEvent; namespace ManagerService.Data { public class MyInfoMateDbContext : DbContext { public MyInfoMateDbContext(DbContextOptions options) : base(options) { } public DbSet Instances { get; set; } public DbSet SubscriptionPlans { get; set; } public DbSet Configurations { get; set; } public DbSet
Sections { get; set; } public DbSet Devices { get; set; } public DbSet Resources { get; set; } public DbSet Users { get; set; } public DbSet ApplicationInstances { get; set; } public DbSet AppConfigurationLinks { get; set; } // MAP public DbSet GeoPoints { get; set; } // QUIZ public DbSet QuizQuestions { get; set; } public DbSet GuidedPaths { get; set; } public DbSet GuidedSteps { get; set; } // Events public DbSet ProgrammeBlocks { get; set; } public DbSet MapAnnotations { get; set; } // Agenda public DbSet EventAgendas { get; set; } // Statistics public DbSet VisitEvents { get; set; } // API Keys public DbSet ApiKeys { get; set; } // Push Notifications public DbSet PushNotifications { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; base.OnModelCreating(modelBuilder); modelBuilder.Entity() .Property(s => s.Title) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity
() .Property("Discriminator") .HasMaxLength(50); modelBuilder.Entity
() .HasDiscriminator("Discriminator") .HasValue
("Base") .HasValue("Agenda") .HasValue("Article") .HasValue("Event") .HasValue("Map") .HasValue("Menu") .HasValue("PDF") .HasValue("Game") .HasValue("Quiz") .HasValue("Slider") .HasValue("Video") .HasValue("Weather") .HasValue("Web"); /*modelBuilder.Entity(entity => { entity.Property(e => e.Geometry).HasColumnType("geometry"); }); modelBuilder.Entity(entity => { entity.Property(e => e.Geometry).HasColumnType("geometry"); });*/ modelBuilder.Entity
() .Property(s => s.Title) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity
() .Property(s => s.Description) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity() .Property(s => s.Title) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity() .Property(s => s.Description) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity() .Property(s => s.Contents) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity() .Property(s => s.Schedules) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity() .Property(s => s.Prices) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity() .Property(s => s.Phone) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity() .Property(s => s.Email) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity() .Property(s => s.Site) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); // Configurations JSON pour GuidedPath modelBuilder.Entity() .Property(gp => gp.Title) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity() .Property(gp => gp.Description) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); // Configurations JSON pour GuidedStep modelBuilder.Entity() .Property(gs => gs.Title) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity() .Property(gs => gs.Description) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity() .Property(gp => gp.TimerExpiredMessage) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity() .Property(s => s.Label) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity() .Property(s => s.Description) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize>(v, options)); modelBuilder.Entity() .Property(s => s.Address) .HasColumnType("jsonb") .HasConversion( v => JsonSerializer.Serialize(v, options), v => JsonSerializer.Deserialize(v, options)); // SectionEvent: link to base SectionMap modelBuilder.Entity() .HasOne(se => se.BaseMap) .WithMany() .HasForeignKey(se => se.BaseSectionMapId) .IsRequired(false) .OnDelete(DeleteBehavior.SetNull); // MapAnnotation: global event-level annotations linked directly to SectionEvent modelBuilder.Entity() .HasOne() .WithMany(se => se.GlobalMapAnnotations) .HasForeignKey(ma => ma.SectionEventId) .IsRequired(false) .OnDelete(DeleteBehavior.Cascade); // Seed : plans d'abonnement par défaut modelBuilder.Entity().HasData( new SubscriptionPlan { Id = "plan-starter", Name = "Starter", StorageQuotaBytes = 1L * 1024 * 1024 * 1024, // 1 GB AiRequestsPerMonth = 0, }, new SubscriptionPlan { Id = "plan-standard", Name = "Standard", StorageQuotaBytes = 10L * 1024 * 1024 * 1024, // 10 GB AiRequestsPerMonth = 100, }, new SubscriptionPlan { Id = "plan-premium", Name = "Premium", StorageQuotaBytes = 50L * 1024 * 1024 * 1024, // 50 GB AiRequestsPerMonth = 500, } ); } } }