add deliverycode , add version 0.20.23.40

release
Amir Hossein Khademi 2024-04-13 01:26:10 +03:30
parent 3cba0d598a
commit 803d26082f
16 changed files with 1908 additions and 8 deletions

View File

@ -1 +1 @@
0.19.22.39
0.20.23.40

View File

@ -24,6 +24,7 @@ public class OrderController : ICarterModule
group.MapDelete("{id}", DeleteAsync)
.WithDisplayName("DeleteOneOrder")
.HasApiVersion(1.0);
group.MapGet("{id}/invoice", GetOrderInvoiceAsync)
.WithDisplayName("GetOrderInvoice")
.AllowAnonymous()
@ -31,8 +32,8 @@ public class OrderController : ICarterModule
}
private async Task<IResult> ConfirmOrderStepAsync(Guid id, [FromQuery] OrderStatus nextOrderStatus, [FromServices] IMediator mediator, CancellationToken cancellationToken)
=> TypedResults.Ok(await mediator.Send(new ConfirmOrderStepCommand(id, nextOrderStatus), cancellationToken));
private async Task<IResult> ConfirmOrderStepAsync(Guid id, [FromQuery] OrderStatus nextOrderStatus, [FromQuery]string? trackingCode, [FromServices] IMediator mediator, CancellationToken cancellationToken)
=> TypedResults.Ok(await mediator.Send(new ConfirmOrderStepCommand(id, nextOrderStatus,TrackingCode:trackingCode), cancellationToken));
public async Task<IResult> GetAllAsync(IMediator mediator, [FromQuery]long? selectedDate, [FromQuery] OrderStatus? orderStatus, [FromQuery] OrderQueryDateFilter? dateFilter, [FromQuery] int page = 0, CancellationToken cancellationToken = default)
=> TypedResults.Ok(await mediator.Send(new GetOrdersQuery(Page:page, SelectedDate: selectedDate, OrderStatus:orderStatus, DateFilter:dateFilter), cancellationToken));

View File

@ -0,0 +1,16 @@
namespace NetinaShop.Api.Controller;
public class SearchController : ICarterModule
{
public void AddRoutes(IEndpointRouteBuilder app)
{
var group = app.NewVersionedApi("Search").MapGroup("api/search");
group.MapGet("", SearchAsync)
.WithDisplayName("Search Async")
.HasApiVersion(1.0);
}
private async Task<IResult> SearchAsync([FromQuery] string name, [FromServices] ISearchService searchService, CancellationToken cancellationToken)
=> TypedResults.Ok(await searchService.SearchAsync(name, cancellationToken));
}

View File

@ -0,0 +1,6 @@
namespace NetinaShop.Core.CoreServices.Abstracts;
public interface ISearchService : IScopedDependency
{
public Task<SearchResponseDto> SearchAsync(string name,CancellationToken cancellationToken = default);
}

View File

