Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue #56: Integrate payment method #57

Merged
merged 4 commits into from
Dec 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions src/Shopizy.Api/Common/Mapping/CartMappingConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,30 +36,31 @@ public void Register(TypeAdapterConfig config)

config
.NewConfig<
(Guid UserId, Guid CartId, UpdateProductQuantityRequest request),
(Guid UserId, Guid CartId, Guid ItemId, UpdateProductQuantityRequest request),
UpdateProductQuantityCommand
>()
.Map(dest => dest.UserId, src => src.UserId)
.Map(dest => dest.CartId, src => src.CartId)
.Map(dest => dest.ItemId, src => src.ItemId)
.Map(dest => dest, src => src.request);

config
.NewConfig<(Guid UserId, Guid CartId, Guid ProductId), RemoveProductFromCartCommand>()
.NewConfig<(Guid UserId, Guid CartId, Guid ItemId), RemoveProductFromCartCommand>()
.Map(dest => dest.UserId, src => src.UserId)
.Map(dest => dest.CartId, src => src.CartId)
.Map(dest => dest.ProductId, src => src.ProductId);
.Map(dest => dest.ItemId, src => src.ItemId);

config.NewConfig<Guid, GetCartQuery>().MapWith(userId => new GetCartQuery(userId));

config
.NewConfig<Cart, CartResponse>()
.Map(dest => dest.CartId, src => src.Id.Value)
.Map(dest => dest.UserId, src => src.UserId.Value)
.Map(dest => dest.LineItems, src => src.LineItems);
.Map(dest => dest.CartItems, src => src.CartItems);

config
.NewConfig<LineItem, LineItemResponse>()
.Map(dest => dest.LineItemId, src => src.Id.Value)
.NewConfig<CartItem, CartItemResponse>()
.Map(dest => dest.CartItemId, src => src.Id.Value)
.Map(dest => dest.ProductId, src => src.ProductId.Value)
.Map(dest => dest.Quantity, src => src.Quantity)
.Map(dest => dest.Product, src => src.Product)
Expand All @@ -69,6 +70,7 @@ public void Register(TypeAdapterConfig config)
src.Product.ProductImages == null
? null
: src.Product.ProductImages.Select(pi => pi.ImageUrl)
);
)
.Map(dest => dest.Product.Price, src => src.Product.UnitPrice.Amount);
}
}
6 changes: 5 additions & 1 deletion src/Shopizy.Api/Common/Mapping/OrderMappingConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@ public void Register(TypeAdapterConfig config)
.Map(dest => dest.DeliveryChargeAmount, src => src.request.DeliveryCharge.Amount)
.Map(
dest => dest.DeliveryChargeCurrency,
src => (Currency)src.request.DeliveryCharge.Currency
src =>
src.request.DeliveryCharge.Currency == "usd" ? Currency.usd
: src.request.DeliveryCharge.Currency == "bdt" ? Currency.bdt
: src.request.DeliveryCharge.Currency == "euro" ? Currency.euro
: Currency.usd
);
config
.NewConfig<(Guid UserId, Guid OrderId), GetOrderQuery>()
Expand Down
14 changes: 14 additions & 0 deletions src/Shopizy.Api/Common/Mapping/ProductMappingConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using Shopizy.Application.Products.Queries.GetProducts;
using shopizy.Contracts.Product;
using Shopizy.Contracts.Product;
using Shopizy.Domain.ProductReviews;
using Shopizy.Domain.Products;
using Shopizy.Domain.Products.Entities;

Expand Down Expand Up @@ -46,13 +47,26 @@ public void Register(TypeAdapterConfig config)
.NewConfig<Product, ProductResponse>()
.Map(dest => dest.ProductId, src => src.Id.Value)
.Map(dest => dest.CategoryId, src => src.CategoryId.Value)
.Map(dest => dest.Price, src => src.UnitPrice.Amount.ToString());

config
.NewConfig<Product, ProductDetailResponse>()
.Map(dest => dest.ProductId, src => src.Id.Value)
.Map(dest => dest.CategoryId, src => src.CategoryId.Value)
.Map(dest => dest.Sku, src => src.SKU)
.Map(dest => dest.Price, src => src.UnitPrice.Amount.ToString());

config
.NewConfig<ProductImage, ProductImageResponse>()
.Map(dest => dest.ProductImageId, src => src.Id.Value);

config
.NewConfig<ProductReview, ProductReviewResponse>()
.Map(dest => dest.ProductReviewId, src => src.Id.Value)
.Map(dest => dest.Rating, src => src.Rating.Value)
.Map(dest => dest.Reviewer, src => $"{src.User.FirstName} {src.User.LastName}")
.Map(dest => dest.ReviewerImageUrl, src => src.User.ProfileImageUrl);

