A reply whose text had lost the @name of the author it answers (decePub prefills it, a reader may delete it) was addressed to nobody on the author's server. PrivaPub delivered it to the author's inbox anyway, but GoToSocial keeps only what is addressed to someone there, so the reply never appeared under the post. A public or unlisted reply to a remote post now names its parent's author in cc, as Pleroma does; the reply already says whom it answers, so nothing new is revealed. The parent author's actor id is kept on the reply (InReplyToActorURI). Found by decePub's end-to-end tests on the town. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
128 lines
4.9 KiB
C#
128 lines
4.9 KiB
C#
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 InReplyToActorURI { get; set; }//a local reply's remote parent author, named in its cc
|
|
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<PostMention> Mentions { get; set; } = new();
|
|
public List<string> Tags { get; set; } = new();
|
|
public List<PostMedia> Media { get; set; } = new();
|
|
public List<CustomEmoji> 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 PostPlace Place { get; set; }
|
|
[BsonIgnoreIfNull]
|
|
public PostPoll Poll { get; set; }
|
|
public List<float> 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 AuthorGone { get; set; }//its remote author deleted their account: kept, but hidden everywhere (VisibilityPolicy)
|
|
|
|
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; }
|
|
public string LocalQuotePolicy { get; set; }//who may quote this local post: QuotePolicies.Public, Followers or Nobody//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<string> To { get; set; } = new();
|
|
public List<string> 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<PostRevision> 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; }
|
|
//addressed in to or cc without a Mention tag (Mastodon's silent mention): may see the post, but the post does not name it
|
|
public bool Silent { 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; }
|
|
}
|
|
}
|