هنحتاج نظبط شوية حاجات عشان لما الـ 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>());