diff --git a/DysonNetwork.Shared/Models/FediverseActor.cs b/DysonNetwork.Shared/Models/FediverseActor.cs index df82f11..f7041ab 100644 --- a/DysonNetwork.Shared/Models/FediverseActor.cs +++ b/DysonNetwork.Shared/Models/FediverseActor.cs @@ -32,8 +32,8 @@ public class SnFediverseActor : ModelBase public bool IsDiscoverable { get; set; } = true; public Guid InstanceId { get; set; } + public SnFediverseInstance Instance { get; set; } = null!; - [JsonIgnore] public SnFediverseInstance Instance { get; set; } = null!; [JsonIgnore] public ICollection Contents { get; set; } = []; [JsonIgnore] public ICollection Activities { get; set; } = []; [JsonIgnore] public ICollection FollowingRelationships { get; set; } = []; diff --git a/DysonNetwork.Shared/Models/FediverseInstance.cs b/DysonNetwork.Shared/Models/FediverseInstance.cs index 2945f94..173e321 100644 --- a/DysonNetwork.Shared/Models/FediverseInstance.cs +++ b/DysonNetwork.Shared/Models/FediverseInstance.cs @@ -11,35 +11,19 @@ public class SnFediverseInstance : ModelBase { public Guid Id { get; set; } = Guid.NewGuid(); - [MaxLength(256)] - public string Domain { get; set; } = null!; - - [MaxLength(512)] - public string? Name { get; set; } - - [MaxLength(4096)] - public string? Description { get; set; } - - [MaxLength(2048)] - public string? Software { get; set; } - - [MaxLength(2048)] - public string? Version { get; set; } - - [Column(TypeName = "jsonb")] - public Dictionary? Metadata { get; set; } + [MaxLength(256)] public string Domain { get; set; } = null!; + [MaxLength(512)] public string? Name { get; set; } + [MaxLength(4096)] public string? Description { get; set; } + [MaxLength(2048)] public string? Software { get; set; } + [MaxLength(2048)] public string? Version { get; set; } + [Column(TypeName = "jsonb")] public Dictionary? Metadata { get; set; } public bool IsBlocked { get; set; } = false; public bool IsSilenced { get; set; } = false; - [MaxLength(2048)] - public string? BlockReason { get; set; } - - [JsonIgnore] - public ICollection Actors { get; set; } = []; - - [JsonIgnore] - public ICollection Contents { get; set; } = []; + [MaxLength(2048)] public string? BlockReason { get; set; } + [JsonIgnore] public ICollection Actors { get; set; } = []; + [JsonIgnore] public ICollection Contents { get; set; } = []; public Instant? LastFetchedAt { get; set; } public Instant? LastActivityAt { get; set; } diff --git a/DysonNetwork.Sphere/ActivityPub/ActivityPubDiscoveryService.cs b/DysonNetwork.Sphere/ActivityPub/ActivityPubDiscoveryService.cs index d939681..76f250f 100644 --- a/DysonNetwork.Sphere/ActivityPub/ActivityPubDiscoveryService.cs +++ b/DysonNetwork.Sphere/ActivityPub/ActivityPubDiscoveryService.cs @@ -1,6 +1,5 @@ using DysonNetwork.Shared.Models; using Microsoft.EntityFrameworkCore; -using System.Linq; using System.Text.Json; using System.Text.RegularExpressions; using System.Xml.Linq; @@ -39,6 +38,7 @@ public partial class ActivityPubDiscoveryService( ) { var localResults = await db.FediverseActors + .Include(a => a.Instance) .Where(a => a.Username.Contains(query) || a.DisplayName != null && a.DisplayName.Contains(query)) @@ -210,10 +210,15 @@ public partial class ActivityPubDiscoveryService( } } - private async Task StoreActorAsync(string actorUri, string username, string domain, - string? webfingerAvatarUrl) + private async Task StoreActorAsync( + string actorUri, + string username, + string domain, + string? webfingerAvatarUrl + ) { var existingActor = await db.FediverseActors + .Include(a => a.Instance) .FirstOrDefaultAsync(a => a.Uri == actorUri); if (existingActor != null) @@ -250,9 +255,10 @@ public partial class ActivityPubDiscoveryService( await db.SaveChangesAsync(); logger.LogInformation("Successfully stored actor from Webfinger: {Username}@{Domain}", username, domain); - + await FetchActorDataAsync(actor); + actor.Instance = instance; return actor; } catch (Exception ex) @@ -289,7 +295,7 @@ public partial class ActivityPubDiscoveryService( return; } - actor.Type = actorData.GetValueOrDefault("type")?.ToString(); + actor.Type = actorData.GetValueOrDefault("type")?.ToString() ?? "Person"; actor.DisplayName = actorData.GetValueOrDefault("name")?.ToString(); actor.Bio = actorData.GetValueOrDefault("summary")?.ToString(); actor.InboxUri = actorData.GetValueOrDefault("inbox")?.ToString(); diff --git a/DysonNetwork.Sphere/ActivityPub/ActivityPubFollowController.cs b/DysonNetwork.Sphere/ActivityPub/ActivityPubFollowController.cs index b37529a..8f15100 100644 --- a/DysonNetwork.Sphere/ActivityPub/ActivityPubFollowController.cs +++ b/DysonNetwork.Sphere/ActivityPub/ActivityPubFollowController.cs @@ -108,6 +108,7 @@ public class ActivityPubFollowController( var actors = await db.FediverseRelationships .Include(r => r.TargetActor) + .ThenInclude(a => a.Instance) .Where(r => r.IsLocalActor && r.LocalPublisherId == publisher.Id && @@ -140,6 +141,7 @@ public class ActivityPubFollowController( var actors = await db.FediverseRelationships .Include(r => r.Actor) + .ThenInclude(a => a.Instance) .Where(r => !r.IsLocalActor && r.LocalPublisherId == publisher.Id &&