From c235500c02901749081dc3081101252d25a24fac Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 18 Sep 2018 12:26:46 -0400 Subject: [PATCH 01/13] Remove unecessary specificity --- src/Tgstation.Server.Host/Controllers/DreamMakerController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs b/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs index cb147a5e79..48843b419d 100644 --- a/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs +++ b/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs @@ -51,7 +51,7 @@ namespace Tgstation.Server.Host.Controllers { var instance = instanceManager.GetInstance(Instance); var dreamMakerSettings = await DatabaseContext.DreamMakerSettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false); - return Json(new Api.Models.DreamMaker + return Json(new DreamMaker { ProjectName = dreamMakerSettings.ProjectName, ApiValidationPort = dreamMakerSettings.ApiValidationPort From 1745d2c5cb1c36617584fd377e5d3da6287b6e6f Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 18 Sep 2018 12:27:22 -0400 Subject: [PATCH 02/13] Include MinimumSecurityLevel in CompileJob.ToApi() --- src/Tgstation.Server.Host/Models/CompileJob.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Tgstation.Server.Host/Models/CompileJob.cs b/src/Tgstation.Server.Host/Models/CompileJob.cs index 22e97759dd..e372065af0 100644 --- a/src/Tgstation.Server.Host/Models/CompileJob.cs +++ b/src/Tgstation.Server.Host/Models/CompileJob.cs @@ -35,7 +35,8 @@ namespace Tgstation.Server.Host.Models Job = Job.ToApi(), Output = Output, RevisionInformation = RevisionInformation.ToApi(), - ByondVersion = Version.Parse(ByondVersion) + ByondVersion = Version.Parse(ByondVersion), + MinimumSecurityLevel = MinimumSecurityLevel }; } } From 75ea9cda6ca5a441e328e6654be39a37f7875eef Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 18 Sep 2018 12:28:38 -0400 Subject: [PATCH 03/13] Marks required CompileJob fields as required --- src/Tgstation.Server.Api/Models/Internal/CompileJob.cs | 3 +++ src/Tgstation.Server.Host/Models/CompileJob.cs | 1 + 2 files changed, 4 insertions(+) diff --git a/src/Tgstation.Server.Api/Models/Internal/CompileJob.cs b/src/Tgstation.Server.Api/Models/Internal/CompileJob.cs index e101ff7f23..c659c49737 100644 --- a/src/Tgstation.Server.Api/Models/Internal/CompileJob.cs +++ b/src/Tgstation.Server.Api/Models/Internal/CompileJob.cs @@ -16,16 +16,19 @@ namespace Tgstation.Server.Api.Models.Internal /// /// The .dme file used for compilation /// + [Required] public string DmeName { get; set; } /// /// Textual output of DM /// + [Required] public string Output { get; set; } /// /// The Game folder the results were compiled into /// + [Required] public Guid? DirectoryName { get; set; } /// diff --git a/src/Tgstation.Server.Host/Models/CompileJob.cs b/src/Tgstation.Server.Host/Models/CompileJob.cs index e372065af0..ffcdd186a4 100644 --- a/src/Tgstation.Server.Host/Models/CompileJob.cs +++ b/src/Tgstation.Server.Host/Models/CompileJob.cs @@ -9,6 +9,7 @@ namespace Tgstation.Server.Host.Models /// /// See /// + [Required] public Job Job { get; set; } /// From 0a792c3873d640de82c92c41dfa0c0de2caa9019 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 18 Sep 2018 12:31:06 -0400 Subject: [PATCH 04/13] Adds a note about sharing databases to the README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a03c2d0a2d..10e2440f64 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,8 @@ If using MySQL, our provider library [recommends you set 'utf8mb4' as your defau The user created for the application will need the privilege to create databases on the first run. Once the initial set of migrations is run, the create right may be revoked. The user should maintain DDL rights though for applying future migrations +Note that the ratio of application installations to databases is 1:1. Do not attempt to share a database amongst multiple TGS installations. + ### Starting For the Windows service version start the `tgstation-server-4` service From 2c462c3b2173e484ec3f97273dc74ac9ef45e856 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 18 Sep 2018 12:50:36 -0400 Subject: [PATCH 05/13] Tabify existing migrations --- ...918020726_MYAddMinimumSecurity.Designer.cs | 900 ++++++++--------- .../20180918020726_MYAddMinimumSecurity.cs | 42 +- ...918021228_MSAddMinimumSecurity.Designer.cs | 952 +++++++++--------- .../20180918021228_MSAddMinimumSecurity.cs | 42 +- 4 files changed, 968 insertions(+), 968 deletions(-) diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.Designer.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.Designer.cs index bf112bf7b2..3387ebe8bd 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.Designer.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.Designer.cs @@ -7,642 +7,642 @@ using Tgstation.Server.Host.Models; namespace Tgstation.Server.Host.Migrations { - [DbContext(typeof(MySqlDatabaseContext))] - [Migration("20180918020726_MYAddMinimumSecurity")] - partial class MYAddMinimumSecurity + [DbContext(typeof(MySqlDatabaseContext))] + [Migration("20180918020726_MYAddMinimumSecurity")] + partial class MYAddMinimumSecurity { /// /// Builds the target model /// /// The to use protected override void BuildTargetModel(ModelBuilder modelBuilder) - { + { #pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "2.1.3-rtm-32065") - .HasAnnotation("Relational:MaxIdentifierLength", 64); + modelBuilder + .HasAnnotation("ProductVersion", "2.1.3-rtm-32065") + .HasAnnotation("Relational:MaxIdentifierLength", 64); - modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("ConnectionString") - .IsRequired(); + b.Property("ConnectionString") + .IsRequired(); - b.Property("Enabled"); + b.Property("Enabled"); - b.Property("InstanceId"); + b.Property("InstanceId"); - b.Property("Name") - .IsRequired(); + b.Property("Name") + .IsRequired(); - b.Property("Provider"); + b.Property("Provider"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("InstanceId"); + b.HasIndex("InstanceId"); - b.HasIndex("Name") - .IsUnique(); + b.HasIndex("Name") + .IsUnique(); - b.ToTable("ChatBots"); - }); + b.ToTable("ChatBots"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("ChatSettingsId"); + b.Property("ChatSettingsId"); - b.Property("DiscordChannelId"); + b.Property("DiscordChannelId"); - b.Property("IrcChannel"); + b.Property("IrcChannel"); - b.Property("IsAdminChannel") - .IsRequired(); + b.Property("IsAdminChannel") + .IsRequired(); - b.Property("IsUpdatesChannel") - .IsRequired(); + b.Property("IsUpdatesChannel") + .IsRequired(); - b.Property("IsWatchdogChannel") - .IsRequired(); + b.Property("IsWatchdogChannel") + .IsRequired(); - b.Property("Tag"); + b.Property("Tag"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("ChatSettingsId", "DiscordChannelId") - .IsUnique(); + b.HasIndex("ChatSettingsId", "DiscordChannelId") + .IsUnique(); - b.HasIndex("ChatSettingsId", "IrcChannel") - .IsUnique(); + b.HasIndex("ChatSettingsId", "IrcChannel") + .IsUnique(); - b.ToTable("ChatChannels"); - }); + b.ToTable("ChatChannels"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("ByondVersion") - .IsRequired(); + b.Property("ByondVersion") + .IsRequired(); - b.Property("DirectoryName"); + b.Property("DirectoryName"); - b.Property("DmeName"); + b.Property("DmeName"); - b.Property("JobId"); + b.Property("JobId"); - b.Property("MinimumSecurityLevel"); + b.Property("MinimumSecurityLevel"); - b.Property("Output"); + b.Property("Output"); - b.Property("RevisionInformationId"); + b.Property("RevisionInformationId"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("DirectoryName"); + b.HasIndex("DirectoryName"); - b.HasIndex("JobId"); + b.HasIndex("JobId"); - b.HasIndex("RevisionInformationId"); + b.HasIndex("RevisionInformationId"); - b.ToTable("CompileJobs"); - }); + b.ToTable("CompileJobs"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("AccessToken"); + b.Property("AccessToken"); - b.Property("AllowWebClient") - .IsRequired(); + b.Property("AllowWebClient") + .IsRequired(); - b.Property("AutoStart") - .IsRequired(); + b.Property("AutoStart") + .IsRequired(); - b.Property("InstanceId"); + b.Property("InstanceId"); - b.Property("PrimaryPort") - .IsRequired(); + b.Property("PrimaryPort") + .IsRequired(); - b.Property("ProcessId"); + b.Property("ProcessId"); - b.Property("SecondaryPort") - .IsRequired(); + b.Property("SecondaryPort") + .IsRequired(); - b.Property("SecurityLevel"); + b.Property("SecurityLevel"); - b.Property("SoftRestart") - .IsRequired(); + b.Property("SoftRestart") + .IsRequired(); - b.Property("SoftShutdown") - .IsRequired(); + b.Property("SoftShutdown") + .IsRequired(); - b.Property("StartupTimeout") - .IsRequired(); + b.Property("StartupTimeout") + .IsRequired(); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("InstanceId") - .IsUnique(); + b.HasIndex("InstanceId") + .IsUnique(); - b.ToTable("DreamDaemonSettings"); - }); + b.ToTable("DreamDaemonSettings"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("ApiValidationPort") - .IsRequired(); + b.Property("ApiValidationPort") + .IsRequired(); - b.Property("ApiValidationSecurityLevel"); + b.Property("ApiValidationSecurityLevel"); - b.Property("InstanceId"); + b.Property("InstanceId"); - b.Property("ProjectName"); + b.Property("ProjectName"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("InstanceId") - .IsUnique(); + b.HasIndex("InstanceId") + .IsUnique(); - b.ToTable("DreamMakerSettings"); - }); + b.ToTable("DreamMakerSettings"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("AutoUpdateInterval") - .IsRequired(); + b.Property("AutoUpdateInterval") + .IsRequired(); - b.Property("ConfigurationType"); + b.Property("ConfigurationType"); - b.Property("Name") - .IsRequired(); + b.Property("Name") + .IsRequired(); - b.Property("Online") - .IsRequired(); + b.Property("Online") + .IsRequired(); - b.Property("Path") - .IsRequired(); + b.Property("Path") + .IsRequired(); - b.Property("WatchdogReattachInformationId"); + b.Property("WatchdogReattachInformationId"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("Path") - .IsUnique(); + b.HasIndex("Path") + .IsUnique(); - b.HasIndex("WatchdogReattachInformationId"); + b.HasIndex("WatchdogReattachInformationId"); - b.ToTable("Instances"); - }); + b.ToTable("Instances"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("ByondRights"); + b.Property("ByondRights"); - b.Property("ChatBotRights"); + b.Property("ChatBotRights"); - b.Property("ConfigurationRights"); + b.Property("ConfigurationRights"); - b.Property("DreamDaemonRights"); + b.Property("DreamDaemonRights"); - b.Property("DreamMakerRights"); + b.Property("DreamMakerRights"); - b.Property("InstanceId"); + b.Property("InstanceId"); - b.Property("InstanceUserRights"); + b.Property("InstanceUserRights"); - b.Property("RepositoryRights"); + b.Property("RepositoryRights"); - b.Property("UserId") - .IsRequired(); + b.Property("UserId") + .IsRequired(); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("InstanceId"); + b.HasIndex("InstanceId"); - b.HasIndex("UserId", "InstanceId") - .IsUnique(); + b.HasIndex("UserId", "InstanceId") + .IsUnique(); - b.ToTable("InstanceUsers"); - }); + b.ToTable("InstanceUsers"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("CancelRight"); + b.Property("CancelRight"); - b.Property("CancelRightsType"); + b.Property("CancelRightsType"); - b.Property("Cancelled") - .IsRequired(); + b.Property("Cancelled") + .IsRequired(); - b.Property("CancelledById"); + b.Property("CancelledById"); - b.Property("Description") - .IsRequired(); + b.Property("Description") + .IsRequired(); - b.Property("ExceptionDetails"); + b.Property("ExceptionDetails"); - b.Property("InstanceId"); + b.Property("InstanceId"); - b.Property("StartedAt") - .IsRequired(); + b.Property("StartedAt") + .IsRequired(); - b.Property("StartedById"); + b.Property("StartedById"); - b.Property("StoppedAt"); + b.Property("StoppedAt"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("CancelledById"); + b.HasIndex("CancelledById"); - b.HasIndex("InstanceId"); + b.HasIndex("InstanceId"); - b.HasIndex("StartedById"); + b.HasIndex("StartedById"); - b.ToTable("Jobs"); - }); + b.ToTable("Jobs"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("AccessIdentifier") - .IsRequired(); + b.Property("AccessIdentifier") + .IsRequired(); - b.Property("ChatChannelsJson") - .IsRequired(); + b.Property("ChatChannelsJson") + .IsRequired(); - b.Property("ChatCommandsJson") - .IsRequired(); + b.Property("ChatCommandsJson") + .IsRequired(); - b.Property("CompileJobId"); + b.Property("CompileJobId"); - b.Property("IsPrimary"); + b.Property("IsPrimary"); - b.Property("Port"); + b.Property("Port"); - b.Property("ProcessId"); + b.Property("ProcessId"); - b.Property("RebootState"); + b.Property("RebootState"); - b.Property("ServerCommandsJson") - .IsRequired(); + b.Property("ServerCommandsJson") + .IsRequired(); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("CompileJobId"); + b.HasIndex("CompileJobId"); - b.ToTable("ReattachInformations"); - }); + b.ToTable("ReattachInformations"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("AccessToken"); + b.Property("AccessToken"); - b.Property("AccessUser"); + b.Property("AccessUser"); - b.Property("AutoUpdatesKeepTestMerges") - .IsRequired(); + b.Property("AutoUpdatesKeepTestMerges") + .IsRequired(); - b.Property("AutoUpdatesSynchronize") - .IsRequired(); + b.Property("AutoUpdatesSynchronize") + .IsRequired(); - b.Property("CommitterEmail") - .IsRequired(); + b.Property("CommitterEmail") + .IsRequired(); - b.Property("CommitterName") - .IsRequired(); + b.Property("CommitterName") + .IsRequired(); - b.Property("InstanceId"); + b.Property("InstanceId"); - b.Property("PushTestMergeCommits") - .IsRequired(); + b.Property("PushTestMergeCommits") + .IsRequired(); - b.Property("ShowTestMergeCommitters") - .IsRequired(); + b.Property("ShowTestMergeCommitters") + .IsRequired(); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("InstanceId") - .IsUnique(); + b.HasIndex("InstanceId") + .IsUnique(); - b.ToTable("RepositorySettings"); - }); + b.ToTable("RepositorySettings"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("RevisionInformationId"); + b.Property("RevisionInformationId"); - b.Property("TestMergeId"); + b.Property("TestMergeId"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("RevisionInformationId"); + b.HasIndex("RevisionInformationId"); - b.HasIndex("TestMergeId"); + b.HasIndex("TestMergeId"); - b.ToTable("RevInfoTestMerges"); - }); + b.ToTable("RevInfoTestMerges"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("CommitSha") - .IsRequired() - .HasMaxLength(40); + b.Property("CommitSha") + .IsRequired() + .HasMaxLength(40); - b.Property("InstanceId"); + b.Property("InstanceId"); - b.Property("OriginCommitSha") - .IsRequired() - .HasMaxLength(40); + b.Property("OriginCommitSha") + .IsRequired() + .HasMaxLength(40); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("CommitSha") - .IsUnique(); + b.HasIndex("CommitSha") + .IsUnique(); - b.HasIndex("InstanceId"); + b.HasIndex("InstanceId"); - b.ToTable("RevisionInformations"); - }); + b.ToTable("RevisionInformations"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("Author") - .IsRequired(); + b.Property("Author") + .IsRequired(); - b.Property("BodyAtMerge") - .IsRequired(); + b.Property("BodyAtMerge") + .IsRequired(); - b.Property("Comment"); + b.Property("Comment"); - b.Property("MergedAt"); + b.Property("MergedAt"); - b.Property("MergedById"); + b.Property("MergedById"); - b.Property("Number") - .IsRequired(); + b.Property("Number") + .IsRequired(); - b.Property("PrimaryRevisionInformationId"); + b.Property("PrimaryRevisionInformationId"); - b.Property("PullRequestRevision") - .IsRequired(); + b.Property("PullRequestRevision") + .IsRequired(); - b.Property("TitleAtMerge") - .IsRequired(); + b.Property("TitleAtMerge") + .IsRequired(); - b.Property("Url") - .IsRequired(); + b.Property("Url") + .IsRequired(); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("MergedById"); + b.HasIndex("MergedById"); - b.HasIndex("PrimaryRevisionInformationId") - .IsUnique(); + b.HasIndex("PrimaryRevisionInformationId") + .IsUnique(); - b.ToTable("TestMerges"); - }); + b.ToTable("TestMerges"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("AdministrationRights"); + b.Property("AdministrationRights"); - b.Property("CanonicalName") - .IsRequired(); + b.Property("CanonicalName") + .IsRequired(); - b.Property("CreatedAt") - .IsRequired(); + b.Property("CreatedAt") + .IsRequired(); - b.Property("CreatedById"); + b.Property("CreatedById"); - b.Property("Enabled") - .IsRequired(); + b.Property("Enabled") + .IsRequired(); - b.Property("InstanceManagerRights"); + b.Property("InstanceManagerRights"); - b.Property("LastPasswordUpdate"); + b.Property("LastPasswordUpdate"); - b.Property("Name") - .IsRequired(); + b.Property("Name") + .IsRequired(); - b.Property("PasswordHash"); + b.Property("PasswordHash"); - b.Property("SystemIdentifier"); + b.Property("SystemIdentifier"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("CanonicalName") - .IsUnique(); + b.HasIndex("CanonicalName") + .IsUnique(); - b.HasIndex("CreatedById"); + b.HasIndex("CreatedById"); - b.ToTable("Users"); - }); + b.ToTable("Users"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); + modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); - b.Property("AlphaId"); + b.Property("AlphaId"); - b.Property("AlphaIsActive"); + b.Property("AlphaIsActive"); - b.Property("BravoId"); + b.Property("BravoId"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("AlphaId"); + b.HasIndex("AlphaId"); - b.HasIndex("BravoId"); + b.HasIndex("BravoId"); - b.ToTable("WatchdogReattachInformations"); - }); + b.ToTable("WatchdogReattachInformations"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b => - { - b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") - .WithMany("ChatSettings") - .HasForeignKey("InstanceId") - .OnDelete(DeleteBehavior.Cascade); - }); + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("ChatSettings") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b => - { - b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings") - .WithMany("Channels") - .HasForeignKey("ChatSettingsId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b => - { - b.HasOne("Tgstation.Server.Host.Models.Job", "Job") - .WithMany() - .HasForeignKey("JobId"); - - b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation") - .WithMany("CompileJobs") - .HasForeignKey("RevisionInformationId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b => - { - b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") - .WithOne("DreamDaemonSettings") - .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b => - { - b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") - .WithOne("DreamMakerSettings") - .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b => - { - b.HasOne("Tgstation.Server.Host.Models.WatchdogReattachInformation", "WatchdogReattachInformation") - .WithMany() - .HasForeignKey("WatchdogReattachInformationId"); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b => - { - b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") - .WithMany("InstanceUsers") - .HasForeignKey("InstanceId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("Tgstation.Server.Host.Models.User") - .WithMany("InstanceUsers") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b => - { - b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy") - .WithMany() - .HasForeignKey("CancelledById"); - - b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") - .WithMany("Jobs") - .HasForeignKey("InstanceId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy") - .WithMany() - .HasForeignKey("StartedById") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b => - { - b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob") - .WithMany() - .HasForeignKey("CompileJobId"); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b => - { - b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") - .WithOne("RepositorySettings") - .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b => - { - b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation") - .WithMany("ActiveTestMerges") - .HasForeignKey("RevisionInformationId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge") - .WithMany("RevisonInformations") - .HasForeignKey("TestMergeId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b => - { - b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") - .WithMany("RevisionInformations") - .HasForeignKey("InstanceId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b => - { - b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy") - .WithMany("TestMerges") - .HasForeignKey("MergedById") - .OnDelete(DeleteBehavior.Restrict); - - b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation") - .WithOne("PrimaryTestMerge") - .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId") - .OnDelete(DeleteBehavior.SetNull); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.User", b => - { - b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy") - .WithMany("CreatedUsers") - .HasForeignKey("CreatedById"); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b => - { - b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha") - .WithMany() - .HasForeignKey("AlphaId"); - - b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo") - .WithMany() - .HasForeignKey("BravoId"); - }); + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b => + { + b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings") + .WithMany("Channels") + .HasForeignKey("ChatSettingsId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b => + { + b.HasOne("Tgstation.Server.Host.Models.Job", "Job") + .WithMany() + .HasForeignKey("JobId"); + + b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation") + .WithMany("CompileJobs") + .HasForeignKey("RevisionInformationId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithOne("DreamDaemonSettings") + .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithOne("DreamMakerSettings") + .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b => + { + b.HasOne("Tgstation.Server.Host.Models.WatchdogReattachInformation", "WatchdogReattachInformation") + .WithMany() + .HasForeignKey("WatchdogReattachInformationId"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("InstanceUsers") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Tgstation.Server.Host.Models.User") + .WithMany("InstanceUsers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b => + { + b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy") + .WithMany() + .HasForeignKey("CancelledById"); + + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("Jobs") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy") + .WithMany() + .HasForeignKey("StartedById") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b => + { + b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob") + .WithMany() + .HasForeignKey("CompileJobId"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithOne("RepositorySettings") + .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b => + { + b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation") + .WithMany("ActiveTestMerges") + .HasForeignKey("RevisionInformationId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge") + .WithMany("RevisonInformations") + .HasForeignKey("TestMergeId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("RevisionInformations") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b => + { + b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy") + .WithMany("TestMerges") + .HasForeignKey("MergedById") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation") + .WithOne("PrimaryTestMerge") + .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.User", b => + { + b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy") + .WithMany("CreatedUsers") + .HasForeignKey("CreatedById"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b => + { + b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha") + .WithMany() + .HasForeignKey("AlphaId"); + + b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo") + .WithMany() + .HasForeignKey("BravoId"); + }); #pragma warning restore 612, 618 - } - } + } + } } diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.cs index 13a103ac32..6d47a3801a 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.cs @@ -13,33 +13,33 @@ namespace Tgstation.Server.Host.Migrations /// /// The to use protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "ApiValidationSecurityLevel", - table: "DreamMakerSettings", - nullable: false, - defaultValue: (int)DreamDaemonSecurity.Safe); + { + migrationBuilder.AddColumn( + name: "ApiValidationSecurityLevel", + table: "DreamMakerSettings", + nullable: false, + defaultValue: (int)DreamDaemonSecurity.Safe); - migrationBuilder.AddColumn( - name: "MinimumSecurityLevel", - table: "CompileJobs", - nullable: false, - defaultValue: (int)DreamDaemonSecurity.Safe); - } + migrationBuilder.AddColumn( + name: "MinimumSecurityLevel", + table: "CompileJobs", + nullable: false, + defaultValue: (int)DreamDaemonSecurity.Safe); + } /// /// Unapplies the migration /// /// The to use protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "ApiValidationSecurityLevel", - table: "DreamMakerSettings"); + { + migrationBuilder.DropColumn( + name: "ApiValidationSecurityLevel", + table: "DreamMakerSettings"); - migrationBuilder.DropColumn( - name: "MinimumSecurityLevel", - table: "CompileJobs"); - } - } + migrationBuilder.DropColumn( + name: "MinimumSecurityLevel", + table: "CompileJobs"); + } + } } diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.Designer.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.Designer.cs index 0abec67697..5d669e5b4b 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.Designer.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.Designer.cs @@ -9,668 +9,668 @@ using Tgstation.Server.Host.Models; namespace Tgstation.Server.Host.Migrations { - [DbContext(typeof(SqlServerDatabaseContext))] - [Migration("20180918021228_MSAddMinimumSecurity")] - partial class MSAddMinimumSecurity + [DbContext(typeof(SqlServerDatabaseContext))] + [Migration("20180918021228_MSAddMinimumSecurity")] + partial class MSAddMinimumSecurity { /// /// Builds the target model /// /// The to use protected override void BuildTargetModel(ModelBuilder modelBuilder) - { + { #pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "2.1.3-rtm-32065") - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder + .HasAnnotation("ProductVersion", "2.1.3-rtm-32065") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("ConnectionString") - .IsRequired(); + b.Property("ConnectionString") + .IsRequired(); - b.Property("Enabled"); + b.Property("Enabled"); - b.Property("InstanceId"); + b.Property("InstanceId"); - b.Property("Name") - .IsRequired(); + b.Property("Name") + .IsRequired(); - b.Property("Provider"); + b.Property("Provider"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("InstanceId"); + b.HasIndex("InstanceId"); - b.HasIndex("Name") - .IsUnique(); + b.HasIndex("Name") + .IsUnique(); - b.ToTable("ChatBots"); - }); + b.ToTable("ChatBots"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("ChatSettingsId"); + b.Property("ChatSettingsId"); - b.Property("DiscordChannelId") - .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + b.Property("DiscordChannelId") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); - b.Property("IrcChannel"); + b.Property("IrcChannel"); - b.Property("IsAdminChannel") - .IsRequired(); + b.Property("IsAdminChannel") + .IsRequired(); - b.Property("IsUpdatesChannel") - .IsRequired(); + b.Property("IsUpdatesChannel") + .IsRequired(); - b.Property("IsWatchdogChannel") - .IsRequired(); + b.Property("IsWatchdogChannel") + .IsRequired(); - b.Property("Tag"); + b.Property("Tag"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("ChatSettingsId", "DiscordChannelId") - .IsUnique() - .HasFilter("[DiscordChannelId] IS NOT NULL"); + b.HasIndex("ChatSettingsId", "DiscordChannelId") + .IsUnique() + .HasFilter("[DiscordChannelId] IS NOT NULL"); - b.HasIndex("ChatSettingsId", "IrcChannel") - .IsUnique() - .HasFilter("[IrcChannel] IS NOT NULL"); + b.HasIndex("ChatSettingsId", "IrcChannel") + .IsUnique() + .HasFilter("[IrcChannel] IS NOT NULL"); - b.ToTable("ChatChannels"); - }); + b.ToTable("ChatChannels"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("ByondVersion") - .IsRequired(); + b.Property("ByondVersion") + .IsRequired(); - b.Property("DirectoryName"); + b.Property("DirectoryName"); - b.Property("DmeName"); + b.Property("DmeName"); - b.Property("JobId"); + b.Property("JobId"); - b.Property("MinimumSecurityLevel"); + b.Property("MinimumSecurityLevel"); - b.Property("Output"); + b.Property("Output"); - b.Property("RevisionInformationId"); + b.Property("RevisionInformationId"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("DirectoryName"); + b.HasIndex("DirectoryName"); - b.HasIndex("JobId"); + b.HasIndex("JobId"); - b.HasIndex("RevisionInformationId"); + b.HasIndex("RevisionInformationId"); - b.ToTable("CompileJobs"); - }); + b.ToTable("CompileJobs"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("AccessToken"); + b.Property("AccessToken"); - b.Property("AllowWebClient") - .IsRequired(); + b.Property("AllowWebClient") + .IsRequired(); - b.Property("AutoStart") - .IsRequired(); + b.Property("AutoStart") + .IsRequired(); - b.Property("InstanceId"); + b.Property("InstanceId"); - b.Property("PrimaryPort"); + b.Property("PrimaryPort"); - b.Property("ProcessId"); + b.Property("ProcessId"); - b.Property("SecondaryPort"); + b.Property("SecondaryPort"); - b.Property("SecurityLevel"); + b.Property("SecurityLevel"); - b.Property("SoftRestart") - .IsRequired(); + b.Property("SoftRestart") + .IsRequired(); - b.Property("SoftShutdown") - .IsRequired(); + b.Property("SoftShutdown") + .IsRequired(); - b.Property("StartupTimeout"); + b.Property("StartupTimeout"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("InstanceId") - .IsUnique(); + b.HasIndex("InstanceId") + .IsUnique(); - b.ToTable("DreamDaemonSettings"); - }); + b.ToTable("DreamDaemonSettings"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("ApiValidationPort"); + b.Property("ApiValidationPort"); - b.Property("ApiValidationSecurityLevel"); + b.Property("ApiValidationSecurityLevel"); - b.Property("InstanceId"); + b.Property("InstanceId"); - b.Property("ProjectName"); + b.Property("ProjectName"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("InstanceId") - .IsUnique(); + b.HasIndex("InstanceId") + .IsUnique(); - b.ToTable("DreamMakerSettings"); - }); + b.ToTable("DreamMakerSettings"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("AutoUpdateInterval"); + b.Property("AutoUpdateInterval"); - b.Property("ConfigurationType"); + b.Property("ConfigurationType"); - b.Property("Name") - .IsRequired(); + b.Property("Name") + .IsRequired(); - b.Property("Online") - .IsRequired(); + b.Property("Online") + .IsRequired(); - b.Property("Path") - .IsRequired(); + b.Property("Path") + .IsRequired(); - b.Property("WatchdogReattachInformationId"); + b.Property("WatchdogReattachInformationId"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("Path") - .IsUnique(); + b.HasIndex("Path") + .IsUnique(); - b.HasIndex("WatchdogReattachInformationId"); + b.HasIndex("WatchdogReattachInformationId"); - b.ToTable("Instances"); - }); + b.ToTable("Instances"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("ByondRights") - .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + b.Property("ByondRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); - b.Property("ChatBotRights") - .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + b.Property("ChatBotRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); - b.Property("ConfigurationRights") - .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + b.Property("ConfigurationRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); - b.Property("DreamDaemonRights") - .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + b.Property("DreamDaemonRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); - b.Property("DreamMakerRights") - .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + b.Property("DreamMakerRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); - b.Property("InstanceId"); + b.Property("InstanceId"); - b.Property("InstanceUserRights") - .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + b.Property("InstanceUserRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); - b.Property("RepositoryRights") - .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + b.Property("RepositoryRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); - b.Property("UserId") - .IsRequired(); + b.Property("UserId") + .IsRequired(); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("InstanceId"); + b.HasIndex("InstanceId"); - b.HasIndex("UserId", "InstanceId") - .IsUnique(); + b.HasIndex("UserId", "InstanceId") + .IsUnique(); - b.ToTable("InstanceUsers"); - }); + b.ToTable("InstanceUsers"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("CancelRight") - .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + b.Property("CancelRight") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); - b.Property("CancelRightsType") - .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + b.Property("CancelRightsType") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); - b.Property("Cancelled") - .IsRequired(); + b.Property("Cancelled") + .IsRequired(); - b.Property("CancelledById"); + b.Property("CancelledById"); - b.Property("Description") - .IsRequired(); + b.Property("Description") + .IsRequired(); - b.Property("ExceptionDetails"); + b.Property("ExceptionDetails"); - b.Property("InstanceId"); + b.Property("InstanceId"); - b.Property("StartedAt") - .IsRequired(); + b.Property("StartedAt") + .IsRequired(); - b.Property("StartedById"); + b.Property("StartedById"); - b.Property("StoppedAt"); + b.Property("StoppedAt"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("CancelledById"); + b.HasIndex("CancelledById"); - b.HasIndex("InstanceId"); + b.HasIndex("InstanceId"); - b.HasIndex("StartedById"); + b.HasIndex("StartedById"); - b.ToTable("Jobs"); - }); + b.ToTable("Jobs"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("AccessIdentifier") - .IsRequired(); + b.Property("AccessIdentifier") + .IsRequired(); - b.Property("ChatChannelsJson") - .IsRequired(); + b.Property("ChatChannelsJson") + .IsRequired(); - b.Property("ChatCommandsJson") - .IsRequired(); + b.Property("ChatCommandsJson") + .IsRequired(); - b.Property("CompileJobId"); + b.Property("CompileJobId"); - b.Property("IsPrimary"); + b.Property("IsPrimary"); - b.Property("Port"); + b.Property("Port"); - b.Property("ProcessId"); + b.Property("ProcessId"); - b.Property("RebootState"); + b.Property("RebootState"); - b.Property("ServerCommandsJson") - .IsRequired(); + b.Property("ServerCommandsJson") + .IsRequired(); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("CompileJobId"); + b.HasIndex("CompileJobId"); - b.ToTable("ReattachInformations"); - }); + b.ToTable("ReattachInformations"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("AccessToken"); + b.Property("AccessToken"); - b.Property("AccessUser"); + b.Property("AccessUser"); - b.Property("AutoUpdatesKeepTestMerges") - .IsRequired(); + b.Property("AutoUpdatesKeepTestMerges") + .IsRequired(); - b.Property("AutoUpdatesSynchronize") - .IsRequired(); + b.Property("AutoUpdatesSynchronize") + .IsRequired(); - b.Property("CommitterEmail") - .IsRequired(); + b.Property("CommitterEmail") + .IsRequired(); - b.Property("CommitterName") - .IsRequired(); + b.Property("CommitterName") + .IsRequired(); - b.Property("InstanceId"); + b.Property("InstanceId"); - b.Property("PushTestMergeCommits") - .IsRequired(); + b.Property("PushTestMergeCommits") + .IsRequired(); - b.Property("ShowTestMergeCommitters") - .IsRequired(); + b.Property("ShowTestMergeCommitters") + .IsRequired(); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("InstanceId") - .IsUnique(); + b.HasIndex("InstanceId") + .IsUnique(); - b.ToTable("RepositorySettings"); - }); + b.ToTable("RepositorySettings"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("RevisionInformationId"); + b.Property("RevisionInformationId"); - b.Property("TestMergeId"); + b.Property("TestMergeId"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("RevisionInformationId"); + b.HasIndex("RevisionInformationId"); - b.HasIndex("TestMergeId"); + b.HasIndex("TestMergeId"); - b.ToTable("RevInfoTestMerges"); - }); + b.ToTable("RevInfoTestMerges"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("CommitSha") - .IsRequired() - .HasMaxLength(40); + b.Property("CommitSha") + .IsRequired() + .HasMaxLength(40); - b.Property("InstanceId"); + b.Property("InstanceId"); - b.Property("OriginCommitSha") - .IsRequired() - .HasMaxLength(40); + b.Property("OriginCommitSha") + .IsRequired() + .HasMaxLength(40); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("CommitSha") - .IsUnique(); + b.HasIndex("CommitSha") + .IsUnique(); - b.HasIndex("InstanceId"); + b.HasIndex("InstanceId"); - b.ToTable("RevisionInformations"); - }); + b.ToTable("RevisionInformations"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("Author") - .IsRequired(); + b.Property("Author") + .IsRequired(); - b.Property("BodyAtMerge") - .IsRequired(); + b.Property("BodyAtMerge") + .IsRequired(); - b.Property("Comment"); + b.Property("Comment"); - b.Property("MergedAt"); + b.Property("MergedAt"); - b.Property("MergedById"); + b.Property("MergedById"); - b.Property("Number") - .IsRequired(); + b.Property("Number") + .IsRequired(); - b.Property("PrimaryRevisionInformationId"); + b.Property("PrimaryRevisionInformationId"); - b.Property("PullRequestRevision") - .IsRequired(); + b.Property("PullRequestRevision") + .IsRequired(); - b.Property("TitleAtMerge") - .IsRequired(); + b.Property("TitleAtMerge") + .IsRequired(); - b.Property("Url") - .IsRequired(); + b.Property("Url") + .IsRequired(); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("MergedById"); + b.HasIndex("MergedById"); - b.HasIndex("PrimaryRevisionInformationId") - .IsUnique() - .HasFilter("[PrimaryRevisionInformationId] IS NOT NULL"); + b.HasIndex("PrimaryRevisionInformationId") + .IsUnique() + .HasFilter("[PrimaryRevisionInformationId] IS NOT NULL"); - b.ToTable("TestMerges"); - }); + b.ToTable("TestMerges"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("AdministrationRights") - .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + b.Property("AdministrationRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); - b.Property("CanonicalName") - .IsRequired(); + b.Property("CanonicalName") + .IsRequired(); - b.Property("CreatedAt") - .IsRequired(); + b.Property("CreatedAt") + .IsRequired(); - b.Property("CreatedById"); + b.Property("CreatedById"); - b.Property("Enabled") - .IsRequired(); + b.Property("Enabled") + .IsRequired(); - b.Property("InstanceManagerRights") - .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + b.Property("InstanceManagerRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); - b.Property("LastPasswordUpdate"); + b.Property("LastPasswordUpdate"); - b.Property("Name") - .IsRequired(); + b.Property("Name") + .IsRequired(); - b.Property("PasswordHash"); + b.Property("PasswordHash"); - b.Property("SystemIdentifier"); + b.Property("SystemIdentifier"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("CanonicalName") - .IsUnique(); + b.HasIndex("CanonicalName") + .IsUnique(); - b.HasIndex("CreatedById"); + b.HasIndex("CreatedById"); - b.ToTable("Users"); - }); + b.ToTable("Users"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("AlphaId"); + b.Property("AlphaId"); - b.Property("AlphaIsActive"); + b.Property("AlphaIsActive"); - b.Property("BravoId"); + b.Property("BravoId"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("AlphaId"); + b.HasIndex("AlphaId"); - b.HasIndex("BravoId"); + b.HasIndex("BravoId"); - b.ToTable("WatchdogReattachInformations"); - }); + b.ToTable("WatchdogReattachInformations"); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b => - { - b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") - .WithMany("ChatSettings") - .HasForeignKey("InstanceId") - .OnDelete(DeleteBehavior.Cascade); - }); + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("ChatSettings") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); - modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b => - { - b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings") - .WithMany("Channels") - .HasForeignKey("ChatSettingsId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b => - { - b.HasOne("Tgstation.Server.Host.Models.Job", "Job") - .WithMany() - .HasForeignKey("JobId"); - - b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation") - .WithMany("CompileJobs") - .HasForeignKey("RevisionInformationId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b => - { - b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") - .WithOne("DreamDaemonSettings") - .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b => - { - b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") - .WithOne("DreamMakerSettings") - .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b => - { - b.HasOne("Tgstation.Server.Host.Models.WatchdogReattachInformation", "WatchdogReattachInformation") - .WithMany() - .HasForeignKey("WatchdogReattachInformationId"); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b => - { - b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") - .WithMany("InstanceUsers") - .HasForeignKey("InstanceId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("Tgstation.Server.Host.Models.User") - .WithMany("InstanceUsers") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b => - { - b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy") - .WithMany() - .HasForeignKey("CancelledById"); - - b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") - .WithMany("Jobs") - .HasForeignKey("InstanceId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy") - .WithMany() - .HasForeignKey("StartedById") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b => - { - b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob") - .WithMany() - .HasForeignKey("CompileJobId"); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b => - { - b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") - .WithOne("RepositorySettings") - .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b => - { - b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation") - .WithMany("ActiveTestMerges") - .HasForeignKey("RevisionInformationId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge") - .WithMany("RevisonInformations") - .HasForeignKey("TestMergeId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b => - { - b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") - .WithMany("RevisionInformations") - .HasForeignKey("InstanceId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b => - { - b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy") - .WithMany("TestMerges") - .HasForeignKey("MergedById") - .OnDelete(DeleteBehavior.Restrict); - - b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation") - .WithOne("PrimaryTestMerge") - .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId") - .OnDelete(DeleteBehavior.SetNull); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.User", b => - { - b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy") - .WithMany("CreatedUsers") - .HasForeignKey("CreatedById"); - }); - - modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b => - { - b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha") - .WithMany() - .HasForeignKey("AlphaId"); - - b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo") - .WithMany() - .HasForeignKey("BravoId"); - }); + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b => + { + b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings") + .WithMany("Channels") + .HasForeignKey("ChatSettingsId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b => + { + b.HasOne("Tgstation.Server.Host.Models.Job", "Job") + .WithMany() + .HasForeignKey("JobId"); + + b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation") + .WithMany("CompileJobs") + .HasForeignKey("RevisionInformationId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithOne("DreamDaemonSettings") + .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithOne("DreamMakerSettings") + .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b => + { + b.HasOne("Tgstation.Server.Host.Models.WatchdogReattachInformation", "WatchdogReattachInformation") + .WithMany() + .HasForeignKey("WatchdogReattachInformationId"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("InstanceUsers") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Tgstation.Server.Host.Models.User") + .WithMany("InstanceUsers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b => + { + b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy") + .WithMany() + .HasForeignKey("CancelledById"); + + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("Jobs") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy") + .WithMany() + .HasForeignKey("StartedById") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b => + { + b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob") + .WithMany() + .HasForeignKey("CompileJobId"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithOne("RepositorySettings") + .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b => + { + b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation") + .WithMany("ActiveTestMerges") + .HasForeignKey("RevisionInformationId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge") + .WithMany("RevisonInformations") + .HasForeignKey("TestMergeId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("RevisionInformations") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b => + { + b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy") + .WithMany("TestMerges") + .HasForeignKey("MergedById") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation") + .WithOne("PrimaryTestMerge") + .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.User", b => + { + b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy") + .WithMany("CreatedUsers") + .HasForeignKey("CreatedById"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b => + { + b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha") + .WithMany() + .HasForeignKey("AlphaId"); + + b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo") + .WithMany() + .HasForeignKey("BravoId"); + }); #pragma warning restore 612, 618 - } - } + } + } } diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.cs index 78c8da9d83..9cf5da54c7 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.cs @@ -13,33 +13,33 @@ namespace Tgstation.Server.Host.Migrations /// /// The to use protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "ApiValidationSecurityLevel", - table: "DreamMakerSettings", - nullable: false, - defaultValue: (int)DreamDaemonSecurity.Safe); + { + migrationBuilder.AddColumn( + name: "ApiValidationSecurityLevel", + table: "DreamMakerSettings", + nullable: false, + defaultValue: (int)DreamDaemonSecurity.Safe); - migrationBuilder.AddColumn( - name: "MinimumSecurityLevel", - table: "CompileJobs", - nullable: false, - defaultValue: (int)DreamDaemonSecurity.Safe); - } + migrationBuilder.AddColumn( + name: "MinimumSecurityLevel", + table: "CompileJobs", + nullable: false, + defaultValue: (int)DreamDaemonSecurity.Safe); + } /// /// Unapplies the migration /// /// The to use protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "ApiValidationSecurityLevel", - table: "DreamMakerSettings"); + { + migrationBuilder.DropColumn( + name: "ApiValidationSecurityLevel", + table: "DreamMakerSettings"); - migrationBuilder.DropColumn( - name: "MinimumSecurityLevel", - table: "CompileJobs"); - } - } + migrationBuilder.DropColumn( + name: "MinimumSecurityLevel", + table: "CompileJobs"); + } + } } From 7566c62befe10a20f4770ad74b9fb042e56ec599 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 18 Sep 2018 12:57:33 -0400 Subject: [PATCH 06/13] Fix migrations namespaces --- .../Migrations/20180918020726_MYAddMinimumSecurity.Designer.cs | 3 +-- .../Models/Migrations/20180918020726_MYAddMinimumSecurity.cs | 2 +- .../Migrations/20180918021228_MSAddMinimumSecurity.Designer.cs | 3 +-- .../Models/Migrations/20180918021228_MSAddMinimumSecurity.cs | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.Designer.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.Designer.cs index 3387ebe8bd..0c4538790b 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.Designer.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.Designer.cs @@ -3,9 +3,8 @@ using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; -using Tgstation.Server.Host.Models; -namespace Tgstation.Server.Host.Migrations +namespace Tgstation.Server.Host.Models.Migrations { [DbContext(typeof(MySqlDatabaseContext))] [Migration("20180918020726_MYAddMinimumSecurity")] diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.cs index 6d47a3801a..95950e251f 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.cs @@ -1,7 +1,7 @@ using Microsoft.EntityFrameworkCore.Migrations; using Tgstation.Server.Api.Models; -namespace Tgstation.Server.Host.Migrations +namespace Tgstation.Server.Host.Models.Migrations { /// /// Add the and columns for MySQL/MariaDB diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.Designer.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.Designer.cs index 5d669e5b4b..6223542618 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.Designer.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.Designer.cs @@ -5,9 +5,8 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Tgstation.Server.Host.Models; -namespace Tgstation.Server.Host.Migrations +namespace Tgstation.Server.Host.Models.Migrations { [DbContext(typeof(SqlServerDatabaseContext))] [Migration("20180918021228_MSAddMinimumSecurity")] diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.cs index 9cf5da54c7..9ac5b22b9f 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.cs @@ -1,7 +1,7 @@ using Microsoft.EntityFrameworkCore.Migrations; using Tgstation.Server.Api.Models; -namespace Tgstation.Server.Host.Migrations +namespace Tgstation.Server.Host.Models.Migrations { /// /// Add the and columns for MSSQL From 71fe411c680b0650511afc27c82f29ee595ab545 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 18 Sep 2018 13:11:59 -0400 Subject: [PATCH 07/13] I've struggled with this before but it seems multiple cascade paths will absolutely not allow us to create CompileJobs with Required jobs --- src/Tgstation.Server.Host/Models/CompileJob.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Tgstation.Server.Host/Models/CompileJob.cs b/src/Tgstation.Server.Host/Models/CompileJob.cs index ffcdd186a4..e372065af0 100644 --- a/src/Tgstation.Server.Host/Models/CompileJob.cs +++ b/src/Tgstation.Server.Host/Models/CompileJob.cs @@ -9,7 +9,6 @@ namespace Tgstation.Server.Host.Models /// /// See /// - [Required] public Job Job { get; set; } /// From 56d7f38eeb2aa0e277bb58f5ced8a80cc4672117 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 18 Sep 2018 15:05:11 -0400 Subject: [PATCH 08/13] EF Model integrity fixups --- src/Tgstation.Server.Host/Models/CompileJob.cs | 5 +++++ src/Tgstation.Server.Host/Models/DatabaseContext.cs | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/Tgstation.Server.Host/Models/CompileJob.cs b/src/Tgstation.Server.Host/Models/CompileJob.cs index e372065af0..3dc141372c 100644 --- a/src/Tgstation.Server.Host/Models/CompileJob.cs +++ b/src/Tgstation.Server.Host/Models/CompileJob.cs @@ -11,6 +11,11 @@ namespace Tgstation.Server.Host.Models /// public Job Job { get; set; } + /// + /// The of + /// + public long JobId { get; set; } + /// /// See /// diff --git a/src/Tgstation.Server.Host/Models/DatabaseContext.cs b/src/Tgstation.Server.Host/Models/DatabaseContext.cs index c79f697839..51998ddc2c 100644 --- a/src/Tgstation.Server.Host/Models/DatabaseContext.cs +++ b/src/Tgstation.Server.Host/Models/DatabaseContext.cs @@ -112,6 +112,8 @@ namespace Tgstation.Server.Host.Models modelBuilder.Entity().HasIndex(x => x.DirectoryName); + modelBuilder.Entity().HasOne().WithOne(x => x.Job).OnDelete(DeleteBehavior.Restrict); + var chatChannel = modelBuilder.Entity(); chatChannel.HasIndex(x => new { x.ChatSettingsId, x.IrcChannel }).IsUnique(); chatChannel.HasIndex(x => new { x.ChatSettingsId, x.DiscordChannelId }).IsUnique(); From 4b84e1f48eabfd53c42c13eb77d40eca849aec8b Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 18 Sep 2018 15:18:05 -0400 Subject: [PATCH 09/13] Fix watchdog reattach information foreign key --- src/Tgstation.Server.Host/Models/DatabaseContext.cs | 1 + .../Models/WatchdogReattachInformation.cs | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Tgstation.Server.Host/Models/DatabaseContext.cs b/src/Tgstation.Server.Host/Models/DatabaseContext.cs index 51998ddc2c..4fb568d700 100644 --- a/src/Tgstation.Server.Host/Models/DatabaseContext.cs +++ b/src/Tgstation.Server.Host/Models/DatabaseContext.cs @@ -130,6 +130,7 @@ namespace Tgstation.Server.Host.Models instanceModel.HasMany(x => x.RevisionInformations).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade); instanceModel.HasMany(x => x.InstanceUsers).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade); instanceModel.HasMany(x => x.Jobs).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade); + instanceModel.HasOne(x => x.WatchdogReattachInformation).WithOne().OnDelete(DeleteBehavior.Cascade); } /// diff --git a/src/Tgstation.Server.Host/Models/WatchdogReattachInformation.cs b/src/Tgstation.Server.Host/Models/WatchdogReattachInformation.cs index db27049745..204baed3b3 100644 --- a/src/Tgstation.Server.Host/Models/WatchdogReattachInformation.cs +++ b/src/Tgstation.Server.Host/Models/WatchdogReattachInformation.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Tgstation.Server.Host.Models +namespace Tgstation.Server.Host.Models { /// /// Database representation of @@ -14,6 +10,11 @@ namespace Tgstation.Server.Host.Models /// public long Id { get; set; } + /// + /// The of the the belongs to + /// + public long InstanceId { get; set; } + /// /// The for the Alpha server /// From ff1a4d5f26fff220b7a4d2a54ccabc67d73c0c9b Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 18 Sep 2018 15:28:46 -0400 Subject: [PATCH 10/13] Mark TestMerge.PrimaryRevisionInformation as required --- src/Tgstation.Server.Host/Models/TestMerge.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Tgstation.Server.Host/Models/TestMerge.cs b/src/Tgstation.Server.Host/Models/TestMerge.cs index bbab03bea0..754951c355 100644 --- a/src/Tgstation.Server.Host/Models/TestMerge.cs +++ b/src/Tgstation.Server.Host/Models/TestMerge.cs @@ -15,6 +15,7 @@ namespace Tgstation.Server.Host.Models /// /// The initial the was merged with /// + [Required] public RevisionInformation PrimaryRevisionInformation { get; set; } /// From 9a6e414dd60164fbe6775367330b90b552e978ab Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 18 Sep 2018 16:42:14 -0400 Subject: [PATCH 11/13] Restrict instead of SetNull. We have no use for SetNull --- src/Tgstation.Server.Host/Models/DatabaseContext.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tgstation.Server.Host/Models/DatabaseContext.cs b/src/Tgstation.Server.Host/Models/DatabaseContext.cs index 4fb568d700..7578c21c8a 100644 --- a/src/Tgstation.Server.Host/Models/DatabaseContext.cs +++ b/src/Tgstation.Server.Host/Models/DatabaseContext.cs @@ -107,7 +107,7 @@ namespace Tgstation.Server.Host.Models var revInfo = modelBuilder.Entity(); revInfo.HasMany(x => x.CompileJobs).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade); revInfo.HasMany(x => x.ActiveTestMerges).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade); - revInfo.HasOne(x => x.PrimaryTestMerge).WithOne(x => x.PrimaryRevisionInformation).OnDelete(DeleteBehavior.SetNull); + revInfo.HasOne(x => x.PrimaryTestMerge).WithOne(x => x.PrimaryRevisionInformation).OnDelete(DeleteBehavior.Restrict); revInfo.HasIndex(x => x.CommitSha).IsUnique(); modelBuilder.Entity().HasIndex(x => x.DirectoryName); From abdb8553bf65f0d61da7de76fb23db3ec503d8a2 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 18 Sep 2018 16:54:41 -0400 Subject: [PATCH 12/13] NullableAndForeignKeyCleanup Migration --- ...MYNullableAndForeignKeyCleanup.Designer.cs | 652 +++++++++++++++++ ...18204520_MYNullableAndForeignKeyCleanup.cs | 219 ++++++ ...MSNullableAndForeignKeyCleanup.Designer.cs | 679 ++++++++++++++++++ ...18205224_MSNullableAndForeignKeyCleanup.cs | 216 ++++++ .../MySqlDatabaseContextModelSnapshot.cs | 47 +- .../SqlServerDatabaseContextModelSnapshot.cs | 49 +- 6 files changed, 1820 insertions(+), 42 deletions(-) create mode 100644 src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.Designer.cs create mode 100644 src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.cs create mode 100644 src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.Designer.cs create mode 100644 src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.cs diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.Designer.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.Designer.cs new file mode 100644 index 0000000000..c267dc1782 --- /dev/null +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.Designer.cs @@ -0,0 +1,652 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Tgstation.Server.Host.Models.Migrations +{ + [DbContext(typeof(MySqlDatabaseContext))] + [Migration("20180918204520_MYNullableAndForeignKeyCleanup")] + partial class MYNullableAndForeignKeyCleanup + { + /// + /// Builds the target model + /// + /// The to use + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.1.3-rtm-32065") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConnectionString") + .IsRequired(); + + b.Property("Enabled"); + + b.Property("InstanceId"); + + b.Property("Name") + .IsRequired(); + + b.Property("Provider"); + + b.HasKey("Id"); + + b.HasIndex("InstanceId"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("ChatBots"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChatSettingsId"); + + b.Property("DiscordChannelId"); + + b.Property("IrcChannel"); + + b.Property("IsAdminChannel") + .IsRequired(); + + b.Property("IsUpdatesChannel") + .IsRequired(); + + b.Property("IsWatchdogChannel") + .IsRequired(); + + b.Property("Tag"); + + b.HasKey("Id"); + + b.HasIndex("ChatSettingsId", "DiscordChannelId") + .IsUnique(); + + b.HasIndex("ChatSettingsId", "IrcChannel") + .IsUnique(); + + b.ToTable("ChatChannels"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ByondVersion") + .IsRequired(); + + b.Property("DirectoryName") + .IsRequired(); + + b.Property("DmeName") + .IsRequired(); + + b.Property("JobId"); + + b.Property("MinimumSecurityLevel"); + + b.Property("Output") + .IsRequired(); + + b.Property("RevisionInformationId"); + + b.HasKey("Id"); + + b.HasIndex("DirectoryName"); + + b.HasIndex("JobId") + .IsUnique(); + + b.HasIndex("RevisionInformationId"); + + b.ToTable("CompileJobs"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessToken"); + + b.Property("AllowWebClient") + .IsRequired(); + + b.Property("AutoStart") + .IsRequired(); + + b.Property("InstanceId"); + + b.Property("PrimaryPort") + .IsRequired(); + + b.Property("ProcessId"); + + b.Property("SecondaryPort") + .IsRequired(); + + b.Property("SecurityLevel"); + + b.Property("SoftRestart") + .IsRequired(); + + b.Property("SoftShutdown") + .IsRequired(); + + b.Property("StartupTimeout") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("InstanceId") + .IsUnique(); + + b.ToTable("DreamDaemonSettings"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ApiValidationPort") + .IsRequired(); + + b.Property("ApiValidationSecurityLevel"); + + b.Property("InstanceId"); + + b.Property("ProjectName"); + + b.HasKey("Id"); + + b.HasIndex("InstanceId") + .IsUnique(); + + b.ToTable("DreamMakerSettings"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AutoUpdateInterval") + .IsRequired(); + + b.Property("ConfigurationType"); + + b.Property("Name") + .IsRequired(); + + b.Property("Online") + .IsRequired(); + + b.Property("Path") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("Path") + .IsUnique(); + + b.ToTable("Instances"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ByondRights"); + + b.Property("ChatBotRights"); + + b.Property("ConfigurationRights"); + + b.Property("DreamDaemonRights"); + + b.Property("DreamMakerRights"); + + b.Property("InstanceId"); + + b.Property("InstanceUserRights"); + + b.Property("RepositoryRights"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("InstanceId"); + + b.HasIndex("UserId", "InstanceId") + .IsUnique(); + + b.ToTable("InstanceUsers"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CancelRight"); + + b.Property("CancelRightsType"); + + b.Property("Cancelled") + .IsRequired(); + + b.Property("CancelledById"); + + b.Property("Description") + .IsRequired(); + + b.Property("ExceptionDetails"); + + b.Property("InstanceId"); + + b.Property("StartedAt") + .IsRequired(); + + b.Property("StartedById"); + + b.Property("StoppedAt"); + + b.HasKey("Id"); + + b.HasIndex("CancelledById"); + + b.HasIndex("InstanceId"); + + b.HasIndex("StartedById"); + + b.ToTable("Jobs"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessIdentifier") + .IsRequired(); + + b.Property("ChatChannelsJson") + .IsRequired(); + + b.Property("ChatCommandsJson") + .IsRequired(); + + b.Property("CompileJobId"); + + b.Property("IsPrimary"); + + b.Property("Port"); + + b.Property("ProcessId"); + + b.Property("RebootState"); + + b.Property("ServerCommandsJson") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("CompileJobId"); + + b.ToTable("ReattachInformations"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessToken"); + + b.Property("AccessUser"); + + b.Property("AutoUpdatesKeepTestMerges") + .IsRequired(); + + b.Property("AutoUpdatesSynchronize") + .IsRequired(); + + b.Property("CommitterEmail") + .IsRequired(); + + b.Property("CommitterName") + .IsRequired(); + + b.Property("InstanceId"); + + b.Property("PushTestMergeCommits") + .IsRequired(); + + b.Property("ShowTestMergeCommitters") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("InstanceId") + .IsUnique(); + + b.ToTable("RepositorySettings"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("RevisionInformationId"); + + b.Property("TestMergeId"); + + b.HasKey("Id"); + + b.HasIndex("RevisionInformationId"); + + b.HasIndex("TestMergeId"); + + b.ToTable("RevInfoTestMerges"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CommitSha") + .IsRequired() + .HasMaxLength(40); + + b.Property("InstanceId"); + + b.Property("OriginCommitSha") + .IsRequired() + .HasMaxLength(40); + + b.HasKey("Id"); + + b.HasIndex("CommitSha") + .IsUnique(); + + b.HasIndex("InstanceId"); + + b.ToTable("RevisionInformations"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Author") + .IsRequired(); + + b.Property("BodyAtMerge") + .IsRequired(); + + b.Property("Comment"); + + b.Property("MergedAt"); + + b.Property("MergedById"); + + b.Property("Number") + .IsRequired(); + + b.Property("PrimaryRevisionInformationId") + .IsRequired(); + + b.Property("PullRequestRevision") + .IsRequired(); + + b.Property("TitleAtMerge") + .IsRequired(); + + b.Property("Url") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("MergedById"); + + b.HasIndex("PrimaryRevisionInformationId") + .IsUnique(); + + b.ToTable("TestMerges"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AdministrationRights"); + + b.Property("CanonicalName") + .IsRequired(); + + b.Property("CreatedAt") + .IsRequired(); + + b.Property("CreatedById"); + + b.Property("Enabled") + .IsRequired(); + + b.Property("InstanceManagerRights"); + + b.Property("LastPasswordUpdate"); + + b.Property("Name") + .IsRequired(); + + b.Property("PasswordHash"); + + b.Property("SystemIdentifier"); + + b.HasKey("Id"); + + b.HasIndex("CanonicalName") + .IsUnique(); + + b.HasIndex("CreatedById"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AlphaId"); + + b.Property("AlphaIsActive"); + + b.Property("BravoId"); + + b.Property("InstanceId"); + + b.HasKey("Id"); + + b.HasIndex("AlphaId"); + + b.HasIndex("BravoId"); + + b.HasIndex("InstanceId") + .IsUnique(); + + b.ToTable("WatchdogReattachInformations"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("ChatSettings") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b => + { + b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings") + .WithMany("Channels") + .HasForeignKey("ChatSettingsId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b => + { + b.HasOne("Tgstation.Server.Host.Models.Job", "Job") + .WithOne() + .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation") + .WithMany("CompileJobs") + .HasForeignKey("RevisionInformationId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithOne("DreamDaemonSettings") + .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithOne("DreamMakerSettings") + .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("InstanceUsers") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Tgstation.Server.Host.Models.User") + .WithMany("InstanceUsers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b => + { + b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy") + .WithMany() + .HasForeignKey("CancelledById"); + + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("Jobs") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy") + .WithMany() + .HasForeignKey("StartedById") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b => + { + b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob") + .WithMany() + .HasForeignKey("CompileJobId"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithOne("RepositorySettings") + .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b => + { + b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation") + .WithMany("ActiveTestMerges") + .HasForeignKey("RevisionInformationId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge") + .WithMany("RevisonInformations") + .HasForeignKey("TestMergeId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("RevisionInformations") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b => + { + b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy") + .WithMany("TestMerges") + .HasForeignKey("MergedById") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation") + .WithOne("PrimaryTestMerge") + .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId") + .OnDelete(DeleteBehavior.Restrict); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.User", b => + { + b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy") + .WithMany("CreatedUsers") + .HasForeignKey("CreatedById"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b => + { + b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha") + .WithMany() + .HasForeignKey("AlphaId"); + + b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo") + .WithMany() + .HasForeignKey("BravoId"); + + b.HasOne("Tgstation.Server.Host.Models.Instance") + .WithOne("WatchdogReattachInformation") + .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.cs new file mode 100644 index 0000000000..c5bf5fa166 --- /dev/null +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.cs @@ -0,0 +1,219 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Tgstation.Server.Host.Models.Migrations +{ + /// + /// Cleans up of nullable columns and foreign keys MySQL/MariaDB + /// + public partial class MYNullableAndForeignKeyCleanup : Migration + { + /// + /// Applies the migration + /// + /// The to use + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInfor~", + table: "Instances"); + + migrationBuilder.DropForeignKey( + name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId", + table: "TestMerges"); + + migrationBuilder.DropForeignKey( + name: "FK_CompileJobs_Jobs_JobId", + table: "CompileJobs"); + + migrationBuilder.DropIndex( + name: "IX_Instances_WatchdogReattachInformationId", + table: "Instances"); + + migrationBuilder.DropIndex( + name: "IX_CompileJobs_JobId", + table: "CompileJobs"); + + migrationBuilder.DropColumn( + name: "WatchdogReattachInformationId", + table: "Instances"); + + migrationBuilder.AddColumn( + name: "InstanceId", + table: "WatchdogReattachInformations", + nullable: false, + defaultValue: 0L); + + migrationBuilder.AlterColumn( + name: "PrimaryRevisionInformationId", + table: "TestMerges", + nullable: false, + oldClrType: typeof(long), + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "Output", + table: "CompileJobs", + nullable: false, + oldClrType: typeof(string), + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "JobId", + table: "CompileJobs", + nullable: false, + oldClrType: typeof(long), + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "DmeName", + table: "CompileJobs", + nullable: false, + oldClrType: typeof(string), + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "DirectoryName", + table: "CompileJobs", + nullable: false, + oldClrType: typeof(Guid), + oldNullable: true); + + migrationBuilder.CreateIndex( + name: "IX_WatchdogReattachInformations_InstanceId", + table: "WatchdogReattachInformations", + column: "InstanceId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_CompileJobs_JobId", + table: "CompileJobs", + column: "JobId", + unique: true); + + migrationBuilder.AddForeignKey( + name: "FK_CompileJobs_Jobs_JobId", + table: "CompileJobs", + column: "JobId", + principalTable: "Jobs", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId", + table: "TestMerges", + column: "PrimaryRevisionInformationId", + principalTable: "RevisionInformations", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_WatchdogReattachInformations_Instances_InstanceId", + table: "WatchdogReattachInformations", + column: "InstanceId", + principalTable: "Instances", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + /// Unapplies the migration + /// + /// The to use + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId", + table: "TestMerges"); + + migrationBuilder.DropForeignKey( + name: "FK_WatchdogReattachInformations_Instances_InstanceId", + table: "WatchdogReattachInformations"); + + migrationBuilder.DropForeignKey( + name: "FK_CompileJobs_Jobs_JobId", + table: "CompileJobs"); + + migrationBuilder.DropIndex( + name: "IX_WatchdogReattachInformations_InstanceId", + table: "WatchdogReattachInformations"); + + migrationBuilder.DropIndex( + name: "IX_CompileJobs_JobId", + table: "CompileJobs"); + + migrationBuilder.DropColumn( + name: "InstanceId", + table: "WatchdogReattachInformations"); + + migrationBuilder.AlterColumn( + name: "PrimaryRevisionInformationId", + table: "TestMerges", + nullable: true, + oldClrType: typeof(long)); + + migrationBuilder.AddColumn( + name: "WatchdogReattachInformationId", + table: "Instances", + nullable: true); + + migrationBuilder.AlterColumn( + name: "Output", + table: "CompileJobs", + nullable: true, + oldClrType: typeof(string)); + + migrationBuilder.AlterColumn( + name: "JobId", + table: "CompileJobs", + nullable: true, + oldClrType: typeof(long)); + + migrationBuilder.AlterColumn( + name: "DmeName", + table: "CompileJobs", + nullable: true, + oldClrType: typeof(string)); + + migrationBuilder.AlterColumn( + name: "DirectoryName", + table: "CompileJobs", + nullable: true, + oldClrType: typeof(Guid)); + + migrationBuilder.CreateIndex( + name: "IX_Instances_WatchdogReattachInformationId", + table: "Instances", + column: "WatchdogReattachInformationId"); + + migrationBuilder.CreateIndex( + name: "IX_CompileJobs_JobId", + table: "CompileJobs", + column: "JobId"); + + migrationBuilder.AddForeignKey( + name: "FK_CompileJobs_Jobs_JobId", + table: "CompileJobs", + column: "JobId", + principalTable: "Jobs", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInfor~", + table: "Instances", + column: "WatchdogReattachInformationId", + principalTable: "WatchdogReattachInformations", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId", + table: "TestMerges", + column: "PrimaryRevisionInformationId", + principalTable: "RevisionInformations", + principalColumn: "Id", + onDelete: ReferentialAction.SetNull); + } + } +} diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.Designer.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.Designer.cs new file mode 100644 index 0000000000..d8bf97f528 --- /dev/null +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.Designer.cs @@ -0,0 +1,679 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace Tgstation.Server.Host.Models.Migrations +{ + [DbContext(typeof(SqlServerDatabaseContext))] + [Migration("20180918205224_MSNullableAndForeignKeyCleanup")] + partial class MSNullableAndForeignKeyCleanup + { + /// + /// Builds the target model + /// + /// The to use + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.1.3-rtm-32065") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ConnectionString") + .IsRequired(); + + b.Property("Enabled"); + + b.Property("InstanceId"); + + b.Property("Name") + .IsRequired(); + + b.Property("Provider"); + + b.HasKey("Id"); + + b.HasIndex("InstanceId"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("ChatBots"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ChatSettingsId"); + + b.Property("DiscordChannelId") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + + b.Property("IrcChannel"); + + b.Property("IsAdminChannel") + .IsRequired(); + + b.Property("IsUpdatesChannel") + .IsRequired(); + + b.Property("IsWatchdogChannel") + .IsRequired(); + + b.Property("Tag"); + + b.HasKey("Id"); + + b.HasIndex("ChatSettingsId", "DiscordChannelId") + .IsUnique() + .HasFilter("[DiscordChannelId] IS NOT NULL"); + + b.HasIndex("ChatSettingsId", "IrcChannel") + .IsUnique() + .HasFilter("[IrcChannel] IS NOT NULL"); + + b.ToTable("ChatChannels"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ByondVersion") + .IsRequired(); + + b.Property("DirectoryName") + .IsRequired(); + + b.Property("DmeName") + .IsRequired(); + + b.Property("JobId"); + + b.Property("MinimumSecurityLevel"); + + b.Property("Output") + .IsRequired(); + + b.Property("RevisionInformationId"); + + b.HasKey("Id"); + + b.HasIndex("DirectoryName"); + + b.HasIndex("JobId") + .IsUnique(); + + b.HasIndex("RevisionInformationId"); + + b.ToTable("CompileJobs"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AccessToken"); + + b.Property("AllowWebClient") + .IsRequired(); + + b.Property("AutoStart") + .IsRequired(); + + b.Property("InstanceId"); + + b.Property("PrimaryPort"); + + b.Property("ProcessId"); + + b.Property("SecondaryPort"); + + b.Property("SecurityLevel"); + + b.Property("SoftRestart") + .IsRequired(); + + b.Property("SoftShutdown") + .IsRequired(); + + b.Property("StartupTimeout"); + + b.HasKey("Id"); + + b.HasIndex("InstanceId") + .IsUnique(); + + b.ToTable("DreamDaemonSettings"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ApiValidationPort"); + + b.Property("ApiValidationSecurityLevel"); + + b.Property("InstanceId"); + + b.Property("ProjectName"); + + b.HasKey("Id"); + + b.HasIndex("InstanceId") + .IsUnique(); + + b.ToTable("DreamMakerSettings"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AutoUpdateInterval"); + + b.Property("ConfigurationType"); + + b.Property("Name") + .IsRequired(); + + b.Property("Online") + .IsRequired(); + + b.Property("Path") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("Path") + .IsUnique(); + + b.ToTable("Instances"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ByondRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + + b.Property("ChatBotRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + + b.Property("ConfigurationRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + + b.Property("DreamDaemonRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + + b.Property("DreamMakerRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + + b.Property("InstanceId"); + + b.Property("InstanceUserRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + + b.Property("RepositoryRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("InstanceId"); + + b.HasIndex("UserId", "InstanceId") + .IsUnique(); + + b.ToTable("InstanceUsers"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CancelRight") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + + b.Property("CancelRightsType") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + + b.Property("Cancelled") + .IsRequired(); + + b.Property("CancelledById"); + + b.Property("Description") + .IsRequired(); + + b.Property("ExceptionDetails"); + + b.Property("InstanceId"); + + b.Property("StartedAt") + .IsRequired(); + + b.Property("StartedById"); + + b.Property("StoppedAt"); + + b.HasKey("Id"); + + b.HasIndex("CancelledById"); + + b.HasIndex("InstanceId"); + + b.HasIndex("StartedById"); + + b.ToTable("Jobs"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AccessIdentifier") + .IsRequired(); + + b.Property("ChatChannelsJson") + .IsRequired(); + + b.Property("ChatCommandsJson") + .IsRequired(); + + b.Property("CompileJobId"); + + b.Property("IsPrimary"); + + b.Property("Port"); + + b.Property("ProcessId"); + + b.Property("RebootState"); + + b.Property("ServerCommandsJson") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("CompileJobId"); + + b.ToTable("ReattachInformations"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AccessToken"); + + b.Property("AccessUser"); + + b.Property("AutoUpdatesKeepTestMerges") + .IsRequired(); + + b.Property("AutoUpdatesSynchronize") + .IsRequired(); + + b.Property("CommitterEmail") + .IsRequired(); + + b.Property("CommitterName") + .IsRequired(); + + b.Property("InstanceId"); + + b.Property("PushTestMergeCommits") + .IsRequired(); + + b.Property("ShowTestMergeCommitters") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("InstanceId") + .IsUnique(); + + b.ToTable("RepositorySettings"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("RevisionInformationId"); + + b.Property("TestMergeId"); + + b.HasKey("Id"); + + b.HasIndex("RevisionInformationId"); + + b.HasIndex("TestMergeId"); + + b.ToTable("RevInfoTestMerges"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CommitSha") + .IsRequired() + .HasMaxLength(40); + + b.Property("InstanceId"); + + b.Property("OriginCommitSha") + .IsRequired() + .HasMaxLength(40); + + b.HasKey("Id"); + + b.HasIndex("CommitSha") + .IsUnique(); + + b.HasIndex("InstanceId"); + + b.ToTable("RevisionInformations"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Author") + .IsRequired(); + + b.Property("BodyAtMerge") + .IsRequired(); + + b.Property("Comment"); + + b.Property("MergedAt"); + + b.Property("MergedById"); + + b.Property("Number") + .IsRequired(); + + b.Property("PrimaryRevisionInformationId") + .IsRequired(); + + b.Property("PullRequestRevision") + .IsRequired(); + + b.Property("TitleAtMerge") + .IsRequired(); + + b.Property("Url") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("MergedById"); + + b.HasIndex("PrimaryRevisionInformationId") + .IsUnique(); + + b.ToTable("TestMerges"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdministrationRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + + b.Property("CanonicalName") + .IsRequired(); + + b.Property("CreatedAt") + .IsRequired(); + + b.Property("CreatedById"); + + b.Property("Enabled") + .IsRequired(); + + b.Property("InstanceManagerRights") + .HasConversion(new ValueConverter(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0))); + + b.Property("LastPasswordUpdate"); + + b.Property("Name") + .IsRequired(); + + b.Property("PasswordHash"); + + b.Property("SystemIdentifier"); + + b.HasKey("Id"); + + b.HasIndex("CanonicalName") + .IsUnique(); + + b.HasIndex("CreatedById"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AlphaId"); + + b.Property("AlphaIsActive"); + + b.Property("BravoId"); + + b.Property("InstanceId"); + + b.HasKey("Id"); + + b.HasIndex("AlphaId"); + + b.HasIndex("BravoId"); + + b.HasIndex("InstanceId") + .IsUnique(); + + b.ToTable("WatchdogReattachInformations"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("ChatSettings") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b => + { + b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings") + .WithMany("Channels") + .HasForeignKey("ChatSettingsId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b => + { + b.HasOne("Tgstation.Server.Host.Models.Job", "Job") + .WithOne() + .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation") + .WithMany("CompileJobs") + .HasForeignKey("RevisionInformationId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithOne("DreamDaemonSettings") + .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithOne("DreamMakerSettings") + .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("InstanceUsers") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Tgstation.Server.Host.Models.User") + .WithMany("InstanceUsers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b => + { + b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy") + .WithMany() + .HasForeignKey("CancelledById"); + + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("Jobs") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy") + .WithMany() + .HasForeignKey("StartedById") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b => + { + b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob") + .WithMany() + .HasForeignKey("CompileJobId"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithOne("RepositorySettings") + .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b => + { + b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation") + .WithMany("ActiveTestMerges") + .HasForeignKey("RevisionInformationId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge") + .WithMany("RevisonInformations") + .HasForeignKey("TestMergeId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b => + { + b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") + .WithMany("RevisionInformations") + .HasForeignKey("InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b => + { + b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy") + .WithMany("TestMerges") + .HasForeignKey("MergedById") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation") + .WithOne("PrimaryTestMerge") + .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId") + .OnDelete(DeleteBehavior.Restrict); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.User", b => + { + b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy") + .WithMany("CreatedUsers") + .HasForeignKey("CreatedById"); + }); + + modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b => + { + b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha") + .WithMany() + .HasForeignKey("AlphaId"); + + b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo") + .WithMany() + .HasForeignKey("BravoId"); + + b.HasOne("Tgstation.Server.Host.Models.Instance") + .WithOne("WatchdogReattachInformation") + .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.cs b/src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.cs new file mode 100644 index 0000000000..3cc60483d6 --- /dev/null +++ b/src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.cs @@ -0,0 +1,216 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Tgstation.Server.Host.Models.Migrations +{ + /// + /// Cleans up of nullable columns and foreign keys MSSQL + /// + public partial class MSNullableAndForeignKeyCleanup : Migration + { + /// + /// Applies the migration + /// + /// The to use + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInformationId", + table: "Instances"); + + migrationBuilder.DropForeignKey( + name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId", + table: "TestMerges"); + + migrationBuilder.DropIndex( + name: "IX_TestMerges_PrimaryRevisionInformationId", + table: "TestMerges"); + + migrationBuilder.DropIndex( + name: "IX_Instances_WatchdogReattachInformationId", + table: "Instances"); + + migrationBuilder.DropIndex( + name: "IX_CompileJobs_JobId", + table: "CompileJobs"); + + migrationBuilder.DropColumn( + name: "WatchdogReattachInformationId", + table: "Instances"); + + migrationBuilder.AddColumn( + name: "InstanceId", + table: "WatchdogReattachInformations", + nullable: false, + defaultValue: 0L); + + migrationBuilder.AlterColumn( + name: "PrimaryRevisionInformationId", + table: "TestMerges", + nullable: false, + oldClrType: typeof(long), + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "Output", + table: "CompileJobs", + nullable: false, + oldClrType: typeof(string), + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "JobId", + table: "CompileJobs", + nullable: false, + oldClrType: typeof(long), + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "DmeName", + table: "CompileJobs", + nullable: false, + oldClrType: typeof(string), + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "DirectoryName", + table: "CompileJobs", + nullable: false, + oldClrType: typeof(Guid), + oldNullable: true); + + migrationBuilder.CreateIndex( + name: "IX_WatchdogReattachInformations_InstanceId", + table: "WatchdogReattachInformations", + column: "InstanceId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_TestMerges_PrimaryRevisionInformationId", + table: "TestMerges", + column: "PrimaryRevisionInformationId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_CompileJobs_JobId", + table: "CompileJobs", + column: "JobId", + unique: true); + + migrationBuilder.AddForeignKey( + name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId", + table: "TestMerges", + column: "PrimaryRevisionInformationId", + principalTable: "RevisionInformations", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_WatchdogReattachInformations_Instances_InstanceId", + table: "WatchdogReattachInformations", + column: "InstanceId", + principalTable: "Instances", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + /// Unapplies the migration + /// + /// The to use + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId", + table: "TestMerges"); + + migrationBuilder.DropForeignKey( + name: "FK_WatchdogReattachInformations_Instances_InstanceId", + table: "WatchdogReattachInformations"); + + migrationBuilder.DropIndex( + name: "IX_WatchdogReattachInformations_InstanceId", + table: "WatchdogReattachInformations"); + + migrationBuilder.DropIndex( + name: "IX_TestMerges_PrimaryRevisionInformationId", + table: "TestMerges"); + + migrationBuilder.DropIndex( + name: "IX_CompileJobs_JobId", + table: "CompileJobs"); + + migrationBuilder.DropColumn( + name: "InstanceId", + table: "WatchdogReattachInformations"); + + migrationBuilder.AlterColumn( + name: "PrimaryRevisionInformationId", + table: "TestMerges", + nullable: true, + oldClrType: typeof(long)); + + migrationBuilder.AddColumn( + name: "WatchdogReattachInformationId", + table: "Instances", + nullable: true); + + migrationBuilder.AlterColumn( + name: "Output", + table: "CompileJobs", + nullable: true, + oldClrType: typeof(string)); + + migrationBuilder.AlterColumn( + name: "JobId", + table: "CompileJobs", + nullable: true, + oldClrType: typeof(long)); + + migrationBuilder.AlterColumn( + name: "DmeName", + table: "CompileJobs", + nullable: true, + oldClrType: typeof(string)); + + migrationBuilder.AlterColumn( + name: "DirectoryName", + table: "CompileJobs", + nullable: true, + oldClrType: typeof(Guid)); + + migrationBuilder.CreateIndex( + name: "IX_TestMerges_PrimaryRevisionInformationId", + table: "TestMerges", + column: "PrimaryRevisionInformationId", + unique: true, + filter: "[PrimaryRevisionInformationId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_Instances_WatchdogReattachInformationId", + table: "Instances", + column: "WatchdogReattachInformationId"); + + migrationBuilder.CreateIndex( + name: "IX_CompileJobs_JobId", + table: "CompileJobs", + column: "JobId"); + + migrationBuilder.AddForeignKey( + name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInformationId", + table: "Instances", + column: "WatchdogReattachInformationId", + principalTable: "WatchdogReattachInformations", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId", + table: "TestMerges", + column: "PrimaryRevisionInformationId", + principalTable: "RevisionInformations", + principalColumn: "Id", + onDelete: ReferentialAction.SetNull); + } + } +} diff --git a/src/Tgstation.Server.Host/Models/Migrations/MySqlDatabaseContextModelSnapshot.cs b/src/Tgstation.Server.Host/Models/Migrations/MySqlDatabaseContextModelSnapshot.cs index 7658150957..e273129437 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/MySqlDatabaseContextModelSnapshot.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/MySqlDatabaseContextModelSnapshot.cs @@ -2,6 +2,8 @@ using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Tgstation.Server.Host.Models; namespace Tgstation.Server.Host.Models.Migrations { @@ -83,15 +85,18 @@ namespace Tgstation.Server.Host.Models.Migrations b.Property("ByondVersion") .IsRequired(); - b.Property("DirectoryName"); + b.Property("DirectoryName") + .IsRequired(); - b.Property("DmeName"); + b.Property("DmeName") + .IsRequired(); - b.Property("JobId"); + b.Property("JobId"); b.Property("MinimumSecurityLevel"); - b.Property("Output"); + b.Property("Output") + .IsRequired(); b.Property("RevisionInformationId"); @@ -99,7 +104,8 @@ namespace Tgstation.Server.Host.Models.Migrations b.HasIndex("DirectoryName"); - b.HasIndex("JobId"); + b.HasIndex("JobId") + .IsUnique(); b.HasIndex("RevisionInformationId"); @@ -189,15 +195,11 @@ namespace Tgstation.Server.Host.Models.Migrations b.Property("Path") .IsRequired(); - b.Property("WatchdogReattachInformationId"); - b.HasKey("Id"); b.HasIndex("Path") .IsUnique(); - b.HasIndex("WatchdogReattachInformationId"); - b.ToTable("Instances"); }); @@ -408,7 +410,8 @@ namespace Tgstation.Server.Host.Models.Migrations b.Property("Number") .IsRequired(); - b.Property("PrimaryRevisionInformationId"); + b.Property("PrimaryRevisionInformationId") + .IsRequired(); b.Property("PullRequestRevision") .IsRequired(); @@ -479,12 +482,17 @@ namespace Tgstation.Server.Host.Models.Migrations b.Property("BravoId"); + b.Property("InstanceId"); + b.HasKey("Id"); b.HasIndex("AlphaId"); b.HasIndex("BravoId"); + b.HasIndex("InstanceId") + .IsUnique(); + b.ToTable("WatchdogReattachInformations"); }); @@ -507,8 +515,9 @@ namespace Tgstation.Server.Host.Models.Migrations modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b => { b.HasOne("Tgstation.Server.Host.Models.Job", "Job") - .WithMany() - .HasForeignKey("JobId"); + .WithOne() + .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId") + .OnDelete(DeleteBehavior.Restrict); b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation") .WithMany("CompileJobs") @@ -532,13 +541,6 @@ namespace Tgstation.Server.Host.Models.Migrations .OnDelete(DeleteBehavior.Cascade); }); - modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b => - { - b.HasOne("Tgstation.Server.Host.Models.WatchdogReattachInformation", "WatchdogReattachInformation") - .WithMany() - .HasForeignKey("WatchdogReattachInformationId"); - }); - modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b => { b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") @@ -615,7 +617,7 @@ namespace Tgstation.Server.Host.Models.Migrations b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation") .WithOne("PrimaryTestMerge") .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId") - .OnDelete(DeleteBehavior.SetNull); + .OnDelete(DeleteBehavior.Restrict); }); modelBuilder.Entity("Tgstation.Server.Host.Models.User", b => @@ -634,6 +636,11 @@ namespace Tgstation.Server.Host.Models.Migrations b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo") .WithMany() .HasForeignKey("BravoId"); + + b.HasOne("Tgstation.Server.Host.Models.Instance") + .WithOne("WatchdogReattachInformation") + .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); }); #pragma warning restore 612, 618 } diff --git a/src/Tgstation.Server.Host/Models/Migrations/SqlServerDatabaseContextModelSnapshot.cs b/src/Tgstation.Server.Host/Models/Migrations/SqlServerDatabaseContextModelSnapshot.cs index d8ea3e4706..0174e55a09 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/SqlServerDatabaseContextModelSnapshot.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/SqlServerDatabaseContextModelSnapshot.cs @@ -4,6 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Tgstation.Server.Host.Models; namespace Tgstation.Server.Host.Models.Migrations { @@ -92,15 +93,18 @@ namespace Tgstation.Server.Host.Models.Migrations b.Property("ByondVersion") .IsRequired(); - b.Property("DirectoryName"); + b.Property("DirectoryName") + .IsRequired(); - b.Property("DmeName"); + b.Property("DmeName") + .IsRequired(); - b.Property("JobId"); + b.Property("JobId"); b.Property("MinimumSecurityLevel"); - b.Property("Output"); + b.Property("Output") + .IsRequired(); b.Property("RevisionInformationId"); @@ -108,7 +112,8 @@ namespace Tgstation.Server.Host.Models.Migrations b.HasIndex("DirectoryName"); - b.HasIndex("JobId"); + b.HasIndex("JobId") + .IsUnique(); b.HasIndex("RevisionInformationId"); @@ -196,15 +201,11 @@ namespace Tgstation.Server.Host.Models.Migrations b.Property("Path") .IsRequired(); - b.Property("WatchdogReattachInformationId"); - b.HasKey("Id"); b.HasIndex("Path") .IsUnique(); - b.HasIndex("WatchdogReattachInformationId"); - b.ToTable("Instances"); }); @@ -431,7 +432,8 @@ namespace Tgstation.Server.Host.Models.Migrations b.Property("Number") .IsRequired(); - b.Property("PrimaryRevisionInformationId"); + b.Property("PrimaryRevisionInformationId") + .IsRequired(); b.Property("PullRequestRevision") .IsRequired(); @@ -447,8 +449,7 @@ namespace Tgstation.Server.Host.Models.Migrations b.HasIndex("MergedById"); b.HasIndex("PrimaryRevisionInformationId") - .IsUnique() - .HasFilter("[PrimaryRevisionInformationId] IS NOT NULL"); + .IsUnique(); b.ToTable("TestMerges"); }); @@ -507,12 +508,17 @@ namespace Tgstation.Server.Host.Models.Migrations b.Property("BravoId"); + b.Property("InstanceId"); + b.HasKey("Id"); b.HasIndex("AlphaId"); b.HasIndex("BravoId"); + b.HasIndex("InstanceId") + .IsUnique(); + b.ToTable("WatchdogReattachInformations"); }); @@ -535,8 +541,9 @@ namespace Tgstation.Server.Host.Models.Migrations modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b => { b.HasOne("Tgstation.Server.Host.Models.Job", "Job") - .WithMany() - .HasForeignKey("JobId"); + .WithOne() + .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId") + .OnDelete(DeleteBehavior.Restrict); b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation") .WithMany("CompileJobs") @@ -560,13 +567,6 @@ namespace Tgstation.Server.Host.Models.Migrations .OnDelete(DeleteBehavior.Cascade); }); - modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b => - { - b.HasOne("Tgstation.Server.Host.Models.WatchdogReattachInformation", "WatchdogReattachInformation") - .WithMany() - .HasForeignKey("WatchdogReattachInformationId"); - }); - modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b => { b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance") @@ -643,7 +643,7 @@ namespace Tgstation.Server.Host.Models.Migrations b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation") .WithOne("PrimaryTestMerge") .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId") - .OnDelete(DeleteBehavior.SetNull); + .OnDelete(DeleteBehavior.Restrict); }); modelBuilder.Entity("Tgstation.Server.Host.Models.User", b => @@ -662,6 +662,11 @@ namespace Tgstation.Server.Host.Models.Migrations b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo") .WithMany() .HasForeignKey("BravoId"); + + b.HasOne("Tgstation.Server.Host.Models.Instance") + .WithOne("WatchdogReattachInformation") + .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId") + .OnDelete(DeleteBehavior.Cascade); }); #pragma warning restore 612, 618 } From d8fafff1cdede1ee9ec9c33f9c7aa0cd511b94c8 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 18 Sep 2018 16:59:38 -0400 Subject: [PATCH 13/13] Thank god EF caught this for us --- src/Tgstation.Server.Host/Models/CompileJob.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Tgstation.Server.Host/Models/CompileJob.cs b/src/Tgstation.Server.Host/Models/CompileJob.cs index 3dc141372c..3fadc5b182 100644 --- a/src/Tgstation.Server.Host/Models/CompileJob.cs +++ b/src/Tgstation.Server.Host/Models/CompileJob.cs @@ -9,6 +9,7 @@ namespace Tgstation.Server.Host.Models /// /// See /// + [Required] public Job Job { get; set; } ///