using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using BCrypt.Net; using iknow_api.Controllers; using iknow_api.Models; using iknow_api.DTOs; using iknow_api.Repositories; using Microsoft.IdentityModel.Tokens; namespace iknow_api.Services { public class AuthService : IAuthService { private readonly IUserRepository _userRepository; private readonly IConfiguration _configuration; public AuthService(IUserRepository userRepository, IConfiguration configuration) { _userRepository = userRepository; _configuration = configuration; } public async Task RegisterAsync(RegisterDto registerDto) { if (await _userRepository.UserExistsAsync(registerDto.Email)) return false; var user = new User { Name = registerDto.Name, Surname = registerDto.Surname, Index = registerDto.Index, Email = registerDto.Email, PasswordHash = BCrypt.Net.BCrypt.HashPassword(registerDto.Password), Bday = DateTime.SpecifyKind(registerDto.Bday, DateTimeKind.Utc), CreatedAt = DateTime.UtcNow, Role = (Models.UserRole)registerDto.Role }; await _userRepository.AddUserAsync(user); return true; } public async Task LoginAsync(LoginDto loginDto) { var user = await _userRepository.GetUserByUsernameAsync(loginDto.Email); if (user == null || !BCrypt.Net.BCrypt.Verify(loginDto.Password, user.PasswordHash)) return null; return CreateToken(user); } public async Task GetUsersCountAsync() { return await _userRepository.GetUsersCountAsync(); } private string CreateToken(User user) { var claims = new[] { new Claim("id", user.Id.ToString()), new Claim("email", user.Email ?? string.Empty), new Claim("role", user.Role.ToString()) }; var keyString = _configuration["Jwt:Key"]; if (string.IsNullOrEmpty(keyString)) throw new Exception("JWT Key is missing in configuration!"); var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(keyString)); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: "iknow-api", audience: "iknow-api", claims: claims, expires: DateTime.UtcNow.AddHours(1), signingCredentials: creds ); return new JwtSecurityTokenHandler().WriteToken(token); } } }