aboutsummaryrefslogtreecommitdiff
path: root/Timeline
diff options
context:
space:
mode:
Diffstat (limited to 'Timeline')
-rw-r--r--Timeline/Configs/DatabaseConfig.cs4
-rw-r--r--Timeline/Entities/DatabaseContext.cs21
-rw-r--r--Timeline/Entities/TimelineMemberEntity.cs1
-rw-r--r--Timeline/Migrations/DevelopmentDatabase/20200105150407_Initialize.Designer.cs269
-rw-r--r--Timeline/Migrations/DevelopmentDatabase/20200105150407_Initialize.cs217
-rw-r--r--Timeline/Migrations/DevelopmentDatabase/DevelopmentDatabaseContextModelSnapshot.cs267
-rw-r--r--Timeline/Migrations/ProductionDatabase/20191031064541_Initialize.Designer.cs (renamed from Timeline/Migrations/20191031064541_Initialize.Designer.cs)4
-rw-r--r--Timeline/Migrations/ProductionDatabase/20191031064541_Initialize.cs (renamed from Timeline/Migrations/20191031064541_Initialize.cs)2
-rw-r--r--Timeline/Migrations/ProductionDatabase/20191120104512_InitTimeline.Designer.cs (renamed from Timeline/Migrations/20191120104512_InitTimeline.Designer.cs)4
-rw-r--r--Timeline/Migrations/ProductionDatabase/20191120104512_InitTimeline.cs (renamed from Timeline/Migrations/20191120104512_InitTimeline.cs)2
-rw-r--r--Timeline/Migrations/ProductionDatabase/20200105151839_RenameTimelineMember.Designer.cs270
-rw-r--r--Timeline/Migrations/ProductionDatabase/20200105151839_RenameTimelineMember.cs107
-rw-r--r--Timeline/Migrations/ProductionDatabase/ProductionDatabaseContextModelSnapshot.cs (renamed from Timeline/Migrations/DatabaseContextModelSnapshot.cs)10
-rw-r--r--Timeline/Properties/launchSettings.json16
-rw-r--r--Timeline/Startup.cs51
-rw-r--r--Timeline/Timeline.csproj7
-rw-r--r--Timeline/appsettings.Development.json3
-rw-r--r--Timeline/appsettings.Production.json5
18 files changed, 1219 insertions, 41 deletions
diff --git a/Timeline/Configs/DatabaseConfig.cs b/Timeline/Configs/DatabaseConfig.cs
index c9309b08..e1231bcd 100644
--- a/Timeline/Configs/DatabaseConfig.cs
+++ b/Timeline/Configs/DatabaseConfig.cs
@@ -2,6 +2,10 @@ namespace Timeline.Configs
{
public class DatabaseConfig
{
+ public bool UseDevelopment { get; set; } = false;
+
public string ConnectionString { get; set; } = default!;
+
+ public string DevelopmentConnectionString { get; set; } = default!;
}
}
diff --git a/Timeline/Entities/DatabaseContext.cs b/Timeline/Entities/DatabaseContext.cs
index 123ae0f3..ffb6158a 100644
--- a/Timeline/Entities/DatabaseContext.cs
+++ b/Timeline/Entities/DatabaseContext.cs
@@ -2,9 +2,9 @@ using Microsoft.EntityFrameworkCore;
namespace Timeline.Entities
{
- public class DatabaseContext : DbContext
+ public abstract class DatabaseContext : DbContext
{
- public DatabaseContext(DbContextOptions<DatabaseContext> options)
+ public DatabaseContext(DbContextOptions options)
: base(options)
{
@@ -24,4 +24,21 @@ namespace Timeline.Entities
public DbSet<TimelinePostEntity> TimelinePosts { get; set; } = default!;
public DbSet<TimelineMemberEntity> TimelineMembers { get; set; } = default!;
}
+ public class ProductionDatabaseContext : DatabaseContext
+ {
+ public ProductionDatabaseContext(DbContextOptions<ProductionDatabaseContext> options)
+ : base(options)
+ {
+
+ }
+ }
+
+ public class DevelopmentDatabaseContext : DatabaseContext
+ {
+ public DevelopmentDatabaseContext(DbContextOptions<DevelopmentDatabaseContext> options)
+ : base(options)
+ {
+
+ }
+ }
}
diff --git a/Timeline/Entities/TimelineMemberEntity.cs b/Timeline/Entities/TimelineMemberEntity.cs
index c8961013..dbe861bd 100644
--- a/Timeline/Entities/TimelineMemberEntity.cs
+++ b/Timeline/Entities/TimelineMemberEntity.cs
@@ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace Timeline.Entities
{
+ [Table("timeline_members")]
public class TimelineMemberEntity
{
[Column("id"), Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
diff --git a/Timeline/Migrations/DevelopmentDatabase/20200105150407_Initialize.Designer.cs b/Timeline/Migrations/DevelopmentDatabase/20200105150407_Initialize.Designer.cs
new file mode 100644
index 00000000..6fe1044c
--- /dev/null
+++ b/Timeline/Migrations/DevelopmentDatabase/20200105150407_Initialize.Designer.cs
@@ -0,0 +1,269 @@
+// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Timeline.Entities;
+
+namespace Timeline.Migrations.DevelopmentDatabase
+{
+ [DbContext(typeof(DevelopmentDatabaseContext))]
+ [Migration("20200105150407_Initialize")]
+ partial class Initialize
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "3.1.0");
+
+ modelBuilder.Entity("Timeline.Entities.TimelineEntity", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("INTEGER");
+
+ b.Property<DateTime>("CreateTime")
+ .HasColumnName("create_time")
+ .HasColumnType("TEXT");
+
+ b.Property<string>("Description")
+ .HasColumnName("description")
+ .HasColumnType("TEXT");
+
+ b.Property<string>("Name")
+ .HasColumnName("name")
+ .HasColumnType("TEXT");
+
+ b.Property<long>("OwnerId")
+ .HasColumnName("owner")
+ .HasColumnType("INTEGER");
+
+ b.Property<int>("Visibility")
+ .HasColumnName("visibility")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OwnerId");
+
+ b.ToTable("timelines");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelineMemberEntity", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("INTEGER");
+
+ b.Property<long>("TimelineId")
+ .HasColumnName("timeline")
+ .HasColumnType("INTEGER");
+
+ b.Property<long>("UserId")
+ .HasColumnName("user")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TimelineId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("timeline_members");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("INTEGER");
+
+ b.Property<long>("AuthorId")
+ .HasColumnName("author")
+ .HasColumnType("INTEGER");
+
+ b.Property<string>("Content")
+ .HasColumnName("content")
+ .HasColumnType("TEXT");
+
+ b.Property<DateTime>("LastUpdated")
+ .HasColumnName("last_updated")
+ .HasColumnType("TEXT");
+
+ b.Property<DateTime>("Time")
+ .HasColumnName("time")
+ .HasColumnType("TEXT");
+
+ b.Property<long>("TimelineId")
+ .HasColumnName("timeline")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuthorId");
+
+ b.HasIndex("TimelineId");
+
+ b.ToTable("timeline_posts");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.User", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("INTEGER");
+
+ b.Property<string>("EncryptedPassword")
+ .IsRequired()
+ .HasColumnName("password")
+ .HasColumnType("TEXT");
+
+ b.Property<string>("Name")
+ .IsRequired()
+ .HasColumnName("name")
+ .HasColumnType("TEXT")
+ .HasMaxLength(26);
+
+ b.Property<string>("RoleString")
+ .IsRequired()
+ .HasColumnName("roles")
+ .HasColumnType("TEXT");
+
+ b.Property<long>("Version")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("version")
+ .HasColumnType("INTEGER")
+ .HasDefaultValue(0L);
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("users");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.UserAvatar", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("INTEGER");
+
+ b.Property<byte[]>("Data")
+ .HasColumnName("data")
+ .HasColumnType("BLOB");
+
+ b.Property<string>("ETag")
+ .HasColumnName("etag")
+ .HasColumnType("TEXT")
+ .HasMaxLength(30);
+
+ b.Property<DateTime>("LastModified")
+ .HasColumnName("last_modified")
+ .HasColumnType("TEXT");
+
+ b.Property<string>("Type")
+ .HasColumnName("type")
+ .HasColumnType("TEXT");
+
+ b.Property<long>("UserId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId")
+ .IsUnique();
+
+ b.ToTable("user_avatars");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.UserDetail", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("INTEGER");
+
+ b.Property<string>("Nickname")
+ .HasColumnName("nickname")
+ .HasColumnType("TEXT")
+ .HasMaxLength(26);
+
+ b.Property<long>("UserId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId")
+ .IsUnique();
+
+ b.ToTable("user_details");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelineEntity", b =>
+ {
+ b.HasOne("Timeline.Entities.User", "Owner")
+ .WithMany("Timelines")
+ .HasForeignKey("OwnerId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelineMemberEntity", b =>
+ {
+ b.HasOne("Timeline.Entities.TimelineEntity", "Timeline")
+ .WithMany("Members")
+ .HasForeignKey("TimelineId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Timeline.Entities.User", "User")
+ .WithMany("TimelinesJoined")
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b =>
+ {
+ b.HasOne("Timeline.Entities.User", "Author")
+ .WithMany("TimelinePosts")
+ .HasForeignKey("AuthorId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Timeline.Entities.TimelineEntity", "Timeline")
+ .WithMany("Posts")
+ .HasForeignKey("TimelineId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Timeline.Entities.UserAvatar", b =>
+ {
+ b.HasOne("Timeline.Entities.User", null)
+ .WithOne("Avatar")
+ .HasForeignKey("Timeline.Entities.UserAvatar", "UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Timeline.Entities.UserDetail", b =>
+ {
+ b.HasOne("Timeline.Entities.User", null)
+ .WithOne("Detail")
+ .HasForeignKey("Timeline.Entities.UserDetail", "UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Timeline/Migrations/DevelopmentDatabase/20200105150407_Initialize.cs b/Timeline/Migrations/DevelopmentDatabase/20200105150407_Initialize.cs
new file mode 100644
index 00000000..c6efaa4b
--- /dev/null
+++ b/Timeline/Migrations/DevelopmentDatabase/20200105150407_Initialize.cs
@@ -0,0 +1,217 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace Timeline.Migrations.DevelopmentDatabase
+{
+ public partial class Initialize : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "users",
+ columns: table => new
+ {
+ id = table.Column<long>(nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ name = table.Column<string>(maxLength: 26, nullable: false),
+ password = table.Column<string>(nullable: false),
+ roles = table.Column<string>(nullable: false),
+ version = table.Column<long>(nullable: false, defaultValue: 0L)
+ .Annotation("Sqlite:Autoincrement", true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_users", x => x.id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "timelines",
+ columns: table => new
+ {
+ id = table.Column<long>(nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ name = table.Column<string>(nullable: true),
+ description = table.Column<string>(nullable: true),
+ owner = table.Column<long>(nullable: false),
+ visibility = table.Column<int>(nullable: false),
+ create_time = table.Column<DateTime>(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_timelines", x => x.id);
+ table.ForeignKey(
+ name: "FK_timelines_users_owner",
+ column: x => x.owner,
+ principalTable: "users",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "user_avatars",
+ columns: table => new
+ {
+ id = table.Column<long>(nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ data = table.Column<byte[]>(nullable: true),
+ type = table.Column<string>(nullable: true),
+ etag = table.Column<string>(maxLength: 30, nullable: true),
+ last_modified = table.Column<DateTime>(nullable: false),
+ UserId = table.Column<long>(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_user_avatars", x => x.id);
+ table.ForeignKey(
+ name: "FK_user_avatars_users_UserId",
+ column: x => x.UserId,
+ principalTable: "users",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "user_details",
+ columns: table => new
+ {
+ id = table.Column<long>(nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ nickname = table.Column<string>(maxLength: 26, nullable: true),
+ UserId = table.Column<long>(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_user_details", x => x.id);
+ table.ForeignKey(
+ name: "FK_user_details_users_UserId",
+ column: x => x.UserId,
+ principalTable: "users",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "timeline_members",
+ columns: table => new
+ {
+ id = table.Column<long>(nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ user = table.Column<long>(nullable: false),
+ timeline = table.Column<long>(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_timeline_members", x => x.id);
+ table.ForeignKey(
+ name: "FK_timeline_members_timelines_timeline",
+ column: x => x.timeline,
+ principalTable: "timelines",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_timeline_members_users_user",
+ column: x => x.user,
+ principalTable: "users",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "timeline_posts",
+ columns: table => new
+ {
+ id = table.Column<long>(nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ timeline = table.Column<long>(nullable: false),
+ author = table.Column<long>(nullable: false),
+ content = table.Column<string>(nullable: true),
+ time = table.Column<DateTime>(nullable: false),
+ last_updated = table.Column<DateTime>(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_timeline_posts", x => x.id);
+ table.ForeignKey(
+ name: "FK_timeline_posts_users_author",
+ column: x => x.author,
+ principalTable: "users",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_timeline_posts_timelines_timeline",
+ column: x => x.timeline,
+ principalTable: "timelines",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_timeline_members_timeline",
+ table: "timeline_members",
+ column: "timeline");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_timeline_members_user",
+ table: "timeline_members",
+ column: "user");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_timeline_posts_author",
+ table: "timeline_posts",
+ column: "author");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_timeline_posts_timeline",
+ table: "timeline_posts",
+ column: "timeline");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_timelines_owner",
+ table: "timelines",
+ column: "owner");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_user_avatars_UserId",
+ table: "user_avatars",
+ column: "UserId",
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_user_details_UserId",
+ table: "user_details",
+ column: "UserId",
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_users_name",
+ table: "users",
+ column: "name",
+ unique: true);
+
+ // Add a init user. Username is "administrator". Password is "crupest".
+ migrationBuilder.InsertData("users", new string[] { "name", "password", "roles" },
+ new object[] { "administrator", "AQAAAAEAACcQAAAAENsspZrk8Wo+UuMyg6QuWJsNvRg6gVu4K/TumVod3h9GVLX9zDVuQQds3o7V8QWJ2w==", "user,admin" });
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "timeline_members");
+
+ migrationBuilder.DropTable(
+ name: "timeline_posts");
+
+ migrationBuilder.DropTable(
+ name: "user_avatars");
+
+ migrationBuilder.DropTable(
+ name: "user_details");
+
+ migrationBuilder.DropTable(
+ name: "timelines");
+
+ migrationBuilder.DropTable(
+ name: "users");
+ }
+ }
+}
diff --git a/Timeline/Migrations/DevelopmentDatabase/DevelopmentDatabaseContextModelSnapshot.cs b/Timeline/Migrations/DevelopmentDatabase/DevelopmentDatabaseContextModelSnapshot.cs
new file mode 100644
index 00000000..6fbaea5f
--- /dev/null
+++ b/Timeline/Migrations/DevelopmentDatabase/DevelopmentDatabaseContextModelSnapshot.cs
@@ -0,0 +1,267 @@
+// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Timeline.Entities;
+
+namespace Timeline.Migrations.DevelopmentDatabase
+{
+ [DbContext(typeof(DevelopmentDatabaseContext))]
+ partial class DevelopmentDatabaseContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "3.1.0");
+
+ modelBuilder.Entity("Timeline.Entities.TimelineEntity", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("INTEGER");
+
+ b.Property<DateTime>("CreateTime")
+ .HasColumnName("create_time")
+ .HasColumnType("TEXT");
+
+ b.Property<string>("Description")
+ .HasColumnName("description")
+ .HasColumnType("TEXT");
+
+ b.Property<string>("Name")
+ .HasColumnName("name")
+ .HasColumnType("TEXT");
+
+ b.Property<long>("OwnerId")
+ .HasColumnName("owner")
+ .HasColumnType("INTEGER");
+
+ b.Property<int>("Visibility")
+ .HasColumnName("visibility")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OwnerId");
+
+ b.ToTable("timelines");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelineMemberEntity", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("INTEGER");
+
+ b.Property<long>("TimelineId")
+ .HasColumnName("timeline")
+ .HasColumnType("INTEGER");
+
+ b.Property<long>("UserId")
+ .HasColumnName("user")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TimelineId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("timeline_members");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("INTEGER");
+
+ b.Property<long>("AuthorId")
+ .HasColumnName("author")
+ .HasColumnType("INTEGER");
+
+ b.Property<string>("Content")
+ .HasColumnName("content")
+ .HasColumnType("TEXT");
+
+ b.Property<DateTime>("LastUpdated")
+ .HasColumnName("last_updated")
+ .HasColumnType("TEXT");
+
+ b.Property<DateTime>("Time")
+ .HasColumnName("time")
+ .HasColumnType("TEXT");
+
+ b.Property<long>("TimelineId")
+ .HasColumnName("timeline")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuthorId");
+
+ b.HasIndex("TimelineId");
+
+ b.ToTable("timeline_posts");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.User", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("INTEGER");
+
+ b.Property<string>("EncryptedPassword")
+ .IsRequired()
+ .HasColumnName("password")
+ .HasColumnType("TEXT");
+
+ b.Property<string>("Name")
+ .IsRequired()
+ .HasColumnName("name")
+ .HasColumnType("TEXT")
+ .HasMaxLength(26);
+
+ b.Property<string>("RoleString")
+ .IsRequired()
+ .HasColumnName("roles")
+ .HasColumnType("TEXT");
+
+ b.Property<long>("Version")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("version")
+ .HasColumnType("INTEGER")
+ .HasDefaultValue(0L);
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("users");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.UserAvatar", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("INTEGER");
+
+ b.Property<byte[]>("Data")
+ .HasColumnName("data")
+ .HasColumnType("BLOB");
+
+ b.Property<string>("ETag")
+ .HasColumnName("etag")
+ .HasColumnType("TEXT")
+ .HasMaxLength(30);
+
+ b.Property<DateTime>("LastModified")
+ .HasColumnName("last_modified")
+ .HasColumnType("TEXT");
+
+ b.Property<string>("Type")
+ .HasColumnName("type")
+ .HasColumnType("TEXT");
+
+ b.Property<long>("UserId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId")
+ .IsUnique();
+
+ b.ToTable("user_avatars");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.UserDetail", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("INTEGER");
+
+ b.Property<string>("Nickname")
+ .HasColumnName("nickname")
+ .HasColumnType("TEXT")
+ .HasMaxLength(26);
+
+ b.Property<long>("UserId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId")
+ .IsUnique();
+
+ b.ToTable("user_details");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelineEntity", b =>
+ {
+ b.HasOne("Timeline.Entities.User", "Owner")
+ .WithMany("Timelines")
+ .HasForeignKey("OwnerId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelineMemberEntity", b =>
+ {
+ b.HasOne("Timeline.Entities.TimelineEntity", "Timeline")
+ .WithMany("Members")
+ .HasForeignKey("TimelineId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Timeline.Entities.User", "User")
+ .WithMany("TimelinesJoined")
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b =>
+ {
+ b.HasOne("Timeline.Entities.User", "Author")
+ .WithMany("TimelinePosts")
+ .HasForeignKey("AuthorId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Timeline.Entities.TimelineEntity", "Timeline")
+ .WithMany("Posts")
+ .HasForeignKey("TimelineId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Timeline.Entities.UserAvatar", b =>
+ {
+ b.HasOne("Timeline.Entities.User", null)
+ .WithOne("Avatar")
+ .HasForeignKey("Timeline.Entities.UserAvatar", "UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Timeline.Entities.UserDetail", b =>
+ {
+ b.HasOne("Timeline.Entities.User", null)
+ .WithOne("Detail")
+ .HasForeignKey("Timeline.Entities.UserDetail", "UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Timeline/Migrations/20191031064541_Initialize.Designer.cs b/Timeline/Migrations/ProductionDatabase/20191031064541_Initialize.Designer.cs
index 60cb4095..cd584b3c 100644
--- a/Timeline/Migrations/20191031064541_Initialize.Designer.cs
+++ b/Timeline/Migrations/ProductionDatabase/20191031064541_Initialize.Designer.cs
@@ -6,9 +6,9 @@ using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Timeline.Entities;
-namespace Timeline.Migrations
+namespace Timeline.Migrations.ProductionDatabase
{
- [DbContext(typeof(DatabaseContext))]
+ [DbContext(typeof(ProductionDatabaseContext))]
[Migration("20191031064541_Initialize")]
partial class Initialize
{
diff --git a/Timeline/Migrations/20191031064541_Initialize.cs b/Timeline/Migrations/ProductionDatabase/20191031064541_Initialize.cs
index 73521102..dc989a96 100644
--- a/Timeline/Migrations/20191031064541_Initialize.cs
+++ b/Timeline/Migrations/ProductionDatabase/20191031064541_Initialize.cs
@@ -2,7 +2,7 @@
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
-namespace Timeline.Migrations
+namespace Timeline.Migrations.ProductionDatabase
{
public partial class Initialize : Migration
{
diff --git a/Timeline/Migrations/20191120104512_InitTimeline.Designer.cs b/Timeline/Migrations/ProductionDatabase/20191120104512_InitTimeline.Designer.cs
index 2bff5d68..d50e8330 100644
--- a/Timeline/Migrations/20191120104512_InitTimeline.Designer.cs
+++ b/Timeline/Migrations/ProductionDatabase/20191120104512_InitTimeline.Designer.cs
@@ -6,9 +6,9 @@ using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Timeline.Entities;
-namespace Timeline.Migrations
+namespace Timeline.Migrations.ProductionDatabase
{
- [DbContext(typeof(DatabaseContext))]
+ [DbContext(typeof(ProductionDatabaseContext))]
[Migration("20191120104512_InitTimeline")]
partial class InitTimeline
{
diff --git a/Timeline/Migrations/20191120104512_InitTimeline.cs b/Timeline/Migrations/ProductionDatabase/20191120104512_InitTimeline.cs
index a702864f..9b80ad30 100644
--- a/Timeline/Migrations/20191120104512_InitTimeline.cs
+++ b/Timeline/Migrations/ProductionDatabase/20191120104512_InitTimeline.cs
@@ -2,7 +2,7 @@
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
-namespace Timeline.Migrations
+namespace Timeline.Migrations.ProductionDatabase
{
public partial class InitTimeline : Migration
{
diff --git a/Timeline/Migrations/ProductionDatabase/20200105151839_RenameTimelineMember.Designer.cs b/Timeline/Migrations/ProductionDatabase/20200105151839_RenameTimelineMember.Designer.cs
new file mode 100644
index 00000000..356406fa
--- /dev/null
+++ b/Timeline/Migrations/ProductionDatabase/20200105151839_RenameTimelineMember.Designer.cs
@@ -0,0 +1,270 @@
+// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Timeline.Entities;
+
+namespace Timeline.Migrations.ProductionDatabase
+{
+ [DbContext(typeof(ProductionDatabaseContext))]
+ [Migration("20200105151839_RenameTimelineMember")]
+ partial class RenameTimelineMember
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "3.1.0")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ modelBuilder.Entity("Timeline.Entities.TimelineEntity", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("bigint");
+
+ b.Property<DateTime>("CreateTime")
+ .HasColumnName("create_time")
+ .HasColumnType("datetime(6)");
+
+ b.Property<string>("Description")
+ .HasColumnName("description")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property<string>("Name")
+ .HasColumnName("name")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property<long>("OwnerId")
+ .HasColumnName("owner")
+ .HasColumnType("bigint");
+
+ b.Property<int>("Visibility")
+ .HasColumnName("visibility")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OwnerId");
+
+ b.ToTable("timelines");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelineMemberEntity", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("bigint");
+
+ b.Property<long>("TimelineId")
+ .HasColumnName("timeline")
+ .HasColumnType("bigint");
+
+ b.Property<long>("UserId")
+ .HasColumnName("user")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TimelineId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("timeline_members");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("bigint");
+
+ b.Property<long>("AuthorId")
+ .HasColumnName("author")
+ .HasColumnType("bigint");
+
+ b.Property<string>("Content")
+ .HasColumnName("content")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property<DateTime>("LastUpdated")
+ .HasColumnName("last_updated")
+ .HasColumnType("datetime(6)");
+
+ b.Property<DateTime>("Time")
+ .HasColumnName("time")
+ .HasColumnType("datetime(6)");
+
+ b.Property<long>("TimelineId")
+ .HasColumnName("timeline")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuthorId");
+
+ b.HasIndex("TimelineId");
+
+ b.ToTable("timeline_posts");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.User", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("bigint");
+
+ b.Property<string>("EncryptedPassword")
+ .IsRequired()
+ .HasColumnName("password")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property<string>("Name")
+ .IsRequired()
+ .HasColumnName("name")
+ .HasColumnType("varchar(26) CHARACTER SET utf8mb4")
+ .HasMaxLength(26);
+
+ b.Property<string>("RoleString")
+ .IsRequired()
+ .HasColumnName("roles")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property<long>("Version")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("version")
+ .HasColumnType("bigint")
+ .HasDefaultValue(0L);
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("users");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.UserAvatar", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("bigint");
+
+ b.Property<byte[]>("Data")
+ .HasColumnName("data")
+ .HasColumnType("longblob");
+
+ b.Property<string>("ETag")
+ .HasColumnName("etag")
+ .HasColumnType("varchar(30) CHARACTER SET utf8mb4")
+ .HasMaxLength(30);
+
+ b.Property<DateTime>("LastModified")
+ .HasColumnName("last_modified")
+ .HasColumnType("datetime(6)");
+
+ b.Property<string>("Type")
+ .HasColumnName("type")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property<long>("UserId")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId")
+ .IsUnique();
+
+ b.ToTable("user_avatars");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.UserDetail", b =>
+ {
+ b.Property<long>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnName("id")
+ .HasColumnType("bigint");
+
+ b.Property<string>("Nickname")
+ .HasColumnName("nickname")
+ .HasColumnType("varchar(26) CHARACTER SET utf8mb4")
+ .HasMaxLength(26);
+
+ b.Property<long>("UserId")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId")
+ .IsUnique();
+
+ b.ToTable("user_details");
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelineEntity", b =>
+ {
+ b.HasOne("Timeline.Entities.User", "Owner")
+ .WithMany("Timelines")
+ .HasForeignKey("OwnerId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelineMemberEntity", b =>
+ {
+ b.HasOne("Timeline.Entities.TimelineEntity", "Timeline")
+ .WithMany("Members")
+ .HasForeignKey("TimelineId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Timeline.Entities.User", "User")
+ .WithMany("TimelinesJoined")
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b =>
+ {
+ b.HasOne("Timeline.Entities.User", "Author")
+ .WithMany("TimelinePosts")
+ .HasForeignKey("AuthorId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Timeline.Entities.TimelineEntity", "Timeline")
+ .WithMany("Posts")
+ .HasForeignKey("TimelineId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Timeline.Entities.UserAvatar", b =>
+ {
+ b.HasOne("Timeline.Entities.User", null)
+ .WithOne("Avatar")
+ .HasForeignKey("Timeline.Entities.UserAvatar", "UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Timeline.Entities.UserDetail", b =>
+ {
+ b.HasOne("Timeline.Entities.User", null)
+ .WithOne("Detail")
+ .HasForeignKey("Timeline.Entities.UserDetail", "UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Timeline/Migrations/ProductionDatabase/20200105151839_RenameTimelineMember.cs b/Timeline/Migrations/ProductionDatabase/20200105151839_RenameTimelineMember.cs
new file mode 100644
index 00000000..8aef42d7
--- /dev/null
+++ b/Timeline/Migrations/ProductionDatabase/20200105151839_RenameTimelineMember.cs
@@ -0,0 +1,107 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace Timeline.Migrations.ProductionDatabase
+{
+ public partial class RenameTimelineMember : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropForeignKey(
+ name: "FK_TimelineMembers_timelines_timeline",
+ table: "TimelineMembers");
+
+ migrationBuilder.DropForeignKey(
+ name: "FK_TimelineMembers_users_user",
+ table: "TimelineMembers");
+
+ migrationBuilder.DropPrimaryKey(
+ name: "PK_TimelineMembers",
+ table: "TimelineMembers");
+
+ migrationBuilder.RenameTable(
+ name: "TimelineMembers",
+ newName: "timeline_members");
+
+ migrationBuilder.RenameIndex(
+ name: "IX_TimelineMembers_user",
+ table: "timeline_members",
+ newName: "IX_timeline_members_user");
+
+ migrationBuilder.RenameIndex(
+ name: "IX_TimelineMembers_timeline",
+ table: "timeline_members",
+ newName: "IX_timeline_members_timeline");
+
+ migrationBuilder.AddPrimaryKey(
+ name: "PK_timeline_members",
+ table: "timeline_members",
+ column: "id");
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_timeline_members_timelines_timeline",
+ table: "timeline_members",
+ column: "timeline",
+ principalTable: "timelines",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_timeline_members_users_user",
+ table: "timeline_members",
+ column: "user",
+ principalTable: "users",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropForeignKey(
+ name: "FK_timeline_members_timelines_timeline",
+ table: "timeline_members");
+
+ migrationBuilder.DropForeignKey(
+ name: "FK_timeline_members_users_user",
+ table: "timeline_members");
+
+ migrationBuilder.DropPrimaryKey(
+ name: "PK_timeline_members",
+ table: "timeline_members");
+
+ migrationBuilder.RenameTable(
+ name: "timeline_members",
+ newName: "TimelineMembers");
+
+ migrationBuilder.RenameIndex(
+ name: "IX_timeline_members_user",
+ table: "TimelineMembers",
+ newName: "IX_TimelineMembers_user");
+
+ migrationBuilder.RenameIndex(
+ name: "IX_timeline_members_timeline",
+ table: "TimelineMembers",
+ newName: "IX_TimelineMembers_timeline");
+
+ migrationBuilder.AddPrimaryKey(
+ name: "PK_TimelineMembers",
+ table: "TimelineMembers",
+ column: "id");
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_TimelineMembers_timelines_timeline",
+ table: "TimelineMembers",
+ column: "timeline",
+ principalTable: "timelines",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_TimelineMembers_users_user",
+ table: "TimelineMembers",
+ column: "user",
+ principalTable: "users",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ }
+ }
+}
diff --git a/Timeline/Migrations/DatabaseContextModelSnapshot.cs b/Timeline/Migrations/ProductionDatabase/ProductionDatabaseContextModelSnapshot.cs
index 26be281c..67ef52a4 100644
--- a/Timeline/Migrations/DatabaseContextModelSnapshot.cs
+++ b/Timeline/Migrations/ProductionDatabase/ProductionDatabaseContextModelSnapshot.cs
@@ -5,16 +5,16 @@ using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Timeline.Entities;
-namespace Timeline.Migrations
+namespace Timeline.Migrations.ProductionDatabase
{
- [DbContext(typeof(DatabaseContext))]
- partial class DatabaseContextModelSnapshot : ModelSnapshot
+ [DbContext(typeof(ProductionDatabaseContext))]
+ partial class ProductionDatabaseContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
- .HasAnnotation("ProductVersion", "3.0.1")
+ .HasAnnotation("ProductVersion", "3.1.0")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
modelBuilder.Entity("Timeline.Entities.TimelineEntity", b =>
@@ -72,7 +72,7 @@ namespace Timeline.Migrations
b.HasIndex("UserId");
- b.ToTable("TimelineMembers");
+ b.ToTable("timeline_members");
});
modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b =>
diff --git a/Timeline/Properties/launchSettings.json b/Timeline/Properties/launchSettings.json
index 5d9312b5..2daf38db 100644
--- a/Timeline/Properties/launchSettings.json
+++ b/Timeline/Properties/launchSettings.json
@@ -1,19 +1,5 @@
{
- "iisSettings": {
- "windowsAuthentication": false,
- "anonymousAuthentication": true,
- "iisExpress": {
- "applicationUrl": "http://localhost:2520",
- "sslPort": 44362
- }
- },
"profiles": {
- "IIS Express": {
- "commandName": "IISExpress",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- },
"Timeline": {
"commandName": "Project",
"environmentVariables": {
@@ -21,4 +7,4 @@
}
}
}
-} \ No newline at end of file
+}
diff --git a/Timeline/Startup.cs b/Timeline/Startup.cs
index 672e5f15..5b6499a4 100644
--- a/Timeline/Startup.cs
+++ b/Timeline/Startup.cs
@@ -1,11 +1,12 @@
using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Cors.Infrastructure;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.AspNetCore.Localization;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.Json.Serialization;
@@ -55,15 +56,27 @@ namespace Timeline
services.AddAuthorization();
- var corsConfig = Configuration.GetSection("Cors").Get<string[]>();
- services.AddCors(setup =>
+ if (Environment.IsDevelopment())
{
- setup.AddDefaultPolicy(new CorsPolicyBuilder()
- .AllowAnyHeader()
- .AllowAnyMethod()
- .WithOrigins(corsConfig).Build()
- );
- });
+ services.AddCors(setup =>
+ {
+ setup.AddDefaultPolicy(builder =>
+ {
+ builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin();
+ });
+ });
+ }
+ else
+ {
+ var corsConfig = Configuration.GetSection("Cors").Get<string[]>();
+ services.AddCors(setup =>
+ {
+ setup.AddDefaultPolicy(builder =>
+ {
+ builder.AllowAnyHeader().AllowAnyMethod().WithOrigins(corsConfig);
+ });
+ });
+ }
services.AddLocalization(options =>
{
@@ -81,10 +94,24 @@ namespace Timeline
var databaseConfig = Configuration.GetSection(nameof(DatabaseConfig)).Get<DatabaseConfig>();
- services.AddDbContext<DatabaseContext>(options =>
+ if (databaseConfig.UseDevelopment)
{
- options.UseMySql(databaseConfig.ConnectionString);
- });
+ services.AddDbContext<DatabaseContext, DevelopmentDatabaseContext>(options =>
+ {
+ if (databaseConfig.DevelopmentConnectionString == null)
+ throw new InvalidOperationException("DatabaseConfig.DevelopmentConnectionString is not set. Please set it as a sqlite connection string.");
+ options.UseSqlite(databaseConfig.DevelopmentConnectionString);
+ });
+ }
+ else
+ {
+ services.AddDbContext<DatabaseContext, ProductionDatabaseContext>(options =>
+ {
+ if (databaseConfig.ConnectionString == null)
+ throw new InvalidOperationException("DatabaseConfig.ConnectionString is not set. Please set it as a mysql connection string.");
+ options.UseMySql(databaseConfig.ConnectionString);
+ });
+ }
services.AddMemoryCache();
}
diff --git a/Timeline/Timeline.csproj b/Timeline/Timeline.csproj
index b739b297..8b7c8509 100644
--- a/Timeline/Timeline.csproj
+++ b/Timeline/Timeline.csproj
@@ -21,11 +21,12 @@
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Analyzers" Version="3.1.0" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
- <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="3.0.1" />
+ <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="3.1.0" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql.Design" Version="1.1.2" />
<PackageReference Include="SixLabors.ImageSharp" Version="1.0.0-dev002868" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="5.6.0" />
@@ -172,4 +173,8 @@
<LastGenOutput>UserService.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
+
+ <ItemGroup>
+ <Folder Include="DevelopmentMigrations\" />
+ </ItemGroup>
</Project>
diff --git a/Timeline/appsettings.Development.json b/Timeline/appsettings.Development.json
index 424b3885..50eb9256 100644
--- a/Timeline/appsettings.Development.json
+++ b/Timeline/appsettings.Development.json
@@ -6,6 +6,9 @@
"Microsoft": "Information"
}
},
+ "DatabaseConfig": {
+ "UseDevelopment": true
+ },
"JwtConfig": {
"SigningKey": "this is very very very very very long secret"
}
diff --git a/Timeline/appsettings.Production.json b/Timeline/appsettings.Production.json
new file mode 100644
index 00000000..5d3db1bc
--- /dev/null
+++ b/Timeline/appsettings.Production.json
@@ -0,0 +1,5 @@
+{
+ "DatabaseConfig": {
+ "UseDevelopment": false
+ }
+}