source: iknow-api/Services/Implementations/AuthService.cs@ 586825e

Last change on this file since 586825e was 586825e, checked in by imbrsk <boris696boris@…>, 11 months ago

Refactored enums

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