39 lines
1.3 KiB
C#
39 lines
1.3 KiB
C#
using Foxchat.Core.Federation;
|
|
using Foxchat.Core.Models.Http;
|
|
using Foxchat.Identity.Database;
|
|
using Foxchat.Identity.Database.Models;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace Foxchat.Identity.Services;
|
|
|
|
public class ChatInstanceResolverService(ILogger logger, RequestSigningService requestSigningService, IdentityContext db, InstanceConfig config)
|
|
{
|
|
private readonly ILogger _logger = logger.ForContext<ChatInstanceResolverService>();
|
|
|
|
public async Task<ChatInstance> ResolveChatInstanceAsync(string domain)
|
|
{
|
|
var instance = await db.ChatInstances.Where(c => c.Domain == domain).FirstOrDefaultAsync();
|
|
if (instance != null) return instance;
|
|
|
|
_logger.Information("Unknown chat instance {Domain}, fetching its data", domain);
|
|
|
|
var resp = await requestSigningService.RequestAsync<Hello.HelloResponse>(
|
|
HttpMethod.Post,
|
|
domain, "/_fox/chat/hello",
|
|
userId: null,
|
|
body: new Hello.HelloRequest(config.Domain)
|
|
);
|
|
|
|
instance = new ChatInstance
|
|
{
|
|
Domain = domain,
|
|
BaseUrl = $"https://{domain}",
|
|
PublicKey = resp.PublicKey,
|
|
Status = ChatInstance.InstanceStatus.Active,
|
|
};
|
|
await db.AddAsync(instance);
|
|
await db.SaveChangesAsync();
|
|
|
|
return instance;
|
|
}
|
|
}
|