using System.Security.Claims; using API.Dtos; using API.Errors; using Core.Entities.Identity; using Core.Interfaces; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; namespace API.Controllers { public class AccountController : BaseApiController { private readonly UserManager _userManager; private readonly SignInManager _signInManager; private readonly ITokenService _tokenService; public AccountController(UserManager userManager, SignInManager signInManager, ITokenService tokenService) { _tokenService = tokenService; _signInManager = signInManager; _userManager = userManager; } [Authorize] [HttpGet] public async Task> GetCurrentUser() { var email = User.FindFirstValue(ClaimTypes.Email); var user = await _userManager.FindByEmailAsync(email); return new UserDto { Email = user.Email, Token = _tokenService.CreateToken(user), DisplayName = user.DisplayName }; } [HttpGet("emailexists")] public async Task> CheckEmailExistsAsync([FromQuery] string email){ return await _userManager.FindByEmailAsync(email) != null; } [Authorize] [HttpGet("address")] public async Task> GetUserAddress() { var email = User.FindFirstValue(ClaimTypes.Email); var user = await _userManager.FindByEmailAsync(email); return user.Address; } [HttpPost("login")] public async Task> Login(LoginDto loginDto) { var user = await _userManager.FindByEmailAsync(loginDto.Email); if (user == null) return Unauthorized(new ApiResponse(401)); var results = await _signInManager.CheckPasswordSignInAsync(user, loginDto.Password, false); if(!results.Succeeded) return Unauthorized(new ApiResponse(401)); return new UserDto { Email = user.Email, Token = _tokenService.CreateToken(user), DisplayName = user.DisplayName }; } [HttpPost("register")] public async Task> Register(RegisterDto registerDto) { var user = new AppUser { DisplayName = registerDto.DisplayName, Email = registerDto.Email, UserName = registerDto.Email }; var results = await _userManager.CreateAsync(user, registerDto.Password); if(!results.Succeeded) return BadRequest(new ApiResponse(400)); return new UserDto { DisplayName = user.DisplayName, Token = _tokenService.CreateToken(user), Email = user.Email }; } } }