feat(chat): add /guilds/{id} and /guilds/@me endpoints

This commit is contained in:
sam 2024-05-22 17:17:36 +02:00
parent 6aed05af06
commit 00a54f4f8b
Signed by: sam
GPG key ID: B4EF20DDE721CAA1
2 changed files with 49 additions and 5 deletions

View file

@ -5,6 +5,7 @@ using Foxchat.Chat.Services;
using Foxchat.Core.Models; using Foxchat.Core.Models;
using Foxchat.Core.Models.Http; using Foxchat.Core.Models.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using ApiError = Foxchat.Core.ApiError; using ApiError = Foxchat.Core.ApiError;
namespace Foxchat.Chat.Controllers.Api; namespace Foxchat.Chat.Controllers.Api;
@ -16,10 +17,9 @@ public class GuildsController(ILogger logger, ChatContext db, UserResolverServic
[HttpPost] [HttpPost]
public async Task<IActionResult> CreateGuild([FromBody] GuildsApi.CreateGuildRequest req) public async Task<IActionResult> CreateGuild([FromBody] GuildsApi.CreateGuildRequest req)
{ {
var (instance, sig) = HttpContext.GetSignatureOrThrow(); var (instance, _, userId) = HttpContext.GetSignatureWithUser();
if (sig.UserId == null) throw new ApiError.IncomingFederationError("This endpoint requires a user ID.");
var user = await userResolverService.ResolveUserAsync(instance, sig.UserId); var user = await userResolverService.ResolveUserAsync(instance, userId);
var guild = new Guild var guild = new Guild
{ {
@ -44,4 +44,41 @@ public class GuildsController(ILogger logger, ChatContext db, UserResolverServic
[new Channels.PartialChannel(defaultChannel.Id.ToString(), defaultChannel.Name)]) [new Channels.PartialChannel(defaultChannel.Id.ToString(), defaultChannel.Name)])
); );
} }
[HttpGet("{id}")]
public async Task<IActionResult> GetGuild(Ulid id)
{
var (instance, _, userId) = HttpContext.GetSignatureWithUser();
var guild = await db.Guilds
.Include(g => g.Channels)
.FirstOrDefaultAsync(g =>
g.Id == id && g.Users.Any(u => u.RemoteUserId == userId && u.InstanceId == instance.Id));
if (guild == null) throw new ApiError.NotFound("Guild not found");
return Ok(new Guilds.Guild(
guild.Id.ToString(),
guild.Name,
[guild.OwnerId.ToString()],
guild.Channels.Select(c => new Channels.PartialChannel(c.Id.ToString(), c.Name))
));
}
[HttpGet("@me")]
public async Task<IActionResult> GetUserGuilds()
{
var (instance, _, userId) = HttpContext.GetSignatureWithUser();
var guilds = await db.Guilds
.Include(g => g.Channels)
.Where(g => g.Users.Any(u => u.RemoteUserId == userId && u.InstanceId == instance.Id))
.ToListAsync();
var guildResponses = guilds.Select(g => new Guilds.Guild(
g.Id.ToString(),
g.Name,
[g.OwnerId.ToString()],
g.Channels.Select(c => new Channels.PartialChannel(c.Id.ToString(), c.Name))
));
return Ok(guildResponses);
}
} }

View file

@ -76,4 +76,11 @@ public static class HttpContextExtensions
return ((IdentityInstance, SignatureData))obj!; return ((IdentityInstance, SignatureData))obj!;
} }
public static (IdentityInstance, SignatureData, string) GetSignatureWithUser(this HttpContext ctx)
{
var (instance, sig) = ctx.GetSignatureOrThrow();
if (sig.UserId == null) throw new ApiError.IncomingFederationError("This endpoint requires a user ID.");
return (instance, sig, sig.UserId);
}
} }