Skip to content

Commit

Permalink
Issue #59: Update login and cart APIs.
Browse files Browse the repository at this point in the history
  • Loading branch information
akazad13 committed Dec 22, 2024
1 parent 41789b9 commit 210337b
Show file tree
Hide file tree
Showing 17 changed files with 79 additions and 114 deletions.
3 changes: 0 additions & 3 deletions src/Shopizy.Api/Common/Mapping/CartMappingConfig.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using Ardalis.GuardClauses;
using Mapster;
using Shopizy.Application.Carts.Commands.AddProductToCart;
using Shopizy.Application.Carts.Commands.CreateCartWithFirstProduct;
using Shopizy.Application.Carts.Commands.RemoveProductFromCart;
using Shopizy.Application.Carts.Commands.UpdateProductQuantity;
using Shopizy.Application.Carts.Queries.GetCart;
Expand All @@ -17,8 +16,6 @@ public void Register(TypeAdapterConfig config)
{
Guard.Against.Null(config);

config.NewConfig<CreateCartWithFirstProductRequest, CreateCartWithFirstProductCommand>();

config
.NewConfig<(Guid CartId, AddProductToCartRequest request), AddProductToCartCommand>()
.Map(dest => dest.CartId, src => src.CartId)
Expand Down
2 changes: 1 addition & 1 deletion src/Shopizy.Api/Controllers/AuthenticationController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class AuthenticationController(ISender mediator, IMapper mapper) : ApiCon
private readonly IMapper _mapper = mapper;

[HttpPost("register")]
[SwaggerResponse(StatusCodes.Status200OK, null, typeof(AuthResponse))]
[SwaggerResponse(StatusCodes.Status200OK, null, typeof(SuccessResult))]
[SwaggerResponse(StatusCodes.Status400BadRequest, null, typeof(ErrorResult))]
[SwaggerResponse(StatusCodes.Status401Unauthorized, null, typeof(ErrorResult))]
[SwaggerResponse(StatusCodes.Status409Conflict, null, typeof(ErrorResult))]
Expand Down
17 changes: 0 additions & 17 deletions src/Shopizy.Api/Controllers/CartController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Shopizy.Application.Carts.Commands.AddProductToCart;
using Shopizy.Application.Carts.Commands.CreateCartWithFirstProduct;
using Shopizy.Application.Carts.Commands.RemoveProductFromCart;
using Shopizy.Application.Carts.Commands.UpdateProductQuantity;
using Shopizy.Application.Carts.Queries.GetCart;
Expand Down Expand Up @@ -31,22 +30,6 @@ public async Task<IActionResult> GetCartAsync(Guid userId)
return result.Match(Product => Ok(_mapper.Map<CartResponse>(Product)), Problem);
}

[HttpPost]
[SwaggerResponse(StatusCodes.Status200OK, null, typeof(CartResponse))]
[SwaggerResponse(StatusCodes.Status400BadRequest, null, typeof(ErrorResult))]
[SwaggerResponse(StatusCodes.Status401Unauthorized, null, typeof(ErrorResult))]
[SwaggerResponse(StatusCodes.Status409Conflict, null, typeof(ErrorResult))]
[SwaggerResponse(StatusCodes.Status500InternalServerError, null, typeof(ErrorResult))]
public async Task<IActionResult> CreateCartWithFirstProductAsync(
CreateCartWithFirstProductRequest request
)
{
var command = _mapper.Map<CreateCartWithFirstProductCommand>(request);
var result = await _mediator.Send(command);

return result.Match(product => Ok(_mapper.Map<CartResponse>(product)), Problem);
}

[HttpPatch("{cartId:guid}")]
[SwaggerResponse(StatusCodes.Status200OK, null, typeof(CartResponse))]
[SwaggerResponse(StatusCodes.Status400BadRequest, null, typeof(ErrorResult))]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using MediatR;
using Shopizy.Application.Common.Interfaces.Authentication;
using Shopizy.Application.Common.Interfaces.Persistence;
using Shopizy.Domain.Carts;
using Shopizy.Domain.Common.CustomErrors;
using Shopizy.Domain.Permissions.ValueObjects;
using Shopizy.Domain.Users;
Expand All @@ -10,11 +11,13 @@ namespace Shopizy.Application.Authentication.Commands.Register;

