using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using SameBeat.Application.Interfejsy; using SameBeat.Domain.Encje; using SameBeat.Domain.Enumy; namespace SameBeat.Infrastructure.BazaDanych; /// /// Seed jednorazowego konta hosta dla srodowiska deweloperskiego -- zeby wlasciciel mogl sie /// zalogowac od razu po postawieniu bazy, bez ekranu rejestracji (ktorego etap 1 celowo nie ma). /// public static class SeedDanych { public static async Task SeedujKontoHostaDevAsync( KontekstBazyDanych kontekst, IUslugaHaszowaniaHasel uslugaHaszowaniaHasel, IConfiguration konfiguracja, ILogger logger, CancellationToken token = default) { // Seedujemy tylko raz -- gdy w bazie nie ma jeszcze zadnego konta. Dzieki temu powtorne // uruchomienie API nie nadpisuje hasla, ktore Piotr mogl juz zmienic recznie. var czyPustaTabela = !await kontekst.Uzytkownicy.AnyAsync(token); if (!czyPustaTabela) { return; } var nick = konfiguracja["KontoHostaDev:Nick"]; var haslo = konfiguracja["KontoHostaDev:Haslo"]; if (string.IsNullOrWhiteSpace(nick) || string.IsNullOrWhiteSpace(haslo)) { // Brak wypelnionej konfiguracji to normalny stan na swiezym srodowisku (np. jeszcze // przed uzupelnieniem appsettings.Development.json) -- nie ma powodu przerywac startu API. logger.LogWarning( "Pomijam seed konta hosta dev -- brak ustawien KontoHostaDev:Nick / KontoHostaDev:Haslo w konfiguracji."); return; } var uzytkownik = Uzytkownik.Utworz(nick, RolaUzytkownika.Host); uzytkownik.UstawHasloHash(uslugaHaszowaniaHasel.Haszuj(uzytkownik, haslo)); kontekst.Uzytkownicy.Add(uzytkownik); await kontekst.SaveChangesAsync(token); logger.LogInformation("Zasiano konto hosta dev dla nicku {Nick}.", nick); } /// /// TYLKO DEV: seeduje jedno przykladowe wydarzenie (status Offline), zeby dalo sie od razu /// testowac lokalnie POST /api/join bez recznego tworzenia eventu przez panel hosta za kazdym razem. /// Wywolywane tylko z bloku app.Environment.IsDevelopment() w Program.cs. /// public static async Task SeedujWydarzenieDevAsync(KontekstBazyDanych kontekst, ILogger logger, CancellationToken token = default) { var czyPustaTabela = !await kontekst.Wydarzenia.AnyAsync(token); if (!czyPustaTabela) { return; } var wydarzenie = Wydarzenie.Utworz("Testowa impreza SameBeat"); kontekst.Wydarzenia.Add(wydarzenie); await kontekst.SaveChangesAsync(token); logger.LogInformation("Zasiano przykladowe wydarzenie dev: {WydarzenieId} ({Nazwa}).", wydarzenie.Id, wydarzenie.Nazwa); } }