From 74fe70b995eefcf9e706e47aae8bc0cdf7efddd9 Mon Sep 17 00:00:00 2001 From: Rory& Date: Thu, 8 Oct 2026 14:46:34 +0200 Subject: [PATCH] Admin API: send guild member leave events --- .../Spacebar.DataMappings.AdminApi/deps.json | 87 +++++++++++++++++++ .../GuildMEmberEvents.cs | 42 +++++++++ .../Controllers/UserController.cs | 10 +++ .../Spacebar.AdminApi.csproj | 5 ++ extra/admin-api/outputs.nix | 12 +++ 5 files changed, 156 insertions(+) create mode 100644 extra/admin-api/DataMappings/Spacebar.DataMappings.AdminApi/deps.json create mode 100644 extra/admin-api/Models/Spacebar.Models.Gateway/GuildMEmberEvents.cs diff --git a/extra/admin-api/DataMappings/Spacebar.DataMappings.AdminApi/deps.json b/extra/admin-api/DataMappings/Spacebar.DataMappings.AdminApi/deps.json new file mode 100644 index 000000000..6305a98da --- /dev/null +++ b/extra/admin-api/DataMappings/Spacebar.DataMappings.AdminApi/deps.json @@ -0,0 +1,87 @@ +[ + { + "pname": "Microsoft.EntityFrameworkCore", + "version": "10.0.4", + "hash": "sha256-V3Vwl1MtVMRTPo7a9lAgs6UaeMnFV3eEsKnLyPaPMHA=" + }, + { + "pname": "Microsoft.EntityFrameworkCore.Abstractions", + "version": "10.0.4", + "hash": "sha256-so4y7Wrp/oWhQ7wd1rK9ha9GtPme1l5H8SrQz7sf8MQ=" + }, + { + "pname": "Microsoft.EntityFrameworkCore.Analyzers", + "version": "10.0.4", + "hash": "sha256-Wed75M4RdQ7bCUWSc+q/0YqL6R5CrIZ2X0t/LpU7ZZA=" + }, + { + "pname": "Microsoft.EntityFrameworkCore.Relational", + "version": "10.0.4", + "hash": "sha256-WwGoCwNxDXyqfBvUX9fGa/6X+yiDBuE7hf3csU78+Os=" + }, + { + "pname": "Microsoft.Extensions.Caching.Abstractions", + "version": "10.0.4", + "hash": "sha256-/vLXWvT42HQAm/JLjWGeFo9AvLn/mu4nCNjabm+wABE=" + }, + { + "pname": "Microsoft.Extensions.Caching.Memory", + "version": "10.0.4", + "hash": "sha256-+0sK/vSyB4KFC9kliECROfK1WaiWwlRrhLpi03pT+3w=" + }, + { + "pname": "Microsoft.Extensions.Configuration.Abstractions", + "version": "10.0.4", + "hash": "sha256-bvEQLGSOpJHKdPD6kd59IIi4x57lKapVMgOORtcjJPs=" + }, + { + "pname": "Microsoft.Extensions.DependencyInjection", + "version": "10.0.4", + "hash": "sha256-hbpKNzN0KIszhlpM5iAT/V3B7QRs3FGTZI9Wq/cYc1A=" + }, + { + "pname": "Microsoft.Extensions.DependencyInjection.Abstractions", + "version": "10.0.0", + "hash": "sha256-9iodXP39YqgxomnOPOxd/mzbG0JfOSXzFoNU3omT2Ps=" + }, + { + "pname": "Microsoft.Extensions.DependencyInjection.Abstractions", + "version": "10.0.4", + "hash": "sha256-0QhVYjk9Cxy6NFef9VKftGmscTZnvcD1bhBQoXz3mwA=" + }, + { + "pname": "Microsoft.Extensions.Logging", + "version": "10.0.4", + "hash": "sha256-eneXBu83dGBiWMFabheGFPYiZJQ+WMewG6bTs2oJ7RA=" + }, + { + "pname": "Microsoft.Extensions.Logging.Abstractions", + "version": "10.0.0", + "hash": "sha256-BnhgGZc01HwTSxogavq7Ueq4V7iMA3wPnbfRwQ4RhGk=" + }, + { + "pname": "Microsoft.Extensions.Logging.Abstractions", + "version": "10.0.4", + "hash": "sha256-dvBRBgEf4Bw9NW2J2XDlEeJw2TNhJ+6gV98dPE13/J0=" + }, + { + "pname": "Microsoft.Extensions.Options", + "version": "10.0.4", + "hash": "sha256-ybyUtpSs/irdarkVjsGhqDcj0w8TNUgh0Kp0j3EVfIA=" + }, + { + "pname": "Microsoft.Extensions.Primitives", + "version": "10.0.4", + "hash": "sha256-ePpEFzrKQbEMY6Kh/xyxKHq6txNru62Vh4LVZO5Rrvg=" + }, + { + "pname": "Npgsql", + "version": "10.0.3", + "hash": "sha256-ddCXCSOoyfy7035OvnL+4LEDYqHjZyPoZ3ffG2coMW0=" + }, + { + "pname": "Npgsql.EntityFrameworkCore.PostgreSQL", + "version": "10.0.3", + "hash": "sha256-2ImviEfJ21Dk7pjLJRFCndi5fqDLOl4gkmtGxH3O48Q=" + } +] diff --git a/extra/admin-api/Models/Spacebar.Models.Gateway/GuildMEmberEvents.cs b/extra/admin-api/Models/Spacebar.Models.Gateway/GuildMEmberEvents.cs new file mode 100644 index 000000000..210869335 --- /dev/null +++ b/extra/admin-api/Models/Spacebar.Models.Gateway/GuildMEmberEvents.cs @@ -0,0 +1,42 @@ +using System.Text.Json.Serialization; +using Spacebar.Models.Generic; + +namespace Spacebar.Models.Gateway; + +public class GuildMemberEvents { + public class Add : Member { + [JsonPropertyName("guild_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] + public long GuildId { get; set; } + } + + public class Update { + [JsonPropertyName("guild_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] + public long GuildId { get; set; } + + [JsonPropertyName("user")] + public PartialUser User { get; set; } // TODO: not partial + + [JsonPropertyName("roles"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] + public List Roles { get; set; } + + [JsonPropertyName("nick")] + public string? Nick { get; set; } + + [JsonPropertyName("joined_at")] + public DateTime? JoinedAt { get; set; } + + [JsonPropertyName("premium_since")] + public DateTime? PremiumSince { get; set; } // TODO serialise as unix? + + [JsonPropertyName("pending")] + public bool? Pending { get; set; } + } + + public class Remove { + [JsonPropertyName("guild_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] + public long GuildId { get; set; } + + [JsonPropertyName("user")] + public PartialUser User { get; set; } // TODO: not partial + } +} \ No newline at end of file diff --git a/extra/admin-api/Spacebar.AdminApi/Controllers/UserController.cs b/extra/admin-api/Spacebar.AdminApi/Controllers/UserController.cs index d24ec7484..3ca2b44b0 100644 --- a/extra/admin-api/Spacebar.AdminApi/Controllers/UserController.cs +++ b/extra/admin-api/Spacebar.AdminApi/Controllers/UserController.cs @@ -3,6 +3,7 @@ using System.Linq.Expressions; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Spacebar.AdminApi.Extensions; +using Spacebar.DataMappings.Generic; using Spacebar.Interop.Authentication; using Spacebar.Interop.Authentication.AspNetCore; using Spacebar.Interop.Replication.Abstractions; @@ -280,6 +281,15 @@ public class UserController( await foreach (var membership in memberships) { db2.Members.Remove(membership); guildIds.Add(membership.GuildId.ToString()); + await replication.SendAsync(new() { + Event = "MESSAGE_BULK_DELETE", + GuildId = membership.GuildId, + Payload = new() { + GuildId = membership.GuildId, + User = user.ToPartialUser() // TODO PublicUser? + }, + Origin = "AdminApi/DeleteUser", + }); } await db2.SaveChangesAsync(); diff --git a/extra/admin-api/Spacebar.AdminApi/Spacebar.AdminApi.csproj b/extra/admin-api/Spacebar.AdminApi/Spacebar.AdminApi.csproj index b846ec0c1..2dc626811 100644 --- a/extra/admin-api/Spacebar.AdminApi/Spacebar.AdminApi.csproj +++ b/extra/admin-api/Spacebar.AdminApi/Spacebar.AdminApi.csproj @@ -14,12 +14,17 @@ + + + + + diff --git a/extra/admin-api/outputs.nix b/extra/admin-api/outputs.nix index 4c7ad3f54..5042cee5f 100644 --- a/extra/admin-api/outputs.nix +++ b/extra/admin-api/outputs.nix @@ -26,6 +26,16 @@ nixpkgs.lib.recursiveUpdate ( { packages = { # Data mappings + Spacebar-DataMappings-AdminApi = buildSpacebarDotnetModule { + name = "Spacebar.DataMappings.AdminApi"; + projectFile = "Spacebar.DataMappings.AdminApi.csproj"; + nugetDeps = DataMappings/Spacebar.DataMappings.AdminApi/deps.json; + srcRoot = DataMappings/Spacebar.DataMappings.AdminApi; + projectReferences = [ + proj.Spacebar-Models-Db + proj.Spacebar-Models-AdminApi + ]; + }; Spacebar-DataMappings-Generic = buildSpacebarDotnetModule { name = "Spacebar.DataMappings.Generic"; projectFile = "Spacebar.DataMappings.Generic.csproj"; @@ -176,6 +186,8 @@ nixpkgs.lib.recursiveUpdate ( srcRoot = ./Spacebar.AdminApi; packNupkg = false; projectReferences = [ + proj.Spacebar-DataMappings-AdminApi + proj.Spacebar-DataMappings-Generic proj.Spacebar-Interop-Authentication proj.Spacebar-Interop-Authentication-AspNetCore proj.Spacebar-Interop-Replication-Abstractions