نروح في الـ Controller بتاعنا وهنعمل Endpoint جديدة بترجع كل الـ Orders لـ User معين
[HttpGet] // GET : /api/Orders?email=mahmoudfeshar11@gmail.com
public async Task<ActionResult<IReadOnlyList<Order>>> GetOrdersForUser(string email)
{
var orders = await _orderService.GetOrdersForUserAsync(email);
return Ok(orders);
}
ونروح نعمل implementation للـ Method اللي اسمها GetOrdersForUserAsync
جوا Class الـ OrderService
public Task<IReadOnlyList<Order>> GetOrdersForUserAsync(string buyerEmail)
{
var ordersRepo = _unitOfWork.Repository<Order>();
// var spec = new OrderSpecifications();
var orders = await ordersRepo.GetAllWithSpecAsync(spec);
}
محتاج دلوقتي أعمل الـ Specifications للـ Order اللي هتورث من الـ Base
هنروح على بروجكت الـ Core وفيه فولدر الـ Specifications فهنعمل فولدر Order Specs ونعمل كلاس جديد نسميه OrderSpecifications
محتاجين نظبط الـ Criteria انه يبقا زي الايميل اللي هياخده
وبعدها محتاجين نظبط الـ Includes للـ Navigational Properties فهنلاقي الـ Delivery Method بس وافتكر ان الـ Address مش Navigational Property
وكمان نرتبها دايما من الجديد للقديم
public class OrderSpecifications : BaseSpecifications<Order>
{
public OrderSpecifications(string buyerEmail)
:base(O => O.BuyerEmail == buyerEmail)
{
Includes.Add(O => O.DeliveryMethod);
Includes.Add(O => O.Items); // Eager Loading
AddOrderByDesc(O => O.OrderDate);
// ApplyPagination
}
}
أنا محتاج أبعت الـ Buyer Email للـ Spec عشان يشوف هو بيساوي الـ Email ولا لا
public Task<IReadOnlyList<Order>> GetOrdersForUserAsync(string buyerEmail)
{
var ordersRepo = _unitOfWork.Repository<Order>();
var spec = new OrderSpecifications(buyerEmail);
var orders = await ordersRepo.GetAllWithSpecAsync(spec);
return orders;
}