diff --git a/Backend/PruebaGentle.API/Controllers/AuthController.cs b/Backend/PruebaGentle.API/Controllers/AuthController.cs index 92d85b2..87fb910 100644 --- a/Backend/PruebaGentle.API/Controllers/AuthController.cs +++ b/Backend/PruebaGentle.API/Controllers/AuthController.cs @@ -48,6 +48,40 @@ public class AuthController : ControllerBase }); } + [HttpPost("register")] + public async Task Register([FromBody] RegisterDto dto) + { + var user = new PruebaGentle.Core.Entities.User + { + Username = dto.Username, + PasswordHash = _passwordHasher.Hash(dto.Password), + Email = dto.Email, + NombreCompleto = dto.NombreCompleto + }; + + try + { + var created = await _userRepository.RegisterAsync(user); + var expiresAt = DateTime.UtcNow.AddHours(_jwtSettings.ExpirationHours); + var token = GenerateJwtToken(created.Id, created.Username, created.Email, expiresAt); + + return Created(string.Empty, new RegisterResponseDto + { + Token = token, + ExpiresAt = expiresAt, + UserId = created.Id + }); + } + catch (Microsoft.Data.SqlClient.SqlException ex) when (ex.Number == 50001) + { + return Conflict(new { error = "El nombre de usuario ya existe." }); + } + catch (Microsoft.Data.SqlClient.SqlException ex) when (ex.Number == 50002) + { + return Conflict(new { error = "El email ya existe." }); + } + } + private string GenerateJwtToken(int userId, string username, string email, DateTime expiresAt) { var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.Secret)); diff --git a/Backend/PruebaGentle.Core/Interfaces/IUserRepository.cs b/Backend/PruebaGentle.Core/Interfaces/IUserRepository.cs index 4606125..e2da4cd 100644 --- a/Backend/PruebaGentle.Core/Interfaces/IUserRepository.cs +++ b/Backend/PruebaGentle.Core/Interfaces/IUserRepository.cs @@ -10,4 +10,5 @@ public interface IUserRepository Task UpdateAsync(User user); Task DeleteAsync(int id); Task GetByUsernameAsync(string username); + Task RegisterAsync(User user); } diff --git a/Backend/PruebaGentle.Infrastructure/Repositories/UserRepository.cs b/Backend/PruebaGentle.Infrastructure/Repositories/UserRepository.cs index 2e40fbb..2af1999 100644 --- a/Backend/PruebaGentle.Infrastructure/Repositories/UserRepository.cs +++ b/Backend/PruebaGentle.Infrastructure/Repositories/UserRepository.cs @@ -86,4 +86,21 @@ public class UserRepository : IUserRepository new { Username = username }, commandType: CommandType.StoredProcedure); } + + public async Task RegisterAsync(User user) + { + using var connection = CreateConnection(); + var result = await connection.QuerySingleAsync( + "sp_User_Register", + new + { + user.Username, + user.PasswordHash, + user.Email, + user.NombreCompleto + }, + commandType: CommandType.StoredProcedure); + + return result; + } }