/*
* 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) });
}
}
}