Newer
Older
Warehouse / src / Application / Products / CreateProduct / CreateProductCommand.cs
@Derek Comartin Derek Comartin on 22 Aug 2023 1 KB Init
using MyWarehouse.Application.Common.Dependencies.DataAccess;
using MyWarehouse.Domain.Common.ValueObjects.Mass;
using MyWarehouse.Domain.Common.ValueObjects.Money;
using MyWarehouse.Domain.Products;

namespace MyWarehouse.Application.Products.CreateProduct;

public record CreateProductCommand : IRequest<int>
{
    public string Name { get; init; } = null!;
    public string Description { get; init; } = null!;

    public float MassValue { get; init; }
    public string MassUnitSymbol { get; init; } = null!;

    public decimal PriceAmount { get; init; }
    public string PriceCurrencyCode { get; init; } = null!;
}

public class CreateProductCommandHandler : IRequestHandler<CreateProductCommand, int>
{
    private readonly IUnitOfWork _unitOfWork;

    public CreateProductCommandHandler(IUnitOfWork unitOfWork)
        => _unitOfWork = unitOfWork;

    public async Task<int> Handle(CreateProductCommand request, CancellationToken cancellationToken)
    {
        var product = new Product(
            name: request.Name.Trim(),
            description: request.Description.Trim(),
            price: new Money(request.PriceAmount, ProductInvariants.DefaultPriceCurrency),
            mass: new Mass(request.MassValue, ProductInvariants.DefaultMassUnit)
        );

        _unitOfWork.Products.Add(product);
        await _unitOfWork.SaveChanges();

        return product.Id;
    }
}