using SameBeat.Domain.Wyjatki; namespace SameBeat.Domain.Encje; /// /// Pojedyncze miejsce na scenie glownej -- jedno z 1..9 (zalezy od ) /// slotow, do ktorego host moze przypisac uczestnika oczekujacego. Wiersz jest tworzony przy /// pierwszym przypisaniu numeru slotu i pozniej ponownie uzywany (Przypisz/Zwolnij), nie kasowany -- /// dzieki temu jeden numer slotu ma zawsze co najwyzej jeden wiersz w bazie na wydarzenie. /// public class SlotSceny { public Guid Id { get; private set; } public Guid WydarzenieId { get; private set; } public int NumerSlotu { get; private set; } /// /// Null = slot wolny. Nigdy nie jest ujawniany publicznie przez SignalR/REST widzom -- warstwa /// aplikacji buduje z tego wylacznie (numerSlotu, nick), patrz komentarz przy SerwisSceny. /// public Guid? UczestnikOczekujacyId { get; private set; } // Prywatny konstruktor bez parametrow -- wymagany przez EF Core do materializacji encji z bazy. private SlotSceny() { } private SlotSceny(Guid id, Guid wydarzenieId, int numerSlotu) { Id = id; WydarzenieId = wydarzenieId; NumerSlotu = numerSlotu; UczestnikOczekujacyId = null; } public static SlotSceny Utworz(Guid wydarzenieId, int numerSlotu) { if (wydarzenieId == Guid.Empty) { throw new NieprawidlowyStanEncjiWyjatek("Slot sceny musi byc powiazany z konkretnym wydarzeniem."); } if (numerSlotu < 1) { throw new NieprawidlowyStanEncjiWyjatek("Numer slotu musi byc dodatni."); } return new SlotSceny(Guid.NewGuid(), wydarzenieId, numerSlotu); } public void Przypisz(Guid uczestnikOczekujacyId) { if (uczestnikOczekujacyId == Guid.Empty) { throw new NieprawidlowyStanEncjiWyjatek("Nie mozna przypisac slotu do pustego identyfikatora uczestnika."); } UczestnikOczekujacyId = uczestnikOczekujacyId; } public void Zwolnij() => UczestnikOczekujacyId = null; }