parent
0ae475613c
commit
d13cae449b
@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace Dto.Auth;
|
||||||
|
|
||||||
|
public class LoginRequestDto
|
||||||
|
{
|
||||||
|
[Required(ErrorMessage = "Username is required")]
|
||||||
|
public string Username { get; set; }
|
||||||
|
[Required(ErrorMessage = "Password is required")]
|
||||||
|
public string Password { get; set; }
|
||||||
|
}
|
@ -0,0 +1,152 @@
|
|||||||
|
using System.Globalization;
|
||||||
|
using Dto.Auth;
|
||||||
|
using Dto.Tiny;
|
||||||
|
using Entities;
|
||||||
|
using HeartTrackAPI.Request;
|
||||||
|
using HeartTrackAPI.Services;
|
||||||
|
using Microsoft.AspNetCore.Identity;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace HeartTrackAPI.Controllers;
|
||||||
|
[ApiController]
|
||||||
|
public class AuthController : Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
private readonly UserManager<AthleteEntity> _userManager;
|
||||||
|
private readonly ITokenService _tokenService;
|
||||||
|
private readonly SignInManager<AthleteEntity> _signinManager;
|
||||||
|
|
||||||
|
public AuthController(UserManager<AthleteEntity> userManager,ITokenService tokenService, SignInManager<AthleteEntity> signinManager)
|
||||||
|
{
|
||||||
|
_userManager = userManager;
|
||||||
|
_tokenService = tokenService;
|
||||||
|
_signinManager = signinManager;
|
||||||
|
}
|
||||||
|
[HttpPost("login")]
|
||||||
|
public async Task<IActionResult> Login(LoginRequestDto loginDto)
|
||||||
|
{
|
||||||
|
if (!ModelState.IsValid)
|
||||||
|
return BadRequest(ModelState);
|
||||||
|
|
||||||
|
var user = await _userManager.Users.FirstOrDefaultAsync(x => x.UserName == loginDto.Username.ToLower());
|
||||||
|
|
||||||
|
if (user == null) return Unauthorized("Invalid username!");
|
||||||
|
|
||||||
|
var result = await _signinManager.CheckPasswordSignInAsync(user, loginDto.Password, false);
|
||||||
|
|
||||||
|
if (!result.Succeeded) return Unauthorized("Username not found and/or password incorrect");
|
||||||
|
|
||||||
|
return Ok(new AuthResponseDto
|
||||||
|
{
|
||||||
|
AccessToken = _tokenService.CreateToken(user),
|
||||||
|
ExpiresIn = DateTime.Now.AddDays(7).ToString(CultureInfo.InvariantCulture),
|
||||||
|
TokenType = "Bearer"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost("register")]
|
||||||
|
public async Task<IActionResult> Register([FromBody] RegisterRequestDto request)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!ModelState.IsValid)
|
||||||
|
return BadRequest(ModelState);
|
||||||
|
// just for testing
|
||||||
|
// the good way is to use the repository and give him the userManager
|
||||||
|
var user = new AthleteEntity
|
||||||
|
{
|
||||||
|
Email = request.Email,
|
||||||
|
UserName = request.Username,
|
||||||
|
LastName = request.LastName,
|
||||||
|
FirstName = request.FirstName,
|
||||||
|
Sexe = request.Sexe,
|
||||||
|
Length = request.Size,
|
||||||
|
Weight = request.Weight,
|
||||||
|
DateOfBirth = DateOnly.FromDateTime(request.DateOfBirth),
|
||||||
|
IsCoach = request.IsCoach
|
||||||
|
};
|
||||||
|
var createdUser = _userManager.CreateAsync(user, request.Password).Result;
|
||||||
|
if (createdUser.Succeeded)
|
||||||
|
{
|
||||||
|
var roleResult = await _userManager.AddToRoleAsync(user, request.IsCoach ? "Coach" : "Athlete");
|
||||||
|
if (roleResult.Succeeded)
|
||||||
|
{
|
||||||
|
return Ok(
|
||||||
|
new AuthResponseDto
|
||||||
|
{
|
||||||
|
AccessToken = _tokenService.CreateToken(user),
|
||||||
|
ExpiresIn = DateTime.Now.AddDays(7).ToString(),
|
||||||
|
TokenType = "Bearer"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
return StatusCode(500, roleResult.Errors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
return StatusCode(500, createdUser.Errors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
return StatusCode(500, e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* var user = _userRepository.GetByEmail(request.Email);
|
||||||
|
if (user != null)
|
||||||
|
{
|
||||||
|
return BadRequest("User already exists");
|
||||||
|
}
|
||||||
|
var newUser = new User
|
||||||
|
{
|
||||||
|
Email = request.Email,
|
||||||
|
PasswordHash = BCrypt.Net.BCrypt.HashPassword(request.PasswordHash),
|
||||||
|
FirstName = request.FirstName,
|
||||||
|
LastName = request.LastName
|
||||||
|
};
|
||||||
|
_userRepository.Add(newUser);
|
||||||
|
return Ok();*/
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
[HttpPost("refresh")]
|
||||||
|
public IActionResult Refresh([FromBody] RefreshRequest request)
|
||||||
|
{
|
||||||
|
var user = _userRepository.GetByEmail(request.Email);
|
||||||
|
if (user == null)
|
||||||
|
{
|
||||||
|
return Unauthorized();
|
||||||
|
}
|
||||||
|
if (!BCrypt.Net.BCrypt.Verify(request.PasswordHash, user.PasswordHash))
|
||||||
|
{
|
||||||
|
return Unauthorized();
|
||||||
|
}
|
||||||
|
var token = _jwtService.GenerateToken(user);
|
||||||
|
return Ok(new { token });
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
[HttpPost("logout")]
|
||||||
|
public IActionResult Logout()
|
||||||
|
{
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
|
||||||
|
[HttpPost("forgot-password")]
|
||||||
|
public IActionResult ForgotPassword([FromBody] ForgotPasswordRequest request)
|
||||||
|
{
|
||||||
|
var user = _userRepository.GetByEmail(request.Email);
|
||||||
|
if (user == null)
|
||||||
|
{
|
||||||
|
return BadRequest("User not found");
|
||||||
|
}
|
||||||
|
var token = _jwtService.GenerateToken(user);
|
||||||
|
// send email with token
|
||||||
|
return Ok();
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in new issue