|  |  | 1 |  | using LGDXRobotCloud.Data.Entities; | 
|  |  | 2 |  | using LGDXRobotCloud.Utilities.Enums; | 
|  |  | 3 |  | using Microsoft.AspNetCore.Identity.EntityFrameworkCore; | 
|  |  | 4 |  | using Microsoft.EntityFrameworkCore; | 
|  |  | 5 |  | using Microsoft.EntityFrameworkCore.Storage.ValueConversion; | 
|  |  | 6 |  |  | 
|  |  | 7 |  | namespace LGDXRobotCloud.Data.DbContexts; | 
|  |  | 8 |  |  | 
|  | 524 | 9 |  | public class LgdxContext(DbContextOptions<LgdxContext> options) : IdentityDbContext<LgdxUser, LgdxRole, string>(options) | 
|  |  | 10 |  | { | 
|  |  | 11 |  |   // Administration | 
|  | 262 | 12 |  |   public virtual DbSet<ApiKey> ApiKeys { get; set; } | 
|  |  | 13 |  |  | 
|  |  | 14 |  |   // Automation | 
|  | 262 | 15 |  |   public virtual DbSet<AutoTask> AutoTasks { get; set; } | 
|  | 262 | 16 |  |   public virtual DbSet<AutoTaskDetail> AutoTasksDetail { get; set; } | 
|  | 262 | 17 |  |   public virtual DbSet<AutoTaskJourney> AutoTasksJourney { get; set; } | 
|  | 262 | 18 |  |   public virtual DbSet<Flow> Flows { get; set; } | 
|  | 262 | 19 |  |   public virtual DbSet<FlowDetail> FlowDetails { get; set; } | 
|  | 262 | 20 |  |   public virtual DbSet<Progress> Progresses { get; set; } | 
|  | 262 | 21 |  |   public virtual DbSet<Trigger> Triggers { get; set; } | 
|  | 262 | 22 |  |   public virtual DbSet<TriggerRetry> TriggerRetries { get; set; } | 
|  |  | 23 |  |  | 
|  |  | 24 |  |   // Navigation | 
|  | 262 | 25 |  |   public virtual DbSet<Realm> Realms { get; set; } | 
|  | 262 | 26 |  |   public virtual DbSet<Robot> Robots { get; set; } | 
|  | 262 | 27 |  |   public virtual DbSet<RobotCertificate> RobotCertificates { get; set; } | 
|  | 262 | 28 |  |   public virtual DbSet<RobotChassisInfo> RobotChassisInfos { get; set; } | 
|  | 262 | 29 |  |   public virtual DbSet<RobotSystemInfo> RobotSystemInfos { get; set; } | 
|  | 262 | 30 |  |   public virtual DbSet<Waypoint> Waypoints { get; set; } | 
|  | 262 | 31 |  |   public virtual DbSet<WaypointTraffic> WaypointTraffics { get; set; } | 
|  |  | 32 |  |  | 
|  |  | 33 |  |   protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) | 
|  | 1 | 34 |  |   { | 
|  | 1 | 35 |  |     configurationBuilder | 
|  | 1 | 36 |  |       .Properties<DateTime>() | 
|  | 1 | 37 |  |       .HaveConversion(typeof(UtcValueConverter)); | 
|  | 1 | 38 |  |   } | 
|  |  | 39 |  |  | 
|  |  | 40 |  |   protected override void OnModelCreating(ModelBuilder modelBuilder) | 
|  | 1 | 41 |  |   { | 
|  | 70 | 42 |  |     foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys())) | 
|  | 22 | 43 |  |     { | 
|  | 22 | 44 |  |       relationship.DeleteBehavior = DeleteBehavior.Restrict; | 
|  | 22 | 45 |  |     } | 
|  |  | 46 |  |  | 
|  |  | 47 |  |     // Automation.AutoTasks | 
|  | 1 | 48 |  |     modelBuilder.Entity<AutoTask>() | 
|  | 1 | 49 |  |       .HasMany(e => e.AutoTaskDetails) | 
|  | 1 | 50 |  |       .WithOne(e => e.AutoTask) | 
|  | 1 | 51 |  |       .HasForeignKey(e => e.AutoTaskId) | 
|  | 1 | 52 |  |       .OnDelete(DeleteBehavior.Cascade) | 
|  | 1 | 53 |  |       .IsRequired(); | 
|  | 1 | 54 |  |     modelBuilder.Entity<AutoTask>() | 
|  | 1 | 55 |  |       .HasOne(e => e.Realm) | 
|  | 1 | 56 |  |       .WithMany() | 
|  | 1 | 57 |  |       .OnDelete(DeleteBehavior.Cascade) | 
|  | 1 | 58 |  |       .IsRequired(); | 
|  | 1 | 59 |  |     modelBuilder.Entity<AutoTask>() | 
|  | 1 | 60 |  |       .HasOne(e => e.AssignedRobot) | 
|  | 1 | 61 |  |       .WithMany(e => e.AssignedTasks) | 
|  | 1 | 62 |  |       .HasForeignKey(e => e.AssignedRobotId) | 
|  | 1 | 63 |  |       .IsRequired(false) | 
|  | 1 | 64 |  |       .OnDelete(DeleteBehavior.SetNull); | 
|  | 1 | 65 |  |     modelBuilder.Entity<AutoTask>() | 
|  | 1 | 66 |  |       .HasOne(e => e.Flow) | 
|  | 1 | 67 |  |       .WithMany() | 
|  | 1 | 68 |  |       .HasForeignKey(e => e.FlowId) | 
|  | 1 | 69 |  |       .IsRequired(false) | 
|  | 1 | 70 |  |       .OnDelete(DeleteBehavior.SetNull); | 
|  | 1 | 71 |  |     modelBuilder.Entity<AutoTaskDetail>() | 
|  | 1 | 72 |  |       .HasOne(e => e.Waypoint) | 
|  | 1 | 73 |  |       .WithMany() | 
|  | 1 | 74 |  |       .HasForeignKey(e => e.WaypointId) | 
|  | 1 | 75 |  |       .OnDelete(DeleteBehavior.SetNull) | 
|  | 1 | 76 |  |       .IsRequired(false); | 
|  | 1 | 77 |  |     modelBuilder.Entity<AutoTaskJourney>() | 
|  | 1 | 78 |  |       .HasOne(e => e.CurrentProgress) | 
|  | 1 | 79 |  |       .WithMany() | 
|  | 1 | 80 |  |       .HasForeignKey(e => e.CurrentProgressId) | 
|  | 1 | 81 |  |       .OnDelete(DeleteBehavior.SetNull) | 
|  | 1 | 82 |  |       .IsRequired(false); | 
|  |  | 83 |  |     // Automation.FlowDetails | 
|  | 1 | 84 |  |     modelBuilder.Entity<Flow>() | 
|  | 1 | 85 |  |       .HasMany(e => e.FlowDetails) | 
|  | 1 | 86 |  |       .WithOne(e => e.Flow) | 
|  | 1 | 87 |  |       .HasForeignKey(e => e.FlowId) | 
|  | 1 | 88 |  |       .OnDelete(DeleteBehavior.Cascade) | 
|  | 1 | 89 |  |       .IsRequired(); | 
|  |  | 90 |  |     // Automation.TriggerRetries | 
|  | 1 | 91 |  |     modelBuilder.Entity<TriggerRetry>() | 
|  | 1 | 92 |  |       .HasOne(e => e.Trigger) | 
|  | 1 | 93 |  |       .WithMany() | 
|  | 1 | 94 |  |       .HasForeignKey(e => e.TriggerId) | 
|  | 1 | 95 |  |       .IsRequired(true) | 
|  | 1 | 96 |  |       .OnDelete(DeleteBehavior.Cascade); | 
|  | 1 | 97 |  |     modelBuilder.Entity<TriggerRetry>() | 
|  | 1 | 98 |  |       .HasOne(e => e.AutoTask) | 
|  | 1 | 99 |  |       .WithMany() | 
|  | 1 | 100 |  |       .HasForeignKey(e => e.AutoTaskId) | 
|  | 1 | 101 |  |       .IsRequired(true) | 
|  | 1 | 102 |  |       .OnDelete(DeleteBehavior.Cascade); | 
|  |  | 103 |  |     // Automation.Triggers | 
|  | 1 | 104 |  |     modelBuilder.Entity<Trigger>() | 
|  | 1 | 105 |  |       .HasOne(e => e.ApiKey) | 
|  | 1 | 106 |  |       .WithMany() | 
|  | 1 | 107 |  |       .HasForeignKey(e => e.ApiKeyId) | 
|  | 1 | 108 |  |       .IsRequired(false) | 
|  | 1 | 109 |  |       .OnDelete(DeleteBehavior.SetNull); | 
|  |  | 110 |  |  | 
|  |  | 111 |  |     // Navigation.Robots | 
|  | 1 | 112 |  |     modelBuilder.Entity<Robot>() | 
|  | 1 | 113 |  |       .HasOne(e => e.RobotSystemInfo) | 
|  | 1 | 114 |  |       .WithOne(e => e.Robot) | 
|  | 1 | 115 |  |       .HasForeignKey<RobotSystemInfo>(e => e.RobotId) | 
|  | 1 | 116 |  |       .IsRequired(false) | 
|  | 1 | 117 |  |       .OnDelete(DeleteBehavior.Cascade); | 
|  | 1 | 118 |  |     modelBuilder.Entity<Robot>() | 
|  | 1 | 119 |  |       .HasOne(e => e.RobotChassisInfo) | 
|  | 1 | 120 |  |       .WithOne(e => e.Robot) | 
|  | 1 | 121 |  |       .HasForeignKey<RobotChassisInfo>(e => e.RobotId) | 
|  | 1 | 122 |  |       .IsRequired(false) | 
|  | 1 | 123 |  |       .OnDelete(DeleteBehavior.Cascade); | 
|  | 1 | 124 |  |     modelBuilder.Entity<Robot>() | 
|  | 1 | 125 |  |       .HasOne(e => e.RobotCertificate) | 
|  | 1 | 126 |  |       .WithOne(e => e.Robot) | 
|  | 1 | 127 |  |       .HasForeignKey<RobotCertificate>(e => e.RobotId) | 
|  | 1 | 128 |  |       .IsRequired() | 
|  | 1 | 129 |  |       .OnDelete(DeleteBehavior.Cascade); | 
|  |  | 130 |  |  | 
|  | 1 | 131 |  |     modelBuilder.Entity<Realm>().HasData( | 
|  | 1 | 132 |  |       new Realm | 
|  | 1 | 133 |  |       { | 
|  | 1 | 134 |  |         Id = 1, | 
|  | 1 | 135 |  |         Name = "First Realm", | 
|  | 1 | 136 |  |         Description = "Please update this realm", | 
|  | 1 | 137 |  |         Image = [], | 
|  | 1 | 138 |  |         Resolution = 0, | 
|  | 1 | 139 |  |         OriginX = 0, | 
|  | 1 | 140 |  |         OriginY = 0, | 
|  | 1 | 141 |  |         OriginRotation = 0, | 
|  | 1 | 142 |  |       } | 
|  | 1 | 143 |  |     ); | 
|  |  | 144 |  |  | 
|  | 1 | 145 |  |     modelBuilder.Entity<Progress>().HasData( | 
|  | 1 | 146 |  |       new Progress | 
|  | 1 | 147 |  |       { | 
|  | 1 | 148 |  |         Id = (int)ProgressState.Template, | 
|  | 1 | 149 |  |         Name = "Template", | 
|  | 1 | 150 |  |         System = true, | 
|  | 1 | 151 |  |         Reserved = true | 
|  | 1 | 152 |  |       }, | 
|  | 1 | 153 |  |       new Progress | 
|  | 1 | 154 |  |       { | 
|  | 1 | 155 |  |         Id = (int)ProgressState.Waiting, | 
|  | 1 | 156 |  |         Name = "Waiting", | 
|  | 1 | 157 |  |         System = true, | 
|  | 1 | 158 |  |         Reserved = true | 
|  | 1 | 159 |  |       }, | 
|  | 1 | 160 |  |       new Progress | 
|  | 1 | 161 |  |       { | 
|  | 1 | 162 |  |         Id = (int)ProgressState.Completed, | 
|  | 1 | 163 |  |         Name = "Completed", | 
|  | 1 | 164 |  |         System = true, | 
|  | 1 | 165 |  |         Reserved = true | 
|  | 1 | 166 |  |       }, | 
|  | 1 | 167 |  |       new Progress | 
|  | 1 | 168 |  |       { | 
|  | 1 | 169 |  |         Id = (int)ProgressState.Aborted, | 
|  | 1 | 170 |  |         Name = "Aborted", | 
|  | 1 | 171 |  |         System = true, | 
|  | 1 | 172 |  |         Reserved = true | 
|  | 1 | 173 |  |       }, | 
|  | 1 | 174 |  |       new Progress | 
|  | 1 | 175 |  |       { | 
|  | 1 | 176 |  |         Id = (int)ProgressState.Starting, | 
|  | 1 | 177 |  |         Name = "Starting", | 
|  | 1 | 178 |  |         System = true | 
|  | 1 | 179 |  |       }, | 
|  | 1 | 180 |  |       new Progress | 
|  | 1 | 181 |  |       { | 
|  | 1 | 182 |  |         Id = (int)ProgressState.Loading, | 
|  | 1 | 183 |  |         Name = "Loading", | 
|  | 1 | 184 |  |         System = true | 
|  | 1 | 185 |  |       }, | 
|  | 1 | 186 |  |       new Progress | 
|  | 1 | 187 |  |       { | 
|  | 1 | 188 |  |         Id = (int)ProgressState.PreMoving, | 
|  | 1 | 189 |  |         Name = "PreMoving", | 
|  | 1 | 190 |  |         System = true | 
|  | 1 | 191 |  |       }, | 
|  | 1 | 192 |  |       new Progress | 
|  | 1 | 193 |  |       { | 
|  | 1 | 194 |  |         Id = (int)ProgressState.Moving, | 
|  | 1 | 195 |  |         Name = "Moving", | 
|  | 1 | 196 |  |         System = true | 
|  | 1 | 197 |  |       }, | 
|  | 1 | 198 |  |       new Progress | 
|  | 1 | 199 |  |       { | 
|  | 1 | 200 |  |         Id = (int)ProgressState.Unloading, | 
|  | 1 | 201 |  |         Name = "Unloading", | 
|  | 1 | 202 |  |         System = true | 
|  | 1 | 203 |  |       }, | 
|  | 1 | 204 |  |       new Progress | 
|  | 1 | 205 |  |       { | 
|  | 1 | 206 |  |         Id = (int)ProgressState.Completing, | 
|  | 1 | 207 |  |         Name = "Completing", | 
|  | 1 | 208 |  |         System = true | 
|  | 1 | 209 |  |       }, | 
|  | 1 | 210 |  |       new Progress | 
|  | 1 | 211 |  |       { | 
|  | 1 | 212 |  |         Id = (int)ProgressState.Reserved, | 
|  | 1 | 213 |  |         Name = "Reserved", | 
|  | 1 | 214 |  |         System = true, | 
|  | 1 | 215 |  |         Reserved = true | 
|  | 1 | 216 |  |       } | 
|  | 1 | 217 |  |     ); | 
|  | 1 | 218 |  |     base.OnModelCreating(modelBuilder); | 
|  | 1 | 219 |  |   } | 
|  |  | 220 |  | } | 
|  |  | 221 |  |  | 
|  |  | 222 |  | class UtcValueConverter : ValueConverter<DateTime, DateTime> | 
|  |  | 223 |  | { | 
|  |  | 224 |  |   public UtcValueConverter() : base(v => v, v => DateTime.SpecifyKind(v, DateTimeKind.Utc)) {} | 
|  |  | 225 |  | } |