using ECommerce.Model.Entities; using ECommerce.Model.Repositories; using ECommerce.Presenter.Presenters; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using System.Text; namespace Ecommerce_web_project.Controllers.Admin; [Area("Admin")] [Authorize(Roles = "Admin")] public class OrdersController : Controller { private readonly AdminOrderPresenter _presenter; private readonly IEmailSender _emailSender; private readonly UserManager _userManager; private readonly ICustomerRepository _customerRepo; public OrdersController(AdminOrderPresenter presenter, IEmailSender emailSender, UserManager userManager, ICustomerRepository customerRepo) { _presenter = presenter; _emailSender = emailSender; _userManager = userManager; _customerRepo = customerRepo; } public async Task Index() { var orders = await _presenter.GetAllOrdersAsync(); return View(orders); } public async Task Details(Guid id) { var order = await _presenter.GetOrderByIdAsync(id); if (order is null) return NotFound(); return View(order); } [HttpPost] public async Task UpdateStatus(Guid id, string status) { await _presenter.UpdateOrderStatusAsync(id, status); if (string.Equals(status, "Shipped", StringComparison.OrdinalIgnoreCase)) { try { var orderEntity = await _presenter.GetOrderEntityAsync(id); if (orderEntity != null) { var customer = await _customerRepo.GetByIdAsync(orderEntity.CustomerId); if (customer != null) { var user = await _userManager.FindByIdAsync(customer.UserId); if (user?.Email != null) { var itemsHtml = new StringBuilder(); foreach (var item in orderEntity.Items) { var name = item.Product?.Name ?? "Unknown"; var subtotal = item.Quantity * item.UnitPrice; itemsHtml.Append($"{name}{item.Quantity}${subtotal:F2}"); } var body = $"""

🚚 Your Order is on its Way!

Hi {customer.FirstName},

Your order #{orderEntity.OrderNumber} has been shipped and is on its way!

{itemsHtml}
ItemQtyTotal

Total: ${orderEntity.TotalAmount:F2}

Thank you for shopping with DanStore!

— DanStore Team

"""; await _emailSender.SendEmailAsync(user.Email, $"Your Order #{orderEntity.OrderNumber} Has Been Shipped!", body); TempData["Success"] = $"Shipped email sent to {user.Email}"; } } } } catch { } } return RedirectToAction(nameof(Details), new { id }); } }