using CartWise.Infrastructure.Identity; using CartWise.Web.ViewModels.Account; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; namespace CartWise.Web.Controllers; public class AccountController : Controller { private readonly UserManager _userManager; private readonly SignInManager _signInManager; public AccountController(UserManager userManager, SignInManager signInManager) { _userManager = userManager; _signInManager = signInManager; } [HttpGet] public IActionResult Register(string? returnUrl = null) { return View(new RegisterViewModel { ReturnUrl = returnUrl }); } [HttpPost] [ValidateAntiForgeryToken] public async Task Register(RegisterViewModel model) { if (!ModelState.IsValid) { return View(model); } var user = new ApplicationUser { UserName = model.Email, Email = model.Email, DisplayName = model.DisplayName, CreatedUtc = DateTime.UtcNow }; var result = await _userManager.CreateAsync(user, model.Password); if (!result.Succeeded) { foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } return View(model); } await _signInManager.SignInAsync(user, isPersistent: false); return RedirectToLocal(model.ReturnUrl); } [HttpGet] public IActionResult Login(string? returnUrl = null) { return View(new LoginViewModel { ReturnUrl = returnUrl }); } [HttpPost] [ValidateAntiForgeryToken] public async Task Login(LoginViewModel model) { if (!ModelState.IsValid) { return View(model); } var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); if (!result.Succeeded) { ModelState.AddModelError(string.Empty, "Invalid login attempt."); return View(model); } return RedirectToLocal(model.ReturnUrl); } [HttpPost] [ValidateAntiForgeryToken] public async Task Logout() { await _signInManager.SignOutAsync(); return RedirectToAction("Index", "Home"); } private IActionResult RedirectToLocal(string? returnUrl) { if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } return RedirectToAction("Index", "Home"); } }