using Microsoft.Extensions.Logging; using SameBeat.Application.DTO; using SameBeat.Application.Interfejsy; using SameBeat.Application.Komendy; using SameBeat.Domain.Encje; using SameBeat.Domain.Wyjatki; namespace SameBeat.Application.Serwisy; /// /// Minimalny cykl zycia wydarzenia dla hosta: utworz -> start -> stop. Sama scena/sloty to ETAP 3. /// public sealed class SerwisZarzadzaniaWydarzeniem : ISerwisZarzadzaniaWydarzeniem { private readonly IRepozytoriumWydarzen _repozytoriumWydarzen; private readonly IJednostkaPracy _jednostkaPracy; private readonly ILogger _logger; public SerwisZarzadzaniaWydarzeniem( IRepozytoriumWydarzen repozytoriumWydarzen, IJednostkaPracy jednostkaPracy, ILogger logger) { _repozytoriumWydarzen = repozytoriumWydarzen; _jednostkaPracy = jednostkaPracy; _logger = logger; } public async Task> UtworzAsync(UtworzWydarzenieKomenda komenda, CancellationToken token = default) { Wydarzenie wydarzenie; try { wydarzenie = Wydarzenie.Utworz(komenda.Nazwa); } catch (WyjatekDomenowy wyjatek) { return WynikOperacji.Niepowodzenie(wyjatek.Message); } _repozytoriumWydarzen.Dodaj(wydarzenie); await _jednostkaPracy.ZapiszZmianyAsync(token); _logger.LogInformation("Utworzono wydarzenie {WydarzenieId} ({Nazwa}).", wydarzenie.Id, wydarzenie.Nazwa); return WynikOperacji.Ok(DoDto(wydarzenie)); } public async Task> StartujAsync(Guid wydarzenieId, CancellationToken token = default) { var wydarzenie = await _repozytoriumWydarzen.ZnajdzPoIdAsync(wydarzenieId, token); if (wydarzenie is null) { return WynikOperacji.Niepowodzenie("Nie znaleziono wydarzenia o podanym identyfikatorze."); } wydarzenie.PrzejdzNaLive(); await _jednostkaPracy.ZapiszZmianyAsync(token); _logger.LogInformation("Wydarzenie {WydarzenieId} przeszlo na Live.", wydarzenie.Id); return WynikOperacji.Ok(DoDto(wydarzenie)); } public async Task> ZatrzymajAsync(Guid wydarzenieId, CancellationToken token = default) { var wydarzenie = await _repozytoriumWydarzen.ZnajdzPoIdAsync(wydarzenieId, token); if (wydarzenie is null) { return WynikOperacji.Niepowodzenie("Nie znaleziono wydarzenia o podanym identyfikatorze."); } wydarzenie.PrzejdzNaOffline(); await _jednostkaPracy.ZapiszZmianyAsync(token); _logger.LogInformation("Wydarzenie {WydarzenieId} przeszlo na Offline.", wydarzenie.Id); return WynikOperacji.Ok(DoDto(wydarzenie)); } private static WydarzenieDto DoDto(Wydarzenie wydarzenie) => new(wydarzenie.Id, wydarzenie.Nazwa, wydarzenie.Status); }