diff --git a/.gitignore b/.gitignore
index a0fa5f96e2..9b60069c91 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,4 @@ artifacts/
*DS_Store
*.sln.ide
/TestResults
+/src/Tgstation.Server.Host/appsettings.Development.json
diff --git a/src/Tgstation.Server.Host/Configuration/DatabaseConfiguration.cs b/src/Tgstation.Server.Host/Configuration/DatabaseConfiguration.cs
index b356408c50..ef28e52f8e 100644
--- a/src/Tgstation.Server.Host/Configuration/DatabaseConfiguration.cs
+++ b/src/Tgstation.Server.Host/Configuration/DatabaseConfiguration.cs
@@ -2,6 +2,7 @@
{
sealed class DatabaseConfiguration
{
+ public const string Section = "Database";
public DatabaseType DatabaseType { get; set; }
public string ConnectionString { get; set; }
}
diff --git a/src/Tgstation.Server.Host/Core/Application.cs b/src/Tgstation.Server.Host/Core/Application.cs
index 3e392b41d2..b70e80286b 100644
--- a/src/Tgstation.Server.Host/Core/Application.cs
+++ b/src/Tgstation.Server.Host/Core/Application.cs
@@ -2,6 +2,7 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity;
+using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
@@ -22,11 +23,21 @@ namespace Tgstation.Server.Host.Core
///
readonly IConfiguration configuration;
+ ///
+ /// The for the
+ ///
+ readonly IHostingEnvironment hostingEnvironment;
+
///
/// Construct an
///
/// The value of
- public Application(IConfiguration configuration) => this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
+ /// The value of
+ public Application(IConfiguration configuration, IHostingEnvironment hostingEnvironment)
+ {
+ this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
+ this.hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
+ }
///
/// Configure dependency injected services
@@ -39,15 +50,38 @@ namespace Tgstation.Server.Host.Core
if (services == null)
throw new ArgumentNullException(nameof(services));
var workingDir = Environment.CurrentDirectory;
- services.Configure(configuration.GetSection("Database"));
+ var databaseConfigurationSection = configuration.GetSection(DatabaseConfiguration.Section);
+ services.Configure(databaseConfigurationSection);
services.AddMvc();
services.AddOptions();
services.AddLocalization();
+
+ var databaseConfiguration = databaseConfigurationSection.Get();
+ void ConfigureDatabase(DbContextOptionsBuilder builder)
+ {
+ if (hostingEnvironment.IsDevelopment())
+ builder.EnableSensitiveDataLogging();
+ };
- services.AddDbContext();
- services.AddScoped(x => x.GetRequiredService());
-
+ switch (databaseConfiguration.DatabaseType)
+ {
+ case DatabaseType.MySql:
+ services.AddDbContext(ConfigureDatabase);
+ services.AddScoped(x => x.GetRequiredService());
+ break;
+ case DatabaseType.Sqlite:
+ services.AddDbContext(ConfigureDatabase);
+ services.AddScoped(x => x.GetRequiredService());
+ break;
+ case DatabaseType.SqlServer:
+ services.AddDbContext(ConfigureDatabase);
+ services.AddScoped(x => x.GetRequiredService());
+ break;
+ default:
+ throw new InvalidOperationException("Invalid DatabaseType!");
+ }
+
services.AddSingleton();
services.AddSingleton();
services.AddSingleton, PasswordHasher>();
@@ -57,13 +91,10 @@ namespace Tgstation.Server.Host.Core
/// Configure the
///
/// The to configure
- /// The of the
- public void Configure(IApplicationBuilder applicationBuilder, IHostingEnvironment hostingEnvironment)
+ public void Configure(IApplicationBuilder applicationBuilder)
{
if (applicationBuilder == null)
throw new ArgumentNullException(nameof(applicationBuilder));
- if (hostingEnvironment == null)
- throw new ArgumentNullException(nameof(hostingEnvironment));
if (hostingEnvironment.IsDevelopment())
applicationBuilder.UseDeveloperExceptionPage();
diff --git a/src/Tgstation.Server.Host/Models/DatabaseContext.cs b/src/Tgstation.Server.Host/Models/DatabaseContext.cs
index 1a6cf81e00..9651b6b2db 100644
--- a/src/Tgstation.Server.Host/Models/DatabaseContext.cs
+++ b/src/Tgstation.Server.Host/Models/DatabaseContext.cs
@@ -1,21 +1,17 @@
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Linq;
-using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
-using Tgstation.Server.Api.Models;
-using Tgstation.Server.Api.Rights;
using Tgstation.Server.Host.Configuration;
-using Tgstation.Server.Host.Core;
using ZNetCS.AspNetCore.Logging.EntityFrameworkCore;
namespace Tgstation.Server.Host.Models
{
- sealed class DatabaseContext : DbContext, IDatabaseContext
+ ///
+ abstract class DatabaseContext : DbContext, IDatabaseContext where TParentContext : DbContext
{
///
public DbSet ServerSettings { get; set; }
@@ -41,6 +37,11 @@ namespace Tgstation.Server.Host.Models
public DbSet RevisionInformations { get; set; }
public DbSet RepositorySettings { get; set; }
+ ///
+ /// The connection string for the
+ ///
+ protected string ConnectionString => databaseConfiguration.ConnectionString;
+
///
/// The for the
///
@@ -50,10 +51,6 @@ namespace Tgstation.Server.Host.Models
///
readonly ILoggerFactory loggerFactory;
///
- /// The for the
- ///
- readonly IHostingEnvironment hostingEnvironment;
- ///
/// The for the
///
readonly IDatabaseSeeder databaseSeeder;
@@ -61,16 +58,14 @@ namespace Tgstation.Server.Host.Models
///
/// Construct a
///
- /// The for the
+ /// The for the
/// The containing the value of
/// The value of
- /// The value of
/// The value of
- public DatabaseContext(DbContextOptions dbContextOptions, IOptions databaseConfigurationOptions, ILoggerFactory loggerFactory, IHostingEnvironment hostingEnvironment, IDatabaseSeeder databaseSeeder) : base(dbContextOptions)
+ public DatabaseContext(DbContextOptions dbContextOptions, IOptions databaseConfigurationOptions, ILoggerFactory loggerFactory, IDatabaseSeeder databaseSeeder) : base(dbContextOptions)
{
databaseConfiguration = databaseConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(databaseConfigurationOptions));
this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
- this.hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
this.databaseSeeder = databaseSeeder ?? throw new ArgumentNullException(nameof(databaseSeeder));
}
@@ -90,21 +85,9 @@ namespace Tgstation.Server.Host.Models
///
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
- switch (databaseConfiguration.DatabaseType)
- {
- case DatabaseType.MySql:
- optionsBuilder.UseMySQL(databaseConfiguration.ConnectionString);
- break;
- case DatabaseType.Sqlite:
- optionsBuilder.UseSqlite(databaseConfiguration.ConnectionString);
- break;
- case DatabaseType.SqlServer:
- optionsBuilder.UseSqlServer(databaseConfiguration.ConnectionString);
- break;
- }
+ base.OnConfiguring(optionsBuilder);
+
optionsBuilder.UseLoggerFactory(loggerFactory);
- if (hostingEnvironment.IsDevelopment())
- optionsBuilder.EnableSensitiveDataLogging();
}
///
diff --git a/src/Tgstation.Server.Host/Models/Migrations/DesignTimeDbContextFactoryHelpers.cs b/src/Tgstation.Server.Host/Models/Migrations/DesignTimeDbContextFactoryHelpers.cs
new file mode 100644
index 0000000000..9c1da8c24e
--- /dev/null
+++ b/src/Tgstation.Server.Host/Models/Migrations/DesignTimeDbContextFactoryHelpers.cs
@@ -0,0 +1,29 @@
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Options;
+using System.IO;
+using System.Reflection;
+using Tgstation.Server.Host.Configuration;
+
+namespace Tgstation.Server.Host.Models.Migrations
+{
+ ///
+ /// Contains helpers for creating design time s
+ ///
+ static class DesignTimeDbContextFactoryHelpers
+ {
+ ///
+ /// Path to the json file to use for migrations configuration
+ ///
+ const string MigrationsJson = "appsettings.Development.json";
+
+ ///
+ public static IOptions GetDbContextOptions()
+ {
+ var builder = new ConfigurationBuilder();
+ builder.SetBasePath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
+ builder.AddJsonFile(MigrationsJson);
+ var configuration = builder.Build();
+ return Options.Create(configuration.GetSection(DatabaseConfiguration.Section).Get());
+ }
+ }
+}
diff --git a/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs b/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs
new file mode 100644
index 0000000000..33640bd86f
--- /dev/null
+++ b/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs
@@ -0,0 +1,15 @@
+using Microsoft.AspNetCore.Identity;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Design;
+using Microsoft.Extensions.Logging;
+using Tgstation.Server.Host.Core;
+
+namespace Tgstation.Server.Host.Models.Migrations
+{
+ ///
+ sealed class MySqlDesignTimeDbContextFactory : IDesignTimeDbContextFactory
+ {
+ ///
+ public MySqlDatabaseContext CreateDbContext(string[] args) => new MySqlDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new LoggerFactory(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher())));
+ }
+}
diff --git a/src/Tgstation.Server.Host/Models/Migrations/SqlServer/20180410203936_InitialCreate.Designer.cs b/src/Tgstation.Server.Host/Models/Migrations/SqlServer/20180410203936_InitialCreate.Designer.cs
new file mode 100644
index 0000000000..44d5df743e
--- /dev/null
+++ b/src/Tgstation.Server.Host/Models/Migrations/SqlServer/20180410203936_InitialCreate.Designer.cs
@@ -0,0 +1,512 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Metadata.Internal;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Tgstation.Server.Host.Models;
+
+namespace Tgstation.Server.Host.Models.Migrations.SqlServer
+{
+ [DbContext(typeof(SqlServerDatabaseContext))]
+ [Migration("20180410203936_InitialCreate")]
+ partial class InitialCreate
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "2.1.0-preview2-30571")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ChatSettingsId");
+
+ b.Property("ChatSettingsId1");
+
+ b.Property("DiscordChannelId");
+
+ b.Property("IrcChannel");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ChatSettingsId");
+
+ b.HasIndex("ChatSettingsId1");
+
+ b.ToTable("ChatChannels");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.ChatSettings", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("DiscordBotToken");
+
+ b.Property("DiscordEnabled");
+
+ b.Property("InstanceId");
+
+ b.Property("IrcEnabled");
+
+ b.Property("IrcHost")
+ .IsRequired();
+
+ b.Property("IrcNickServPassword");
+
+ b.Property("IrcPort");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InstanceId")
+ .IsUnique();
+
+ b.ToTable("ChatSettings");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ExitCode");
+
+ b.Property("FinishedAt");
+
+ b.Property("InstanceId");
+
+ b.Property("Output");
+
+ b.Property("RevisionInformationId");
+
+ b.Property("StartedAt");
+
+ b.Property("TargetedPrimaryDirectory");
+
+ b.Property("TriggeredById");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InstanceId");
+
+ b.HasIndex("RevisionInformationId");
+
+ b.HasIndex("TriggeredById");
+
+ b.ToTable("CompileJobs");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AccessToken");
+
+ b.Property("AllowWebClient");
+
+ b.Property("AutoStart");
+
+ b.Property("CompileJobId");
+
+ b.Property("InstanceId");
+
+ b.Property("PrimaryPort");
+
+ b.Property("ProcessId");
+
+ b.Property("SecondaryPort");
+
+ b.Property("SecurityLevel");
+
+ b.Property("SoftRestart");
+
+ b.Property("SoftShutdown");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CompileJobId");
+
+ b.HasIndex("InstanceId")
+ .IsUnique();
+
+ b.ToTable("DreamDaemonSettings");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AutoCompileInterval");
+
+ b.Property("CompileJobId");
+
+ b.Property("InstanceId");
+
+ b.Property("TargetDme");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CompileJobId");
+
+ b.HasIndex("InstanceId")
+ .IsUnique();
+
+ b.ToTable("DreamMakerSettings");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ConfigurationAllowed");
+
+ b.Property("Name")
+ .IsRequired();
+
+ b.Property("Online");
+
+ b.Property("Path")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.ToTable("Instances");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ByondRights");
+
+ b.Property("ChatSettingsRights");
+
+ b.Property("ConfigurationRights");
+
+ b.Property("DreamDaemonRights");
+
+ b.Property("DreamMakerRights");
+
+ b.Property("InstanceId");
+
+ b.Property("RepositoryRights");
+
+ b.Property("UserId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InstanceId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("InstanceUsers");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Cancelled");
+
+ b.Property("Description")
+ .IsRequired();
+
+ b.Property("InstanceId");
+
+ b.Property("StartedAt");
+
+ b.Property("StartedById");
+
+ b.Property("StoppedAt");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InstanceId");
+
+ b.HasIndex("StartedById");
+
+ b.ToTable("Jobs");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AccessToken");
+
+ b.Property("AccessUser");
+
+ b.Property("AutoUpdateInterval");
+
+ b.Property("CommitterEmail")
+ .IsRequired();
+
+ b.Property("CommitterName")
+ .IsRequired();
+
+ b.Property("InstanceId");
+
+ b.Property("Origin");
+
+ b.Property("PushTestMergeCommits");
+
+ b.Property("RevisionInformationId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InstanceId")
+ .IsUnique();
+
+ b.HasIndex("RevisionInformationId");
+
+ b.ToTable("RepositorySettings");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("OriginRevision")
+ .IsRequired()
+ .HasMaxLength(40);
+
+ b.Property("Revision")
+ .IsRequired()
+ .HasMaxLength(40);
+
+ b.HasKey("Id");
+
+ b.HasIndex("Revision")
+ .IsUnique();
+
+ b.ToTable("RevisionInformations");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.ServerSettings", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("EnableTelemetry");
+
+ b.Property("SystemAuthenticationGroup");
+
+ b.Property("UpstreamRepository");
+
+ b.HasKey("Id");
+
+ b.ToTable("ServerSettings");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Author")
+ .IsRequired();
+
+ b.Property("BodyAtMerge")
+ .IsRequired();
+
+ b.Property("InstanceId");
+
+ b.Property("MergedAt");
+
+ b.Property("MergedById");
+
+ b.Property("RevisionInformationId");
+
+ b.Property("TitleAtMerge")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("InstanceId");
+
+ b.HasIndex("MergedById");
+
+ b.HasIndex("RevisionInformationId");
+
+ b.ToTable("TestMerges");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AdministrationRights");
+
+ b.Property("CreatedAt");
+
+ b.Property("InstanceManagerRights");
+
+ b.Property("Name")
+ .IsRequired();
+
+ b.Property("PasswordHash");
+
+ b.Property("SystemIdentifier");
+
+ b.Property("TokenSecret")
+ .HasMaxLength(40);
+
+ b.HasKey("Id");
+
+ b.HasIndex("SystemIdentifier")
+ .IsUnique()
+ .HasFilter("[SystemIdentifier] IS NOT NULL");
+
+ b.ToTable("Users");
+ });
+
+ modelBuilder.Entity("ZNetCS.AspNetCore.Logging.EntityFrameworkCore.Log", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("EventId");
+
+ b.Property("Level");
+
+ b.Property("Message");
+
+ b.Property("Name")
+ .HasMaxLength(255);
+
+ b.Property("TimeStamp");
+
+ b.HasKey("Id");
+
+ b.ToTable("Logs");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
+ {
+ b.HasOne("Tgstation.Server.Host.Models.ChatSettings")
+ .WithMany("AdminChannels")
+ .HasForeignKey("ChatSettingsId");
+
+ b.HasOne("Tgstation.Server.Host.Models.ChatSettings")
+ .WithMany("GeneralChannels")
+ .HasForeignKey("ChatSettingsId1");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.ChatSettings", b =>
+ {
+ b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
+ .WithOne("ChatSettings")
+ .HasForeignKey("Tgstation.Server.Host.Models.ChatSettings", "InstanceId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
+ {
+ b.HasOne("Tgstation.Server.Host.Models.Instance")
+ .WithMany("CompileJobs")
+ .HasForeignKey("InstanceId");
+
+ b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
+ .WithMany()
+ .HasForeignKey("RevisionInformationId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("Tgstation.Server.Host.Models.User", "TriggeredBy")
+ .WithMany()
+ .HasForeignKey("TriggeredById")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
+ {
+ b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
+ .WithMany()
+ .HasForeignKey("CompileJobId");
+
+ 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.CompileJob", "CompileJob")
+ .WithMany()
+ .HasForeignKey("CompileJobId");
+
+ 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")
+ .WithMany("InstanceUsers")
+ .HasForeignKey("InstanceId");
+
+ b.HasOne("Tgstation.Server.Host.Models.User")
+ .WithMany("InstanceUsers")
+ .HasForeignKey("UserId");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
+ {
+ 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.RepositorySettings", b =>
+ {
+ b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
+ .WithOne("RepositorySettings")
+ .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
+ .WithMany()
+ .HasForeignKey("RevisionInformationId");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
+ {
+ b.HasOne("Tgstation.Server.Host.Models.Instance")
+ .WithMany("TestMerges")
+ .HasForeignKey("InstanceId");
+
+ b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
+ .WithMany()
+ .HasForeignKey("MergedById")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("Tgstation.Server.Host.Models.RevisionInformation")
+ .WithMany("TestMerges")
+ .HasForeignKey("RevisionInformationId");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/Tgstation.Server.Host/Models/Migrations/SqlServer/20180410203936_InitialCreate.cs b/src/Tgstation.Server.Host/Models/Migrations/SqlServer/20180410203936_InitialCreate.cs
new file mode 100644
index 0000000000..0a9656c3c1
--- /dev/null
+++ b/src/Tgstation.Server.Host/Models/Migrations/SqlServer/20180410203936_InitialCreate.cs
@@ -0,0 +1,537 @@
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace Tgstation.Server.Host.Models.Migrations.SqlServer
+{
+ public partial class InitialCreate : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "Instances",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ Name = table.Column(nullable: false),
+ Path = table.Column(nullable: false),
+ Online = table.Column(nullable: false),
+ ConfigurationAllowed = table.Column(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Instances", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Logs",
+ columns: table => new
+ {
+ EventId = table.Column(nullable: false),
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ Level = table.Column(nullable: false),
+ Message = table.Column(nullable: true),
+ Name = table.Column(maxLength: 255, nullable: true),
+ TimeStamp = table.Column(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Logs", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "RevisionInformations",
+ columns: table => new
+ {
+ Revision = table.Column(maxLength: 40, nullable: false),
+ OriginRevision = table.Column(maxLength: 40, nullable: false),
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_RevisionInformations", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "ServerSettings",
+ columns: table => new
+ {
+ SystemAuthenticationGroup = table.Column(nullable: true),
+ EnableTelemetry = table.Column(nullable: false),
+ UpstreamRepository = table.Column(nullable: true),
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_ServerSettings", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Users",
+ columns: table => new
+ {
+ AdministrationRights = table.Column(nullable: false),
+ CreatedAt = table.Column(nullable: false),
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ InstanceManagerRights = table.Column(nullable: false),
+ SystemIdentifier = table.Column(nullable: true),
+ Name = table.Column(nullable: false),
+ PasswordHash = table.Column(nullable: true),
+ TokenSecret = table.Column(maxLength: 40, nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Users", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "ChatSettings",
+ columns: table => new
+ {
+ IrcEnabled = table.Column(nullable: false),
+ IrcHost = table.Column(nullable: false),
+ IrcPort = table.Column(nullable: false),
+ IrcNickServPassword = table.Column(nullable: true),
+ DiscordEnabled = table.Column(nullable: false),
+ DiscordBotToken = table.Column(nullable: true),
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ InstanceId = table.Column(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_ChatSettings", x => x.Id);
+ table.ForeignKey(
+ name: "FK_ChatSettings_Instances_InstanceId",
+ column: x => x.InstanceId,
+ principalTable: "Instances",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "RepositorySettings",
+ columns: table => new
+ {
+ Origin = table.Column(nullable: true),
+ CommitterName = table.Column(nullable: false),
+ CommitterEmail = table.Column(nullable: false),
+ AccessUser = table.Column(nullable: true),
+ AccessToken = table.Column(nullable: true),
+ PushTestMergeCommits = table.Column(nullable: false),
+ AutoUpdateInterval = table.Column(nullable: true),
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ InstanceId = table.Column(nullable: false),
+ RevisionInformationId = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_RepositorySettings", x => x.Id);
+ table.ForeignKey(
+ name: "FK_RepositorySettings_Instances_InstanceId",
+ column: x => x.InstanceId,
+ principalTable: "Instances",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_RepositorySettings_RevisionInformations_RevisionInformationId",
+ column: x => x.RevisionInformationId,
+ principalTable: "RevisionInformations",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "CompileJobs",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ StartedAt = table.Column(nullable: false),
+ FinishedAt = table.Column(nullable: false),
+ TargetedPrimaryDirectory = table.Column(nullable: true),
+ Output = table.Column(nullable: true),
+ ExitCode = table.Column(nullable: true),
+ TriggeredById = table.Column(nullable: false),
+ RevisionInformationId = table.Column(nullable: false),
+ InstanceId = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_CompileJobs", x => x.Id);
+ table.ForeignKey(
+ name: "FK_CompileJobs_Instances_InstanceId",
+ column: x => x.InstanceId,
+ principalTable: "Instances",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ table.ForeignKey(
+ name: "FK_CompileJobs_RevisionInformations_RevisionInformationId",
+ column: x => x.RevisionInformationId,
+ principalTable: "RevisionInformations",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_CompileJobs_Users_TriggeredById",
+ column: x => x.TriggeredById,
+ principalTable: "Users",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "InstanceUsers",
+ columns: table => new
+ {
+ ByondRights = table.Column(nullable: false),
+ DreamDaemonRights = table.Column(nullable: false),
+ DreamMakerRights = table.Column(nullable: false),
+ RepositoryRights = table.Column(nullable: false),
+ ChatSettingsRights = table.Column(nullable: false),
+ ConfigurationRights = table.Column(nullable: false),
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ InstanceId = table.Column(nullable: true),
+ UserId = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_InstanceUsers", x => x.Id);
+ table.ForeignKey(
+ name: "FK_InstanceUsers_Instances_InstanceId",
+ column: x => x.InstanceId,
+ principalTable: "Instances",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ table.ForeignKey(
+ name: "FK_InstanceUsers_Users_UserId",
+ column: x => x.UserId,
+ principalTable: "Users",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Jobs",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ Description = table.Column(nullable: false),
+ StartedAt = table.Column(nullable: false),
+ StoppedAt = table.Column(nullable: false),
+ Cancelled = table.Column(nullable: false),
+ StartedById = table.Column(nullable: false),
+ InstanceId = table.Column(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Jobs", x => x.Id);
+ table.ForeignKey(
+ name: "FK_Jobs_Instances_InstanceId",
+ column: x => x.InstanceId,
+ principalTable: "Instances",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_Jobs_Users_StartedById",
+ column: x => x.StartedById,
+ principalTable: "Users",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "TestMerges",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ MergedAt = table.Column(nullable: false),
+ TitleAtMerge = table.Column(nullable: false),
+ BodyAtMerge = table.Column(nullable: false),
+ Author = table.Column(nullable: false),
+ MergedById = table.Column(nullable: false),
+ InstanceId = table.Column(nullable: true),
+ RevisionInformationId = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_TestMerges", x => x.Id);
+ table.ForeignKey(
+ name: "FK_TestMerges_Instances_InstanceId",
+ column: x => x.InstanceId,
+ principalTable: "Instances",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ table.ForeignKey(
+ name: "FK_TestMerges_Users_MergedById",
+ column: x => x.MergedById,
+ principalTable: "Users",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_TestMerges_RevisionInformations_RevisionInformationId",
+ column: x => x.RevisionInformationId,
+ principalTable: "RevisionInformations",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "ChatChannels",
+ columns: table => new
+ {
+ IrcChannel = table.Column(nullable: true),
+ DiscordChannelId = table.Column(nullable: false),
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ ChatSettingsId = table.Column(nullable: true),
+ ChatSettingsId1 = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_ChatChannels", x => x.Id);
+ table.ForeignKey(
+ name: "FK_ChatChannels_ChatSettings_ChatSettingsId",
+ column: x => x.ChatSettingsId,
+ principalTable: "ChatSettings",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ table.ForeignKey(
+ name: "FK_ChatChannels_ChatSettings_ChatSettingsId1",
+ column: x => x.ChatSettingsId1,
+ principalTable: "ChatSettings",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "DreamDaemonSettings",
+ columns: table => new
+ {
+ AutoStart = table.Column(nullable: false),
+ AllowWebClient = table.Column(nullable: false),
+ SoftRestart = table.Column(nullable: false),
+ SoftShutdown = table.Column(nullable: false),
+ SecurityLevel = table.Column(nullable: false),
+ PrimaryPort = table.Column(nullable: false),
+ SecondaryPort = table.Column(nullable: false),
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ ProcessId = table.Column(nullable: true),
+ AccessToken = table.Column(nullable: true),
+ InstanceId = table.Column(nullable: false),
+ CompileJobId = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_DreamDaemonSettings", x => x.Id);
+ table.ForeignKey(
+ name: "FK_DreamDaemonSettings_CompileJobs_CompileJobId",
+ column: x => x.CompileJobId,
+ principalTable: "CompileJobs",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ table.ForeignKey(
+ name: "FK_DreamDaemonSettings_Instances_InstanceId",
+ column: x => x.InstanceId,
+ principalTable: "Instances",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "DreamMakerSettings",
+ columns: table => new
+ {
+ AutoCompileInterval = table.Column(nullable: true),
+ TargetDme = table.Column(nullable: true),
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ InstanceId = table.Column(nullable: false),
+ CompileJobId = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_DreamMakerSettings", x => x.Id);
+ table.ForeignKey(
+ name: "FK_DreamMakerSettings_CompileJobs_CompileJobId",
+ column: x => x.CompileJobId,
+ principalTable: "CompileJobs",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ table.ForeignKey(
+ name: "FK_DreamMakerSettings_Instances_InstanceId",
+ column: x => x.InstanceId,
+ principalTable: "Instances",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_ChatChannels_ChatSettingsId",
+ table: "ChatChannels",
+ column: "ChatSettingsId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_ChatChannels_ChatSettingsId1",
+ table: "ChatChannels",
+ column: "ChatSettingsId1");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_ChatSettings_InstanceId",
+ table: "ChatSettings",
+ column: "InstanceId",
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_CompileJobs_InstanceId",
+ table: "CompileJobs",
+ column: "InstanceId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_CompileJobs_RevisionInformationId",
+ table: "CompileJobs",
+ column: "RevisionInformationId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_CompileJobs_TriggeredById",
+ table: "CompileJobs",
+ column: "TriggeredById");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_DreamDaemonSettings_CompileJobId",
+ table: "DreamDaemonSettings",
+ column: "CompileJobId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_DreamDaemonSettings_InstanceId",
+ table: "DreamDaemonSettings",
+ column: "InstanceId",
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_DreamMakerSettings_CompileJobId",
+ table: "DreamMakerSettings",
+ column: "CompileJobId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_DreamMakerSettings_InstanceId",
+ table: "DreamMakerSettings",
+ column: "InstanceId",
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_InstanceUsers_InstanceId",
+ table: "InstanceUsers",
+ column: "InstanceId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_InstanceUsers_UserId",
+ table: "InstanceUsers",
+ column: "UserId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Jobs_InstanceId",
+ table: "Jobs",
+ column: "InstanceId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Jobs_StartedById",
+ table: "Jobs",
+ column: "StartedById");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_RepositorySettings_InstanceId",
+ table: "RepositorySettings",
+ column: "InstanceId",
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_RepositorySettings_RevisionInformationId",
+ table: "RepositorySettings",
+ column: "RevisionInformationId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_RevisionInformations_Revision",
+ table: "RevisionInformations",
+ column: "Revision",
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_TestMerges_InstanceId",
+ table: "TestMerges",
+ column: "InstanceId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_TestMerges_MergedById",
+ table: "TestMerges",
+ column: "MergedById");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_TestMerges_RevisionInformationId",
+ table: "TestMerges",
+ column: "RevisionInformationId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Users_SystemIdentifier",
+ table: "Users",
+ column: "SystemIdentifier",
+ unique: true,
+ filter: "[SystemIdentifier] IS NOT NULL");
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "ChatChannels");
+
+ migrationBuilder.DropTable(
+ name: "DreamDaemonSettings");
+
+ migrationBuilder.DropTable(
+ name: "DreamMakerSettings");
+
+ migrationBuilder.DropTable(
+ name: "InstanceUsers");
+
+ migrationBuilder.DropTable(
+ name: "Jobs");
+
+ migrationBuilder.DropTable(
+ name: "Logs");
+
+ migrationBuilder.DropTable(
+ name: "RepositorySettings");
+
+ migrationBuilder.DropTable(
+ name: "ServerSettings");
+
+ migrationBuilder.DropTable(
+ name: "TestMerges");
+
+ migrationBuilder.DropTable(
+ name: "ChatSettings");
+
+ migrationBuilder.DropTable(
+ name: "CompileJobs");
+
+ migrationBuilder.DropTable(
+ name: "Instances");
+
+ migrationBuilder.DropTable(
+ name: "RevisionInformations");
+
+ migrationBuilder.DropTable(
+ name: "Users");
+ }
+ }
+}
diff --git a/src/Tgstation.Server.Host/Models/Migrations/SqlServer/SqlServerDatabaseContextModelSnapshot.cs b/src/Tgstation.Server.Host/Models/Migrations/SqlServer/SqlServerDatabaseContextModelSnapshot.cs
new file mode 100644
index 0000000000..46332b16f3
--- /dev/null
+++ b/src/Tgstation.Server.Host/Models/Migrations/SqlServer/SqlServerDatabaseContextModelSnapshot.cs
@@ -0,0 +1,511 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Metadata.Internal;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Tgstation.Server.Host.Models;
+
+namespace Tgstation.Server.Host.Models.Migrations.SqlServer
+{
+ [DbContext(typeof(SqlServerDatabaseContext))]
+ partial class SqlServerDatabaseContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "2.1.0-preview2-30571")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ChatSettingsId");
+
+ b.Property("ChatSettingsId1");
+
+ b.Property("DiscordChannelId");
+
+ b.Property("IrcChannel");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ChatSettingsId");
+
+ b.HasIndex("ChatSettingsId1");
+
+ b.ToTable("ChatChannels");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.ChatSettings", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("DiscordBotToken");
+
+ b.Property("DiscordEnabled");
+
+ b.Property("InstanceId");
+
+ b.Property("IrcEnabled");
+
+ b.Property("IrcHost")
+ .IsRequired();
+
+ b.Property("IrcNickServPassword");
+
+ b.Property("IrcPort");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InstanceId")
+ .IsUnique();
+
+ b.ToTable("ChatSettings");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ExitCode");
+
+ b.Property("FinishedAt");
+
+ b.Property("InstanceId");
+
+ b.Property("Output");
+
+ b.Property("RevisionInformationId");
+
+ b.Property("StartedAt");
+
+ b.Property("TargetedPrimaryDirectory");
+
+ b.Property("TriggeredById");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InstanceId");
+
+ b.HasIndex("RevisionInformationId");
+
+ b.HasIndex("TriggeredById");
+
+ b.ToTable("CompileJobs");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AccessToken");
+
+ b.Property("AllowWebClient");
+
+ b.Property("AutoStart");
+
+ b.Property("CompileJobId");
+
+ b.Property("InstanceId");
+
+ b.Property("PrimaryPort");
+
+ b.Property("ProcessId");
+
+ b.Property("SecondaryPort");
+
+ b.Property("SecurityLevel");
+
+ b.Property("SoftRestart");
+
+ b.Property("SoftShutdown");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CompileJobId");
+
+ b.HasIndex("InstanceId")
+ .IsUnique();
+
+ b.ToTable("DreamDaemonSettings");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AutoCompileInterval");
+
+ b.Property("CompileJobId");
+
+ b.Property("InstanceId");
+
+ b.Property("TargetDme");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CompileJobId");
+
+ b.HasIndex("InstanceId")
+ .IsUnique();
+
+ b.ToTable("DreamMakerSettings");
+ });
+
+ modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ConfigurationAllowed");
+
+ b.Property("Name")
+ .IsRequired();
+
+ b.Property("Online");
+
+ b.Property