using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using DysonNetwork.Shared.Data; using NodaTime; using NodaTime.Serialization.Protobuf; namespace DysonNetwork.Pass.Account; public enum StatusAttitude { Positive, Negative, Neutral } public class Status : ModelBase { public Guid Id { get; set; } = Guid.NewGuid(); public StatusAttitude Attitude { get; set; } [NotMapped] public bool IsOnline { get; set; } [NotMapped] public bool IsCustomized { get; set; } = true; public bool IsInvisible { get; set; } public bool IsNotDisturb { get; set; } [MaxLength(1024)] public string? Label { get; set; } public Instant? ClearedAt { get; set; } public Guid AccountId { get; set; } public Account Account { get; set; } = null!; public Shared.Proto.AccountStatus ToProtoValue() { var proto = new Shared.Proto.AccountStatus { Id = Id.ToString(), Attitude = Attitude switch { StatusAttitude.Positive => Shared.Proto.StatusAttitude.Positive, StatusAttitude.Negative => Shared.Proto.StatusAttitude.Negative, StatusAttitude.Neutral => Shared.Proto.StatusAttitude.Neutral, _ => Shared.Proto.StatusAttitude.Unspecified }, IsOnline = IsOnline, IsCustomized = IsCustomized, IsInvisible = IsInvisible, IsNotDisturb = IsNotDisturb, Label = Label ?? string.Empty, ClearedAt = ClearedAt?.ToTimestamp(), AccountId = AccountId.ToString() }; return proto; } public static Status FromProtoValue(Shared.Proto.AccountStatus proto) { var status = new Status { Id = Guid.Parse(proto.Id), Attitude = proto.Attitude switch { Shared.Proto.StatusAttitude.Positive => StatusAttitude.Positive, Shared.Proto.StatusAttitude.Negative => StatusAttitude.Negative, Shared.Proto.StatusAttitude.Neutral => StatusAttitude.Neutral, _ => StatusAttitude.Neutral }, IsOnline = proto.IsOnline, IsCustomized = proto.IsCustomized, IsInvisible = proto.IsInvisible, IsNotDisturb = proto.IsNotDisturb, Label = proto.Label, ClearedAt = proto.ClearedAt?.ToInstant(), AccountId = Guid.Parse(proto.AccountId) }; return status; } } public enum CheckInResultLevel { Worst, Worse, Normal, Better, Best } public class CheckInResult : ModelBase { public Guid Id { get; set; } = Guid.NewGuid(); public CheckInResultLevel Level { get; set; } public decimal? RewardPoints { get; set; } public int? RewardExperience { get; set; } [Column(TypeName = "jsonb")] public ICollection Tips { get; set; } = new List(); public Guid AccountId { get; set; } public Account Account { get; set; } = null!; public Instant? BackdatedFrom { get; set; } } public class FortuneTip { public bool IsPositive { get; set; } public string Title { get; set; } = null!; public string Content { get; set; } = null!; } /// /// This method should not be mapped. Used to generate the daily event calendar. /// public class DailyEventResponse { public Instant Date { get; set; } public CheckInResult? CheckInResult { get; set; } public ICollection Statuses { get; set; } = new List(); }