using iknow_api.Repositories; using iknow_api.Services; using iknow_api.DTOs; using Microsoft.AspNetCore.Http.HttpResults; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Microsoft.IdentityModel.Tokens; using iknow_api.Models; namespace iknow_api.Services { public class UserService : IUserService { private readonly IUserRepository _userRepository; private readonly IConfiguration _configuration; public UserService(IUserRepository userRepository, IConfiguration configuration) { _userRepository = userRepository; _configuration = configuration; } public async Task GetUserData(string JWT) { var userId = ExtractUserIdFromJwt(JWT); if (userId == null) return null; // Now you can use userId to fetch user data var user = await _userRepository.GetUserByIdAsync(userId.Value); if(user == null) return null; else return user; } private int? ExtractUserIdFromJwt(string token) { try { var tokenHandler = new JwtSecurityTokenHandler(); var keyString = _configuration["Jwt:Key"]; if (string.IsNullOrEmpty(keyString)) return null; var key = Encoding.UTF8.GetBytes(keyString); var validationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = true, ValidIssuer = "iknow-api", ValidateAudience = true, ValidAudience = "iknow-api", ValidateLifetime = true, ClockSkew = TimeSpan.Zero }; var principal = tokenHandler.ValidateToken(token, validationParameters, out SecurityToken validatedToken); // Extract the "id" claim that was set in AuthService.CreateToken var userIdClaim = principal.FindFirst("id"); if (userIdClaim != null && int.TryParse(userIdClaim.Value, out int userId)) { return userId; } return null; } catch { return null; } } } }