Add Order/Address/OrderAddress repos, and handlers

This commit is contained in:
lumijiez
2025-06-25 22:34:39 +03:00
parent 3887e7bc44
commit c21c01c432
19 changed files with 484 additions and 6 deletions

View File

@@ -0,0 +1,52 @@
using AutoMapper;
using Imprink.Application.Dtos;
using Imprink.Domain.Entities;
using MediatR;
namespace Imprink.Application.Commands.Addresses;
public class CreateAddressCommand : IRequest<AddressDto>
{
public string UserId { get; set; } = null!;
public string AddressType { get; set; } = null!;
public string? FirstName { get; set; }
public string? LastName { get; set; }
public string? Company { get; set; }
public string AddressLine1 { get; set; } = null!;
public string? AddressLine2 { get; set; }
public string? ApartmentNumber { get; set; }
public string? BuildingNumber { get; set; }
public string? Floor { get; set; }
public string City { get; set; } = null!;
public string State { get; set; } = null!;
public string PostalCode { get; set; } = null!;
public string Country { get; set; } = null!;
public string? PhoneNumber { get; set; }
public string? Instructions { get; set; }
public bool IsDefault { get; set; }
public bool IsActive { get; set; } = true;
}
public class CreateAddressHandler(IUnitOfWork uw, IMapper mapper) : IRequestHandler<CreateAddressCommand, AddressDto>
{
public async Task<AddressDto> Handle(CreateAddressCommand request, CancellationToken cancellationToken)
{
return await uw.TransactAsync(async () =>
{
var address = mapper.Map<Address>(request);
if (address.IsDefault)
{
var currentDefault = await uw.AddressRepository.GetDefaultByUserIdAsync(address.UserId, cancellationToken);
if (currentDefault != null)
{
currentDefault.IsDefault = false;
await uw.AddressRepository.UpdateAsync(currentDefault, cancellationToken);
}
}
var createdAddress = await uw.AddressRepository.AddAsync(address, cancellationToken);
return mapper.Map<AddressDto>(createdAddress);
}, cancellationToken);
}
}

View File

@@ -0,0 +1,31 @@
using AutoMapper;
using Imprink.Application.Dtos;
using Imprink.Domain.Entities;
using MediatR;
namespace Imprink.Application.Commands.Addresses;
public class GetAddressByIdQuery : IRequest<AddressDto?>
{
public Guid Id { get; set; }
public string? UserId { get; set; }
}
public class GetAddressByIdHandler(IUnitOfWork uw, IMapper mapper) : IRequestHandler<GetAddressByIdQuery, AddressDto?>
{
public async Task<AddressDto?> Handle(GetAddressByIdQuery request, CancellationToken cancellationToken)
{
Address? address;
if (!string.IsNullOrEmpty(request.UserId))
{
address = await uw.AddressRepository.GetByIdAndUserIdAsync(request.Id, request.UserId, cancellationToken);
}
else
{
address = await uw.AddressRepository.GetByIdAsync(request.Id, cancellationToken);
}
return address != null ? mapper.Map<AddressDto>(address) : null;
}
}

View File

@@ -0,0 +1,36 @@
using AutoMapper;
using Imprink.Application.Dtos;
using Imprink.Domain.Entities;
using MediatR;
namespace Imprink.Application.Commands.Addresses;
public class GetAddressesByUserIdQuery : IRequest<IEnumerable<AddressDto>>
{
public string UserId { get; set; } = null!;
public bool ActiveOnly { get; set; } = false;
public string? AddressType { get; set; }
}
public class GetAddressesByUserIdHandler(IUnitOfWork uw, IMapper mapper) : IRequestHandler<GetAddressesByUserIdQuery, IEnumerable<AddressDto>>
{
public async Task<IEnumerable<AddressDto>> Handle(GetAddressesByUserIdQuery request, CancellationToken cancellationToken)
{
IEnumerable<Address> addresses;
if (!string.IsNullOrEmpty(request.AddressType))
{
addresses = await uw.AddressRepository.GetByUserIdAndTypeAsync(request.UserId, request.AddressType, cancellationToken);
}
else if (request.ActiveOnly)
{
addresses = await uw.AddressRepository.GetActiveByUserIdAsync(request.UserId, cancellationToken);
}
else
{
addresses = await uw.AddressRepository.GetByUserIdAsync(request.UserId, cancellationToken);
}
return mapper.Map<IEnumerable<AddressDto>>(addresses);
}
}