Add Automapper
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using AutoMapper;
|
||||
using Imprink.Application.Products.Dtos;
|
||||
using Imprink.Domain.Entities.Product;
|
||||
using MediatR;
|
||||
@@ -16,7 +17,7 @@ public class CreateProductVariantCommand : IRequest<ProductVariantDto>
|
||||
public bool IsActive { get; set; } = true;
|
||||
}
|
||||
|
||||
public class CreateProductVariantHandler(IUnitOfWork unitOfWork)
|
||||
public class CreateProductVariantHandler(IUnitOfWork unitOfWork, IMapper mapper)
|
||||
: IRequestHandler<CreateProductVariantCommand, ProductVariantDto>
|
||||
{
|
||||
public async Task<ProductVariantDto> Handle(CreateProductVariantCommand request, CancellationToken cancellationToken)
|
||||
@@ -25,36 +26,16 @@ public class CreateProductVariantHandler(IUnitOfWork unitOfWork)
|
||||
|
||||
try
|
||||
{
|
||||
var productVariant = new ProductVariant
|
||||
{
|
||||
ProductId = request.ProductId,
|
||||
Size = request.Size,
|
||||
Color = request.Color,
|
||||
Price = request.Price,
|
||||
ImageUrl = request.ImageUrl,
|
||||
Sku = request.Sku,
|
||||
StockQuantity = request.StockQuantity,
|
||||
IsActive = request.IsActive,
|
||||
Product = null!
|
||||
};
|
||||
var productVariant = mapper.Map<ProductVariant>(request);
|
||||
|
||||
productVariant.Product = null!;
|
||||
|
||||
var createdVariant = await unitOfWork.ProductVariantRepository.AddAsync(productVariant, cancellationToken);
|
||||
|
||||
await unitOfWork.SaveAsync(cancellationToken);
|
||||
await unitOfWork.CommitTransactionAsync(cancellationToken);
|
||||
|
||||
return new ProductVariantDto
|
||||
{
|
||||
Id = createdVariant.Id,
|
||||
ProductId = createdVariant.ProductId,
|
||||
Size = createdVariant.Size,
|
||||
Color = createdVariant.Color,
|
||||
Price = createdVariant.Price,
|
||||
ImageUrl = createdVariant.ImageUrl,
|
||||
Sku = createdVariant.Sku,
|
||||
StockQuantity = createdVariant.StockQuantity,
|
||||
IsActive = createdVariant.IsActive,
|
||||
CreatedAt = createdVariant.CreatedAt,
|
||||
ModifiedAt = createdVariant.ModifiedAt
|
||||
};
|
||||
|
||||
return mapper.Map<ProductVariantDto>(createdVariant);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
@@ -16,6 +16,7 @@ public class DeleteProductVariantHandler(IUnitOfWork unitOfWork) : IRequestHandl
|
||||
try
|
||||
{
|
||||
var exists = await unitOfWork.ProductVariantRepository.ExistsAsync(request.Id, cancellationToken);
|
||||
|
||||
if (!exists)
|
||||
{
|
||||
await unitOfWork.RollbackTransactionAsync(cancellationToken);
|
||||
@@ -23,7 +24,10 @@ public class DeleteProductVariantHandler(IUnitOfWork unitOfWork) : IRequestHandl
|
||||
}
|
||||
|
||||
await unitOfWork.ProductVariantRepository.DeleteAsync(request.Id, cancellationToken);
|
||||
|
||||
await unitOfWork.SaveAsync(cancellationToken);
|
||||
await unitOfWork.CommitTransactionAsync(cancellationToken);
|
||||
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
using AutoMapper;
|
||||
using Imprink.Application.Products.Dtos;
|
||||
using Imprink.Domain.Entities.Product;
|
||||
using MediatR;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Imprink.Application.Domains.ProductVariants;
|
||||
|
||||
@@ -11,7 +13,7 @@ public class GetProductVariantsQuery : IRequest<IEnumerable<ProductVariantDto>>
|
||||
public bool InStockOnly { get; set; } = false;
|
||||
}
|
||||
|
||||
public class GetProductVariantsHandler(IUnitOfWork unitOfWork)
|
||||
public class GetProductVariantsHandler(IUnitOfWork unitOfWork, IMapper mapper, ILogger<GetProductVariantsHandler> logger)
|
||||
: IRequestHandler<GetProductVariantsQuery, IEnumerable<ProductVariantDto>>
|
||||
{
|
||||
public async Task<IEnumerable<ProductVariantDto>> Handle(GetProductVariantsQuery request, CancellationToken cancellationToken)
|
||||
@@ -37,33 +39,7 @@ public class GetProductVariantsHandler(IUnitOfWork unitOfWork)
|
||||
{
|
||||
variants = new List<ProductVariant>();
|
||||
}
|
||||
|
||||
return variants.Select(pv => new ProductVariantDto
|
||||
{
|
||||
Id = pv.Id,
|
||||
ProductId = pv.ProductId,
|
||||
Size = pv.Size,
|
||||
Color = pv.Color,
|
||||
Price = pv.Price,
|
||||
ImageUrl = pv.ImageUrl,
|
||||
Sku = pv.Sku,
|
||||
StockQuantity = pv.StockQuantity,
|
||||
IsActive = pv.IsActive,
|
||||
Product = new ProductDto
|
||||
{
|
||||
Id = pv.Product.Id,
|
||||
Name = pv.Product.Name,
|
||||
Description = pv.Product.Description,
|
||||
BasePrice = pv.Product.BasePrice,
|
||||
IsCustomizable = pv.Product.IsCustomizable,
|
||||
IsActive = pv.Product.IsActive,
|
||||
ImageUrl = pv.Product.ImageUrl,
|
||||
CategoryId = pv.Product.CategoryId,
|
||||
CreatedAt = pv.Product.CreatedAt,
|
||||
ModifiedAt = pv.Product.ModifiedAt
|
||||
},
|
||||
CreatedAt = pv.CreatedAt,
|
||||
ModifiedAt = pv.ModifiedAt
|
||||
});
|
||||
|
||||
return mapper.Map<IEnumerable<ProductVariantDto>>(variants);
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
using AutoMapper;
|
||||
using Imprink.Application.Exceptions;
|
||||
using Imprink.Application.Products.Dtos;
|
||||
using MediatR;
|
||||
@@ -17,7 +18,7 @@ public class UpdateProductVariantCommand : IRequest<ProductVariantDto>
|
||||
public bool IsActive { get; set; }
|
||||
}
|
||||
|
||||
public class UpdateProductVariantHandler(IUnitOfWork unitOfWork)
|
||||
public class UpdateProductVariantHandler(IUnitOfWork unitOfWork, IMapper mapper)
|
||||
: IRequestHandler<UpdateProductVariantCommand, ProductVariantDto>
|
||||
{
|
||||
public async Task<ProductVariantDto> Handle(UpdateProductVariantCommand request, CancellationToken cancellationToken)
|
||||
@@ -29,36 +30,16 @@ public class UpdateProductVariantHandler(IUnitOfWork unitOfWork)
|
||||
var existingVariant = await unitOfWork.ProductVariantRepository.GetByIdAsync(request.Id, cancellationToken);
|
||||
|
||||
if (existingVariant == null)
|
||||
{
|
||||
throw new NotFoundException($"Product variant with ID {request.Id} not found.");
|
||||
}
|
||||
|
||||
existingVariant.ProductId = request.ProductId;
|
||||
existingVariant.Size = request.Size;
|
||||
existingVariant.Color = request.Color;
|
||||
existingVariant.Price = request.Price;
|
||||
existingVariant.ImageUrl = request.ImageUrl;
|
||||
existingVariant.Sku = request.Sku;
|
||||
existingVariant.StockQuantity = request.StockQuantity;
|
||||
existingVariant.IsActive = request.IsActive;
|
||||
|
||||
mapper.Map(request, existingVariant);
|
||||
|
||||
var updatedVariant = await unitOfWork.ProductVariantRepository.UpdateAsync(existingVariant, cancellationToken);
|
||||
|
||||
await unitOfWork.SaveAsync(cancellationToken);
|
||||
await unitOfWork.CommitTransactionAsync(cancellationToken);
|
||||
|
||||
return new ProductVariantDto
|
||||
{
|
||||
Id = updatedVariant.Id,
|
||||
ProductId = updatedVariant.ProductId,
|
||||
Size = updatedVariant.Size,
|
||||
Color = updatedVariant.Color,
|
||||
Price = updatedVariant.Price,
|
||||
ImageUrl = updatedVariant.ImageUrl,
|
||||
Sku = updatedVariant.Sku,
|
||||
StockQuantity = updatedVariant.StockQuantity,
|
||||
IsActive = updatedVariant.IsActive,
|
||||
CreatedAt = updatedVariant.CreatedAt,
|
||||
ModifiedAt = updatedVariant.ModifiedAt
|
||||
};
|
||||
return mapper.Map<ProductVariantDto>(updatedVariant);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using AutoMapper;
|
||||
using Imprink.Application.Products.Dtos;
|
||||
using Imprink.Domain.Entities.Product;
|
||||
using MediatR;
|
||||
@@ -15,7 +16,7 @@ public class CreateProductCommand : IRequest<ProductDto>
|
||||
public Guid? CategoryId { get; set; }
|
||||
}
|
||||
|
||||
public class CreateProductHandler(IUnitOfWork unitOfWork) : IRequestHandler<CreateProductCommand, ProductDto>
|
||||
public class CreateProductHandler(IUnitOfWork unitOfWork, IMapper mapper) : IRequestHandler<CreateProductCommand, ProductDto>
|
||||
{
|
||||
public async Task<ProductDto> Handle(CreateProductCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
@@ -23,49 +24,18 @@ public class CreateProductHandler(IUnitOfWork unitOfWork) : IRequestHandler<Crea
|
||||
|
||||
try
|
||||
{
|
||||
var product = new Product
|
||||
{
|
||||
Name = request.Name,
|
||||
Description = request.Description,
|
||||
BasePrice = request.BasePrice,
|
||||
IsCustomizable = request.IsCustomizable,
|
||||
IsActive = request.IsActive,
|
||||
ImageUrl = request.ImageUrl,
|
||||
CategoryId = request.CategoryId,
|
||||
Category = null!
|
||||
};
|
||||
var product = mapper.Map<Product>(request);
|
||||
|
||||
var createdProduct = await unitOfWork.ProductRepository.AddAsync(product, cancellationToken);
|
||||
|
||||
var categoryDto = new CategoryDto
|
||||
|
||||
if (createdProduct.CategoryId.HasValue)
|
||||
{
|
||||
Id = createdProduct.Category.Id,
|
||||
Name = createdProduct.Category.Name,
|
||||
Description = createdProduct.Category.Description,
|
||||
ImageUrl = createdProduct.Category.ImageUrl,
|
||||
SortOrder = createdProduct.Category.SortOrder,
|
||||
IsActive = createdProduct.Category.IsActive,
|
||||
ParentCategoryId = createdProduct.Category.ParentCategoryId,
|
||||
CreatedAt = createdProduct.Category.CreatedAt,
|
||||
ModifiedAt = createdProduct.Category.ModifiedAt
|
||||
};
|
||||
createdProduct.Category = (await unitOfWork.CategoryRepository.GetByIdAsync(createdProduct.CategoryId.Value, cancellationToken))!;
|
||||
}
|
||||
|
||||
await unitOfWork.CommitTransactionAsync(cancellationToken);
|
||||
|
||||
return new ProductDto
|
||||
{
|
||||
Id = createdProduct.Id,
|
||||
Name = createdProduct.Name,
|
||||
Description = createdProduct.Description,
|
||||
BasePrice = createdProduct.BasePrice,
|
||||
IsCustomizable = createdProduct.IsCustomizable,
|
||||
IsActive = createdProduct.IsActive,
|
||||
ImageUrl = createdProduct.ImageUrl,
|
||||
CategoryId = createdProduct.CategoryId,
|
||||
Category = categoryDto,
|
||||
CreatedAt = createdProduct.CreatedAt,
|
||||
ModifiedAt = createdProduct.ModifiedAt
|
||||
};
|
||||
return mapper.Map<ProductDto>(createdProduct);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using AutoMapper;
|
||||
using Imprink.Application.Exceptions;
|
||||
using Imprink.Application.Users.Dtos;
|
||||
using MediatR;
|
||||
@@ -6,7 +7,7 @@ namespace Imprink.Application.Domains.Users;
|
||||
|
||||
public record DeleteUserRoleCommand(string Sub, Guid RoleId) : IRequest<UserRoleDto?>;
|
||||
|
||||
public class DeleteUserRoleHandler(IUnitOfWork uw) : IRequestHandler<DeleteUserRoleCommand, UserRoleDto?>
|
||||
public class DeleteUserRoleHandler(IUnitOfWork uw, IMapper mapper) : IRequestHandler<DeleteUserRoleCommand, UserRoleDto?>
|
||||
{
|
||||
public async Task<UserRoleDto?> Handle(DeleteUserRoleCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
@@ -27,11 +28,7 @@ public class DeleteUserRoleHandler(IUnitOfWork uw) : IRequestHandler<DeleteUserR
|
||||
await uw.SaveAsync(cancellationToken);
|
||||
await uw.CommitTransactionAsync(cancellationToken);
|
||||
|
||||
return new UserRoleDto
|
||||
{
|
||||
UserId = removedRole.UserId,
|
||||
RoleId = removedRole.RoleId
|
||||
};
|
||||
return mapper.Map<UserRoleDto>(removedRole);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
17
src/Imprink.Application/Domains/Users/GetAllRolesHandler.cs
Normal file
17
src/Imprink.Application/Domains/Users/GetAllRolesHandler.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
using AutoMapper;
|
||||
using Imprink.Application.Users.Dtos;
|
||||
using MediatR;
|
||||
|
||||
namespace Imprink.Application.Domains.Users;
|
||||
|
||||
public record GetAllRolesCommand : IRequest<IEnumerable<RoleDto>>;
|
||||
|
||||
public class GetAllRolesHandler(IUnitOfWork uw, IMapper mapper): IRequestHandler<GetAllRolesCommand, IEnumerable<RoleDto>>
|
||||
{
|
||||
public async Task<IEnumerable<RoleDto>> Handle(GetAllRolesCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
var roles = await uw.RoleRepository.GetAllRolesAsync(cancellationToken);
|
||||
|
||||
return mapper.Map<IEnumerable<RoleDto>>(roles);
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
using AutoMapper;
|
||||
using Imprink.Application.Exceptions;
|
||||
using Imprink.Application.Users.Dtos;
|
||||
using MediatR;
|
||||
@@ -6,7 +7,7 @@ namespace Imprink.Application.Domains.Users;
|
||||
|
||||
public record GetUserRolesCommand(string Sub) : IRequest<IEnumerable<RoleDto>>;
|
||||
|
||||
public class GetUserRolesHandler(IUnitOfWork uw): IRequestHandler<GetUserRolesCommand, IEnumerable<RoleDto>>
|
||||
public class GetUserRolesHandler(IUnitOfWork uw, IMapper mapper): IRequestHandler<GetUserRolesCommand, IEnumerable<RoleDto>>
|
||||
{
|
||||
public async Task<IEnumerable<RoleDto>> Handle(GetUserRolesCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
@@ -15,10 +16,6 @@ public class GetUserRolesHandler(IUnitOfWork uw): IRequestHandler<GetUserRolesCo
|
||||
|
||||
var roles = await uw.UserRoleRepository.GetUserRolesAsync(request.Sub, cancellationToken);
|
||||
|
||||
return roles.Select(role => new RoleDto
|
||||
{
|
||||
RoleId = role.Id,
|
||||
RoleName = role.RoleName
|
||||
}).ToList();
|
||||
return mapper.Map<IEnumerable<RoleDto>>(roles);
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
using AutoMapper;
|
||||
using Imprink.Application.Exceptions;
|
||||
using Imprink.Application.Services;
|
||||
using Imprink.Application.Users.Dtos;
|
||||
@@ -7,7 +8,7 @@ namespace Imprink.Application.Domains.Users;
|
||||
|
||||
public record SetUserFullNameCommand(string FirstName, string LastName) : IRequest<UserDto?>;
|
||||
|
||||
public class SetUserFullNameHandler(IUnitOfWork uw, ICurrentUserService userService) : IRequestHandler<SetUserFullNameCommand, UserDto?>
|
||||
public class SetUserFullNameHandler(IUnitOfWork uw, IMapper mapper, ICurrentUserService userService) : IRequestHandler<SetUserFullNameCommand, UserDto?>
|
||||
{
|
||||
public async Task<UserDto?> Handle(SetUserFullNameCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
@@ -16,28 +17,19 @@ public class SetUserFullNameHandler(IUnitOfWork uw, ICurrentUserService userServ
|
||||
try
|
||||
{
|
||||
var currentUser = userService.GetCurrentUserId();
|
||||
|
||||
if (currentUser == null)
|
||||
throw new NotFoundException("User token could not be accessed.");
|
||||
|
||||
var user = await uw.UserRepository.SetUserFullNameAsync(currentUser, request.FirstName, request.LastName, cancellationToken);
|
||||
|
||||
if (user == null)
|
||||
throw new DataUpdateException("User name could not be updated.");
|
||||
|
||||
await uw.SaveAsync(cancellationToken);
|
||||
await uw.CommitTransactionAsync(cancellationToken);
|
||||
|
||||
return new UserDto
|
||||
{
|
||||
Id = user.Id,
|
||||
Name = user.Name,
|
||||
Nickname = user.Nickname,
|
||||
Email = user.Email,
|
||||
EmailVerified = user.EmailVerified,
|
||||
FirstName = user.FirstName,
|
||||
LastName = user.LastName,
|
||||
PhoneNumber = user.PhoneNumber,
|
||||
IsActive = user.IsActive
|
||||
};
|
||||
return mapper.Map<UserDto>(user);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using AutoMapper;
|
||||
using Imprink.Application.Exceptions;
|
||||
using Imprink.Application.Services;
|
||||
using Imprink.Application.Users.Dtos;
|
||||
@@ -7,7 +8,7 @@ namespace Imprink.Application.Domains.Users;
|
||||
|
||||
public record SetUserPhoneCommand(string PhoneNumber) : IRequest<UserDto?>;
|
||||
|
||||
public class SetUserPhoneHandler(IUnitOfWork uw, ICurrentUserService userService) : IRequestHandler<SetUserPhoneCommand, UserDto?>
|
||||
public class SetUserPhoneHandler(IUnitOfWork uw, IMapper mapper, ICurrentUserService userService) : IRequestHandler<SetUserPhoneCommand, UserDto?>
|
||||
{
|
||||
public async Task<UserDto?> Handle(SetUserPhoneCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
@@ -16,28 +17,19 @@ public class SetUserPhoneHandler(IUnitOfWork uw, ICurrentUserService userService
|
||||
try
|
||||
{
|
||||
var currentUser = userService.GetCurrentUserId();
|
||||
|
||||
if (currentUser == null)
|
||||
throw new NotFoundException("User token could not be accessed.");
|
||||
|
||||
var user = await uw.UserRepository.SetUserPhoneAsync(currentUser, request.PhoneNumber, cancellationToken);
|
||||
|
||||
if (user == null)
|
||||
throw new DataUpdateException("User phone could not be updated.");
|
||||
|
||||
await uw.SaveAsync(cancellationToken);
|
||||
await uw.CommitTransactionAsync(cancellationToken);
|
||||
|
||||
return new UserDto
|
||||
{
|
||||
Id = user.Id,
|
||||
Name = user.Name,
|
||||
Nickname = user.Nickname,
|
||||
Email = user.Email,
|
||||
EmailVerified = user.EmailVerified,
|
||||
FirstName = user.FirstName,
|
||||
LastName = user.LastName,
|
||||
PhoneNumber = user.PhoneNumber,
|
||||
IsActive = user.IsActive
|
||||
};
|
||||
return mapper.Map<UserDto>(user);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using AutoMapper;
|
||||
using Imprink.Application.Exceptions;
|
||||
using Imprink.Application.Users.Dtos;
|
||||
using Imprink.Domain.Entities.Users;
|
||||
@@ -7,7 +8,7 @@ namespace Imprink.Application.Domains.Users;
|
||||
|
||||
public record SetUserRoleCommand(string Sub, Guid RoleId) : IRequest<UserRoleDto?>;
|
||||
|
||||
public class SetUserRoleHandler(IUnitOfWork uw) : IRequestHandler<SetUserRoleCommand, UserRoleDto?>
|
||||
public class SetUserRoleHandler(IUnitOfWork uw, IMapper mapper) : IRequestHandler<SetUserRoleCommand, UserRoleDto?>
|
||||
{
|
||||
public async Task<UserRoleDto?> Handle(SetUserRoleCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
@@ -29,11 +30,7 @@ public class SetUserRoleHandler(IUnitOfWork uw) : IRequestHandler<SetUserRoleCom
|
||||
await uw.SaveAsync(cancellationToken);
|
||||
await uw.CommitTransactionAsync(cancellationToken);
|
||||
|
||||
return new UserRoleDto
|
||||
{
|
||||
UserId = addedRole.UserId,
|
||||
RoleId = addedRole.RoleId
|
||||
};
|
||||
return mapper.Map<UserRoleDto>(addedRole);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using AutoMapper;
|
||||
using Imprink.Application.Users.Dtos;
|
||||
using Imprink.Domain.Models;
|
||||
using MediatR;
|
||||
@@ -6,7 +7,7 @@ namespace Imprink.Application.Domains.Users;
|
||||
|
||||
public record SyncUserCommand(Auth0User User) : IRequest<UserDto?>;
|
||||
|
||||
public class SyncUserHandler(IUnitOfWork uw): IRequestHandler<SyncUserCommand, UserDto?>
|
||||
public class SyncUserHandler(IUnitOfWork uw, IMapper mapper): IRequestHandler<SyncUserCommand, UserDto?>
|
||||
{
|
||||
public async Task<UserDto?> Handle(SyncUserCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
@@ -16,23 +17,13 @@ public class SyncUserHandler(IUnitOfWork uw): IRequestHandler<SyncUserCommand, U
|
||||
{
|
||||
var user = await uw.UserRepository.UpdateOrCreateUserAsync(request.User, cancellationToken);
|
||||
|
||||
if (user == null) throw new Exception("User exists but could not be updated");
|
||||
if (user == null)
|
||||
throw new Exception("User exists but could not be updated");
|
||||
|
||||
await uw.SaveAsync(cancellationToken);
|
||||
await uw.CommitTransactionAsync(cancellationToken);
|
||||
|
||||
return new UserDto
|
||||
{
|
||||
Id = user.Id,
|
||||
Name = user.Name,
|
||||
Nickname = user.Nickname,
|
||||
Email = user.Email,
|
||||
EmailVerified = user.EmailVerified,
|
||||
FirstName = user.FirstName,
|
||||
LastName = user.LastName,
|
||||
PhoneNumber = user.PhoneNumber,
|
||||
IsActive = user.IsActive
|
||||
};
|
||||
return mapper.Map<UserDto>(user);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
@@ -19,8 +19,4 @@
|
||||
<ProjectReference Include="..\Imprink.Domain\Imprink.Domain.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Domains\Orders\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
5
src/Imprink.Application/Mappings/MappingProfile.cs
Normal file
5
src/Imprink.Application/Mappings/MappingProfile.cs
Normal file
@@ -0,0 +1,5 @@
|
||||
using AutoMapper;
|
||||
|
||||
namespace Imprink.Application.Mappings;
|
||||
|
||||
public abstract class MappingProfile : Profile { }
|
||||
42
src/Imprink.Application/Mappings/ProductMappingProfile.cs
Normal file
42
src/Imprink.Application/Mappings/ProductMappingProfile.cs
Normal file
@@ -0,0 +1,42 @@
|
||||
using AutoMapper;
|
||||
using Imprink.Application.Domains.Products;
|
||||
using Imprink.Application.Domains.ProductVariants;
|
||||
using Imprink.Application.Products.Dtos;
|
||||
using Imprink.Domain.Entities.Product;
|
||||
|
||||
namespace Imprink.Application.Mappings;
|
||||
|
||||
public class ProductMappingProfile: Profile
|
||||
{
|
||||
public ProductMappingProfile()
|
||||
{
|
||||
CreateMap<CreateProductVariantCommand, ProductVariant>()
|
||||
.ForMember(dest => dest.Id, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.CreatedAt, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.ModifiedAt, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.CreatedBy, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.ModifiedBy, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.Product, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.OrderItems, opt => opt.Ignore());
|
||||
|
||||
CreateMap<ProductVariant, ProductVariantDto>();
|
||||
CreateMap<ProductVariantDto, ProductVariant>()
|
||||
.ForMember(dest => dest.CreatedBy, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.ModifiedBy, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.OrderItems, opt => opt.Ignore());
|
||||
|
||||
CreateMap<Product, ProductDto>();
|
||||
|
||||
CreateMap<CreateProductCommand, Product>()
|
||||
.ForMember(dest => dest.Id, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.CreatedAt, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.ModifiedAt, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.CreatedBy, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.ModifiedBy, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.Category, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.ProductVariants, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.OrderItems, opt => opt.Ignore());
|
||||
|
||||
CreateMap<Category, CategoryDto>();
|
||||
}
|
||||
}
|
||||
42
src/Imprink.Application/Mappings/UserMappingProfile.cs
Normal file
42
src/Imprink.Application/Mappings/UserMappingProfile.cs
Normal file
@@ -0,0 +1,42 @@
|
||||
using System.Security.Claims;
|
||||
using AutoMapper;
|
||||
using Imprink.Application.Users.Dtos;
|
||||
using Imprink.Domain.Entities.Users;
|
||||
using Imprink.Domain.Models;
|
||||
|
||||
namespace Imprink.Application.Mappings;
|
||||
|
||||
public class UserMappingProfile: Profile
|
||||
{
|
||||
public UserMappingProfile()
|
||||
{
|
||||
CreateMap<User, UserDto>()
|
||||
.ForMember(dest => dest.DefaultAddress, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.Roles, opt => opt.Ignore());
|
||||
|
||||
CreateMap<UserDto, User>()
|
||||
.ForMember(dest => dest.DefaultAddress, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.Roles, opt => opt.Ignore());
|
||||
|
||||
CreateMap<UserRole, UserRoleDto>();
|
||||
CreateMap<UserRoleDto, UserRole>();
|
||||
|
||||
CreateMap<Role, RoleDto>()
|
||||
.ForMember(dest => dest.RoleId, opt => opt.MapFrom(src => src.Id));
|
||||
CreateMap<RoleDto, Role>()
|
||||
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.RoleId))
|
||||
.ForMember(dest => dest.UserRoles, opt => opt.Ignore());
|
||||
|
||||
CreateMap<ClaimsPrincipal, Auth0User>()
|
||||
.ForMember(dest => dest.Sub, opt => opt.MapFrom(src =>
|
||||
src.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)!.Value))
|
||||
.ForMember(dest => dest.Name, opt => opt.MapFrom(src =>
|
||||
src.Claims.FirstOrDefault(c => c.Type == "name")!.Value))
|
||||
.ForMember(dest => dest.Nickname, opt => opt.MapFrom(src =>
|
||||
src.Claims.FirstOrDefault(c => c.Type == "nickname")!.Value))
|
||||
.ForMember(dest => dest.Email, opt => opt.MapFrom(src =>
|
||||
src.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email)!.Value))
|
||||
.ForMember(dest => dest.EmailVerified, opt => opt.MapFrom(src =>
|
||||
src.Claims.FirstOrDefault(c => c.Type == "email_verified")!.Value == "true"));
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
using System.Security.Claims;
|
||||
using AutoMapper;
|
||||
using Imprink.Application.Domains.Users;
|
||||
using Imprink.Application.Users.Dtos;
|
||||
using Imprink.Domain.Models;
|
||||
using MediatR;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
@@ -9,30 +11,21 @@ namespace Imprink.WebApi.Controllers.Users;
|
||||
|
||||
[ApiController]
|
||||
[Route("/api/users")]
|
||||
public class UsersController(IMediator mediator) : ControllerBase
|
||||
public class UsersController(IMediator mediator, IMapper mapper) : ControllerBase
|
||||
{
|
||||
[Authorize]
|
||||
[HttpPost("me/sync")]
|
||||
public async Task<IActionResult> SyncMyProfile()
|
||||
{
|
||||
var claims = User.Claims as Claim[] ?? User.Claims.ToArray();
|
||||
|
||||
var auth0User = new Auth0User
|
||||
{
|
||||
Sub = claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value ?? string.Empty,
|
||||
Name = claims.FirstOrDefault(c => c.Type == "name")?.Value ?? string.Empty,
|
||||
Nickname = claims.FirstOrDefault(c => c.Type == "nickname")?.Value ?? string.Empty,
|
||||
Email = claims.FirstOrDefault(c => c.Type == ClaimTypes.Email)?.Value ?? string.Empty,
|
||||
EmailVerified = bool.TryParse(claims.FirstOrDefault(c => c.Type == "email_verified")?.Value, out var emailVerified) && emailVerified
|
||||
};
|
||||
var auth0User = mapper.Map<Auth0User>(User);
|
||||
|
||||
await mediator.Send(new SyncUserCommand(auth0User));
|
||||
return Ok("User profile synchronized.");
|
||||
return Ok("Synced");
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpGet("me/roles")]
|
||||
public async Task<IActionResult> GetMyRoles()
|
||||
public async Task<ActionResult<IEnumerable<RoleDto>>> GetMyRoles()
|
||||
{
|
||||
var sub = User.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty;
|
||||
return Ok(await mediator.Send(new GetUserRolesCommand(sub)));
|
||||
@@ -40,21 +33,29 @@ public class UsersController(IMediator mediator) : ControllerBase
|
||||
|
||||
[Authorize]
|
||||
[HttpPut("me/phone")]
|
||||
public async Task<IActionResult> UpdateMyPhone([FromBody] SetUserPhoneCommand command)
|
||||
public async Task<ActionResult<UserDto?>> UpdateMyPhone([FromBody] SetUserPhoneCommand command)
|
||||
{
|
||||
return Ok(await mediator.Send(command));
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpPut("me/fullname")]
|
||||
public async Task<IActionResult> UpdateMyFullName([FromBody] SetUserFullNameCommand command)
|
||||
public async Task<ActionResult<UserDto?>> UpdateMyFullName([FromBody] SetUserFullNameCommand command)
|
||||
{
|
||||
return Ok(await mediator.Send(command));
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpGet("roles")]
|
||||
public async Task<ActionResult<UserRoleDto?>> GetAllRoles()
|
||||
{
|
||||
var command = new GetAllRolesCommand();
|
||||
return Ok(await mediator.Send(command));
|
||||
}
|
||||
|
||||
[Authorize(Roles = "Admin")]
|
||||
[HttpPut("{userId}/roles/{roleId:guid}")]
|
||||
public async Task<IActionResult> AddUserRole(string userId, Guid roleId)
|
||||
public async Task<ActionResult<UserRoleDto?>> AddUserRole(string userId, Guid roleId)
|
||||
{
|
||||
var command = new SetUserRoleCommand(userId, roleId);
|
||||
return Ok(await mediator.Send(command));
|
||||
@@ -62,7 +63,7 @@ public class UsersController(IMediator mediator) : ControllerBase
|
||||
|
||||
[Authorize(Roles = "Admin")]
|
||||
[HttpDelete("{userId}/roles/{roleId:guid}")]
|
||||
public async Task<IActionResult> RemoveUserRole(string userId, Guid roleId)
|
||||
public async Task<ActionResult<UserRoleDto?>> RemoveUserRole(string userId, Guid roleId)
|
||||
{
|
||||
var command = new DeleteUserRoleCommand(userId, roleId);
|
||||
return Ok(await mediator.Send(command));
|
||||
|
||||
@@ -61,6 +61,7 @@ public class ExceptionHandlingMiddleware(
|
||||
return exception switch
|
||||
{
|
||||
NotFoundException => (HttpStatusCode.NotFound, exception.Message, false),
|
||||
DataUpdateException => (HttpStatusCode.Conflict, exception.Message, false),
|
||||
_ => (HttpStatusCode.InternalServerError, "An internal server error occurred", true)
|
||||
};
|
||||
}
|
||||
|
||||
@@ -13,5 +13,3 @@ var app = builder.Build();
|
||||
Startup.Configure(app, app.Environment);
|
||||
|
||||
app.Run();
|
||||
|
||||
public partial class Program { }
|
||||
@@ -2,6 +2,7 @@ using System.Security.Claims;
|
||||
using FluentValidation;
|
||||
using Imprink.Application;
|
||||
using Imprink.Application.Domains.Products;
|
||||
using Imprink.Application.Mappings;
|
||||
using Imprink.Application.Products;
|
||||
using Imprink.Application.Services;
|
||||
using Imprink.Application.Validation.Models;
|
||||
@@ -39,8 +40,9 @@ public static class Startup
|
||||
services.AddScoped<IOrderItemRepository, OrderItemRepository>();
|
||||
services.AddScoped<IUnitOfWork, UnitOfWork>();
|
||||
services.AddScoped<ICurrentUserService, CurrentUserService>();
|
||||
|
||||
services.AddScoped<Seeder>();
|
||||
|
||||
services.AddAutoMapper(typeof(MappingProfile).Assembly);
|
||||
|
||||
services.AddHttpContextAccessor();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user