using System.Security.Claims; using Microsoft.AspNetCore.Mvc; using SameBeat.Application.Interfejsy; namespace SameBeat.Api.Controllers; /// /// Token LiveKit dla hosta. Trasa zaczyna sie od "api/host", wiec jest automatycznie chroniona /// [Authorize] przez KonwencjaAutoryzacjiHosta -- tozsamosc bierzemy z zalogowanej sesji (ciasteczko /// JWT), NIE z body requestu, wiec host nie moze wystapic pod cudzym nickiem. /// /// Host na tym etapie podglada WYLACZNIE pokoj poczekalni (kamery oczekujacych) -- dlatego token /// wydaje ISerwisPoczekalni, nie ISerwisDostepuLiveKit (ten drugi jest zwiazany z pokojem glownym/ /// widzami i nie ma tu zastosowania). Host nie publikuje wlasnej kamery/mikrofonu. /// [ApiController] [Route("api/host/livekit")] public class HostLiveKitController : ControllerBase { private readonly ISerwisPoczekalni _serwisPoczekalni; public HostLiveKitController(ISerwisPoczekalni serwisPoczekalni) { _serwisPoczekalni = serwisPoczekalni; } [HttpGet("token")] public IActionResult PobierzToken() { var nick = User.FindFirstValue(ClaimTypes.Name); if (string.IsNullOrWhiteSpace(nick)) { // Nie powinno wystapic przy poprawnym tokenie JWT (GeneratorTokenowJwt zawsze dodaje ten // claim) -- ale gdyby jednak, host dostaje czytelny blad zamiast NullReferenceException. return BadRequest(new { blad = "Nie udalo sie odczytac tozsamosci z sesji -- zaloguj sie ponownie." }); } var wynik = _serwisPoczekalni.WygenerujTokenPodgladuHosta(nick); if (!wynik.Sukces || wynik.Dane is null) { return BadRequest(new { blad = wynik.Blad }); } return Ok(wynik.Dane); } }