/* * 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 System; using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.SwaggerGen; using Newtonsoft.Json; using System.ComponentModel.DataAnnotations; using IO.Swagger.Attributes; using IO.Swagger.Security; using Microsoft.AspNetCore.Authorization; using IO.Swagger.Models.dto; using IO.Swagger.Repositories; using System.Threading.Tasks; using System.Linq; using IO.Swagger.Services; using System.Security.Claims; using AutoMapper; using Newtonsoft.Json.Linq; 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)] [ProducesResponseType(401)] public virtual async Task GetUserDetails() { var userIdString = HttpContext.User.Claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value; if (!int.TryParse(userIdString, out int userId)) return Unauthorized(); var 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)] [ProducesResponseType(401)] public virtual async Task LoginUser([FromBody]AuthLoginBody body) { if (!ModelState.IsValid) return BadRequest(ModelState.Values.SelectMany(v => v.Errors.Select(e => e.ErrorMessage))); var 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)] [ProducesResponseType(409)] public async Task RegisterUser([FromBody]AuthRegisterBody body) { if (!ModelState.IsValid) return BadRequest(ModelState.Values.SelectMany(v => v.Errors.Select(e => e.ErrorMessage))); var user = await repository.RegisterUser(body); return user == null ? StatusCode(409) : Ok(new TokenDto{ Token = jwt.GenerateJwt(user.Id) }); } } }