using Books.Api.Domain;
using Books.Api.Domain.Accounts;
using Books.Api.EventFlow.Repositories;
using EventFlow.Commands;
namespace Books.Api.Commands.Accounts;
///
/// Command handler for creating a new account.
/// Validates that the account number is unique within the company.
///
public class CreateAccountCommandHandler(
IAccountRepository accountRepository)
: CommandHandler
{
public override async Task ExecuteAsync(
AccountAggregate aggregate,
CreateAccountCommand command,
CancellationToken cancellationToken)
{
// Check if an account with the same number already exists for this company
var existingAccount = await accountRepository.GetByCompanyAndNumberAsync(
command.CompanyId, command.AccountNumber, cancellationToken);
if (existingAccount != null)
{
throw new DomainException(
"ACCOUNT_NUMBER_EXISTS",
$"Account number {command.AccountNumber} already exists for this company",
$"Kontonummer {command.AccountNumber} eksisterer allerede");
}
aggregate.Create(
command.CompanyId,
command.AccountNumber,
command.Name,
command.AccountType,
command.ParentId,
command.Description,
command.VatCodeId,
command.IsSystemAccount,
command.StandardAccountNumber);
}
}
public class UpdateAccountCommandHandler : CommandHandler
{
public override Task ExecuteAsync(
AccountAggregate aggregate,
UpdateAccountCommand command,
CancellationToken cancellationToken)
{
aggregate.Update(
command.Name,
command.ParentId,
command.Description,
command.VatCodeId);
return Task.CompletedTask;
}
}
public class DeactivateAccountCommandHandler : CommandHandler
{
public override Task ExecuteAsync(
AccountAggregate aggregate,
DeactivateAccountCommand command,
CancellationToken cancellationToken)
{
aggregate.Deactivate();
return Task.CompletedTask;
}
}
public class ReactivateAccountCommandHandler : CommandHandler
{
public override Task ExecuteAsync(
AccountAggregate aggregate,
ReactivateAccountCommand command,
CancellationToken cancellationToken)
{
aggregate.Reactivate();
return Task.CompletedTask;
}
}