using MongoDB.Entities; using PrivaPub.Federation.Actors; using PrivaPub.Federation.Objects; using PrivaPub.Federation.Outbox; using PrivaPub.Federation.Rendering; using PrivaPub.Models.Federation; using PrivaPub.Models.Group; using PrivaPub.Models.Post; using PrivaPub.Models.User; using PrivaPub.StaticServices; using System.Text.Json.Nodes; using static PrivaPub.Federation.Inbox.ForeignMembers; using static PrivaPub.Federation.Objects.ActivityJson; using DmPostEntity = PrivaPub.Models.Post.DmPost; using PostEntity = PrivaPub.Models.Post.Post; namespace PrivaPub.Federation.Inbox.Handlers { public class UpdateHandler : IActivityHandler { readonly DbEntities _dbEntities; readonly ILocalActorService _localActors; readonly IRemoteActorService _remoteActors; readonly IDeliveryService _delivery; public UpdateHandler(DbEntities dbEntities, ILocalActorService localActors, IRemoteActorService remoteActors, IDeliveryService delivery) { _dbEntities = dbEntities; _localActors = localActors; _remoteActors = remoteActors; _delivery = delivery; } public string Type => "Update"; public async Task Handle(JsonNode activity, ForeignAvatar actor, CancellationToken token) { var update = activity; var inner = update["object"]; if (Id(inner) == actor.ActorURI) { await _remoteActors.GetActor(actor.ActorURI, refresh: true, token); return; } if (inner is not JsonObject || Id(inner["attributedTo"]) != actor.ActorURI || !Origin.Same(Id(inner), actor.ActorURI)) return; var objectUri = Id(inner); var text = ContentSanitizer.Html(Value(inner, "content")); await DB.Default.Update() .Match(p => p.ObjectURI == objectUri && p.ActorURI == actor.ActorURI) .Modify(p => p.Text, text) .Modify(p => p.ContentHtml, text) .Modify(p => p.UpdateDate, DateTime.UtcNow) .ExecuteAsync(token); await DB.Default.Update() .Match(p => p.ObjectURI == objectUri && p.ActorURI == actor.ActorURI) .Modify(p => p.Text, text) .Modify(p => p.ContentHtml, text) .Modify(p => p.UpdateDate, DateTime.UtcNow) .ExecuteAsync(token); return; } } }