summary refs log tree commit diff
path: root/extra/admin-api/Spacebar.Offload/Controllers/Op14Controller.cs
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2026-03-19 08:38:20 +0100
committerRory& <root@rory.gay>2026-03-19 08:38:20 +0100
commitd0eac0b8e7738c645707b52e386ca1e2079b8da8 (patch)
treec8fc5b135ec94f6351e025ff7df472f83db4c6c5 /extra/admin-api/Spacebar.Offload/Controllers/Op14Controller.cs
parentCDN: use file contents for hashes, the fuck (diff)
downloadserver-ts-d0eac0b8e7738c645707b52e386ca1e2079b8da8.tar.xz
GatewayOffload: rename to Offload
Diffstat (limited to 'extra/admin-api/Spacebar.Offload/Controllers/Op14Controller.cs')
-rw-r--r--extra/admin-api/Spacebar.Offload/Controllers/Op14Controller.cs51
1 files changed, 51 insertions, 0 deletions
diff --git a/extra/admin-api/Spacebar.Offload/Controllers/Op14Controller.cs b/extra/admin-api/Spacebar.Offload/Controllers/Op14Controller.cs
new file mode 100644

index 00000000..57f1390c --- /dev/null +++ b/extra/admin-api/Spacebar.Offload/Controllers/Op14Controller.cs
@@ -0,0 +1,51 @@ +using System.Text.Json; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Spacebar.GatewayOffload.Extensions.Db; +using Spacebar.Interop.Authentication.AspNetCore; +using Spacebar.Interop.Replication.Abstractions; +using Spacebar.Models.Db.Contexts; +using Spacebar.Models.Gateway; +using Spacebar.Models.Generic; + +namespace Spacebar.GatewayOffload.Controllers; + +[ApiController] +[Route("/_spacebar/offload/gateway/LazyRequest")] +public class Op14Controller(ILogger<Op12Controller> logger, SpacebarAspNetAuthenticationService authService, SpacebarDbContext db, IServiceProvider sp) : ControllerBase { + [HttpPost] + // TODO: actually return something? + public async IAsyncEnumerable<ContentlessReplicationMessage> DoLazyRequest([FromBody] LazyRequest payload) { + var user = await TraceResult.TraceAsync("getAuthUser", () => authService.GetCurrentUserAsync(Request)); + var session = await TraceResult.TraceAsync("getAuthSession", () => authService.GetCurrentSessionAsync(Request)); + + if (!await db.Members.AsNoTracking().AnyAsync(m => m.GuildId == payload.GuildId && m.Id == user.Result.Id)) { + logger.LogWarning("User {user} requested lazy member list for guild {guildId}, but is not a member", user.Result.Id, payload.GuildId); + yield break; + } + + if (payload.Channels.Count == 0) { + logger.LogWarning("User {user} requested lazy member list for guild {guildId}, but is not a member", user.Result.Tag, payload.GuildId); + yield break; + } + + // Fetch hoisted roles for the guild to define groups + var hoistedRoles = await db.Roles + .AsNoTracking() + .Where(r => r.GuildId == payload.GuildId && r.Hoist) + .OrderByDescending(r => r.Position) + .Select(r => new { r.Id }) + .ToListAsync(); + } + + private async Task<string?> GetMemberListIdAsync(SpacebarDbContext db, string guildId, string channelId) { + var channel = await db.Channels.AsNoTracking().FirstOrDefaultAsync(c => c.Id == channelId && c.GuildId == guildId); + if (channel == null) return null; + + if (string.IsNullOrWhiteSpace(channel.PermissionOverwrites) || channel.PermissionOverwrites == "[]") { + return "everyone"; + } + + return null; // TODO + } +} \ No newline at end of file