diff options
10 files changed, 1341 insertions, 587 deletions
diff --git a/BackEnd/Timeline/Entities/DatabaseContext.cs b/BackEnd/Timeline/Entities/DatabaseContext.cs index 8ccdabb5..bb078b77 100644 --- a/BackEnd/Timeline/Entities/DatabaseContext.cs +++ b/BackEnd/Timeline/Entities/DatabaseContext.cs @@ -19,6 +19,7 @@ namespace Timeline.Entities modelBuilder.Entity<UserEntity>().Property(e => e.LastModified).HasDefaultValueSql("datetime('now', 'utc')");
modelBuilder.Entity<DataEntity>().HasIndex(e => e.Tag).IsUnique();
modelBuilder.Entity<TimelineEntity>().Property(e => e.UniqueId).HasDefaultValueSql("lower(hex(randomblob(16)))");
+ modelBuilder.Entity<UserTokenEntity>().HasIndex(e => e.Token).IsUnique();
modelBuilder.ApplyUtcDateTimeConverter();
}
@@ -34,6 +35,7 @@ namespace Timeline.Entities public DbSet<BookmarkTimelineEntity> BookmarkTimelines { get; set; } = default!;
public DbSet<JwtTokenEntity> JwtToken { get; set; } = default!;
+ public DbSet<UserTokenEntity> UserTokens { get; set; } = default!;
public DbSet<DataEntity> Data { get; set; } = default!;
public DbSet<MigrationEntity> Migrations { get; set; } = default!;
diff --git a/BackEnd/Timeline/Entities/UserTokenEntity.cs b/BackEnd/Timeline/Entities/UserTokenEntity.cs new file mode 100644 index 00000000..0d8bce7d --- /dev/null +++ b/BackEnd/Timeline/Entities/UserTokenEntity.cs @@ -0,0 +1,28 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Timeline.Entities +{ + [Table("user_token")] + public class UserTokenEntity + { + [Column("id"), Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public long Id { get; set; } + + [Column("user_id")] + public long UserId { get; set; } + + [ForeignKey(nameof(UserId))] + public UserEntity User { get; set; } = default!; + + [Column("token")] + public string Token { get; set; } = default!; + + [Column("expire_at")] + public DateTime? ExpireAt { get; set; } + + [Column("create_at")] + public DateTime? CreateAt { get; set; } + } +} diff --git a/BackEnd/Timeline/Migrations/20220309132001_AddUserTokenTable.Designer.cs b/BackEnd/Timeline/Migrations/20220309132001_AddUserTokenTable.Designer.cs new file mode 100644 index 00000000..f31eda83 --- /dev/null +++ b/BackEnd/Timeline/Migrations/20220309132001_AddUserTokenTable.Designer.cs @@ -0,0 +1,624 @@ +// <auto-generated /> +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Timeline.Entities; + +#nullable disable + +namespace Timeline.Migrations +{ + [DbContext(typeof(DatabaseContext))] + [Migration("20220309132001_AddUserTokenTable")] + partial class AddUserTokenTable + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.3"); + + modelBuilder.Entity("Timeline.Entities.BookmarkTimelineEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<long>("Rank") + .HasColumnType("INTEGER") + .HasColumnName("rank"); + + b.Property<long>("TimelineId") + .HasColumnType("INTEGER") + .HasColumnName("timeline"); + + b.Property<long>("UserId") + .HasColumnType("INTEGER") + .HasColumnName("user"); + + b.HasKey("Id"); + + b.HasIndex("TimelineId"); + + b.HasIndex("UserId"); + + b.ToTable("bookmark_timelines"); + }); + + modelBuilder.Entity("Timeline.Entities.DataEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<byte[]>("Data") + .IsRequired() + .HasColumnType("BLOB") + .HasColumnName("data"); + + b.Property<int>("Ref") + .HasColumnType("INTEGER") + .HasColumnName("ref"); + + b.Property<string>("Tag") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("tag"); + + b.HasKey("Id"); + + b.HasIndex("Tag") + .IsUnique(); + + b.ToTable("data"); + }); + + modelBuilder.Entity("Timeline.Entities.HighlightTimelineEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<DateTime>("AddTime") + .HasColumnType("TEXT") + .HasColumnName("add_time"); + + b.Property<long?>("OperatorId") + .HasColumnType("INTEGER") + .HasColumnName("operator_id"); + + b.Property<long>("Order") + .HasColumnType("INTEGER") + .HasColumnName("order"); + + b.Property<long>("TimelineId") + .HasColumnType("INTEGER") + .HasColumnName("timeline_id"); + + b.HasKey("Id"); + + b.HasIndex("OperatorId"); + + b.HasIndex("TimelineId"); + + b.ToTable("highlight_timelines"); + }); + + modelBuilder.Entity("Timeline.Entities.JwtTokenEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<byte[]>("Key") + .IsRequired() + .HasColumnType("BLOB") + .HasColumnName("key"); + + b.HasKey("Id"); + + b.ToTable("jwt_token"); + }); + + modelBuilder.Entity("Timeline.Entities.MigrationEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("migrations"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelineEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<string>("Color") + .HasColumnType("TEXT") + .HasColumnName("color"); + + b.Property<DateTime>("CreateTime") + .HasColumnType("TEXT") + .HasColumnName("create_time"); + + b.Property<long>("CurrentPostLocalId") + .HasColumnType("INTEGER") + .HasColumnName("current_post_local_id"); + + b.Property<string>("Description") + .HasColumnType("TEXT") + .HasColumnName("description"); + + b.Property<DateTime>("LastModified") + .HasColumnType("TEXT") + .HasColumnName("last_modified"); + + b.Property<string>("Name") + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.Property<DateTime>("NameLastModified") + .HasColumnType("TEXT") + .HasColumnName("name_last_modified"); + + b.Property<long>("OwnerId") + .HasColumnType("INTEGER") + .HasColumnName("owner"); + + b.Property<string>("Title") + .HasColumnType("TEXT") + .HasColumnName("title"); + + b.Property<string>("UniqueId") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("unique_id") + .HasDefaultValueSql("lower(hex(randomblob(16)))"); + + b.Property<int>("Visibility") + .HasColumnType("INTEGER") + .HasColumnName("visibility"); + + b.HasKey("Id"); + + b.HasIndex("OwnerId"); + + b.ToTable("timelines"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelineMemberEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<long>("TimelineId") + .HasColumnType("INTEGER") + .HasColumnName("timeline"); + + b.Property<long>("UserId") + .HasColumnType("INTEGER") + .HasColumnName("user"); + + b.HasKey("Id"); + + b.HasIndex("TimelineId"); + + b.HasIndex("UserId"); + + b.ToTable("timeline_members"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelinePostDataEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<string>("DataTag") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("data_tag"); + + b.Property<long>("Index") + .HasColumnType("INTEGER") + .HasColumnName("index"); + + b.Property<string>("Kind") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("kind"); + + b.Property<DateTime>("LastUpdated") + .HasColumnType("TEXT") + .HasColumnName("last_updated"); + + b.Property<long>("PostId") + .HasColumnType("INTEGER") + .HasColumnName("post"); + + b.HasKey("Id"); + + b.HasIndex("PostId"); + + b.ToTable("timeline_post_data"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<long?>("AuthorId") + .HasColumnType("INTEGER") + .HasColumnName("author"); + + b.Property<string>("Color") + .HasColumnType("TEXT") + .HasColumnName("color"); + + b.Property<string>("Content") + .HasColumnType("TEXT") + .HasColumnName("content"); + + b.Property<string>("ContentType") + .HasColumnType("TEXT") + .HasColumnName("content_type"); + + b.Property<bool>("Deleted") + .HasColumnType("INTEGER") + .HasColumnName("deleted"); + + b.Property<string>("ExtraContent") + .HasColumnType("TEXT") + .HasColumnName("extra_content"); + + b.Property<DateTime>("LastUpdated") + .HasColumnType("TEXT") + .HasColumnName("last_updated"); + + b.Property<long>("LocalId") + .HasColumnType("INTEGER") + .HasColumnName("local_id"); + + b.Property<DateTime>("Time") + .HasColumnType("TEXT") + .HasColumnName("time"); + + b.Property<long>("TimelineId") + .HasColumnType("INTEGER") + .HasColumnName("timeline"); + + b.HasKey("Id"); + + b.HasIndex("AuthorId"); + + b.HasIndex("TimelineId"); + + b.ToTable("timeline_posts"); + }); + + modelBuilder.Entity("Timeline.Entities.UserAvatarEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<string>("DataTag") + .HasColumnType("TEXT") + .HasColumnName("data_tag"); + + b.Property<DateTime>("LastModified") + .HasColumnType("TEXT") + .HasColumnName("last_modified"); + + b.Property<string>("Type") + .HasColumnType("TEXT") + .HasColumnName("type"); + + b.Property<long>("UserId") + .HasColumnType("INTEGER") + .HasColumnName("user"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("user_avatars"); + }); + + modelBuilder.Entity("Timeline.Entities.UserEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<DateTime>("CreateTime") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("create_time") + .HasDefaultValueSql("datetime('now', 'utc')"); + + b.Property<DateTime>("LastModified") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("last_modified") + .HasDefaultValueSql("datetime('now', 'utc')"); + + b.Property<string>("Nickname") + .HasColumnType("TEXT") + .HasColumnName("nickname"); + + b.Property<string>("Password") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("password"); + + b.Property<string>("UniqueId") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("unique_id") + .HasDefaultValueSql("lower(hex(randomblob(16)))"); + + b.Property<string>("Username") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("username"); + + b.Property<DateTime>("UsernameChangeTime") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("username_change_time") + .HasDefaultValueSql("datetime('now', 'utc')"); + + b.Property<long>("Version") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0L) + .HasColumnName("version"); + + b.HasKey("Id"); + + b.HasIndex("Username") + .IsUnique(); + + b.ToTable("users"); + }); + + modelBuilder.Entity("Timeline.Entities.UserPermissionEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<string>("Permission") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("permission"); + + b.Property<long>("UserId") + .HasColumnType("INTEGER") + .HasColumnName("user_id"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("user_permission"); + }); + + modelBuilder.Entity("Timeline.Entities.UserTokenEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<DateTime?>("CreateAt") + .HasColumnType("TEXT") + .HasColumnName("create_at"); + + b.Property<DateTime?>("ExpireAt") + .HasColumnType("TEXT") + .HasColumnName("expire_at"); + + b.Property<string>("Token") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("token"); + + b.Property<long>("UserId") + .HasColumnType("INTEGER") + .HasColumnName("user_id"); + + b.HasKey("Id"); + + b.HasIndex("Token") + .IsUnique(); + + b.HasIndex("UserId"); + + b.ToTable("user_token"); + }); + + modelBuilder.Entity("Timeline.Entities.BookmarkTimelineEntity", b => + { + b.HasOne("Timeline.Entities.TimelineEntity", "Timeline") + .WithMany() + .HasForeignKey("TimelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Timeline.Entities.UserEntity", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Timeline"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Timeline.Entities.HighlightTimelineEntity", b => + { + b.HasOne("Timeline.Entities.UserEntity", "Operator") + .WithMany() + .HasForeignKey("OperatorId"); + + b.HasOne("Timeline.Entities.TimelineEntity", "Timeline") + .WithMany() + .HasForeignKey("TimelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Operator"); + + b.Navigation("Timeline"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelineEntity", b => + { + b.HasOne("Timeline.Entities.UserEntity", "Owner") + .WithMany("Timelines") + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelineMemberEntity", b => + { + b.HasOne("Timeline.Entities.TimelineEntity", "Timeline") + .WithMany("Members") + .HasForeignKey("TimelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Timeline.Entities.UserEntity", "User") + .WithMany("TimelinesJoined") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Timeline"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelinePostDataEntity", b => + { + b.HasOne("Timeline.Entities.TimelinePostEntity", "Post") + .WithMany("DataList") + .HasForeignKey("PostId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Post"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b => + { + b.HasOne("Timeline.Entities.UserEntity", "Author") + .WithMany("TimelinePosts") + .HasForeignKey("AuthorId"); + + b.HasOne("Timeline.Entities.TimelineEntity", "Timeline") + .WithMany("Posts") + .HasForeignKey("TimelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Timeline"); + }); + + modelBuilder.Entity("Timeline.Entities.UserAvatarEntity", b => + { + b.HasOne("Timeline.Entities.UserEntity", "User") + .WithOne("Avatar") + .HasForeignKey("Timeline.Entities.UserAvatarEntity", "UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Timeline.Entities.UserPermissionEntity", b => + { + b.HasOne("Timeline.Entities.UserEntity", "User") + .WithMany("Permissions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Timeline.Entities.UserTokenEntity", b => + { + b.HasOne("Timeline.Entities.UserEntity", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelineEntity", b => + { + b.Navigation("Members"); + + b.Navigation("Posts"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b => + { + b.Navigation("DataList"); + }); + + modelBuilder.Entity("Timeline.Entities.UserEntity", b => + { + b.Navigation("Avatar"); + + b.Navigation("Permissions"); + + b.Navigation("TimelinePosts"); + + b.Navigation("Timelines"); + + b.Navigation("TimelinesJoined"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BackEnd/Timeline/Migrations/20220309132001_AddUserTokenTable.cs b/BackEnd/Timeline/Migrations/20220309132001_AddUserTokenTable.cs new file mode 100644 index 00000000..02cb5a14 --- /dev/null +++ b/BackEnd/Timeline/Migrations/20220309132001_AddUserTokenTable.cs @@ -0,0 +1,52 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Timeline.Migrations +{ + public partial class AddUserTokenTable : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "user_token", + columns: table => new + { + id = table.Column<long>(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + user_id = table.Column<long>(type: "INTEGER", nullable: false), + token = table.Column<string>(type: "TEXT", nullable: false), + expire_at = table.Column<DateTime>(type: "TEXT", nullable: true), + create_at = table.Column<DateTime>(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_user_token", x => x.id); + table.ForeignKey( + name: "FK_user_token_users_user_id", + column: x => x.user_id, + principalTable: "users", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_user_token_token", + table: "user_token", + column: "token", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_user_token_user_id", + table: "user_token", + column: "user_id"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "user_token"); + } + } +} diff --git a/BackEnd/Timeline/Migrations/DatabaseContextModelSnapshot.cs b/BackEnd/Timeline/Migrations/DatabaseContextModelSnapshot.cs index 26a77e8a..f1e9b6ab 100644 --- a/BackEnd/Timeline/Migrations/DatabaseContextModelSnapshot.cs +++ b/BackEnd/Timeline/Migrations/DatabaseContextModelSnapshot.cs @@ -1,576 +1,622 @@ -// <auto-generated />
-using System;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Infrastructure;
-using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
-using Timeline.Entities;
-
-namespace Timeline.Migrations
-{
- [DbContext(typeof(DatabaseContext))]
- partial class DatabaseContextModelSnapshot : ModelSnapshot
- {
- protected override void BuildModel(ModelBuilder modelBuilder)
- {
-#pragma warning disable 612, 618
- modelBuilder
- .HasAnnotation("ProductVersion", "5.0.0");
-
- modelBuilder.Entity("Timeline.Entities.BookmarkTimelineEntity", b =>
- {
- b.Property<long>("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER")
- .HasColumnName("id");
-
- b.Property<long>("Rank")
- .HasColumnType("INTEGER")
- .HasColumnName("rank");
-
- b.Property<long>("TimelineId")
- .HasColumnType("INTEGER")
- .HasColumnName("timeline");
-
- b.Property<long>("UserId")
- .HasColumnType("INTEGER")
- .HasColumnName("user");
-
- b.HasKey("Id");
-
- b.HasIndex("TimelineId");
-
- b.HasIndex("UserId");
-
- b.ToTable("bookmark_timelines");
- });
-
- modelBuilder.Entity("Timeline.Entities.DataEntity", b =>
- {
- b.Property<long>("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER")
- .HasColumnName("id");
-
- b.Property<byte[]>("Data")
- .IsRequired()
- .HasColumnType("BLOB")
- .HasColumnName("data");
-
- b.Property<int>("Ref")
- .HasColumnType("INTEGER")
- .HasColumnName("ref");
-
- b.Property<string>("Tag")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("tag");
-
- b.HasKey("Id");
-
- b.HasIndex("Tag")
- .IsUnique();
-
- b.ToTable("data");
- });
-
- modelBuilder.Entity("Timeline.Entities.HighlightTimelineEntity", b =>
- {
- b.Property<long>("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER")
- .HasColumnName("id");
-
- b.Property<DateTime>("AddTime")
- .HasColumnType("TEXT")
- .HasColumnName("add_time");
-
- b.Property<long?>("OperatorId")
- .HasColumnType("INTEGER")
- .HasColumnName("operator_id");
-
- b.Property<long>("Order")
- .HasColumnType("INTEGER")
- .HasColumnName("order");
-
- b.Property<long>("TimelineId")
- .HasColumnType("INTEGER")
- .HasColumnName("timeline_id");
-
- b.HasKey("Id");
-
- b.HasIndex("OperatorId");
-
- b.HasIndex("TimelineId");
-
- b.ToTable("highlight_timelines");
- });
-
- modelBuilder.Entity("Timeline.Entities.JwtTokenEntity", b =>
- {
- b.Property<long>("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER")
- .HasColumnName("id");
-
- b.Property<byte[]>("Key")
- .IsRequired()
- .HasColumnType("BLOB")
- .HasColumnName("key");
-
- b.HasKey("Id");
-
- b.ToTable("jwt_token");
- });
-
- modelBuilder.Entity("Timeline.Entities.MigrationEntity", b =>
- {
- b.Property<long>("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER")
- .HasColumnName("id");
-
- b.Property<string>("Name")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("name");
-
- b.HasKey("Id");
-
- b.ToTable("migrations");
- });
-
- modelBuilder.Entity("Timeline.Entities.TimelineEntity", b =>
- {
- b.Property<long>("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER")
- .HasColumnName("id");
-
- b.Property<string>("Color")
- .HasColumnType("TEXT")
- .HasColumnName("color");
-
- b.Property<DateTime>("CreateTime")
- .HasColumnType("TEXT")
- .HasColumnName("create_time");
-
- b.Property<long>("CurrentPostLocalId")
- .HasColumnType("INTEGER")
- .HasColumnName("current_post_local_id");
-
- b.Property<string>("Description")
- .HasColumnType("TEXT")
- .HasColumnName("description");
-
- b.Property<DateTime>("LastModified")
- .HasColumnType("TEXT")
- .HasColumnName("last_modified");
-
- b.Property<string>("Name")
- .HasColumnType("TEXT")
- .HasColumnName("name");
-
- b.Property<DateTime>("NameLastModified")
- .HasColumnType("TEXT")
- .HasColumnName("name_last_modified");
-
- b.Property<long>("OwnerId")
- .HasColumnType("INTEGER")
- .HasColumnName("owner");
-
- b.Property<string>("Title")
- .HasColumnType("TEXT")
- .HasColumnName("title");
-
- b.Property<string>("UniqueId")
- .IsRequired()
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("unique_id")
- .HasDefaultValueSql("lower(hex(randomblob(16)))");
-
- b.Property<int>("Visibility")
- .HasColumnType("INTEGER")
- .HasColumnName("visibility");
-
- b.HasKey("Id");
-
- b.HasIndex("OwnerId");
-
- b.ToTable("timelines");
- });
-
- modelBuilder.Entity("Timeline.Entities.TimelineMemberEntity", b =>
- {
- b.Property<long>("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER")
- .HasColumnName("id");
-
- b.Property<long>("TimelineId")
- .HasColumnType("INTEGER")
- .HasColumnName("timeline");
-
- b.Property<long>("UserId")
- .HasColumnType("INTEGER")
- .HasColumnName("user");
-
- b.HasKey("Id");
-
- b.HasIndex("TimelineId");
-
- b.HasIndex("UserId");
-
- b.ToTable("timeline_members");
- });
-
- modelBuilder.Entity("Timeline.Entities.TimelinePostDataEntity", b =>
- {
- b.Property<long>("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER")
- .HasColumnName("id");
-
- b.Property<string>("DataTag")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("data_tag");
-
- b.Property<long>("Index")
- .HasColumnType("INTEGER")
- .HasColumnName("index");
-
- b.Property<string>("Kind")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("kind");
-
- b.Property<DateTime>("LastUpdated")
- .HasColumnType("TEXT")
- .HasColumnName("last_updated");
-
- b.Property<long>("PostId")
- .HasColumnType("INTEGER")
- .HasColumnName("post");
-
- b.HasKey("Id");
-
- b.HasIndex("PostId");
-
- b.ToTable("timeline_post_data");
- });
-
- modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b =>
- {
- b.Property<long>("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER")
- .HasColumnName("id");
-
- b.Property<long?>("AuthorId")
- .HasColumnType("INTEGER")
- .HasColumnName("author");
-
- b.Property<string>("Color")
- .HasColumnType("TEXT")
- .HasColumnName("color");
-
- b.Property<string>("Content")
- .HasColumnType("TEXT")
- .HasColumnName("content");
-
- b.Property<string>("ContentType")
- .HasColumnType("TEXT")
- .HasColumnName("content_type");
-
- b.Property<bool>("Deleted")
- .HasColumnType("INTEGER")
- .HasColumnName("deleted");
-
- b.Property<string>("ExtraContent")
- .HasColumnType("TEXT")
- .HasColumnName("extra_content");
-
- b.Property<DateTime>("LastUpdated")
- .HasColumnType("TEXT")
- .HasColumnName("last_updated");
-
- b.Property<long>("LocalId")
- .HasColumnType("INTEGER")
- .HasColumnName("local_id");
-
- b.Property<DateTime>("Time")
- .HasColumnType("TEXT")
- .HasColumnName("time");
-
- b.Property<long>("TimelineId")
- .HasColumnType("INTEGER")
- .HasColumnName("timeline");
-
- b.HasKey("Id");
-
- b.HasIndex("AuthorId");
-
- b.HasIndex("TimelineId");
-
- b.ToTable("timeline_posts");
- });
-
- modelBuilder.Entity("Timeline.Entities.UserAvatarEntity", b =>
- {
- b.Property<long>("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER")
- .HasColumnName("id");
-
- b.Property<string>("DataTag")
- .HasColumnType("TEXT")
- .HasColumnName("data_tag");
-
- b.Property<DateTime>("LastModified")
- .HasColumnType("TEXT")
- .HasColumnName("last_modified");
-
- b.Property<string>("Type")
- .HasColumnType("TEXT")
- .HasColumnName("type");
-
- b.Property<long>("UserId")
- .HasColumnType("INTEGER")
- .HasColumnName("user");
-
- b.HasKey("Id");
-
- b.HasIndex("UserId")
- .IsUnique();
-
- b.ToTable("user_avatars");
- });
-
- modelBuilder.Entity("Timeline.Entities.UserEntity", b =>
- {
- b.Property<long>("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER")
- .HasColumnName("id");
-
- b.Property<DateTime>("CreateTime")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("create_time")
- .HasDefaultValueSql("datetime('now', 'utc')");
-
- b.Property<DateTime>("LastModified")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("last_modified")
- .HasDefaultValueSql("datetime('now', 'utc')");
-
- b.Property<string>("Nickname")
- .HasColumnType("TEXT")
- .HasColumnName("nickname");
-
- b.Property<string>("Password")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("password");
-
- b.Property<string>("UniqueId")
- .IsRequired()
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("unique_id")
- .HasDefaultValueSql("lower(hex(randomblob(16)))");
-
- b.Property<string>("Username")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("username");
-
- b.Property<DateTime>("UsernameChangeTime")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("username_change_time")
- .HasDefaultValueSql("datetime('now', 'utc')");
-
- b.Property<long>("Version")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER")
- .HasDefaultValue(0L)
- .HasColumnName("version");
-
- b.HasKey("Id");
-
- b.HasIndex("Username")
- .IsUnique();
-
- b.ToTable("users");
- });
-
- modelBuilder.Entity("Timeline.Entities.UserPermissionEntity", b =>
- {
- b.Property<long>("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER")
- .HasColumnName("id");
-
- b.Property<string>("Permission")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("permission");
-
- b.Property<long>("UserId")
- .HasColumnType("INTEGER")
- .HasColumnName("user_id");
-
- b.HasKey("Id");
-
- b.HasIndex("UserId");
-
- b.ToTable("user_permission");
- });
-
- modelBuilder.Entity("Timeline.Entities.BookmarkTimelineEntity", b =>
- {
- b.HasOne("Timeline.Entities.TimelineEntity", "Timeline")
- .WithMany()
- .HasForeignKey("TimelineId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Timeline.Entities.UserEntity", "User")
- .WithMany()
- .HasForeignKey("UserId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("Timeline");
-
- b.Navigation("User");
- });
-
- modelBuilder.Entity("Timeline.Entities.HighlightTimelineEntity", b =>
- {
- b.HasOne("Timeline.Entities.UserEntity", "Operator")
- .WithMany()
- .HasForeignKey("OperatorId");
-
- b.HasOne("Timeline.Entities.TimelineEntity", "Timeline")
- .WithMany()
- .HasForeignKey("TimelineId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("Operator");
-
- b.Navigation("Timeline");
- });
-
- modelBuilder.Entity("Timeline.Entities.TimelineEntity", b =>
- {
- b.HasOne("Timeline.Entities.UserEntity", "Owner")
- .WithMany("Timelines")
- .HasForeignKey("OwnerId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("Owner");
- });
-
- modelBuilder.Entity("Timeline.Entities.TimelineMemberEntity", b =>
- {
- b.HasOne("Timeline.Entities.TimelineEntity", "Timeline")
- .WithMany("Members")
- .HasForeignKey("TimelineId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Timeline.Entities.UserEntity", "User")
- .WithMany("TimelinesJoined")
- .HasForeignKey("UserId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("Timeline");
-
- b.Navigation("User");
- });
-
- modelBuilder.Entity("Timeline.Entities.TimelinePostDataEntity", b =>
- {
- b.HasOne("Timeline.Entities.TimelinePostEntity", "Post")
- .WithMany("DataList")
- .HasForeignKey("PostId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("Post");
- });
-
- modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b =>
- {
- b.HasOne("Timeline.Entities.UserEntity", "Author")
- .WithMany("TimelinePosts")
- .HasForeignKey("AuthorId");
-
- b.HasOne("Timeline.Entities.TimelineEntity", "Timeline")
- .WithMany("Posts")
- .HasForeignKey("TimelineId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("Author");
-
- b.Navigation("Timeline");
- });
-
- modelBuilder.Entity("Timeline.Entities.UserAvatarEntity", b =>
- {
- b.HasOne("Timeline.Entities.UserEntity", "User")
- .WithOne("Avatar")
- .HasForeignKey("Timeline.Entities.UserAvatarEntity", "UserId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("User");
- });
-
- modelBuilder.Entity("Timeline.Entities.UserPermissionEntity", b =>
- {
- b.HasOne("Timeline.Entities.UserEntity", "User")
- .WithMany("Permissions")
- .HasForeignKey("UserId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("User");
- });
-
- modelBuilder.Entity("Timeline.Entities.TimelineEntity", b =>
- {
- b.Navigation("Members");
-
- b.Navigation("Posts");
- });
-
- modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b =>
- {
- b.Navigation("DataList");
- });
-
- modelBuilder.Entity("Timeline.Entities.UserEntity", b =>
- {
- b.Navigation("Avatar");
-
- b.Navigation("Permissions");
-
- b.Navigation("TimelinePosts");
-
- b.Navigation("Timelines");
-
- b.Navigation("TimelinesJoined");
- });
-#pragma warning restore 612, 618
- }
- }
-}
+// <auto-generated /> +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Timeline.Entities; + +#nullable disable + +namespace Timeline.Migrations +{ + [DbContext(typeof(DatabaseContext))] + partial class DatabaseContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.3"); + + modelBuilder.Entity("Timeline.Entities.BookmarkTimelineEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<long>("Rank") + .HasColumnType("INTEGER") + .HasColumnName("rank"); + + b.Property<long>("TimelineId") + .HasColumnType("INTEGER") + .HasColumnName("timeline"); + + b.Property<long>("UserId") + .HasColumnType("INTEGER") + .HasColumnName("user"); + + b.HasKey("Id"); + + b.HasIndex("TimelineId"); + + b.HasIndex("UserId"); + + b.ToTable("bookmark_timelines"); + }); + + modelBuilder.Entity("Timeline.Entities.DataEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<byte[]>("Data") + .IsRequired() + .HasColumnType("BLOB") + .HasColumnName("data"); + + b.Property<int>("Ref") + .HasColumnType("INTEGER") + .HasColumnName("ref"); + + b.Property<string>("Tag") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("tag"); + + b.HasKey("Id"); + + b.HasIndex("Tag") + .IsUnique(); + + b.ToTable("data"); + }); + + modelBuilder.Entity("Timeline.Entities.HighlightTimelineEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<DateTime>("AddTime") + .HasColumnType("TEXT") + .HasColumnName("add_time"); + + b.Property<long?>("OperatorId") + .HasColumnType("INTEGER") + .HasColumnName("operator_id"); + + b.Property<long>("Order") + .HasColumnType("INTEGER") + .HasColumnName("order"); + + b.Property<long>("TimelineId") + .HasColumnType("INTEGER") + .HasColumnName("timeline_id"); + + b.HasKey("Id"); + + b.HasIndex("OperatorId"); + + b.HasIndex("TimelineId"); + + b.ToTable("highlight_timelines"); + }); + + modelBuilder.Entity("Timeline.Entities.JwtTokenEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<byte[]>("Key") + .IsRequired() + .HasColumnType("BLOB") + .HasColumnName("key"); + + b.HasKey("Id"); + + b.ToTable("jwt_token"); + }); + + modelBuilder.Entity("Timeline.Entities.MigrationEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("migrations"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelineEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<string>("Color") + .HasColumnType("TEXT") + .HasColumnName("color"); + + b.Property<DateTime>("CreateTime") + .HasColumnType("TEXT") + .HasColumnName("create_time"); + + b.Property<long>("CurrentPostLocalId") + .HasColumnType("INTEGER") + .HasColumnName("current_post_local_id"); + + b.Property<string>("Description") + .HasColumnType("TEXT") + .HasColumnName("description"); + + b.Property<DateTime>("LastModified") + .HasColumnType("TEXT") + .HasColumnName("last_modified"); + + b.Property<string>("Name") + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.Property<DateTime>("NameLastModified") + .HasColumnType("TEXT") + .HasColumnName("name_last_modified"); + + b.Property<long>("OwnerId") + .HasColumnType("INTEGER") + .HasColumnName("owner"); + + b.Property<string>("Title") + .HasColumnType("TEXT") + .HasColumnName("title"); + + b.Property<string>("UniqueId") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("unique_id") + .HasDefaultValueSql("lower(hex(randomblob(16)))"); + + b.Property<int>("Visibility") + .HasColumnType("INTEGER") + .HasColumnName("visibility"); + + b.HasKey("Id"); + + b.HasIndex("OwnerId"); + + b.ToTable("timelines"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelineMemberEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<long>("TimelineId") + .HasColumnType("INTEGER") + .HasColumnName("timeline"); + + b.Property<long>("UserId") + .HasColumnType("INTEGER") + .HasColumnName("user"); + + b.HasKey("Id"); + + b.HasIndex("TimelineId"); + + b.HasIndex("UserId"); + + b.ToTable("timeline_members"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelinePostDataEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<string>("DataTag") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("data_tag"); + + b.Property<long>("Index") + .HasColumnType("INTEGER") + .HasColumnName("index"); + + b.Property<string>("Kind") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("kind"); + + b.Property<DateTime>("LastUpdated") + .HasColumnType("TEXT") + .HasColumnName("last_updated"); + + b.Property<long>("PostId") + .HasColumnType("INTEGER") + .HasColumnName("post"); + + b.HasKey("Id"); + + b.HasIndex("PostId"); + + b.ToTable("timeline_post_data"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<long?>("AuthorId") + .HasColumnType("INTEGER") + .HasColumnName("author"); + + b.Property<string>("Color") + .HasColumnType("TEXT") + .HasColumnName("color"); + + b.Property<string>("Content") + .HasColumnType("TEXT") + .HasColumnName("content"); + + b.Property<string>("ContentType") + .HasColumnType("TEXT") + .HasColumnName("content_type"); + + b.Property<bool>("Deleted") + .HasColumnType("INTEGER") + .HasColumnName("deleted"); + + b.Property<string>("ExtraContent") + .HasColumnType("TEXT") + .HasColumnName("extra_content"); + + b.Property<DateTime>("LastUpdated") + .HasColumnType("TEXT") + .HasColumnName("last_updated"); + + b.Property<long>("LocalId") + .HasColumnType("INTEGER") + .HasColumnName("local_id"); + + b.Property<DateTime>("Time") + .HasColumnType("TEXT") + .HasColumnName("time"); + + b.Property<long>("TimelineId") + .HasColumnType("INTEGER") + .HasColumnName("timeline"); + + b.HasKey("Id"); + + b.HasIndex("AuthorId"); + + b.HasIndex("TimelineId"); + + b.ToTable("timeline_posts"); + }); + + modelBuilder.Entity("Timeline.Entities.UserAvatarEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<string>("DataTag") + .HasColumnType("TEXT") + .HasColumnName("data_tag"); + + b.Property<DateTime>("LastModified") + .HasColumnType("TEXT") + .HasColumnName("last_modified"); + + b.Property<string>("Type") + .HasColumnType("TEXT") + .HasColumnName("type"); + + b.Property<long>("UserId") + .HasColumnType("INTEGER") + .HasColumnName("user"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("user_avatars"); + }); + + modelBuilder.Entity("Timeline.Entities.UserEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<DateTime>("CreateTime") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("create_time") + .HasDefaultValueSql("datetime('now', 'utc')"); + + b.Property<DateTime>("LastModified") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("last_modified") + .HasDefaultValueSql("datetime('now', 'utc')"); + + b.Property<string>("Nickname") + .HasColumnType("TEXT") + .HasColumnName("nickname"); + + b.Property<string>("Password") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("password"); + + b.Property<string>("UniqueId") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("unique_id") + .HasDefaultValueSql("lower(hex(randomblob(16)))"); + + b.Property<string>("Username") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("username"); + + b.Property<DateTime>("UsernameChangeTime") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("username_change_time") + .HasDefaultValueSql("datetime('now', 'utc')"); + + b.Property<long>("Version") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0L) + .HasColumnName("version"); + + b.HasKey("Id"); + + b.HasIndex("Username") + .IsUnique(); + + b.ToTable("users"); + }); + + modelBuilder.Entity("Timeline.Entities.UserPermissionEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<string>("Permission") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("permission"); + + b.Property<long>("UserId") + .HasColumnType("INTEGER") + .HasColumnName("user_id"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("user_permission"); + }); + + modelBuilder.Entity("Timeline.Entities.UserTokenEntity", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property<DateTime?>("CreateAt") + .HasColumnType("TEXT") + .HasColumnName("create_at"); + + b.Property<DateTime?>("ExpireAt") + .HasColumnType("TEXT") + .HasColumnName("expire_at"); + + b.Property<string>("Token") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("token"); + + b.Property<long>("UserId") + .HasColumnType("INTEGER") + .HasColumnName("user_id"); + + b.HasKey("Id"); + + b.HasIndex("Token") + .IsUnique(); + + b.HasIndex("UserId"); + + b.ToTable("user_token"); + }); + + modelBuilder.Entity("Timeline.Entities.BookmarkTimelineEntity", b => + { + b.HasOne("Timeline.Entities.TimelineEntity", "Timeline") + .WithMany() + .HasForeignKey("TimelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Timeline.Entities.UserEntity", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Timeline"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Timeline.Entities.HighlightTimelineEntity", b => + { + b.HasOne("Timeline.Entities.UserEntity", "Operator") + .WithMany() + .HasForeignKey("OperatorId"); + + b.HasOne("Timeline.Entities.TimelineEntity", "Timeline") + .WithMany() + .HasForeignKey("TimelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Operator"); + + b.Navigation("Timeline"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelineEntity", b => + { + b.HasOne("Timeline.Entities.UserEntity", "Owner") + .WithMany("Timelines") + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelineMemberEntity", b => + { + b.HasOne("Timeline.Entities.TimelineEntity", "Timeline") + .WithMany("Members") + .HasForeignKey("TimelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Timeline.Entities.UserEntity", "User") + .WithMany("TimelinesJoined") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Timeline"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelinePostDataEntity", b => + { + b.HasOne("Timeline.Entities.TimelinePostEntity", "Post") + .WithMany("DataList") + .HasForeignKey("PostId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Post"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b => + { + b.HasOne("Timeline.Entities.UserEntity", "Author") + .WithMany("TimelinePosts") + .HasForeignKey("AuthorId"); + + b.HasOne("Timeline.Entities.TimelineEntity", "Timeline") + .WithMany("Posts") + .HasForeignKey("TimelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Timeline"); + }); + + modelBuilder.Entity("Timeline.Entities.UserAvatarEntity", b => + { + b.HasOne("Timeline.Entities.UserEntity", "User") + .WithOne("Avatar") + .HasForeignKey("Timeline.Entities.UserAvatarEntity", "UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Timeline.Entities.UserPermissionEntity", b => + { + b.HasOne("Timeline.Entities.UserEntity", "User") + .WithMany("Permissions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Timeline.Entities.UserTokenEntity", b => + { + b.HasOne("Timeline.Entities.UserEntity", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelineEntity", b => + { + b.Navigation("Members"); + + b.Navigation("Posts"); + }); + + modelBuilder.Entity("Timeline.Entities.TimelinePostEntity", b => + { + b.Navigation("DataList"); + }); + + modelBuilder.Entity("Timeline.Entities.UserEntity", b => + { + b.Navigation("Avatar"); + + b.Navigation("Permissions"); + + b.Navigation("TimelinePosts"); + + b.Navigation("Timelines"); + + b.Navigation("TimelinesJoined"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BackEnd/Timeline/Services/Token/DatabaseUserTokenHandler.cs b/BackEnd/Timeline/Services/Token/DatabaseUserTokenHandler.cs new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/BackEnd/Timeline/Services/Token/DatabaseUserTokenHandler.cs diff --git a/BackEnd/Timeline/Services/Token/IUserTokenHandler.cs b/BackEnd/Timeline/Services/Token/IUserTokenHandler.cs index d9788909..62e01de5 100644 --- a/BackEnd/Timeline/Services/Token/IUserTokenHandler.cs +++ b/BackEnd/Timeline/Services/Token/IUserTokenHandler.cs @@ -1,4 +1,5 @@ using System;
+using System.Threading.Tasks;
namespace Timeline.Services.Token
{
@@ -10,7 +11,7 @@ namespace Timeline.Services.Token /// <param name="tokenInfo">The info to generate token.</param>
/// <returns>Return the generated token.</returns>
/// <exception cref="ArgumentNullException">Thrown when <paramref name="tokenInfo"/> is null.</exception>
- string GenerateToken(UserTokenInfo tokenInfo);
+ Task<string> GenerateTokenAsync(UserTokenInfo tokenInfo);
/// <summary>
/// Verify a token and get the saved info. Do not validate lifetime!!!
@@ -23,6 +24,6 @@ namespace Timeline.Services.Token /// If this method throw <see cref="UserTokenBadFormatException"/>, it usually means the token is not created by this service.
/// Do not check expire time in this method, only check whether it is present.
/// </remarks>
- UserTokenInfo VerifyToken(string token);
+ Task<UserTokenInfo> ValidateTokenAsync(string token);
}
}
diff --git a/BackEnd/Timeline/Services/Token/UserTokenHandler.cs b/BackEnd/Timeline/Services/Token/UserTokenHandler.cs index c1633f4a..03b07b53 100644 --- a/BackEnd/Timeline/Services/Token/UserTokenHandler.cs +++ b/BackEnd/Timeline/Services/Token/UserTokenHandler.cs @@ -5,6 +5,7 @@ using System.Globalization; using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
+using System.Threading.Tasks;
using Timeline.Configs;
using Timeline.Entities;
@@ -35,7 +36,7 @@ namespace Timeline.Services.Token _tokenSecurityKey = new SymmetricSecurityKey(key);
}
- public string GenerateToken(UserTokenInfo tokenInfo)
+ public Task<string> GenerateTokenAsync(UserTokenInfo tokenInfo)
{
if (tokenInfo == null)
throw new ArgumentNullException(nameof(tokenInfo));
@@ -60,11 +61,11 @@ namespace Timeline.Services.Token var token = _tokenHandler.CreateToken(tokenDescriptor);
var tokenString = _tokenHandler.WriteToken(token);
- return tokenString;
+ return Task.FromResult(tokenString);
}
- public UserTokenInfo VerifyToken(string token)
+ public Task<UserTokenInfo> ValidateTokenAsync(string token)
{
if (token == null)
throw new ArgumentNullException(nameof(token));
@@ -100,12 +101,12 @@ namespace Timeline.Services.Token if (exp is null)
throw new JwtUserTokenBadFormatException(token, JwtUserTokenBadFormatException.ErrorKind.NoExp);
- return new UserTokenInfo
+ return Task.FromResult(new UserTokenInfo
{
Id = id,
Version = version,
ExpireAt = EpochTime.DateTime(exp.Value)
- };
+ });
}
catch (Exception e) when (e is SecurityTokenException || e is ArgumentException)
{
diff --git a/BackEnd/Timeline/Services/Token/UserTokenManager.cs b/BackEnd/Timeline/Services/Token/UserTokenManager.cs index 7ccdfe0a..bdb229f0 100644 --- a/BackEnd/Timeline/Services/Token/UserTokenManager.cs +++ b/BackEnd/Timeline/Services/Token/UserTokenManager.cs @@ -38,7 +38,7 @@ namespace Timeline.Services.Token var userId = await _userService.VerifyCredential(username, password);
var user = await _userService.GetUserAsync(userId);
- var token = _userTokenService.GenerateToken(new UserTokenInfo
+ var token = await _userTokenService.GenerateTokenAsync(new UserTokenInfo
{
Id = user.Id,
Version = user.Version,
@@ -60,7 +60,7 @@ namespace Timeline.Services.Token try
{
- tokenInfo = _userTokenService.VerifyToken(token);
+ tokenInfo = await _userTokenService.ValidateTokenAsync(token);
}
catch (UserTokenBadFormatException e)
{
diff --git a/BackEnd/Timeline/appsettings.json b/BackEnd/Timeline/appsettings.json index 5098b4ae..81c01bf6 100644 --- a/BackEnd/Timeline/appsettings.json +++ b/BackEnd/Timeline/appsettings.json @@ -5,7 +5,7 @@ }
},
"Jwt": {
- "Issuer": "timeline.crupest.life",
- "Audience": "timeline.crupest.life"
+ "Issuer": "crupest.space",
+ "Audience": "crupest.space"
}
}
|