config
.NewConfig<(Guid UserId, Guid ProductId, Guid ImageId), DeleteProductImageCommand>()
.Map(dest => dest.UserId, src => src.UserId)
Expand Down
31 changes: 23 additions & 8 deletions src/Shopizy.Api/Common/Mapping/paymentMappingConfig.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using Ardalis.GuardClauses;
using Mapster;
using Shopizy.Application.Common.models;
using Shopizy.Application.Payments.Commands.CreatePaymentSession;
using Shopizy.Application.Payments.Commands.CardNotPresentSale;
using Shopizy.Application.Payments.Commands.CashOnDeliverySale;
using Shopizy.Contracts.Payment;

namespace Shopizy.Api.Common.Mapping;
Expand All @@ -14,14 +14,29 @@ public void Register(TypeAdapterConfig config)

config
.NewConfig<
(Guid UserId, CreatePaymentSessionRequest request),
CreatePaymentSessionCommand
(Guid UserId, CardNotPresentSaleRequest request),
CardNotPresentSaleCommand
>()
.Map(dest => dest.UserId, src => src.UserId)
.Map(dest => dest, src => src.request);
.Map(dest => dest.OrderId, src => src.request.OrderId)
.Map(dest => dest.Amount, src => src.request.Amount)
.Map(dest => dest.Currency, src => src.request.Currency)
.Map(dest => dest.PaymentMethod, src => src.request.PaymentMethod)
.Map(dest => dest.PaymentMethodId, src => src.request.PaymentMethodId)
.Map(dest => dest.CardName, src => src.request.CardInfo.CardName)
.Map(dest => dest.CardExpiryMonth, src => src.request.CardInfo.CardExpiryMonth)
.Map(dest => dest.CardExpiryYear, src => src.request.CardInfo.CardExpiryYear)
.Map(dest => dest.LastDigits, src => src.request.CardInfo.LastDigits);

config.NewConfig<ChargeResource, PaymentResponse>();

config.NewConfig<CheckoutSession, PaymentSessionResponse>();
config
.NewConfig<
(Guid UserId, CardNotPresentSaleRequest request),
CashOnDeliverySaleCommand
>()
.Map(dest => dest.UserId, src => src.UserId)
.Map(dest => dest.OrderId, src => src.request.OrderId)
.Map(dest => dest.Amount, src => src.request.Amount)
.Map(dest => dest.Currency, src => src.request.Currency)
.Map(dest => dest.PaymentMethod, src => src.request.PaymentMethod);
}
}
7 changes: 5 additions & 2 deletions src/Shopizy.Api/Controllers/AuthenticationController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,12 @@ public class AuthenticationController(ISender mediator, IMapper mapper) : ApiCon
public async Task<IActionResult> RegisterAsync(RegisterRequest request)
{
var command = _mapper.Map<RegisterCommand>(request);
var authResult = await _mediator.Send(command);
var result = await _mediator.Send(command);

return authResult.Match(authResult => Ok(_mapper.Map<AuthResponse>(authResult)), Problem);
return result.Match(
success => Ok(SuccessResult.Success("Your account has been added. Please log in.")),
Problem
);
}

[HttpPost("login")]
Expand Down
15 changes: 6 additions & 9 deletions src/Shopizy.Api/Controllers/CartController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ AddProductToCartRequest request
return result.Match(product => Ok(_mapper.Map<CartResponse>(product)), Problem);
}

[HttpPatch("{cartId:guid}/update-quantity")]
[HttpPatch("{cartId:guid}/items/{itemId:guid}")]
[SwaggerResponse(StatusCodes.Status200OK, null, typeof(SuccessResult))]
[SwaggerResponse(StatusCodes.Status400BadRequest, null, typeof(ErrorResult))]
[SwaggerResponse(StatusCodes.Status401Unauthorized, null, typeof(ErrorResult))]
Expand All @@ -75,10 +75,11 @@ AddProductToCartRequest request
public async Task<IActionResult> UpdateProductQuantityAsync(
Guid userId,
Guid cartId,
Guid itemId,
UpdateProductQuantityRequest request
)
{
var command = _mapper.Map<UpdateProductQuantityCommand>((userId, cartId, request));
var command = _mapper.Map<UpdateProductQuantityCommand>((userId, cartId, itemId, request));
var result = await _mediator.Send(command);

return result.Match(
Expand All @@ -87,19 +88,15 @@ UpdateProductQuantityRequest request
);
}

