هنعمل الـ 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 ملهاش لازمه، حلها بمعرفتك