Compare commits

...

3 Commits

Author SHA1 Message Date
Amir Hossein Khademi 4ff7601843 fix(CheckUserFirstDiscountUser)
-Add new command for CheckUserFirstDiscountUser
-Fix CheckUserFirstDiscountUser
2024-06-12 11:05:15 +03:30
Amir Hossein Khademi 5edd394252 fix(DiscountCode),VER 1.0.5.6
- Fix discount code use one time per user and customer
- Add Version 1.0.5.6
2024-06-11 18:14:47 +03:30
Amir Hossein Khademi da64ae5b40 fix(TorobGetProducts) , fix(EmallsProducts), VER 1.0.4.5
- Fix torob product price to Tooman
- Fix emalls product price to Tooman
- Add version 1.0.4.5
2024-06-11 12:55:02 +03:30
16 changed files with 110 additions and 64 deletions

View File

@ -1 +1 @@
1.0.3.3
1.0.6.7

View File

@ -11,6 +11,9 @@ public class HealthController : ICarterModule
group.MapGet("", GetHealth)
.WithDisplayName("GetHealth")
.HasApiVersion(1.0);
group.MapGet("/error/test", () => { throw new Exception("Error test message");})
.WithDisplayName("GetHealth")
.HasApiVersion(1.0);
}
public async Task<IResult> GetHealth([FromServices]ISiteMapService siteMapService)

View File

@ -32,8 +32,8 @@ public class OrderBagController : ICarterModule
.HasApiVersion(1.0);
group.MapPost("discount/{orderId}", AddDiscountToOrderBagAsync)
.WithDisplayName("AddDiscountToOrderBag")
group.MapPost("discount/{orderId}", DiscountActionOrderBagAsync)
.WithDisplayName("DiscountActionOrderBag")
.HasApiVersion(1.0);
@ -62,8 +62,8 @@ public class OrderBagController : ICarterModule
public async Task<IResult> RemoveFromOrderBagAsync([FromBody] List<OrderBagRequestDto> requestDtos, IMediator mediator, CancellationToken cancellationToken)
=> TypedResults.Ok(await mediator.Send(new RemoveFromOrderBagCommand(requestDtos), cancellationToken));
public async Task<IResult> AddDiscountToOrderBagAsync(Guid orderId, [FromQuery] string discountCode, IMediator mediator, CancellationToken cancellationToken)
=> TypedResults.Ok(await mediator.Send(new SubmitDiscountCommand(orderId, discountCode), cancellationToken));
public async Task<IResult> DiscountActionOrderBagAsync(Guid orderId, [FromQuery] string? discountCode, IMediator mediator, CancellationToken cancellationToken)
=> TypedResults.Ok(await mediator.Send(new SubmitDiscountActionCommand(orderId, discountCode), cancellationToken));
public async Task<IResult> AddShippingToOrderBagAsync(Guid orderId, [FromBody] SubmitOrderDeliveryCommand request, IMediator mediator, CancellationToken cancellationToken)
=> TypedResults.Ok(await mediator.Send(request with { OrderId = orderId }, cancellationToken));

View File

@ -22,8 +22,6 @@ RUN dotnet publish "./Netina.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish
FROM base AS final
RUN apt-get update
RUN apt-get install-y libgdiplus
WORKDIR /app
COPY --from=publish /app/publish .

View File

@ -6,8 +6,8 @@
<ImplicitUsings>enable</ImplicitUsings>
<InvariantGlobalization>true</InvariantGlobalization>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<AssemblyVersion>1.0.3.3</AssemblyVersion>
<FileVersion>1.0.3.3</FileVersion>
<AssemblyVersion>1.0.6.7</AssemblyVersion>
<FileVersion>1.0.6.7</FileVersion>
</PropertyGroup>
<ItemGroup>

View File

@ -96,7 +96,6 @@ builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
var app = builder.Build();
// Configure the HTTP request pipeline.
//app.UseCustomSwagger(siteSetting.BaseUrl);

View File

@ -1,7 +1,4 @@
using Netina.Common.Models.Api;
using Netina.Common.Models.Exception;
using Netina.Core.Models.Api;
using Refit;
using Refit;
namespace Netina.Api.WebFramework.MiddleWares;

View File

@ -51,11 +51,11 @@ public class GetEmallsProductsQueryHandler : IRequestHandler<GetEmallsProductsQu
};
if (product.Cost > product.CostWithDiscount)
{
torobProduct.old_price = (int)product.Cost;
torobProduct.price = (int)product.CostWithDiscount;
torobProduct.old_price = (int)product.Cost / 10;
torobProduct.price = (int)product.CostWithDiscount / 10;
}
else
torobProduct.price = (int)product.Cost;
torobProduct.price = (int)product.Cost / 10;
products.Add(torobProduct);
}

