using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Mizuki.Dtos; using Mizuki.Services; using Mizuki.Validators; namespace Mizuki.Controllers; /// /// The login controller for Mizuki. /// [ApiController] [Route("/api/user")] public class LoginController( UserService userService, LoginService loginService, LoginDataValidator loginDataValidator) : ControllerBase { /// /// Logs into Mizuki as a given user. /// /// The login data dto. /// Redirect. [HttpPost] [Route("login")] public async Task Login( LoginDataDto dto) { if (!await userService.CheckPasswordForUser(dto.Username, dto.Password)) { return Redirect("/login?error=Invalid username or password."); } var user = await userService.GetUserForUsername(dto.Username); await loginService.LoginAsUser(user); return Redirect("/"); } /// /// Logs out of Mizuki. /// /// Redirect. [Authorize] [Route("logout")] public async Task Logout() { await loginService.Logout(); return Redirect("/"); } /// /// Registers a new user in Mizuki. /// /// The login data dto. /// Redirect. [Route("register")] [HttpPost] public async Task Register( LoginDataDto dto) { if (await userService.UsernameTaken(dto.Username)) return Redirect("/register?error=This user already exists."); var result = await loginDataValidator.ValidateAsync(dto); if (!result.IsValid) { if (result.Errors.Any(e => e.PropertyName == "Username")) return Redirect("/register?error=Invalid username."); if (result.Errors.Any(e => e.PropertyName == "Password")) return Redirect("/register?error=Invalid password."); } await userService.CreateUser( dto.Username, dto.Password); return Redirect("/"); } }