/* * T&J Central Bank API * * API documentation for T&J Central Bank's digital wallets * * OpenAPI spec version: 1.0.0 * * Generated by: https://github.com/swagger-api/swagger-codegen.git */ using AutoMapper; using IO.Swagger.Attributes; using IO.Swagger.Models.RequestDto; using IO.Swagger.Models.ResponseDto; using IO.Swagger.Repositories; using IO.Swagger.Security; using IO.Swagger.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Swashbuckle.AspNetCore.Annotations; using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; namespace IO.Swagger.Controllers { /// /// /// [ApiController] public class AuthApiController : ControllerBase { private readonly IUserRepository repository; private readonly JwtService jwt; private readonly IMapper mapper; /// /// The controller for the authotization endpoints /// /// /// /// /// public AuthApiController(IUserRepository repository, JwtService jwt, IMapper mapper) { this.repository = repository ?? throw new ArgumentNullException(nameof(repository)); this.jwt = jwt ?? throw new ArgumentNullException(nameof(jwt)); this.mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); } /// /// Get user details /// /// Successful response /// Unauthorized [HttpGet] [Route("/v1/api/auth/details")] [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetUserDetails")] [ProducesResponseType(typeof(UserDto), 200)] public virtual async Task GetUserDetails() { string userIdString = HttpContext.User.Claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value; if (!int.TryParse(userIdString, out int userId)) return Unauthorized(); Models.db.User user = await repository.RetrieveUser(userId); return Ok(mapper.Map(user)); } /// /// Log in with email and password /// /// /// Logged in successfully /// Bad Request /// Unauthorized [HttpPost] [Route("/v1/api/auth/login")] [ValidateModelState] [SwaggerOperation("LoginUser")] [ProducesResponseType(typeof(TokenDto), 200)] [ProducesResponseType(typeof(IEnumerable), 400)] public virtual async Task LoginUser([FromBody] AuthLoginBody body) { if (!ModelState.IsValid) return BadRequest(ModelState.Values.SelectMany(v => v.Errors.Select(e => e.ErrorMessage))); Models.db.User user = await repository.LoginUser(body); return user == null ? Unauthorized() : Ok(new TokenDto { Token = jwt.GenerateJwt(user.Id) }); } /// /// Register a new user /// /// /// User registered successfully /// Bad Request /// Conflict (user with provided email already exists) [HttpPost] [Route("/v1/api/auth/register")] [ValidateModelState] [SwaggerOperation("RegisterUser")] [ProducesResponseType(typeof(TokenDto), 200)] [ProducesResponseType(typeof(IEnumerable), 400)] public async Task RegisterUser([FromBody] AuthRegisterBody body) { if (!ModelState.IsValid) return BadRequest(ModelState.Values.SelectMany(v => v.Errors.Select(e => e.ErrorMessage))); Models.db.User user = await repository.RegisterUser(body); return user == null ? StatusCode(409) : Ok(new TokenDto { Token = jwt.GenerateJwt(user.Id) }); } } }