هنحتاج نظبط شوية حاجات عشان لما الـ Order يرجع للUser يبقا تمام دا قبل ما أعمل أي حاجة
Status
الـ Status بترجع رقم مثلًا 0 وانا عايزة يرجع كلمة زي الـ Pending
Shipping Address
فيه حاجات Nested، فهل أنا محتاج أعمله Flatting؟ لأ لأن مش هيبقا ليها معنى فمش هعمله حاجة
Delivery Method
مش محتاج أرجعله كل التفاصيل بتاعته وانه ميبقاش Nested انما الـ Front-end محتاج معلومتين بس اسم الـ Delivery Method والـ Cost
Items
بيجيلي Array of Items أو شوية Objects وكل واحد فيه سعر وكمية والـ id وكمان فيه Object اسمه Product اللي بيبقا فيه معلومات عن الـ Product
فدا مش شكل كويس بالنسبالي فأنا محتاج أعمل Flatting للـ Product اللي جوا كل Item
Total
محتاجين نرجع الـ Total اللي هو عبارة عن الـ Subtotal + Delivery Method Cost
Implement DTO
In DTOs Folder:
public class OrderToReturnDto()
{
public int Id { get; set; }
public string BuyerEmail { get; set; }
public DateTimeOffset OrderDate { get; set; }
// Remove Default value
// Status
public string Status { get; set; }
public Address ShippingAddress { get; set; }
// Delivery Method
public string DeliveryMethod { get; set; }
public decimal DeliveryMethodCost { get; set; }
// Items
// We will Make OrderItemDto
public ICollection<OrderItemDto> Items { get; set; } = new HashSet<OrderItemDto>();
public decimal Subtotal { get; set; }
// Total
public decimal Total { get; set; }
// It will read from GetTotal without any configuration
public string PaymentIntentId { get; set; } = string.Empty;
}
// OrderItemDto
public class OrderItemDto
{
public int Id { get; set; }
public int ProductId { get; set; }
public string ProductName { get; set; }
public string PictureUrl { get; set; }
public decimal Price { get; set; }
public int Qunatity { get; set; }
}
// We need to make configrations for this
Mapping Configurations In Mapping Profiles:
CreateMap<Order, OrderToReturnDto>()
.ForMember(d => d.DeliveryMethod, O => O.MapFrom(s => s.DeliveryMethod.ShortName))
.ForMember(d => d.DeliveryMethodCost, O => O.MapFrom(s => s.DeliveryMethod.Cost));
CreateMap<OrderItem, OrderItemDto>()
.ForMember(d => d.ProductName, O => O.MapFrom(s => s.Product.ProductName))
.ForMember(d => d.ProductId, O => O.MapFrom(s => s.Product.ProductId))
.ForMember(d => d.PictureUrl, O => O.MapFrom(s => s.Product.PictureUrl));
At controller, Make it return OrderToReturnDto
public async Task<ActionResult<OrderToReturnDto>> CreateOrder(OrderDto orderDto)
{
// Function
return Ok(_mapper.Map<Order, OrderToReturnDto>(order));
}
// Also for GetOrdersForUser
return Ok(_mapper.Map<IReadOnlyList<Order>, IReadOnlyList<OrderToReturnDto>>(orders));
// GetOrderForUser
return Ok(_mapper.Map<OrderToReturnDto>(order));
// We can use this version or which take two classes
Picture Url in product
We can’t use old resolver because we map from order item to order item DTO
هنعمل Class جديد في الـ Helpers نسميه OrderItemPictureUrlResolver
public class OrderItemPictureUrlResolver : IValueResolver<OrderItem, OrederItemDto, string>
{
private readonly IConfiguration _configuration;
public ProductPictureUrlResolver(IConfiguration configuration)
{
_configuration = configuration;
}
public string Resolve(OrderItem source, OrderItemDto destination, string destMember, ResolutionContext context)
{
if (!string.IsNullOrEmpty(source.Product.PictureUrl))
{
return $"{_configuration["ApiBaseUrl"]}/{source.Product.PictureUrl}";
}
return string.Empty;
}
}
// At MappingProfile
.ForMember(d => d.PictureUrl, O => O.MapFrom<OrderItemPictureUrlResolver>());