using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; using DysonNetwork.Sphere.Post; using DysonNetwork.Sphere.Storage; using Microsoft.EntityFrameworkCore; using NodaTime; namespace DysonNetwork.Sphere.Publisher; public enum PublisherType { Individual, Organizational } [Index(nameof(Name), IsUnique = true)] public class Publisher : ModelBase { public Guid Id { get; set; } public PublisherType Type { get; set; } [MaxLength(256)] public string Name { get; set; } = string.Empty; [MaxLength(256)] public string Nick { get; set; } = string.Empty; [MaxLength(4096)] public string? Bio { get; set; } public string? PictureId { get; set; } public CloudFile? Picture { get; set; } public string? BackgroundId { get; set; } public CloudFile? Background { get; set; } [JsonIgnore] public ICollection Posts { get; set; } = new List(); [JsonIgnore] public ICollection Collections { get; set; } = new List(); [JsonIgnore] public ICollection Members { get; set; } = new List(); [JsonIgnore] public ICollection Subscriptions { get; set; } = new List(); public Guid? AccountId { get; set; } [JsonIgnore] public Account.Account? Account { get; set; } public Guid? RealmId { get; set; } [JsonIgnore] public Realm.Realm? Realm { get; set; } } public enum PublisherMemberRole { Owner = 100, Manager = 75, Editor = 50, Viewer = 25 } public class PublisherMember : ModelBase { public Guid PublisherId { get; set; } [JsonIgnore] public Publisher Publisher { get; set; } = null!; public Guid AccountId { get; set; } [JsonIgnore] public Account.Account Account { get; set; } = null!; public PublisherMemberRole Role { get; set; } = PublisherMemberRole.Viewer; public Instant? JoinedAt { get; set; } } public enum SubscriptionStatus { Active, Expired, Cancelled } public class PublisherSubscription : ModelBase { public Guid Id { get; set; } public Guid PublisherId { get; set; } [JsonIgnore] public Publisher Publisher { get; set; } = null!; public Guid AccountId { get; set; } [JsonIgnore] public Account.Account Account { get; set; } = null!; public SubscriptionStatus Status { get; set; } = SubscriptionStatus.Active; public int Tier { get; set; } = 0; } public class PublisherFeature : ModelBase { public Guid Id { get; set; } [MaxLength(1024)] public string Flag { get; set; } = null!; public Instant? ExpiredAt { get; set; } public Guid PublisherId { get; set; } public Publisher Publisher { get; set; } = null!; }