[HttpDelete("{cartId:guid}/remove-product/{productId:guid}")]
[HttpDelete("{cartId:guid}/items/{itemId:guid}")]
[SwaggerResponse(StatusCodes.Status200OK, null, typeof(SuccessResult))]
[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> RemoveProductFromCartAsync(
Guid userId,
Guid cartId,
Guid productId
)
public async Task<IActionResult> RemoveItemFromCartAsync(Guid userId, Guid cartId, Guid itemId)
{
var command = _mapper.Map<RemoveProductFromCartCommand>((userId, cartId, productId));
var command = _mapper.Map<RemoveProductFromCartCommand>((userId, cartId, itemId));
var result = await _mediator.Send(command);

return result.Match(
Expand Down
34 changes: 24 additions & 10 deletions src/Shopizy.Api/Controllers/PaymentController.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
using MapsterMapper;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Shopizy.Application.Payments.Commands.CreatePaymentSession;
using Shopizy.Application.Payments.Commands.CardNotPresentSale;
using Shopizy.Application.Payments.Commands.CashOnDeliverySale;
using Shopizy.Contracts.Common;
using Shopizy.Contracts.Payment;
using Swashbuckle.AspNetCore.Annotations;
Expand All @@ -14,20 +15,33 @@ public class PaymentController(ISender mediator, IMapper mapper) : ApiController
private readonly ISender _mediator = mediator;
private readonly IMapper _mapper = mapper;

[HttpPost("session")]
[SwaggerResponse(StatusCodes.Status200OK, null, typeof(PaymentSessionResponse))]
[HttpPost]
[SwaggerResponse(StatusCodes.Status200OK, null, typeof(SuccessResult))]
[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> CreatePaymentSessoinAsync(
Guid userId,
CreatePaymentSessionRequest request
)
public async Task<IActionResult> CreateSaleAsync(Guid userId, CardNotPresentSaleRequest request)
{
var command = _mapper.Map<CreatePaymentSessionCommand>((userId, request));
var result = await _mediator.Send(command);
if (request.PaymentMethod.ToLower() == "Card")
{
var command = _mapper.Map<CardNotPresentSaleCommand>((userId, request));
var result = await _mediator.Send(command);

return result.Match(Payment => Ok(_mapper.Map<PaymentSessionResponse>(Payment)), Problem);
return result.Match(
success => Ok(SuccessResult.Success("Payment successfull collected.")),
Problem
);
}
else
{
var command = _mapper.Map<CashOnDeliverySaleCommand>((userId, request));
var result = await _mediator.Send(command);

return result.Match(
success => Ok(SuccessResult.Success("Payment successfull collected.")),
Problem
);
}
}
}
6 changes: 3 additions & 3 deletions src/Shopizy.Api/Controllers/ProductController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class ProductController(ISender mediator, IMapper mapper) : ApiController
[SwaggerResponse(StatusCodes.Status400BadRequest, null, typeof(ErrorResult))]
[SwaggerResponse(StatusCodes.Status401Unauthorized, null, typeof(ErrorResult))]
[SwaggerResponse(StatusCodes.Status500InternalServerError, null, typeof(ErrorResult))]
public async Task<IActionResult> GetAsync([FromQuery] ProductsCriteriaRequest request)
public async Task<IActionResult> SearchAsync([FromQuery] ProductsCriteriaRequest request)
{
var query = _mapper.Map<GetProductsQuery>(request);
var result = await _mediator.Send(query);
Expand All @@ -35,7 +35,7 @@ public async Task<IActionResult> GetAsync([FromQuery] ProductsCriteriaRequest re
}

[HttpGet("products/{productId:guid}")]
[SwaggerResponse(StatusCodes.Status200OK, null, typeof(ProductResponse))]
[SwaggerResponse(StatusCodes.Status200OK, null, typeof(ProductDetailResponse))]
[SwaggerResponse(StatusCodes.Status400BadRequest, null, typeof(ErrorResult))]
[SwaggerResponse(StatusCodes.Status401Unauthorized, null, typeof(ErrorResult))]
[SwaggerResponse(StatusCodes.Status500InternalServerError, null, typeof(ErrorResult))]
Expand All @@ -44,7 +44,7 @@ public async Task<IActionResult> GetProductAsync(Guid ProductId)
var query = _mapper.Map<GetProductQuery>(ProductId);
var result = await _mediator.Send(query);

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

[HttpPost("users/{userId:guid}/products")]
Expand Down
2 changes: 1 addition & 1 deletion src/Shopizy.Api/Controllers/UserController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public async Task<IActionResult> UpdatePasswordAsync(Guid userId, UpdatePassword
var command = _mapper.Map<UpdatePasswordCommand>((userId, request));
var result = await _mediator.Send(command);

return result.Match<IActionResult>(
return result.Match(
success => Ok(SuccessResult.Success("Successfully updated password.")),
Problem
);
Expand Down
64 changes: 0 additions & 64 deletions src/Shopizy.Api/Controllers/WebhooksController.cs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
using ErrorOr;
using MediatR;
using Shopizy.Application.Authentication.Common;

namespace Shopizy.Application.Authentication.Commands.Register;

public record RegisterCommand(string FirstName, string LastName, string Phone, string Password)
: IRequest<ErrorOr<AuthResult>>;
: IRequest<ErrorOr<Success>>;
Loading
Loading