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);
}
}