using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SameBeat.Application.Interfejsy; using SameBeat.Application.Zapytania; using SameBeat.Domain.Enumy; namespace SameBeat.Api.Controllers; [ApiController] [Route("api/livekit")] public class LiveKitController : ControllerBase { private readonly ISerwisDostepuLiveKit _serwisDostepuLiveKit; public LiveKitController(ISerwisDostepuLiveKit serwisDostepuLiveKit) { _serwisDostepuLiveKit = serwisDostepuLiveKit; } /// /// Wydaje token dostepu do pokoju LiveKit dla widza. Dostepne bez logowania -- widzowie ogladaja /// imprezy bez zakladania konta. /// /// BEZPIECZENSTWO: to jedyny publiczny, niezalogowany endpoint tokenu LiveKit, wiec NIGDY nie moze /// wydac prawa do publikowania (kamera/mikrofon) -- rola jest tu na sztywno ustawiona na Widz, /// niezaleznie od tego co przyszloby w body (body celowo nie ma nawet pola Rola, patrz /// ). Uprawnienia "Uczestnik" (tylko kamera, generowane /// serwerowo) wydaje wylacznie POST /api/join, a uprawnienia "Host" -- chroniony /// [Authorize] GET /api/host/livekit/token z tozsamoscia z sesji JWT. /// [HttpPost("token")] [AllowAnonymous] public IActionResult WygenerujToken([FromBody] ZadanieTokenuWidzaZapytanie zadanie) { var zapytanie = new WygenerujTokenLiveKitZapytanie(zadanie.Nick, RolaUzytkownika.Widz); var wynik = _serwisDostepuLiveKit.WygenerujDostep(zapytanie); if (!wynik.Sukces || wynik.Dane is null) { return BadRequest(new { blad = wynik.Blad }); } return Ok(wynik.Dane); } }