هنعمل الـ Endpoint اللي من خلالها هنقدر نعمل Order

نروح للـ Controllers ونعمل Api Controller ونسميه OrdersController وطبعا متنساش انه هيورث من الـ BaseApiController

public OrdersController : BaseApiController
{
	private readonly IOrderService _orderService;
	public OrdersController(IOrderService orderService)
	{
		_orderService = orderService;
	}
}

محتاجين نعمل Allow للـ DI لـ OrderService نروح في الـ AddApplicationServices

services.AddScoped(typeof(IOrderService), typeof(OrderService));

ومتنساش تضيف ريفرينس للـ Services

Endpoint

Create Order

المفروض ياخد أربعة بارمترز buyer email, shipping address, delivery method id, basket id بس احنا اتفقنا اننا مش هنبعتهم كدا لأنهم أكتر من 3 فاحنا هنعملهم Encapsulation جوا Type ونستخدمه جواه

[HttpPost] // POST: /api/Orders
public async Task<ActionResult<Order>> CreateOrder(OrderDto orderDto)
{
	await _orderService.CreateOrderAsync();
}
 
// OrderDto : At folder DTOs
public class OrderDto
{
	[Required]
	public string BuyerEmail {get; set;}
	[Required]
	public string BasketId {get; set;}
	[Required]
	public int DeliveryMethodId {get; set;}
	public Address ShippingAddress {get; set;}
}

المفروض برضو الحاجات اللي جوا الـ Address تبقا Required بس مينفعش اعدل في الـ Address نفسه لاننا بنسميه Owned Entity عن طريق الـ Order Entity

public class AddressDto
{
	[Required]
	public string FirstName {get; set;}
	[Required]
	public string LastName {get; set;}
	[Required]
	public string Street {get; set;}
	[Required]
	public string City {get; set;}
	[Required]
	public string Country {get; set;}
}

هيظهرلي مشكلة كمان وانا بمرر الداتا لـ CreateOrderAsync انه محتاج الـ Shipping address يكون من النوع Address وانا عملته من النوع AddressDto فأنا لازم اعمل Mapping

[Authorize]
public OrdersController : BaseApiController
{
	private readonly IOrderService _orderService;
	private readonly IMapper _mapper;
	
	public OrdersController(IOrderService orderService, IMapper mapper)
	{
		_orderService = orderService;
		_mapper = mapper;
	}
 
	[ProducesResponseType(typeof(Order), StatusCodes.Status200OK)]
	[ProducesResponseType(typeof(ApiResponse), StatusCodes.Status400BadRequest)]
	[HttpPost] // POST: /api/Orders
	public async Task<ActionResult<Order>> CreateOrder(OrderDto orderDto)
	{
		var address = _mapper.Map<AddressDto, Address>(orderDto.ShippingAddress);
		var order = await _orderService.CreateOrderAsync(orderDto.BuyerEmail, orderDto.BasketId, orderDto.DeliveryMethodId, address);
		if(order is null)
			return BadRequest(new ApiResponse(400));
		return Ok(order);
	}
}
 
// At Mapping profile
Createmap<AddressDto, Address>();

فيه حاجة كمان اني مش هدي من الـ Front الـ Email بتاع الشخص اللي بيشتري انما هجيبه من الـ Security module لاني هقول أي حد بيكلم أي Endpoint جوا الـ Controller انه يكون Authorize وانه يكون معاه Token فانا لازم افك الـ Token واخد منه الـ Email بتاع الـ User بتاع الشخص اللي بيشتري بس انا لسا مجهزتش الكلام دا فانا هخليه هو اللي بيبعتلي الايميل


محتاج أعمل Improvement for swagger documentation


فيه مشكلة ان الـ Delivery Method بيتحط فيها الـ Default value وبسبب انها Int بيحط صفر فيعتبر ان الـ Required ملهاش لازمه، حلها بمعرفتك