View File

@ -49,11 +49,11 @@ public class GetTorobProductsQueryHandler : IRequestHandler<GetTorobProductsQuer
};
if (product.Cost > product.CostWithDiscount)
{
torobProduct.old_price = product.Cost;
torobProduct.price = product.CostWithDiscount;
torobProduct.old_price = product.Cost / 10;
torobProduct.price = product.CostWithDiscount / 10;
}
else
torobProduct.price = product.Cost;
torobProduct.price = product.Cost / 10;
products.Add(torobProduct);
}

View File

@ -21,23 +21,20 @@ public class CalculateOrderDiscountCommandHandler : IRequestHandler<CalculateOrd
if (discount == null)
throw new AppException("تخفیف وجود منقضی شده است یا وجود ندارد", ApiResultStatusCode.NotFound);
if (_currentUserService.UserId != null && Guid.TryParse(_currentUserService.UserId, out Guid userId))
{
var discountedUserOrder = await _repositoryWrapper.SetRepository<Order>()
.TableNoTracking
.FirstOrDefaultAsync(f => f.CustomerId == userId && f.DiscountCode == discount.Code, cancellationToken);
if (discountedUserOrder != null)
throw new AppException("شما یک بار از این کد تخفیف استفاده کرده اید", ApiResultStatusCode.BadRequest);
}
if (discount.IsForFirstPurchase)
{
if (_currentUserService.UserId != null && Guid.TryParse(_currentUserService.UserId, out Guid firstPurchaseUserId))
{
var customer = await _repositoryWrapper.SetRepository<Customer>()
.TableNoTracking
.FirstOrDefaultAsync(c => c.UserId == firstPurchaseUserId, cancellationToken);
if (customer == null)
throw new BaseApiException(ApiResultStatusCode.NotFound, "Customer not found");
var userOrderCount = await _repositoryWrapper.SetRepository<Order>()
.TableNoTracking
.CountAsync(f => f.CustomerId == firstPurchaseUserId && f.DiscountCode == discount.Code, cancellationToken);
.CountAsync(f => f.CustomerId == customer.Id && f.DiscountCode == discount.Code, cancellationToken);
if (userOrderCount > 0)
throw new AppException("شما قبلا خریدی داشته اید و نمیتوانید از تخفیف اولین خرید استفاده کنید", ApiResultStatusCode.BadRequest);
}

View File

@ -0,0 +1,36 @@
namespace Netina.Core.EntityServices.DiscountHandlers;
public class CheckUserDiscountFirstUseCommandHandler : IRequestHandler<CheckUserDiscountFirstUseCommand, bool>
{
private readonly IRepositoryWrapper _repositoryWrapper;
private readonly ICurrentUserService _currentUserService;
public CheckUserDiscountFirstUseCommandHandler(IRepositoryWrapper repositoryWrapper, ICurrentUserService currentUserService)
{
_repositoryWrapper = repositoryWrapper;
_currentUserService = currentUserService;
}
public async Task<bool> Handle(CheckUserDiscountFirstUseCommand request, CancellationToken cancellationToken)
{
if (_currentUserService.UserId != null && Guid.TryParse(_currentUserService.UserId, out Guid userId))
{
var customer = await _repositoryWrapper.SetRepository<Customer>()
.TableNoTracking
.FirstOrDefaultAsync(c => c.UserId == userId, cancellationToken);
if (customer == null)
throw new BaseApiException(ApiResultStatusCode.NotFound, "Customer not found");
var discountedUserOrder = await _repositoryWrapper.SetRepository<Order>()
.TableNoTracking
.FirstOrDefaultAsync(f => f.CustomerId == customer.Id && f.DiscountCode == request.DiscountCode,
cancellationToken);
if (discountedUserOrder != null)
return true;
return false;
}
else
throw new BaseApiException(ApiResultStatusCode.BadRequest,"UserId is wrong");
}
}

View File

@ -0,0 +1,45 @@
namespace Netina.Core.EntityServices.OrderBagHandlers;
public class SubmitDiscountActionCommandHandler : IRequestHandler<SubmitDiscountActionCommand, OrderSDto>
{
private readonly IRepositoryWrapper _repositoryWrapper;
private readonly IMediator _mediator;
public SubmitDiscountActionCommandHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator)
{
_repositoryWrapper = repositoryWrapper;
_mediator = mediator;
}
public async Task<OrderSDto> Handle(SubmitDiscountActionCommand request, CancellationToken cancellationToken)
{
var order = await _repositoryWrapper.SetRepository<Order>()
.TableNoTracking
.FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken);
if (order == null)
throw new AppException("Order not found", ApiResultStatusCode.NotFound);
if (request.DiscountCode != null)
{
var discount = await _repositoryWrapper.SetRepository<Discount>()
.TableNoTracking
.FirstOrDefaultAsync(d => d.Code == request.DiscountCode, cancellationToken);
if (discount == null || discount.IsExpired())
throw new AppException("تخفیف منقضی شده است یا وجود ندارد", ApiResultStatusCode.NotFound);
var isFirstUserOfDiscount = await _mediator.Send(new CheckUserDiscountFirstUseCommand(request.DiscountCode), cancellationToken);
if (!isFirstUserOfDiscount)
throw new BaseApiException(ApiResultStatusCode.BadRequest, "شما یک بار از این کد تخفیف استفاده نموده اید و قابلیت استفاده مجدد ندارید");
order.SetDiscount(request.DiscountCode);
}
else
order.RemoveDiscount();
_repositoryWrapper.SetRepository<Order>().Update(order);
await _repositoryWrapper.SaveChangesAsync(cancellationToken);
var calculateOrder = await _mediator.Send(new CalculateOrderCommand(order.Id), cancellationToken);
return calculateOrder.AdaptToSDto();
}
}

