using SameBeat.Domain.Wyjatki; namespace SameBeat.Domain.Encje; /// /// Utwor w bibliotece muzycznej hosta -- host dostarcza WLASNY, zgodny z prawem material (link do /// pliku audio); backend nigdy nie hostuje ani nie sprawdza tresci pliku, tylko przechowuje jego URL /// i metadane. Jeden Utwor moze byc dodany do playlisty wielu wydarzen (biblioteka jest globalna, /// nie per-wydarzenie -- w odroznieniu od ). /// public class Utwor { public const int MaksymalnaDlugoscTytulu = 200; public const int MaksymalnaDlugoscWykonawcy = 200; public const int MaksymalnaDlugoscUrl = 2048; public Guid Id { get; private set; } public string Tytul { get; private set; } = string.Empty; public string? Wykonawca { get; private set; } public string Url { get; private set; } = string.Empty; /// Czas trwania w milisekundach -- dodawany RECZNIE przez hosta przy dodawaniu utworu (backend nie parsuje pliku audio). public int CzasTrwaniaMs { get; private set; } // Prywatny konstruktor bez parametrow -- wymagany przez EF Core do materializacji encji z bazy. private Utwor() { } private Utwor(Guid id, string tytul, string? wykonawca, string url, int czasTrwaniaMs) { Id = id; Tytul = tytul; Wykonawca = wykonawca; Url = url; CzasTrwaniaMs = czasTrwaniaMs; } /// /// Tworzy nowy utwor. Walidacja tutaj chroni przed powstaniem encji w niepoprawnym stanie /// niezaleznie od tego, ktory serwis aplikacji jej uzyje -- to samo, co juz sprawdza /// SerwisMuzyki przed wywolaniem tej metody (Uri.TryCreate itd.), jest tu powtorzone jako /// druga linia obrony. /// public static Utwor Utworz(string tytul, string? wykonawca, string url, int czasTrwaniaMs) { if (string.IsNullOrWhiteSpace(tytul)) { throw new NieprawidlowyStanEncjiWyjatek("Tytul utworu nie moze byc pusty."); } var tytulPrzyciety = tytul.Trim(); if (tytulPrzyciety.Length > MaksymalnaDlugoscTytulu) { throw new NieprawidlowyStanEncjiWyjatek($"Tytul utworu moze miec maksymalnie {MaksymalnaDlugoscTytulu} znakow."); } var wykonawcaPrzyciety = string.IsNullOrWhiteSpace(wykonawca) ? null : wykonawca.Trim(); if (wykonawcaPrzyciety is not null && wykonawcaPrzyciety.Length > MaksymalnaDlugoscWykonawcy) { throw new NieprawidlowyStanEncjiWyjatek($"Wykonawca moze miec maksymalnie {MaksymalnaDlugoscWykonawcy} znakow."); } if (string.IsNullOrWhiteSpace(url) || url.Length > MaksymalnaDlugoscUrl || !Uri.TryCreate(url, UriKind.Absolute, out _)) { throw new NieprawidlowyStanEncjiWyjatek("Url utworu musi byc poprawnym, pelnym adresem."); } if (czasTrwaniaMs <= 0) { throw new NieprawidlowyStanEncjiWyjatek("Czas trwania utworu musi byc dodatni."); } return new Utwor(Guid.NewGuid(), tytulPrzyciety, wykonawcaPrzyciety, url.Trim(), czasTrwaniaMs); } }