diff --git a/Server/Constants.cs b/Server/Constants.cs index e4b247b..6098051 100644 --- a/Server/Constants.cs +++ b/Server/Constants.cs @@ -67,6 +67,7 @@ public sealed class Constants [(int)EventTypes.Sell] = new("sell", "出售", true), [(int)EventTypes.Share] = new("share", "分享"), [(int)EventTypes.Move] = new("move", "移动"), + [(int)EventTypes.Comment] = new("comment", "评论"), }; } @@ -103,6 +104,10 @@ public enum EventTypes /// 移动 /// </summary> Move = 14, + /// <summary> + /// 评论 + /// </summary> + Comment = 15, } /// <summary> diff --git a/Server/Controller/EventApiController.cs b/Server/Controller/EventApiController.cs index 07c7411..566580e 100644 --- a/Server/Controller/EventApiController.cs +++ b/Server/Controller/EventApiController.cs @@ -37,6 +37,7 @@ public class EventApiController : BaseController /// p: bool? /// /// </remarks> + /// <param name="flowerId">花草唯一 id</param> /// <param name="eventId">事件类型 id</param> /// <param name="key">查询关键字</param> /// <param name="from">起始日期</param> @@ -56,6 +57,7 @@ public class EventApiController : BaseController [HttpGet] [ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)] public ActionResult<RecordItem[]> GetRecords( + [FromQuery(Name = "fid")] int? flowerId, [FromQuery(Name = "eid")] int? eventId, [FromQuery] string? key, [FromQuery] long? from, @@ -74,7 +76,25 @@ public class EventApiController : BaseController SaveDatabase(); - var records = database.Records.Where(r => r.OwnerId == user.Id); + var records = database.Records.Where(r => r.OwnerId == user.Id).Select(r => new RecordItem + { + Id = r.Id, + OwnerId = r.OwnerId, + ByUserId = r.ByUserId, + DateUnixTime = r.DateUnixTime, + EventId = r.EventId, + FlowerId = r.FlowerId, + IsHidden = r.IsHidden, + Latitude = r.Latitude, + Longitude = r.Longitude, + Title = r.Title, + Memo = r.Memo, + ByUserName = string.IsNullOrEmpty(r.ByUserName) && r.ByUserId != null ? database.Users.Single(u => u.Id == r.ByUserId).Name : r.ByUserName + }); + if (flowerId != null) + { + records = records.Where(r => r.FlowerId == flowerId); + } if (eventId != null) { records = records.Where(r => r.EventId == eventId); @@ -99,7 +119,16 @@ public class EventApiController : BaseController records = records.Include(r => r.Photos); } - return Ok(records.ToArray()); + var array = records.ToArray(); + foreach (var r in array) + { + if (string.IsNullOrEmpty(r.ByUserName)) + { + r.ByUserName = user.Name; + } + } + + return Ok(array); } /// <summary> @@ -249,8 +278,10 @@ public class EventApiController : BaseController FlowerId = @event.FlowerId, EventId = @event.CategoryId, DateUnixTime = now, + IsHidden = @event.IsHidden, ByUserId = @event.ByUser == null ? user.Id : null, ByUserName = @event.ByUser, + Title = @event.Title, Memo = @event.Memo, Latitude = @event.Latitude, Longitude = @event.Longitude @@ -357,6 +388,7 @@ public class EventApiController : BaseController record.FlowerId = update.FlowerId; record.EventId = update.CategoryId; record.DateUnixTime = now; + record.IsHidden = update.IsHidden; if (update.ByUser == null) { record.ByUserId = user.Id; @@ -367,6 +399,7 @@ public class EventApiController : BaseController record.ByUserId = null; record.ByUserName = update.ByUser; } + record.Title = update.Title; record.Memo = update.Memo; record.Latitude = update.Latitude; record.Longitude = update.Longitude; diff --git a/Server/Controller/EventApiController.structs.cs b/Server/Controller/EventApiController.structs.cs index 64378e2..266018e 100644 --- a/Server/Controller/EventApiController.structs.cs +++ b/Server/Controller/EventApiController.structs.cs @@ -25,21 +25,26 @@ public record EventParameter /// <summary> /// 操作人姓名 /// </summary> - [Required] [FromForm(Name = "byUser")] - public required string ByUser { get; init; } + public string? ByUser { get; init; } + + /// <summary> + /// 标题 + /// </summary> + [FromForm(Name = "title")] + public string? Title { get; init; } /// <summary> /// 备注 /// </summary> [FromForm(Name = "memo")] - public string? Memo { get; set; } + public string? Memo { get; init; } /// <summary> /// 纬度 /// </summary> [FromForm(Name = "lat")] - public double? Latitude { get; set; } + public double? Latitude { get; init; } /// <summary> /// 经度 @@ -47,6 +52,12 @@ public record EventParameter [FromForm(Name = "lon")] public double? Longitude { get; set; } + /// <summary> + /// 是否为私有记录 + /// </summary> + [FromForm(Name = "hidden")] + public bool? IsHidden { get; init; } + /// <summary> /// 关联的照片 /// </summary> @@ -64,5 +75,5 @@ public record EventUpdateParameter : EventParameter /// </summary> [Required] [FromForm(Name = "id")] - public required int Id { get; set; } + public required int Id { get; init; } } diff --git a/Server/Controller/FlowerApiController.cs b/Server/Controller/FlowerApiController.cs index f0a0ba4..24b4edb 100644 --- a/Server/Controller/FlowerApiController.cs +++ b/Server/Controller/FlowerApiController.cs @@ -301,7 +301,7 @@ public class FlowerApiController : BaseController var loc = database.Records .OrderByDescending(r => r.DateUnixTime) - .FirstOrDefault(r => r.FlowerId == id && (r.EventId == (int)EventTypes.Move || r.EventId == (int)EventTypes.Born)); + .SingleOrDefault(r => r.FlowerId == id && (r.EventId == (int)EventTypes.Move || r.EventId == (int)EventTypes.Born)); if (loc != null) { item.Location = loc.Memo; diff --git a/Server/Controller/FlowerApiController.structs.cs b/Server/Controller/FlowerApiController.structs.cs index 430129f..1876d8f 100644 --- a/Server/Controller/FlowerApiController.structs.cs +++ b/Server/Controller/FlowerApiController.structs.cs @@ -64,25 +64,25 @@ public record FlowerParameter : CoverParameter /// 备注 /// </summary> [FromForm(Name = "memo")] - public string? Memo { get; set; } + public string? Memo { get; init; } /// <summary> /// 纬度 /// </summary> [FromForm(Name = "lat")] - public double? Latitude { get; set; } + public double? Latitude { get; init; } /// <summary> /// 经度 /// </summary> [FromForm(Name = "lon")] - public double? Longitude { get; set; } + public double? Longitude { get; init; } /// <summary> /// 存放位置 /// </summary> [FromForm(Name = "location")] - public string? Location { get; set; } + public string? Location { get; init; } } /// <summary> @@ -114,13 +114,13 @@ public record FlowerCoverParameter : CoverParameter /// 纬度 /// </summary> [FromForm(Name = "lat")] - public double? Latitude { get; set; } + public double? Latitude { get; init; } /// <summary> /// 经度 /// </summary> [FromForm(Name = "lon")] - public double? Longitude { get; set; } + public double? Longitude { get; init; } } /// <summary> diff --git a/Server/Controller/ImageController.cs b/Server/Controller/ImageController.cs index a640db9..5ce34a1 100644 --- a/Server/Controller/ImageController.cs +++ b/Server/Controller/ImageController.cs @@ -93,7 +93,7 @@ public class ImageController : BaseController { return BadRequest(); } - if (!referrer.StartsWith(BaseUrl)) + if (!referrer.StartsWith("https://app.tsanie.org")) { return Forbid(); } diff --git a/Server/Data/Model/RecordItem.cs b/Server/Data/Model/RecordItem.cs index 12ff9fc..c939819 100644 --- a/Server/Data/Model/RecordItem.cs +++ b/Server/Data/Model/RecordItem.cs @@ -61,6 +61,12 @@ public class RecordItem : ILocation [JsonPropertyName("date")] public required long DateUnixTime { get; set; } + /// <summary> + /// 是否为私有记录 + /// </summary> + [Column("hidden")] + public bool? IsHidden { get; set; } + /// <summary> /// 操作人 uid /// </summary> @@ -73,6 +79,12 @@ public class RecordItem : ILocation [Column("byname")] public string? ByUserName { get; set; } + /// <summary> + /// 标题 + /// </summary> + [Column("title")] + public string? Title { get; set; } + /// <summary> /// 备注 /// </summary> diff --git a/Server/Migrations/20230804035653_Add-Hidden-For-Record.Designer.cs b/Server/Migrations/20230804035653_Add-Hidden-For-Record.Designer.cs new file mode 100644 index 0000000..783c358 --- /dev/null +++ b/Server/Migrations/20230804035653_Add-Hidden-For-Record.Designer.cs @@ -0,0 +1,357 @@ +// <auto-generated /> +using System; +using Blahblah.FlowerStory.Server.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Blahblah.FlowerStory.Server.Migrations +{ + [DbContext(typeof(FlowerDatabase))] + [Migration("20230804035653_Add-Hidden-For-Record")] + partial class AddHiddenForRecord + { + /// <inheritdoc /> + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.9"); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("fid"); + + b.Property<int>("CategoryId") + .HasColumnType("INTEGER") + .HasColumnName("categoryid"); + + b.Property<decimal?>("Cost") + .HasColumnType("real") + .HasColumnName("cost"); + + b.Property<long>("DateBuyUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("datebuy") + .HasAnnotation("Relational:JsonPropertyName", "dateBuy"); + + b.Property<double?>("Latitude") + .HasColumnType("REAL") + .HasColumnName("latitude"); + + b.Property<double?>("Longitude") + .HasColumnType("REAL") + .HasColumnName("longitude"); + + b.Property<string>("Memo") + .HasColumnType("TEXT") + .HasColumnName("memo"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.Property<int>("OwnerId") + .HasColumnType("INTEGER") + .HasColumnName("uid"); + + b.Property<string>("Purchase") + .HasColumnType("TEXT") + .HasColumnName("purchase"); + + b.HasKey("Id"); + + b.HasIndex("OwnerId"); + + b.ToTable("flowers"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.PhotoItem", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("pid"); + + b.Property<long>("DateUploadUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("dateupload") + .HasAnnotation("Relational:JsonPropertyName", "dateUpload"); + + b.Property<string>("FileName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("filename"); + + b.Property<string>("FileType") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("filetype"); + + b.Property<int?>("FlowerId") + .HasColumnType("INTEGER") + .HasColumnName("fid"); + + b.Property<int?>("Height") + .HasColumnType("INTEGER") + .HasColumnName("height"); + + b.Property<int>("OwnerId") + .HasColumnType("INTEGER") + .HasColumnName("uid"); + + b.Property<string>("Path") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("path"); + + b.Property<int?>("RecordId") + .HasColumnType("INTEGER") + .HasColumnName("rid"); + + b.Property<int?>("Width") + .HasColumnType("INTEGER") + .HasColumnName("width"); + + b.HasKey("Id"); + + b.HasIndex("FlowerId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("RecordId"); + + b.ToTable("photos"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.RecordItem", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("rid"); + + b.Property<int?>("ByUserId") + .HasColumnType("INTEGER") + .HasColumnName("byuid"); + + b.Property<string>("ByUserName") + .HasColumnType("TEXT") + .HasColumnName("byname"); + + b.Property<long>("DateUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("date") + .HasAnnotation("Relational:JsonPropertyName", "date"); + + b.Property<int>("EventId") + .HasColumnType("INTEGER") + .HasColumnName("eid"); + + b.Property<int>("FlowerId") + .HasColumnType("INTEGER") + .HasColumnName("fid"); + + b.Property<bool?>("Hidden") + .HasColumnType("INTEGER") + .HasColumnName("hidden"); + + b.Property<double?>("Latitude") + .HasColumnType("REAL") + .HasColumnName("latitude"); + + b.Property<double?>("Longitude") + .HasColumnType("REAL") + .HasColumnName("longitude"); + + b.Property<string>("Memo") + .HasColumnType("TEXT") + .HasColumnName("memo"); + + b.Property<int>("OwnerId") + .HasColumnType("INTEGER") + .HasColumnName("uid"); + + b.HasKey("Id"); + + b.HasIndex("FlowerId"); + + b.HasIndex("OwnerId"); + + b.ToTable("records"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.TokenItem", b => + { + b.Property<string>("Id") + .HasColumnType("TEXT") + .HasColumnName("tid"); + + b.Property<long>("ActiveDateUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("activedate") + .HasAnnotation("Relational:JsonPropertyName", "activeDate"); + + b.Property<string>("ClientAgent") + .HasColumnType("TEXT") + .HasColumnName("clientagent"); + + b.Property<string>("ClientApp") + .HasColumnType("TEXT") + .HasColumnName("clientapp"); + + b.Property<string>("DeviceId") + .HasColumnType("TEXT") + .HasColumnName("deviceid"); + + b.Property<long>("ExpireDateUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("expiredate") + .HasAnnotation("Relational:JsonPropertyName", "expireDate"); + + b.Property<int>("ExpireSeconds") + .HasColumnType("INTEGER") + .HasColumnName("expiresecs"); + + b.Property<long>("LogonDateUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("logondate") + .HasAnnotation("Relational:JsonPropertyName", "logonDate"); + + b.Property<int>("UserId") + .HasColumnType("INTEGER") + .HasColumnName("uid"); + + b.Property<string>("VerifyCode") + .HasColumnType("TEXT") + .HasColumnName("verifycode"); + + b.HasKey("Id"); + + b.ToTable("tokens"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.UserItem", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("uid"); + + b.Property<long?>("ActiveDateUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("activedate"); + + b.Property<byte[]>("Avatar") + .HasColumnType("BLOB") + .HasColumnName("avatar"); + + b.Property<string>("Email") + .HasColumnType("TEXT") + .HasColumnName("email"); + + b.Property<int>("Level") + .HasColumnType("INTEGER") + .HasColumnName("level"); + + b.Property<string>("Mobile") + .HasColumnType("TEXT") + .HasColumnName("mobile"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.Property<string>("Password") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("password"); + + b.Property<long>("RegisterDateUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("regdate") + .HasAnnotation("Relational:JsonPropertyName", "registerDate"); + + b.Property<string>("UserId") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("id"); + + b.HasKey("Id"); + + b.ToTable("users"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", b => + { + b.HasOne("Blahblah.FlowerStory.Server.Data.Model.UserItem", "Owner") + .WithMany() + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.PhotoItem", b => + { + b.HasOne("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", "Flower") + .WithMany("Photos") + .HasForeignKey("FlowerId"); + + b.HasOne("Blahblah.FlowerStory.Server.Data.Model.UserItem", "Owner") + .WithMany() + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Blahblah.FlowerStory.Server.Data.Model.RecordItem", "Record") + .WithMany("Photos") + .HasForeignKey("RecordId"); + + b.Navigation("Flower"); + + b.Navigation("Owner"); + + b.Navigation("Record"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.RecordItem", b => + { + b.HasOne("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", "Flower") + .WithMany() + .HasForeignKey("FlowerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Blahblah.FlowerStory.Server.Data.Model.UserItem", "Owner") + .WithMany() + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Flower"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", b => + { + b.Navigation("Photos"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.RecordItem", b => + { + b.Navigation("Photos"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Server/Migrations/20230804035653_Add-Hidden-For-Record.cs b/Server/Migrations/20230804035653_Add-Hidden-For-Record.cs new file mode 100644 index 0000000..6d347d6 --- /dev/null +++ b/Server/Migrations/20230804035653_Add-Hidden-For-Record.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Blahblah.FlowerStory.Server.Migrations +{ + /// <inheritdoc /> + public partial class AddHiddenForRecord : Migration + { + /// <inheritdoc /> + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn<bool>( + name: "hidden", + table: "records", + type: "INTEGER", + nullable: true); + } + + /// <inheritdoc /> + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "hidden", + table: "records"); + } + } +} diff --git a/Server/Migrations/20230804133228_Add-Title-For-Record.Designer.cs b/Server/Migrations/20230804133228_Add-Title-For-Record.Designer.cs new file mode 100644 index 0000000..af85ac0 --- /dev/null +++ b/Server/Migrations/20230804133228_Add-Title-For-Record.Designer.cs @@ -0,0 +1,361 @@ +// <auto-generated /> +using System; +using Blahblah.FlowerStory.Server.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Blahblah.FlowerStory.Server.Migrations +{ + [DbContext(typeof(FlowerDatabase))] + [Migration("20230804133228_Add-Title-For-Record")] + partial class AddTitleForRecord + { + /// <inheritdoc /> + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.9"); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("fid"); + + b.Property<int>("CategoryId") + .HasColumnType("INTEGER") + .HasColumnName("categoryid"); + + b.Property<decimal?>("Cost") + .HasColumnType("real") + .HasColumnName("cost"); + + b.Property<long>("DateBuyUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("datebuy") + .HasAnnotation("Relational:JsonPropertyName", "dateBuy"); + + b.Property<double?>("Latitude") + .HasColumnType("REAL") + .HasColumnName("latitude"); + + b.Property<double?>("Longitude") + .HasColumnType("REAL") + .HasColumnName("longitude"); + + b.Property<string>("Memo") + .HasColumnType("TEXT") + .HasColumnName("memo"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.Property<int>("OwnerId") + .HasColumnType("INTEGER") + .HasColumnName("uid"); + + b.Property<string>("Purchase") + .HasColumnType("TEXT") + .HasColumnName("purchase"); + + b.HasKey("Id"); + + b.HasIndex("OwnerId"); + + b.ToTable("flowers"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.PhotoItem", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("pid"); + + b.Property<long>("DateUploadUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("dateupload") + .HasAnnotation("Relational:JsonPropertyName", "dateUpload"); + + b.Property<string>("FileName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("filename"); + + b.Property<string>("FileType") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("filetype"); + + b.Property<int?>("FlowerId") + .HasColumnType("INTEGER") + .HasColumnName("fid"); + + b.Property<int?>("Height") + .HasColumnType("INTEGER") + .HasColumnName("height"); + + b.Property<int>("OwnerId") + .HasColumnType("INTEGER") + .HasColumnName("uid"); + + b.Property<string>("Path") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("path"); + + b.Property<int?>("RecordId") + .HasColumnType("INTEGER") + .HasColumnName("rid"); + + b.Property<int?>("Width") + .HasColumnType("INTEGER") + .HasColumnName("width"); + + b.HasKey("Id"); + + b.HasIndex("FlowerId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("RecordId"); + + b.ToTable("photos"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.RecordItem", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("rid"); + + b.Property<int?>("ByUserId") + .HasColumnType("INTEGER") + .HasColumnName("byuid"); + + b.Property<string>("ByUserName") + .HasColumnType("TEXT") + .HasColumnName("byname"); + + b.Property<long>("DateUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("date") + .HasAnnotation("Relational:JsonPropertyName", "date"); + + b.Property<int>("EventId") + .HasColumnType("INTEGER") + .HasColumnName("eid"); + + b.Property<int>("FlowerId") + .HasColumnType("INTEGER") + .HasColumnName("fid"); + + b.Property<bool?>("IsHidden") + .HasColumnType("INTEGER") + .HasColumnName("hidden"); + + b.Property<double?>("Latitude") + .HasColumnType("REAL") + .HasColumnName("latitude"); + + b.Property<double?>("Longitude") + .HasColumnType("REAL") + .HasColumnName("longitude"); + + b.Property<string>("Memo") + .HasColumnType("TEXT") + .HasColumnName("memo"); + + b.Property<int>("OwnerId") + .HasColumnType("INTEGER") + .HasColumnName("uid"); + + b.Property<string>("Title") + .HasColumnType("TEXT") + .HasColumnName("title"); + + b.HasKey("Id"); + + b.HasIndex("FlowerId"); + + b.HasIndex("OwnerId"); + + b.ToTable("records"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.TokenItem", b => + { + b.Property<string>("Id") + .HasColumnType("TEXT") + .HasColumnName("tid"); + + b.Property<long>("ActiveDateUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("activedate") + .HasAnnotation("Relational:JsonPropertyName", "activeDate"); + + b.Property<string>("ClientAgent") + .HasColumnType("TEXT") + .HasColumnName("clientagent"); + + b.Property<string>("ClientApp") + .HasColumnType("TEXT") + .HasColumnName("clientapp"); + + b.Property<string>("DeviceId") + .HasColumnType("TEXT") + .HasColumnName("deviceid"); + + b.Property<long>("ExpireDateUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("expiredate") + .HasAnnotation("Relational:JsonPropertyName", "expireDate"); + + b.Property<int>("ExpireSeconds") + .HasColumnType("INTEGER") + .HasColumnName("expiresecs"); + + b.Property<long>("LogonDateUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("logondate") + .HasAnnotation("Relational:JsonPropertyName", "logonDate"); + + b.Property<int>("UserId") + .HasColumnType("INTEGER") + .HasColumnName("uid"); + + b.Property<string>("VerifyCode") + .HasColumnType("TEXT") + .HasColumnName("verifycode"); + + b.HasKey("Id"); + + b.ToTable("tokens"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.UserItem", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("uid"); + + b.Property<long?>("ActiveDateUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("activedate"); + + b.Property<byte[]>("Avatar") + .HasColumnType("BLOB") + .HasColumnName("avatar"); + + b.Property<string>("Email") + .HasColumnType("TEXT") + .HasColumnName("email"); + + b.Property<int>("Level") + .HasColumnType("INTEGER") + .HasColumnName("level"); + + b.Property<string>("Mobile") + .HasColumnType("TEXT") + .HasColumnName("mobile"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.Property<string>("Password") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("password"); + + b.Property<long>("RegisterDateUnixTime") + .HasColumnType("INTEGER") + .HasColumnName("regdate") + .HasAnnotation("Relational:JsonPropertyName", "registerDate"); + + b.Property<string>("UserId") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("id"); + + b.HasKey("Id"); + + b.ToTable("users"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", b => + { + b.HasOne("Blahblah.FlowerStory.Server.Data.Model.UserItem", "Owner") + .WithMany() + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.PhotoItem", b => + { + b.HasOne("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", "Flower") + .WithMany("Photos") + .HasForeignKey("FlowerId"); + + b.HasOne("Blahblah.FlowerStory.Server.Data.Model.UserItem", "Owner") + .WithMany() + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Blahblah.FlowerStory.Server.Data.Model.RecordItem", "Record") + .WithMany("Photos") + .HasForeignKey("RecordId"); + + b.Navigation("Flower"); + + b.Navigation("Owner"); + + b.Navigation("Record"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.RecordItem", b => + { + b.HasOne("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", "Flower") + .WithMany() + .HasForeignKey("FlowerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Blahblah.FlowerStory.Server.Data.Model.UserItem", "Owner") + .WithMany() + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Flower"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", b => + { + b.Navigation("Photos"); + }); + + modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.RecordItem", b => + { + b.Navigation("Photos"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Server/Migrations/20230804133228_Add-Title-For-Record.cs b/Server/Migrations/20230804133228_Add-Title-For-Record.cs new file mode 100644 index 0000000..a9157bc --- /dev/null +++ b/Server/Migrations/20230804133228_Add-Title-For-Record.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Blahblah.FlowerStory.Server.Migrations +{ + /// <inheritdoc /> + public partial class AddTitleForRecord : Migration + { + /// <inheritdoc /> + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn<string>( + name: "title", + table: "records", + type: "TEXT", + nullable: true); + } + + /// <inheritdoc /> + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "title", + table: "records"); + } + } +} diff --git a/Server/Migrations/FlowerDatabaseModelSnapshot.cs b/Server/Migrations/FlowerDatabaseModelSnapshot.cs index 44cd4fb..678e7ae 100644 --- a/Server/Migrations/FlowerDatabaseModelSnapshot.cs +++ b/Server/Migrations/FlowerDatabaseModelSnapshot.cs @@ -155,6 +155,10 @@ namespace Blahblah.FlowerStory.Server.Migrations .HasColumnType("INTEGER") .HasColumnName("fid"); + b.Property<bool?>("IsHidden") + .HasColumnType("INTEGER") + .HasColumnName("hidden"); + b.Property<double?>("Latitude") .HasColumnType("REAL") .HasColumnName("latitude"); @@ -171,6 +175,10 @@ namespace Blahblah.FlowerStory.Server.Migrations .HasColumnType("INTEGER") .HasColumnName("uid"); + b.Property<string>("Title") + .HasColumnType("TEXT") + .HasColumnName("title"); + b.HasKey("Id"); b.HasIndex("FlowerId"); diff --git a/Server/Program.cs b/Server/Program.cs index 9321e25..1f1dd24 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -11,7 +11,7 @@ public class Program /// <inheritdoc/> public const string ProjectName = "Flower Story"; /// <inheritdoc/> - public const string Version = "0.8.803"; + public const string Version = "1.0.807"; /// <inheritdoc/> public static void Main(string[] args) diff --git a/Server/Properties/launchSettings.json b/Server/Properties/launchSettings.json index 868d3e6..1f921a5 100644 --- a/Server/Properties/launchSettings.json +++ b/Server/Properties/launchSettings.json @@ -13,7 +13,7 @@ "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, - "launchUrl": "#tag/UserApi", + "launchUrl": "swagger", "applicationUrl": "http://localhost:5247", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development"