using Microsoft.AspNetCore.Mvc; using KernelRecordsMVC.Data; using KernelRecordsMVC.Models; using KernelRecordsMVC.Application.ViewModels; using Microsoft.AspNetCore.Http; namespace KernelRecordsMVC.Controllers; public class AccountController : Controller { private readonly KernelRecordsContext _context; public AccountController(KernelRecordsContext context) { _context = context; } // ============================== // REGISTER - GET // ============================== [HttpGet] public IActionResult Register() { return View(); } // ============================== // REGISTER - POST // ============================== [HttpPost] [ValidateAntiForgeryToken] public IActionResult Register(RegisterViewModel model) { if (!ModelState.IsValid) return View(model); if (_context.Users.Any(x => x.Username == model.Username)) { ModelState.AddModelError( "Username", "Username is already taken."); return View(model); } if (_context.Users.Any(x => x.Email == model.Email)) { ModelState.AddModelError( "Email", "Email is already registered."); return View(model); } var user = new User { Email = model.Email, Username = model.Username, // We'll replace this with proper password hashing // in the security cleanup section. Password = model.Password, DateCreated = DateTime.Today, ShippingAddress = model.ShippingAddress, TelephoneNumber = model.TelephoneNumber }; _context.Users.Add(user); _context.SaveChanges(); // Every normal registered user is a Consumer. var consumer = new Consumer { UserId = user.UserId, PointsCollected = 0 }; _context.Consumers.Add(consumer); _context.SaveChanges(); return RedirectToAction(nameof(Login)); } // ============================== // LOGIN - GET // ============================== [HttpGet] public IActionResult Login() { return View(); } // ============================== // LOGIN - POST // ============================== [HttpPost] [ValidateAntiForgeryToken] public IActionResult Login(LoginViewModel model) { if (!ModelState.IsValid) return View(model); var user = _context.Users .FirstOrDefault(x => x.Username == model.Username && x.Password == model.Password); if (user == null) { ModelState.AddModelError( "", "Invalid username or password."); return View(model); } HttpContext.Session.SetInt32( "UserId", checked((int)user.UserId)); HttpContext.Session.SetString( "Username", user.Username); // Determine account type from the actual // ADMINS / CONSUMERS tables. var admin = _context.Admins .FirstOrDefault(x => x.UserId == user.UserId); if (admin != null) { HttpContext.Session.SetString( "Role", "Admin"); HttpContext.Session.SetString( "AdminType", admin.Type.ToString()); } else { HttpContext.Session.SetString( "Role", "Consumer"); } return RedirectToAction( "Index", "Home"); } // ============================== // LOGOUT // ============================== public IActionResult Logout() { HttpContext.Session.Clear(); return RedirectToAction( "Index", "Home"); } }