public class RegisterCommandHandler(
IUserRepository userRepository,
IPasswordManager passwordManager
IPasswordManager passwordManager,
ICartRepository cartRepository
) : IRequestHandler<RegisterCommand, ErrorOr<Success>>
{
private readonly IUserRepository _userRepository = userRepository;
private readonly IPasswordManager _passwordManager = passwordManager;
private readonly ICartRepository _cartRepository = cartRepository;

public async Task<ErrorOr<Success>> Handle(
RegisterCommand command,
Expand Down Expand Up @@ -66,6 +69,10 @@ CancellationToken cancellationToken
return CustomErrors.User.UserNotCreated;
}

var cart = Cart.Create(user.Id);
await _cartRepository.AddAsync(cart);
await _cartRepository.Commit(cancellationToken);

return Result.Success;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Shopizy.Application.Authentication.Common;
using Shopizy.Application.Common.Interfaces.Authentication;
using Shopizy.Application.Common.Interfaces.Persistence;
using Shopizy.Domain.Carts;
using Shopizy.Domain.Common.CustomErrors;

namespace Shopizy.Application.Authentication.Queries.login;
Expand All @@ -11,13 +12,15 @@ public class LoginQueryHandler(
IUserRepository userRepository,
IPermissionRepository permissionRepository,
IJwtTokenGenerator jwtTokenGenerator,
IPasswordManager passwordManager
IPasswordManager passwordManager,
ICartRepository cartRepository
) : IRequestHandler<LoginQuery, ErrorOr<AuthResult>>
{
private readonly IUserRepository _userRepository = userRepository;
private readonly IPermissionRepository _permissionRepository = permissionRepository;
private readonly IJwtTokenGenerator _jwtTokenGenerator = jwtTokenGenerator;
private readonly IPasswordManager _passwordManager = passwordManager;
private readonly ICartRepository _cartRepository = cartRepository;

public async Task<ErrorOr<AuthResult>> Handle(
LoginQuery query,
Expand Down Expand Up @@ -52,6 +55,15 @@ CancellationToken cancellationToken

var token = _jwtTokenGenerator.GenerateToken(user.Id, roles, assignedPermissions);

var cart = await _cartRepository.GetCartByUserIdAsync(user.Id);

if (cart is null)
{
cart = Cart.Create(user.Id);
await _cartRepository.AddAsync(cart);
await _cartRepository.Commit(cancellationToken);
}

return new AuthResult(user.Id.Value, user.FirstName, user.LastName, user.Email, token);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,10 @@
namespace Shopizy.Application.Carts.Commands.AddProductToCart;

[Authorize(Permissions = Permissions.Cart.Modify)]
public record AddProductToCartCommand(Guid CartId, Guid ProductId, string Color, string Size)
: IAuthorizeableRequest<ErrorOr<Cart>>;
public record AddProductToCartCommand(
Guid CartId,
Guid ProductId,
string Color,
string Size,
int Quantity
) : IAuthorizeableRequest<ErrorOr<Cart>>;
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ CancellationToken cancellationToken
return CustomErrors.Product.ProductNotFound;
}

cart.AddLineItem(CartItem.Create(ProductId.Create(cmd.ProductId), cmd.Color, cmd.Size));
cart.AddLineItem(
CartItem.Create(ProductId.Create(cmd.ProductId), cmd.Color, cmd.Size, cmd.Quantity)
);

_cartRepository.Update(cart);

Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
using ErrorOr;
using Shopizy.Application.Common.Security.Permissions;
using Shopizy.Application.Common.Security.Policies;
using Shopizy.Application.Common.Security.Request;
using Shopizy.Domain.Common.Enums;
using Shopizy.Domain.Orders;

namespace Shopizy.Application.Orders.Commands.CreateOrder;

[Authorize(Permissions = Permissions.Order.Create, Policies = Policy.Admin)]
[Authorize(Permissions = Permissions.Order.Create)]
public record CreateOrderCommand(
string PromoCode,
int DeliveryMethod,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ CancellationToken cancellationToken
// }
// }



var order = Order.Create(
userId: UserId.Create(_currentUser.GetCurrentUserId()),
promoCode: request.PromoCode,
Expand All @@ -58,29 +60,37 @@ CancellationToken cancellationToken
country: request.ShippingAddress.Country,
zipCode: request.ShippingAddress.ZipCode
),
orderItems: products.ConvertAll(product =>
{
var item = request.OrderItems.First(p => p.ProductId == product.Id.Value);
var photoUrl =
product.ProductImages.Count == 0 ? "" : product.ProductImages[0].ImageUrl;
orderItems: request
.OrderItems.ToList()
.ConvertAll(item =>
{
var product = products.First(p => p.Id.Value == item.ProductId);
var photoUrl =
product.ProductImages.Count == 0 ? "" : product.ProductImages[0].ImageUrl;

return OrderItem.Create(
name: product.Name,
pictureUrl: photoUrl,
unitPrice: product.UnitPrice,
quantity: item.Quantity,
color: item.Color,
size: item.Size,
discount: product.Discount
);
})
return OrderItem.Create(
name: product.Name,
pictureUrl: photoUrl,
unitPrice: Price.CreateNew(
product.UnitPrice.Amount,
product.UnitPrice.Currency
),
quantity: item.Quantity,
color: item.Color,
size: item.Size,
discount: product.Discount
);
})
);

await _orderRepository.AddAsync(order);
if (await _orderRepository.Commit(cancellationToken) <= 0)
{
return CustomErrors.Order.OrderNotCreated;
}

// remove cart items events

return order;
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
using ErrorOr;
using Shopizy.Application.Common.Security.Permissions;
using Shopizy.Application.Common.Security.Policies;
using Shopizy.Application.Common.Security.Request;

namespace Shopizy.Application.Payments.Commands.CardNotPresentSale;

[Authorize(Permissions = Permissions.Order.Get, Policies = Policy.Admin)]
[Authorize(Permissions = Permissions.Order.Create)]
public record CardNotPresentSaleCommand(
Guid OrderId,
decimal Amount,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
using ErrorOr;
using Shopizy.Application.Common.Security.Permissions;
using Shopizy.Application.Common.Security.Policies;
using Shopizy.Application.Common.Security.Request;

namespace Shopizy.Application.Payments.Commands.CashOnDeliverySale;

[Authorize(Permissions = Permissions.Order.Get, Policies = Policy.Admin)]
[Authorize(Permissions = Permissions.Order.Create)]
public record CashOnDeliverySaleCommand(
Guid OrderId,
decimal Amount,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ CancellationToken cancellationToken
return CustomErrors.Product.ProductNotFound;
}

Domain.Products.Entities.ProductImage? prodImage = product.ProductImages.FirstOrDefault(
pi => pi.Id == ProductImageId.Create(cmd.ImageId)
var prodImage = product.ProductImages.FirstOrDefault(pi =>
pi.Id == ProductImageId.Create(cmd.ImageId)
);

if (prodImage is null)
Expand Down
2 changes: 1 addition & 1 deletion src/Shopizy.Contracts/Cart/AddProductToCartRequest.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
namespace Shopizy.Contracts.Cart;

public record AddProductToCartRequest(Guid ProductId, string Color, string Size);
public record AddProductToCartRequest(Guid ProductId, string Color, string Size, int Quantity);
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
namespace Shopizy.Contracts.Cart;

public record CreateCartWithFirstProductRequest(Guid ProductId, string Color, string Size);
public record CreateCartWithFirstProductRequest(
Guid ProductId,
string Color,
string Size,
int Quantity
);
14 changes: 10 additions & 4 deletions src/Shopizy.Domain/Carts/Entities/CartItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,29 @@ public sealed class CartItem : Entity<CartItemId>
public string Size { get; private set; }
public int Quantity { get; private set; }

public static CartItem Create(ProductId productId, string color, string size)
public static CartItem Create(ProductId productId, string color, string size, int quantity)
{
return new CartItem(CartItemId.CreateUnique(), productId, color, size);
return new CartItem(CartItemId.CreateUnique(), productId, color, size, quantity);
}

public void UpdateQuantity(int quantity)
{
Quantity = quantity;
}

private CartItem(CartItemId CartItemId, ProductId productId, string color, string size)
private CartItem(
CartItemId CartItemId,
ProductId productId,
string color,
string size,
int quantity
)
: base(CartItemId)
{
ProductId = productId;
Color = color;
Size = size;
Quantity = 1;
Quantity = quantity;
}

private CartItem() { }
Expand Down

0 comments on commit 210337b

Please sign in to comment.