using Microsoft.Extensions.Logging;
using SameBeat.Application.DTO;
using SameBeat.Application.Interfejsy;
using SameBeat.Application.Walidacja;
using SameBeat.Application.Zapytania;
namespace SameBeat.Application.Serwisy;
///
/// Cienka warstwa orkiestracji nad -- oddziela walidacje
/// wejscia (Application) od szczegolow podpisu JWT LiveKit (Infrastructure).
///
public sealed class SerwisDostepuLiveKit : ISerwisDostepuLiveKit
{
private readonly ISerwisTokenowLiveKit _serwisTokenowLiveKit;
private readonly string _urlLiveKit;
private readonly string _nazwaPokojuGlowna;
private readonly ILogger _logger;
public SerwisDostepuLiveKit(
ISerwisTokenowLiveKit serwisTokenowLiveKit,
string urlLiveKit,
string nazwaPokojuGlowna,
ILogger logger)
{
_serwisTokenowLiveKit = serwisTokenowLiveKit;
_urlLiveKit = urlLiveKit;
_nazwaPokojuGlowna = nazwaPokojuGlowna;
_logger = logger;
}
public WynikOperacji WygenerujDostep(WygenerujTokenLiveKitZapytanie zapytanie)
{
var bladWalidacji = WalidatorWygenerujTokenLiveKitZapytanie.Waliduj(zapytanie);
if (bladWalidacji is not null)
{
return WynikOperacji.Niepowodzenie(bladWalidacji);
}
if (string.IsNullOrWhiteSpace(_urlLiveKit))
{
// Brak konfiguracji LiveKit nie moze objawic sie NullReferenceException u klienta --
// to normalny stan na swiezo postawionym srodowisku, dopoki ktos nie uzupelni ustawien.
_logger.LogWarning("Zadanie tokenu LiveKit odrzucone -- adres serwera LiveKit nie jest skonfigurowany.");
return WynikOperacji.Niepowodzenie("Usluga LiveKit nie jest jeszcze skonfigurowana na serwerze.");
}
var token = _serwisTokenowLiveKit.WygenerujToken(zapytanie.Nick, zapytanie.Nick, zapytanie.Rola, _nazwaPokojuGlowna);
return WynikOperacji.Ok(new OdpowiedzTokenuLiveKitDto(token, _urlLiveKit));
}
}