using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using noteApi.Dtos.Account; using noteApi.Interfaces; using noteApi.Models; namespace noteApi.Controllers { [Route("api/account")] [ApiController] public class AccountController : ControllerBase { private readonly UserManager _userManager; private readonly ITokenService _tokenService; private readonly SignInManager _signInManager; public AccountController(UserManager userManager, ITokenService tokenService, SignInManager signInManager) { _userManager = userManager; _tokenService = tokenService; _signInManager = signInManager; } [HttpPost("register")] public async Task Register([FromBody] RegisterDto registerDto) { try { if(!ModelState.IsValid) return BadRequest(ModelState); var appUser = new AppUser { UserName = registerDto.Username, Email = registerDto.Email }; var createUser = await _userManager.CreateAsync(appUser, registerDto.Password); if (createUser.Succeeded) { var roleResult = await _userManager.AddToRoleAsync(appUser, "User"); if (roleResult.Succeeded) { return Ok(new NewUserDto{ UserName = appUser.UserName, Email = appUser.Email, Token = _tokenService.CreateToken(appUser) }); } else { return StatusCode(500, roleResult.Errors); } } else { return StatusCode(500, createUser.Errors); } } catch (Exception ex) { return StatusCode(500, ex); } } [HttpPost("login")] public async Task Login(LoginDto loginDto) { if (!ModelState.IsValid) { return BadRequest(ModelState); } var user = await _userManager.Users.FirstOrDefaultAsync(x => x.UserName == loginDto.Username.ToLower()); if(user == null) { return Unauthorized("Invalid username!"); } var result = await _signInManager.CheckPasswordSignInAsync(user, loginDto.Password, false); if (!result.Succeeded) return Unauthorized("Username not found and/or Password incorrect!"); return Ok( new NewUserDto { UserName = user.UserName, Email = user.Email, Token = _tokenService.CreateToken(user) } ); } } }