| | | 1 | | using MechanicsSoftware.Application.Abstractions; |
| | | 2 | | using MechanicsSoftware.Application.Exceptions; |
| | | 3 | | using MechanicsSoftware.Application.UseCases.Services.Commands; |
| | | 4 | | using MechanicsSoftware.Domain.Entities; |
| | | 5 | | using MechanicsSoftware.Domain.Exceptions; |
| | | 6 | | using MechanicsSoftware.Domain.ValueObjects; |
| | | 7 | | using Microsoft.EntityFrameworkCore; |
| | | 8 | | |
| | | 9 | | namespace MechanicsSoftware.Application.UseCases.Services.Handlers; |
| | | 10 | | |
| | 6 | 11 | | public sealed class UpdateServiceHandler(IAppDbContext db) |
| | | 12 | | { |
| | | 13 | | public async Task<ServiceResponse> ExecuteAsync( |
| | | 14 | | Guid id, UpdateServiceCommand command, CancellationToken cancellationToken = default) |
| | 6 | 15 | | { |
| | 6 | 16 | | var service = await db.Services.FindAsync([id], cancellationToken) |
| | 6 | 17 | | ?? throw new NotFoundException(nameof(Service), id); |
| | | 18 | | |
| | 4 | 19 | | var nameConflict = await db.Services |
| | 4 | 20 | | .AnyAsync(s => s.Name == command.Name.Trim() && s.Id != id, cancellationToken); |
| | | 21 | | |
| | 4 | 22 | | if (nameConflict) |
| | 2 | 23 | | throw new DomainException($"A service named '{command.Name}' already exists."); |
| | | 24 | | |
| | 2 | 25 | | service.Update( |
| | 2 | 26 | | command.Name, |
| | 2 | 27 | | command.Description, |
| | 2 | 28 | | new Money(command.BasePriceInCents), |
| | 2 | 29 | | command.EstimatedMinutes); |
| | | 30 | | |
| | 2 | 31 | | await db.SaveChangesAsync(cancellationToken); |
| | | 32 | | |
| | 2 | 33 | | return ServiceResponse.From(service); |
| | 2 | 34 | | } |
| | | 35 | | } |