From aba5e114bcbac9d9a15fc8370203de820ef25b72 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 10 Apr 2018 16:48:23 -0400 Subject: [PATCH] Add migrations MySQL currently unsupported due to https://bugs.mysql.com/bug.php?id=89855 --- .gitignore | 1 + .../Configuration/DatabaseConfiguration.cs | 1 + src/Tgstation.Server.Host/Core/Application.cs | 49 +- .../Models/DatabaseContext.cs | 41 +- .../DesignTimeDbContextFactoryHelpers.cs | 29 + .../MySqlDesignTimeDbContextFactory.cs | 15 + .../20180410203936_InitialCreate.Designer.cs | 512 +++++++++++++++++ .../SqlServer/20180410203936_InitialCreate.cs | 537 ++++++++++++++++++ .../SqlServerDatabaseContextModelSnapshot.cs | 511 +++++++++++++++++ .../SqlServerDesignTimeDbContextFactory.cs | 15 + .../20180410204120_InitialCreate.Designer.cs | 510 +++++++++++++++++ .../Sqlite/20180410204120_InitialCreate.cs | 535 +++++++++++++++++ .../SqliteDatabaseContextModelSnapshot.cs | 509 +++++++++++++++++ .../SqliteDesignTimeDbContextFactory.cs | 15 + .../Models/MySqlDatabaseContext.cs | 30 + .../Models/SqlServerDatabaseContext.cs | 30 + .../Models/SqliteDatabaseContext.cs | 30 + .../Tgstation.Server.Host.csproj | 8 +- .../appsettings.Development.json | 24 - 19 files changed, 3339 insertions(+), 63 deletions(-) create mode 100644 src/Tgstation.Server.Host/Models/Migrations/DesignTimeDbContextFactoryHelpers.cs create mode 100644 src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs create mode 100644 src/Tgstation.Server.Host/Models/Migrations/SqlServer/20180410203936_InitialCreate.Designer.cs create mode 100644 src/Tgstation.Server.Host/Models/Migrations/SqlServer/20180410203936_InitialCreate.cs create mode 100644 src/Tgstation.Server.Host/Models/Migrations/SqlServer/SqlServerDatabaseContextModelSnapshot.cs create mode 100644 src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs create mode 100644 src/Tgstation.Server.Host/Models/Migrations/Sqlite/20180410204120_InitialCreate.Designer.cs create mode 100644 src/Tgstation.Server.Host/Models/Migrations/Sqlite/20180410204120_InitialCreate.cs create mode 100644 src/Tgstation.Server.Host/Models/Migrations/Sqlite/SqliteDatabaseContextModelSnapshot.cs create mode 100644 src/Tgstation.Server.Host/Models/Migrations/SqliteDesignTimeDbContextFactory.cs create mode 100644 src/Tgstation.Server.Host/Models/MySqlDatabaseContext.cs create mode 100644 src/Tgstation.Server.Host/Models/SqlServerDatabaseContext.cs create mode 100644 src/Tgstation.Server.Host/Models/SqliteDatabaseContext.cs delete mode 100644 src/Tgstation.Server.Host/appsettings.Development.json 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("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/SqlServerDesignTimeDbContextFactory.cs b/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs new file mode 100644 index 0000000000..2b6f15c7cb --- /dev/null +++ b/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.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 SqlServerDesignTimeDbContextFactory : IDesignTimeDbContextFactory + { + /// + public SqlServerDatabaseContext CreateDbContext(string[] args) => new SqlServerDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new LoggerFactory(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher()))); + } +} diff --git a/src/Tgstation.Server.Host/Models/Migrations/Sqlite/20180410204120_InitialCreate.Designer.cs b/src/Tgstation.Server.Host/Models/Migrations/Sqlite/20180410204120_InitialCreate.Designer.cs new file mode 100644 index 0000000000..0194884160 --- /dev/null +++ b/src/Tgstation.Server.Host/Models/Migrations/Sqlite/20180410204120_InitialCreate.Designer.cs @@ -0,0 +1,510 @@ +// +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.Sqlite +{ + [DbContext(typeof(SqliteDatabaseContext))] + [Migration("20180410204120_InitialCreate")] + partial class InitialCreate + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.1.0-preview2-30571"); + + 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(); + + 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/Sqlite/20180410204120_InitialCreate.cs b/src/Tgstation.Server.Host/Models/Migrations/Sqlite/20180410204120_InitialCreate.cs new file mode 100644 index 0000000000..433fd2978e --- /dev/null +++ b/src/Tgstation.Server.Host/Models/Migrations/Sqlite/20180410204120_InitialCreate.cs @@ -0,0 +1,535 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Tgstation.Server.Host.Models.Migrations.Sqlite +{ + public partial class InitialCreate : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Instances", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + 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("Sqlite:Autoincrement", true), + 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("Sqlite:Autoincrement", true) + }, + 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("Sqlite:Autoincrement", true) + }, + 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("Sqlite:Autoincrement", true), + 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("Sqlite:Autoincrement", true), + 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("Sqlite:Autoincrement", true), + 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("Sqlite:Autoincrement", true), + 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("Sqlite:Autoincrement", true), + 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("Sqlite:Autoincrement", true), + 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("Sqlite:Autoincrement", true), + 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("Sqlite:Autoincrement", true), + 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("Sqlite:Autoincrement", true), + 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("Sqlite:Autoincrement", true), + 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); + } + + 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/Sqlite/SqliteDatabaseContextModelSnapshot.cs b/src/Tgstation.Server.Host/Models/Migrations/Sqlite/SqliteDatabaseContextModelSnapshot.cs new file mode 100644 index 0000000000..499518c925 --- /dev/null +++ b/src/Tgstation.Server.Host/Models/Migrations/Sqlite/SqliteDatabaseContextModelSnapshot.cs @@ -0,0 +1,509 @@ +// +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.Sqlite +{ + [DbContext(typeof(SqliteDatabaseContext))] + partial class SqliteDatabaseContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.1.0-preview2-30571"); + + 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(); + + 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/SqliteDesignTimeDbContextFactory.cs b/src/Tgstation.Server.Host/Models/Migrations/SqliteDesignTimeDbContextFactory.cs new file mode 100644 index 0000000000..21087ac164 --- /dev/null +++ b/src/Tgstation.Server.Host/Models/Migrations/SqliteDesignTimeDbContextFactory.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 SqliteDesignTimeDbContextFactory : IDesignTimeDbContextFactory + { + /// + public SqliteDatabaseContext CreateDbContext(string[] args) => new SqliteDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new LoggerFactory(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher()))); + } +} diff --git a/src/Tgstation.Server.Host/Models/MySqlDatabaseContext.cs b/src/Tgstation.Server.Host/Models/MySqlDatabaseContext.cs new file mode 100644 index 0000000000..c46d26c1ba --- /dev/null +++ b/src/Tgstation.Server.Host/Models/MySqlDatabaseContext.cs @@ -0,0 +1,30 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Tgstation.Server.Host.Configuration; + +namespace Tgstation.Server.Host.Models +{ + /// + /// for MySQL + /// + sealed class MySqlDatabaseContext : DatabaseContext + { + /// + /// Construct a + /// + /// The for the + /// The of for the + /// The for the + /// The for the + public MySqlDatabaseContext(DbContextOptions dbContextOptions, IOptions databaseConfiguration, ILoggerFactory loggerFactory, IDatabaseSeeder databaseSeeder) : base(dbContextOptions, databaseConfiguration, loggerFactory, databaseSeeder) + { } + + /// + protected override void OnConfiguring(DbContextOptionsBuilder options) + { + base.OnConfiguring(options); + options.UseMySQL(ConnectionString); + } + } +} diff --git a/src/Tgstation.Server.Host/Models/SqlServerDatabaseContext.cs b/src/Tgstation.Server.Host/Models/SqlServerDatabaseContext.cs new file mode 100644 index 0000000000..7003c01085 --- /dev/null +++ b/src/Tgstation.Server.Host/Models/SqlServerDatabaseContext.cs @@ -0,0 +1,30 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Tgstation.Server.Host.Configuration; + +namespace Tgstation.Server.Host.Models +{ + /// + /// for Sqlserver + /// + sealed class SqlServerDatabaseContext : DatabaseContext + { + /// + /// Construct a + /// + /// The for the + /// The of for the + /// The for the + /// The for the + public SqlServerDatabaseContext(DbContextOptions dbContextOptions, IOptions databaseConfiguration, ILoggerFactory loggerFactory, IDatabaseSeeder databaseSeeder) : base(dbContextOptions, databaseConfiguration, loggerFactory, databaseSeeder) + { } + + /// + protected override void OnConfiguring(DbContextOptionsBuilder options) + { + base.OnConfiguring(options); + options.UseSqlServer(ConnectionString); + } + } +} diff --git a/src/Tgstation.Server.Host/Models/SqliteDatabaseContext.cs b/src/Tgstation.Server.Host/Models/SqliteDatabaseContext.cs new file mode 100644 index 0000000000..3581d3d130 --- /dev/null +++ b/src/Tgstation.Server.Host/Models/SqliteDatabaseContext.cs @@ -0,0 +1,30 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Tgstation.Server.Host.Configuration; + +namespace Tgstation.Server.Host.Models +{ + /// + /// for Sqlite + /// + sealed class SqliteDatabaseContext : DatabaseContext + { + /// + /// Construct a + /// + /// The for the + /// The of for the + /// The for the + /// The for the + public SqliteDatabaseContext(DbContextOptions dbContextOptions, IOptions databaseConfiguration, ILoggerFactory loggerFactory, IDatabaseSeeder databaseSeeder) : base(dbContextOptions, databaseConfiguration, loggerFactory, databaseSeeder) + { } + + /// + protected override void OnConfiguring(DbContextOptionsBuilder options) + { + base.OnConfiguring(options); + options.UseSqlite(ConnectionString); + } + } +} diff --git a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj index f97f3f42ea..acd5be3e36 100644 --- a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj +++ b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj @@ -41,13 +41,19 @@ + - + + + + + + diff --git a/src/Tgstation.Server.Host/appsettings.Development.json b/src/Tgstation.Server.Host/appsettings.Development.json deleted file mode 100644 index 1350bf6fde..0000000000 --- a/src/Tgstation.Server.Host/appsettings.Development.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Logging": { - "IncludeScopes": false, - "Debug": { - "LogLevel": { - "Default": "Debug" - } - }, - "Console": { - "LogLevel": { - "Default": "Trace" - } - }, - "EntityFramework": { - "LogLevel": { - "Default": "Warning" - } - } - }, - "Database": { - "DatabaseType": "Sqlite", - "ConnectionString": "Data Source=TestDB.sqlite3" - } -}