using MongoDB.Bson.Serialization.Attributes; using MongoDB.Entities; namespace PrivaPub.Models.Post { public class Post : Entity { public string GroupUserId { get; set; }//local author's Avatar.ID public string AuthorAccountId { get; set; }//Avatar.ID or ForeignAvatar.ID public string AnsweringToPostId { get; set; }//the parent's Post.ID when we hold it public string InReplyToURI { get; set; } public string InReplyToAccountId { get; set; } public string GroupId { get; set; } public string ConversationId { get; set; }//DmGroup.ID of a direct post public string AudienceURI { get; set; }//a remote community the post was made in public string ReblogOfPostId { get; set; } public PostVisibility Visibility { get; set; } public string Title { get; set; } public string SpoilerText { get; set; } public string Excerpt { get; set; }//a non-Note's summary: a teaser, a description, an event's date and place public string Text { get; set; } public string ContentHtml { get; set; } public ContentFormat ContentFormat { get; set; } public string Language { get; set; } public List Mentions { get; set; } = new(); public List Tags { get; set; } = new(); public List Media { get; set; } = new(); public List Emojis { get; set; } = new(); [BsonIgnoreIfNull] public PostSource Source { get; set; }//the remote author's own text (Markdown, MFM, BBCode) [BsonIgnoreIfNull] public string CoverURL { get; set; }//a remote object's own image: article cover, video poster, event banner [BsonIgnoreIfNull] public PostLink Link { get; set; } [BsonIgnoreIfNull] public VideoDetails Video { get; set; } [BsonIgnoreIfNull] public AudioDetails Audio { get; set; } [BsonIgnoreIfNull] public EventDetails Event { get; set; } [BsonIgnoreIfNull] public PostPoll Poll { get; set; } public List Location { get; set; } = new(); public float RangeKm { get; set; } = 5.0f; [BsonIgnoreIfNull] public Coordinates2D Geo { get; set; } [BsonIgnoreIfNull] public double? Distance { get; set; } public bool HasContentWarning { get; set; } = false; public bool IsLocalOnly { get; set; } public bool IsFederatedCopy { get; set; } public string ObjectURI { get; set; }//the Note's id public string ObjectType { get; set; }//the remote object's type: Note, Article, Page, Video, Event…; null for local posts public string ActivityURI { get; set; }//the Create's id public string ActorURI { get; set; }//attributedTo public string Url { get; set; } public string ContextURI { get; set; } public string QuoteURI { get; set; } public string QuotedPostId { get; set; }//our copy of the quoted post, once fetched public QuoteState QuoteState { get; set; } public string QuoteAuthorizationURI { get; set; }//FEP-044f: the quoted author's stamp public bool QuoteByConsent { get; set; }//our quote of a post whose server asks for consent (FEP-044f), so `quote` is sent public int QuotesCount { get; set; } [BsonIgnoreIfNull] public InteractionRule QuotePolicy { get; set; }//a remote post's interactionPolicy.canQuote; null when it states none public List To { get; set; } = new(); public List Cc { get; set; } = new(); public int RepliesCount { get; set; } public int FavouritesCount { get; set; } public int DownvotesCount { get; set; }//Lemmy, PieFed, Mbin and Friendica Dislikes public int ReblogsCount { get; set; } public List Revisions { get; set; } = new(); public DateTime CreationDate { get; set; } = DateTime.UtcNow; public DateTime? UpdateDate { get; set; } = DateTime.UtcNow; public DateTime? EditedAt { get; set; } public DateTime? DeletedAt { get; set; } public string UpdateReason { get; set; } } public enum QuoteState { None, Pending, Accepted, Rejected, Revoked, Deleted, Unauthorized } public enum PostVisibility { Public, Unlisted, FollowersOnly, Direct, Circle, LocalGeo } public class PostMention { public string ActorURI { get; set; } public string AccountId { get; set; } public string Handle { get; set; } public bool IsLocal { get; set; } } public class PostRevision { public string Title { get; set; } public string SpoilerText { get; set; } public string ContentHtml { get; set; } public bool HasContentWarning { get; set; } public DateTime EditedAt { get; set; } } }