using System.Security.Claims; using API.Dtos; using API.Errors; using API.Extensions; using AutoMapper; 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; private readonly IMapper _mapper; public AccountController(UserManager userManager, SignInManager signInManager, ITokenService tokenService, IMapper mapper) { _mapper = mapper; _tokenService = tokenService; _signInManager = signInManager; _userManager = userManager; } [Authorize] [HttpGet] public async Task> GetCurrentUser() { var user = await _userManager.FindByEmailFromClaimsPrinciple(User); 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 user = await _userManager.FindUserByClaimsPrincipleWithAddressAsync(User); return _mapper.Map(user.Address); } [Authorize] [HttpPut("address")] public async Task> UpdateUserAddress(AddressDto address) { var user = await _userManager.FindUserByClaimsPrincipleWithAddressAsync(User); user.Address = _mapper.Map(address); var result = await _userManager.UpdateAsync(user); if(result.Succeeded) return Ok(_mapper.Map(user.Address)); return BadRequest("Problem updating user!"); } [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) { if(CheckEmailExistsAsync(registerDto.Email).Result.Value) { return new BadRequestObjectResult(new ApiValidationErrorResponse{Errors = new []{"Email address is in use"}}); } 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 }; } } }