View File

@ -1,32 +0,0 @@
namespace Netina.Core.EntityServices.OrderBagHandlers;
public class SubmitDiscountCommandHandler : IRequestHandler<SubmitDiscountCommand,OrderSDto>
{
private readonly IRepositoryWrapper _repositoryWrapper;
private readonly IMediator _mediator;
public SubmitDiscountCommandHandler(IRepositoryWrapper repositoryWrapper,IMediator mediator)
{
_repositoryWrapper = repositoryWrapper;
_mediator = mediator;
}
public async Task<OrderSDto> Handle(SubmitDiscountCommand request, CancellationToken cancellationToken)
{
var order = await _repositoryWrapper.SetRepository<Order>()
.TableNoTracking
.FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken);
if (order == null)
throw new AppException("Order not found", ApiResultStatusCode.NotFound);
var discount = await _repositoryWrapper.SetRepository<Discount>()
.TableNoTracking
.FirstOrDefaultAsync(d => d.Code == request.DiscountCode, cancellationToken);
if (discount == null || discount.IsExpired())
throw new AppException("تخفیف منقضی شده است یا وجود ندارد", ApiResultStatusCode.NotFound);
order.SetDiscount(request.DiscountCode);
_repositoryWrapper.SetRepository<Order>().Update(order);
await _repositoryWrapper.SaveChangesAsync(cancellationToken);
var calculateOrder = await _mediator.Send(new CalculateOrderCommand(order.Id), cancellationToken);
return calculateOrder.AdaptToSDto();
}
}

View File

@ -51,4 +51,5 @@ public sealed record UpdateDiscountCommand(
public sealed record DeleteDiscountCommand(Guid Id) : IRequest<bool>;
public sealed record CalculateOrderDiscountCommand(string DiscountCode, Order Order) : IRequest<double>;
public sealed record CalculateOrderDiscountCommand(string DiscountCode, Order Order) : IRequest<double>;
public sealed record CheckUserDiscountFirstUseCommand(string DiscountCode) : IRequest<bool>;

View File

@ -6,7 +6,7 @@ public sealed record CheckOrderBagCommand(List<CheckOrderBagRequestItem> OrderBa
public sealed record AddToOrderBagCommand(List<OrderBagRequestDto> RequestDtos) : IRequest<OrderSDto>;
public sealed record RemoveFromOrderBagCommand(List<OrderBagRequestDto> RequestDtos) : IRequest<OrderSDto>;
public sealed record SubmitDiscountCommand(Guid OrderId,string DiscountCode) : IRequest<OrderSDto>;
public sealed record SubmitDiscountActionCommand(Guid OrderId,string? DiscountCode) : IRequest<OrderSDto>;
public sealed record SubmitOrderDeliveryCommand(Guid AddressId, Guid OrderId, Guid ShippingId) : IRequest<OrderSDto>;
public sealed record SubmitOrderBagCommand(List<OrderBagRequestDto> RequestDtos) : IRequest<OrderSDto>;

View File

@ -61,6 +61,8 @@ public partial class Order
public void SetDiscount(string discountCode)
=> DiscountCode = discountCode;
public void RemoveDiscount()
=> DiscountCode = string.Empty;
public void AddOrderProduct(OrderProduct orderProduct)
=> OrderProducts.Add(orderProduct);