using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using LittleShop.Services; using LittleShop.DTOs; namespace LittleShop.Areas.Admin.Controllers; [Area("Admin")] [Authorize(Policy = "AdminOnly")] public class ShippingRatesController : Controller { private readonly IShippingRateService _shippingRateService; private readonly ILogger _logger; public ShippingRatesController(IShippingRateService shippingRateService, ILogger logger) { _shippingRateService = shippingRateService; _logger = logger; } public async Task Index() { var rates = await _shippingRateService.GetAllShippingRatesAsync(); return View(rates); } public IActionResult Create() { return View(new CreateShippingRateDto()); } [HttpPost] [ValidateAntiForgeryToken] public async Task Create(CreateShippingRateDto model) { if (!ModelState.IsValid) { return View(model); } var rate = await _shippingRateService.CreateShippingRateAsync(model); _logger.LogInformation("Created shipping rate {RateId}", rate.Id); return RedirectToAction(nameof(Index)); } public async Task Edit(Guid id) { var rate = await _shippingRateService.GetShippingRateByIdAsync(id); if (rate == null) { return NotFound(); } var model = new UpdateShippingRateDto { Name = rate.Name, Description = rate.Description, Country = rate.Country, MinWeight = rate.MinWeight, MaxWeight = rate.MaxWeight, Price = rate.Price, MinDeliveryDays = rate.MinDeliveryDays, MaxDeliveryDays = rate.MaxDeliveryDays, IsActive = rate.IsActive }; ViewData["RateId"] = id; return View(model); } [HttpPost] [ValidateAntiForgeryToken] public async Task Edit(Guid id, UpdateShippingRateDto model) { if (!ModelState.IsValid) { ViewData["RateId"] = id; return View(model); } var success = await _shippingRateService.UpdateShippingRateAsync(id, model); if (!success) { return NotFound(); } _logger.LogInformation("Updated shipping rate {RateId}", id); return RedirectToAction(nameof(Index)); } [HttpPost] [ValidateAntiForgeryToken] public async Task Delete(Guid id) { var success = await _shippingRateService.DeleteShippingRateAsync(id); if (!success) { return NotFound(); } _logger.LogInformation("Deleted shipping rate {RateId}", id); return RedirectToAction(nameof(Index)); } }