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(); public async Task 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( 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, }; db.Add(instance); await db.SaveChangesAsync(); return instance; } }