138 lines
4.3 KiB
C#
138 lines
4.3 KiB
C#
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using WebVentaCoche.DataBase;
|
|
using WebVentaCoche.Models;
|
|
|
|
namespace WebVentaCoche.Controllers
|
|
{
|
|
public class ProductsController : Controller
|
|
{
|
|
private readonly ApplicationDbContext _context;
|
|
|
|
public ProductsController(ApplicationDbContext context)
|
|
{
|
|
_context = context;
|
|
}
|
|
|
|
// Lista de productos paginada
|
|
public async Task<IActionResult> Index(int page = 1, int pageSize = 10)
|
|
{
|
|
var products = await _context.Products
|
|
.Skip((page - 1) * pageSize)
|
|
.Take(pageSize)
|
|
.ToListAsync();
|
|
|
|
ViewBag.TotalPages = (int)Math.Ceiling((double)_context.Products.Count() / pageSize);
|
|
ViewBag.CurrentPage = page;
|
|
|
|
return View(products);
|
|
}
|
|
|
|
// Ver detalles de un producto
|
|
public async Task<IActionResult> Details(int id)
|
|
{
|
|
var product = await _context.Products.FindAsync(id);
|
|
if (product == null)
|
|
{
|
|
return NotFound();
|
|
}
|
|
return View(product);
|
|
}
|
|
|
|
// Página para añadir producto
|
|
[HttpGet]
|
|
public IActionResult Create()
|
|
{
|
|
return View();
|
|
}
|
|
|
|
// Procesar el POST para añadir producto
|
|
[HttpPost]
|
|
public async Task<IActionResult> Create(Product product, IFormFile Image)
|
|
{
|
|
if (ModelState.IsValid)
|
|
{
|
|
if (Image != null && Image.Length > 0)
|
|
{
|
|
// Crear la carpeta si no existe
|
|
var imagesPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/images");
|
|
if (!Directory.Exists(imagesPath))
|
|
{
|
|
Directory.CreateDirectory(imagesPath);
|
|
}
|
|
|
|
// Generar un nombre único para la imagen
|
|
var uniqueFileName = Guid.NewGuid().ToString() + Path.GetExtension(Image.FileName);
|
|
|
|
// Guardar la imagen en la carpeta wwwroot/images
|
|
var filePath = Path.Combine(imagesPath, uniqueFileName);
|
|
using (var stream = new FileStream(filePath, FileMode.Create))
|
|
{
|
|
await Image.CopyToAsync(stream);
|
|
}
|
|
|
|
// Guardar la ruta relativa en la base de datos
|
|
product.ImagePath = $"/images/{uniqueFileName}";
|
|
}
|
|
|
|
_context.Add(product);
|
|
await _context.SaveChangesAsync();
|
|
return RedirectToAction(nameof(Index));
|
|
}
|
|
|
|
return View(product);
|
|
}
|
|
|
|
[HttpGet]
|
|
public async Task<IActionResult> Edit(int id)
|
|
{
|
|
var product = await _context.Products.FindAsync(id);
|
|
if (product == null)
|
|
{
|
|
return NotFound();
|
|
}
|
|
return View(product);
|
|
}
|
|
|
|
[HttpPut]
|
|
public async Task<IActionResult> Edit(int id, [FromBody] Product updatedProduct)
|
|
{
|
|
if (id != updatedProduct.Id)
|
|
{
|
|
return BadRequest("El ID del producto no coincide.");
|
|
}
|
|
|
|
var product = await _context.Products.FindAsync(id);
|
|
if (product == null)
|
|
{
|
|
return NotFound();
|
|
}
|
|
|
|
product.Name = updatedProduct.Name;
|
|
product.ShortDescription = updatedProduct.ShortDescription;
|
|
product.LongDescription = updatedProduct.LongDescription;
|
|
product.Price = updatedProduct.Price;
|
|
|
|
_context.Products.Update(product);
|
|
await _context.SaveChangesAsync();
|
|
|
|
return Ok(new { message = "Producto actualizado correctamente" });
|
|
}
|
|
|
|
[HttpDelete]
|
|
public async Task<IActionResult> Delete(int id)
|
|
{
|
|
var product = await _context.Products.FindAsync(id);
|
|
if (product == null)
|
|
{
|
|
return NotFound();
|
|
}
|
|
|
|
_context.Products.Remove(product);
|
|
await _context.SaveChangesAsync();
|
|
|
|
return Ok(new { message = "Producto eliminado correctamente" });
|
|
}
|
|
}
|
|
}
|