source: iknow-api/Services/Implementations/AuthService.cs@ 1d32d5c

Last change on this file since 1d32d5c was e423ff3, checked in by GitHub <noreply@…>, 11 months ago

Merge branch 'Dev' into feature/getUser

  • Property mode set to 100644
File size: 5.0 KB
Line 
1using System.IdentityModel.Tokens.Jwt;
2using System.Security.Claims;
3using System.Text;
4using BCrypt.Net;
5using iknow_api.Services;
6using iknow_api.Models;
7using iknow_api.DTOs;
8using iknow_api.Repositories;
9using Microsoft.IdentityModel.Tokens;
10
11namespace iknow_api.Services
12{
13 public class AuthService : IAuthService
14 {
15 private readonly IUserRepository _userRepository;
16 private readonly IRefreshTokenRepository _refreshTokenRepository;
17 private readonly IRefreshTokenService _refreshTokenService;
18 private readonly IConfiguration _configuration;
19
20 public AuthService(IUserRepository userRepository, IConfiguration configuration
21 , IRefreshTokenService refreshTokenService, IRefreshTokenRepository refreshTokenRepository)
22 {
23 _userRepository = userRepository;
24 _configuration = configuration;
25 _refreshTokenService = refreshTokenService;
26 _refreshTokenRepository = refreshTokenRepository;
27 }
28
29 public async Task<bool> RegisterAsync(RegisterDto registerDto)
30 {
31 if (await _userRepository.UserExistsAsync(registerDto.Email))
32 return false;
33
34 var user = new User
35 {
36 Name = registerDto.Name,
37 Surname = registerDto.Surname,
38 Index = registerDto.Index,
39 Email = registerDto.Email,
40 PasswordHash = BCrypt.Net.BCrypt.HashPassword(registerDto.Password),
41 Bday = DateTime.SpecifyKind(registerDto.Bday, DateTimeKind.Utc),
42 CreatedAt = DateTime.UtcNow,
43 Role = (Models.UserRole)registerDto.Role
44 };
45
46 await _userRepository.AddUserAsync(user);
47 int userId = user.Id;
48 var contactInfo = new ContactInfo
49 {
50 UserId = userId,
51 city = registerDto.city,
52 address = registerDto.address,
53 municipality = registerDto.municipality,
54 phoneNumber = registerDto.phoneNumber,
55 microsoftEmail = registerDto.microsoftEmail
56 };
57 await _userRepository.AddContactAsync(contactInfo);
58 var enrollmentInfo = new EnrollmentInfo
59 {
60 UserId = userId,
61 enrollmentYear = registerDto.enrollmentYear,
62 quota = (Models.quota)registerDto.quotaType,
63 major = (Models.major)registerDto.majorType
64 };
65 await _userRepository.AddEnrollmentAsync(enrollmentInfo);
66 await _userRepository.AddHighSchoolAsync(new HighSchool
67 {
68 UserId = userId,
69 GPA = registerDto.gpa,
70 tip = (Models.type)registerDto.tip
71 });
72 return true;
73 }
74
75 public async Task<AuthResultDto?> LoginAsync(LoginDto loginDto)
76 {
77 var user = await _userRepository.GetUserByUsernameAsync(loginDto.Email);
78 if (user == null || !BCrypt.Net.BCrypt.Verify(loginDto.Password, user.PasswordHash))
79 return null;
80
81 var result = new AuthResultDto
82 {
83 AccessToken = CreateToken(user)
84 };
85
86 if (loginDto.GenerateRefreshToken)
87 {
88 int userid = _userRepository.GetUserByUsernameAsync(loginDto.Email).Id;
89 result.RefreshToken = await _refreshTokenService.GenerateRefreshToken(userid);
90 }
91
92 return result;
93 }
94
95 public async Task<int> GetUsersCountAsync()
96 {
97 return await _userRepository.GetUsersCountAsync();
98 }
99
100 public async Task<AuthResultDto> GenerateNewJWT(VerifyRefreshTokenDto token)
101 {
102 int userid = await _refreshTokenRepository.GetUserId(token.token) ?? 0;
103 User user = await _userRepository.GetOnlyUserByIdAsync(userid);
104
105 var result = new AuthResultDto
106 {
107 AccessToken = CreateToken(user)
108 };
109
110 return result;
111 }
112
113 private string CreateToken(User user)
114 {
115 var claims = new[]
116 {
117 new Claim("id", user.Id.ToString()),
118 new Claim("email", user.Email ?? string.Empty),
119 new Claim("role", user.Role.ToString())
120 };
121
122 var keyString = _configuration["Jwt:Key"];
123 if (string.IsNullOrEmpty(keyString))
124 throw new Exception("JWT Key is missing in configuration!");
125
126 var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(keyString));
127 var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
128
129 var token = new JwtSecurityToken(
130 issuer: "iknow-api",
131 audience: "iknow-api",
132 claims: claims,
133 expires: DateTime.UtcNow.AddHours(1),
134 signingCredentials: creds
135 );
136
137 return new JwtSecurityTokenHandler().WriteToken(token);
138 }
139 }
140}
Note: See TracBrowser for help on using the repository browser.