using SameBeat.Application.DTO; using SameBeat.Application.Komendy; using SameBeat.Domain.Enumy; namespace SameBeat.Application.Interfejsy; /// /// Logika sceny glownej (ETAP 3) -- uklad, sloty i bezpieczne "wpuszczenie na scene" uczestnika z /// poczekalni. Metody hosta (uklad/przypisanie/zwolnienie/podglad) dzialaja na biezacym wydarzeniu, /// tak samo jak ISerwisPoczekalni. Metody uczestnika (status/token sceny) sa dostepne bez logowania /// i zabezpieczone WYLACZNIE sekretem sesji (patrz OdpowiedzDolaczeniaDto) -- nigdy id samo w sobie. /// public interface ISerwisSceny { /// Biezacy stan sceny (uklad + zajete sloty) do wyswietlenia w panelu hosta po odswiezeniu strony. Task> PobierzStanScenyAsync(CancellationToken token = default); /// /// Zmienia uklad sceny biezacego wydarzenia. Kazdy zajety slot o numerze wiekszym niz dopuszcza /// nowy uklad zostaje zwolniony, a jego uczestnik wraca do statusu Oczekuje -- zero sierocych przypisan. /// Task> ZmienUkladAsync(UkladSceny nowyUklad, CancellationToken token = default); /// /// Przypisuje uczestnika (musi miec Status=Oczekuje) do slotu w granicach aktualnego ukladu. /// Jesli slot byl zajety przez kogos innego, tamten wraca do poczekalni. Przypisanie tego samego /// uczestnika do slotu, ktory juz zajmuje, jest no-op (sukces bez zmian). /// Task> PrzypiszSlotAsync(int numerSlotu, Guid uczestnikId, CancellationToken token = default); /// Zwalnia slot -- jego uczestnik (jesli byl) wraca do statusu Oczekuje. Idempotentne: pusty/nieistniejacy slot to tez sukces. Task> ZwolnijSlotAsync(int numerSlotu, CancellationToken token = default); /// /// Status uczestnika po weryfikacji sekretu sesji -- uzywane przez przegladarke uczestnika do /// odpytywania, czy zostal wpuszczony na scene. Zly sekret / nieznany uczestnik to Niepowodzenie /// (caller mapuje na 403, nigdy 500). /// Task> PobierzStatusUczestnikaAsync(Guid uczestnikId, string sekret, CancellationToken token = default); /// /// Wymienia sekret sesji na token LiveKit do pokoju GLOWNEGO -- tylko gdy sekret sie zgadza I /// Status uczestnika to NaScenie. To jedyna droga, ktora wydaje prawo publikowania (kamera) na /// scenie glownej -- patrz komentarz w SerwisTokenowLiveKit o rozdziale pokoju poczekalni/glownego. /// Task> WydajTokenScenyAsync(TokenScenyKomenda komenda, CancellationToken token = default); }