@ -0,0 +1,33 @@
using NetinaShop.Domain.Entities.ProductCategories;
namespace NetinaShop.Core.CoreServices;
public class SearchService : ISearchService
{
private readonly IRepositoryWrapper _repositoryWrapper;
public SearchService(IRepositoryWrapper repositoryWrapper)
{
_repositoryWrapper = repositoryWrapper;
}
public async Task<SearchResponseDto> SearchAsync(string name, CancellationToken cancellationToken = default)
{
var products = await _repositoryWrapper.SetRepository<Product>()
.TableNoTracking
.Where(p => p.PersianName.Trim().ToLower().Contains(name.Trim().ToLower()))
.Select(ProductMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
var categories = await _repositoryWrapper.SetRepository<ProductCategory>()
.TableNoTracking
.Where(p => p.Name.Trim().ToLower().Contains(name.Trim().ToLower()))
.Select(ProductCategoryMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
return new SearchResponseDto
{
Products = products.Select(p => p.Adapt<SearchedProductResponseDto>()).ToList(),
Categories = categories.Select(c => c.Adapt<SearchedProductCategoryResponseDto>()).ToList()
};
}
}

View File

@ -1,6 +1,6 @@
namespace NetinaShop.Core.EntityServices.OrderHandlers;
public class ConfirmOrderStepCommandHandler : IRequestHandler<ConfirmOrderStepCommand,bool>
public class ConfirmOrderStepCommandHandler : IRequestHandler<ConfirmOrderStepCommand, bool>
{
private readonly IRepositoryWrapper _repositoryWrapper;
@ -18,6 +18,22 @@ public class ConfirmOrderStepCommandHandler : IRequestHandler<ConfirmOrderStepCo
order.SetOrderStatus(request.NextOrderStatus);
if (request.NextOrderStatus == OrderStatus.Delivered)
{
var delivery = await _repositoryWrapper.SetRepository<OrderDelivery>()
.TableNoTracking
.FirstOrDefaultAsync(od => od.OrderId == order.Id, cancellationToken);
if (delivery != null)
{
if (request.TrackingCode == null || request.TrackingCode.IsNullOrEmpty())
throw new AppException("لطفا کد پیگیری ارسال را پر کنید");
delivery.SetTrackingCode(request.TrackingCode);
_repositoryWrapper.SetRepository<OrderDelivery>()
.Update(delivery);
await _repositoryWrapper.SaveChangesAsync(cancellationToken);
}
}
_repositoryWrapper.SetRepository<Order>()
.Update(order);
await _repositoryWrapper.SaveChangesAsync(cancellationToken);

View File

@ -3,7 +3,7 @@
public sealed record CreateBaseOrderCommand(Guid UserId) : IRequest<Order>;
public sealed record CalculateOrderCommand(Guid OrderId , bool NamoosiCalculate = false) : IRequest<Order>;
public sealed record ConfirmOrderStepCommand(Guid OrderId , OrderStatus NextOrderStatus) : IRequest<bool>;
public sealed record ConfirmOrderStepCommand(Guid OrderId , OrderStatus NextOrderStatus,string? TrackingCode) : IRequest<bool>;
public sealed record GetOrderInvoiceCommand(Guid OrderId) : IRequest<byte[]>;
public sealed record DeleteOrderCommand(Guid OrderId) : IRequest<bool>;

View File

@ -0,0 +1,20 @@
namespace NetinaShop.Domain.Dtos.ResponseDtos;
public class SearchResponseDto
{
public List<SearchedProductCategoryResponseDto> Categories { get; set; } = new();
public List<SearchedProductResponseDto> Products { get; set; } = new();
}
public class SearchedProductResponseDto
{
public Guid Id { get; set; }
public string PersianName { get; set; } = string.Empty;
public string EnglishName { get; set; } = string.Empty;
public string MainImage { get; set; } = string.Empty;
}
public class SearchedProductCategoryResponseDto
{
public Guid Id { get; set; }
public string Name { get; set; } = string.Empty;
}

View File

@ -9,6 +9,7 @@ public class OrderDeliverySDto : BaseDto<OrderDeliverySDto, OrderDelivery>
public float LocationLong { get; set; }
public string Address { get; set; } = string.Empty;
public string PostalCode { get; set; } = string.Empty;
public string TrackingCode { get; set; } = string.Empty;
public string ReceiverPhoneNumber { get; set; } = string.Empty;
public string ReceiverFullName { get; set; } = string.Empty;
public string ShippingMethod { get; set; } = string.Empty;

View File

@ -183,4 +183,9 @@ public partial class OrderDelivery
{
return new OrderDelivery(addressId, deliveryCost, shippingId, orderId);
}
public void SetTrackingCode(string code)
{
this.TrackingCode = code;
}
}

View File

@ -18,6 +18,7 @@ public partial class OrderDelivery : ApiEntity
public UserAddress? Address { get; set; }
public double DeliveryCost { get; internal set; }
public string TrackingCode { get; internal set; } = string.Empty;
public Guid ShippingId { get; internal set; }
public Shipping? Shipping { get; internal set; }
public Guid OrderId { get; internal set; }

View File

@ -41,6 +41,7 @@ namespace NetinaShop.Domain.Mappers
AddressId = p1.OrderDelivery.AddressId,
Address = p1.OrderDelivery.Address == null ? null : (UserAddress)Convert.ChangeType((object)p1.OrderDelivery.Address, typeof(UserAddress)),
DeliveryCost = p1.OrderDelivery.DeliveryCost,
TrackingCode = p1.OrderDelivery.TrackingCode,
ShippingId = p1.OrderDelivery.ShippingId,
Shipping = new Shipping() {Id = p1.OrderDelivery.ShippingId},
OrderId = p1.OrderDelivery.OrderId,
@ -111,6 +112,7 @@ namespace NetinaShop.Domain.Mappers
AddressId = p18.OrderDelivery.AddressId,
Address = p18.OrderDelivery.Address == null ? null : (UserAddress)Convert.ChangeType((object)p18.OrderDelivery.Address, typeof(UserAddress)),
DeliveryCost = p18.OrderDelivery.DeliveryCost,
TrackingCode = p18.OrderDelivery.TrackingCode,
ShippingId = p18.OrderDelivery.ShippingId,
Shipping = new Shipping() {Id = p18.OrderDelivery.ShippingId},
OrderId = p18.OrderDelivery.OrderId,
@ -196,6 +198,7 @@ namespace NetinaShop.Domain.Mappers
LocationLong = p21.OrderDelivery.Address != null ? p21.OrderDelivery.Address.LocationLong : 0f,
Address = p21.OrderDelivery.Address != null ? p21.OrderDelivery.Address.Address : string.Empty,
PostalCode = p21.OrderDelivery.Address != null ? p21.OrderDelivery.Address.PostalCode : string.Empty,
TrackingCode = p21.OrderDelivery.TrackingCode,
ReceiverPhoneNumber = p21.OrderDelivery.Address != null ? p21.OrderDelivery.Address.ReceiverPhoneNumber : string.Empty,
ReceiverFullName = p21.OrderDelivery.Address != null ? p21.OrderDelivery.Address.ReceiverFullName : string.Empty,
ShippingMethod = p21.OrderDelivery.Shipping != null ? p21.OrderDelivery.Shipping.Name : string.Empty,
@ -306,6 +309,7 @@ namespace NetinaShop.Domain.Mappers
LocationLong = p32.OrderDelivery.Address != null ? p32.OrderDelivery.Address.LocationLong : 0f,
Address = p32.OrderDelivery.Address != null ? p32.OrderDelivery.Address.Address : string.Empty,
PostalCode = p32.OrderDelivery.Address != null ? p32.OrderDelivery.Address.PostalCode : string.Empty,
TrackingCode = p32.OrderDelivery.TrackingCode,
ReceiverPhoneNumber = p32.OrderDelivery.Address != null ? p32.OrderDelivery.Address.ReceiverPhoneNumber : string.Empty,
ReceiverFullName = p32.OrderDelivery.Address != null ? p32.OrderDelivery.Address.ReceiverFullName : string.Empty,
ShippingMethod = p32.OrderDelivery.Shipping != null ? p32.OrderDelivery.Shipping.Name : string.Empty,
@ -571,6 +575,7 @@ namespace NetinaShop.Domain.Mappers
result.AddressId = p8.AddressId;
result.Address = p8.Address == null ? null : (UserAddress)Convert.ChangeType((object)p8.Address, typeof(UserAddress));
result.DeliveryCost = p8.DeliveryCost;
result.TrackingCode = p8.TrackingCode;
result.ShippingId = p8.ShippingId;
result.Shipping = funcMain5(new Never(), result.Shipping, p8);
result.OrderId = p8.OrderId;
@ -824,6 +829,7 @@ namespace NetinaShop.Domain.Mappers
result.LocationLong = p30.Address != null ? p30.Address.LocationLong : 0f;
result.Address = p30.Address != null ? p30.Address.Address : string.Empty;
result.PostalCode = p30.Address != null ? p30.Address.PostalCode : string.Empty;
result.TrackingCode = p30.TrackingCode;
result.ReceiverPhoneNumber = p30.Address != null ? p30.Address.ReceiverPhoneNumber : string.Empty;
result.ReceiverFullName = p30.Address != null ? p30.Address.ReceiverFullName : string.Empty;
result.ShippingMethod = p30.Shipping != null ? p30.Shipping.Name : string.Empty;

View File

@ -12,8 +12,9 @@ public class ExternalFilesService : IExternalFilesService
_restApiWrapper = restApiWrapper;
_siteSetting = snapshot.Value;
}
public Task<AdminChangeLogResponseDto> GetAdminChangeLogAsync(CancellationToken cancellationToken = default)
public async Task<AdminChangeLogResponseDto> GetAdminChangeLogAsync(CancellationToken cancellationToken = default)
{
return _restApiWrapper.FileRestApi(_siteSetting.AdminPanelBaseUrl).GetAdminChangeLog();
var changeLog = await _restApiWrapper.FileRestApi(_siteSetting.AdminPanelBaseUrl).GetAdminChangeLog();
return changeLog;
}
}

View File

@ -0,0 +1,31 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace NetinaShop.Repository.Migrations
{
/// <inheritdoc />
public partial class EditOrderDeliveryAddTrackingCode : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "TrackingCode",
schema: "public",
table: "OrderDeliveries",
type: "text",
nullable: false,
defaultValue: "");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "TrackingCode",
schema: "public",
table: "OrderDeliveries");
}
}
}

View File

@ -18,7 +18,7 @@ namespace NetinaShop.Repository.Migrations
#pragma warning disable 612, 618
modelBuilder
.HasDefaultSchema("public")
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("ProductVersion", "8.0.3")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
@ -591,6 +591,10 @@ namespace NetinaShop.Repository.Migrations
b.Property<Guid>("ShippingId")
.HasColumnType("uuid");
b.Property<string>("TrackingCode")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("AddressId");