Spaces:
Sleeping
Sleeping
File size: 4,019 Bytes
c596926 87c9973 c596926 87c9973 c596926 87c9973 c596926 87c9973 c596926 87c9973 c596926 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | using Database.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using LibraryManagement.Backend.Features.Subscriptions;
namespace LibraryManagement.Backend.Features.Auth
{
public interface IAuthService
{
Task<AuthResponse> Register(RegisterRequest request);
Task<AuthResponse> Login(LoginRequest request);
}
public class AuthService : IAuthService
{
private readonly LibraryManagementContext _context;
private readonly IConfiguration _configuration;
private readonly ISubscriptionService _subscriptionService;
public AuthService(LibraryManagementContext context, IConfiguration configuration, ISubscriptionService subscriptionService)
{
_context = context;
_configuration = configuration;
_subscriptionService = subscriptionService;
}
public async Task<AuthResponse> Register(RegisterRequest request)
{
if (await _context.Users.AnyAsync(u => u.Email == request.Email))
{
throw new Exception("User already exists with this email.");
}
var user = new User
{
FullName = request.FullName,
Email = request.Email,
PhoneNumber = request.PhoneNumber,
Address = request.Address,
StudentId = request.StudentId,
PasswordHash = BCrypt.Net.BCrypt.HashPassword(request.Password),
Role = "Member", // Default role
IsActive = true,
CreatedAt = DateTime.UtcNow
};
_context.Users.Add(user);
await _context.SaveChangesAsync();
if (!string.IsNullOrEmpty(user.StudentId))
{
await _subscriptionService.SubscribeUserAsync(user.Id, 3); // 3 is "Basic Yearly"
}
return await AuthenticateUser(user);
}
public async Task<AuthResponse> Login(LoginRequest request)
{
var user = await _context.Users.FirstOrDefaultAsync(u => u.Email == request.Email);
if (user == null || !BCrypt.Net.BCrypt.Verify(request.Password, user.PasswordHash))
{
throw new Exception("Invalid email or password.");
}
if (!user.IsActive)
{
throw new Exception("User account is deactivated.");
}
return await AuthenticateUser(user);
}
private async Task<AuthResponse> AuthenticateUser(User user)
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_configuration["Jwt:Secret"] ?? "YourSuperSecretKeyForLibraryManagementSystem_AtLeast32CharsLong");
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Email, user.Email),
new Claim(ClaimTypes.Name, user.FullName),
new Claim(ClaimTypes.Role, user.Role)
}),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature),
Issuer = _configuration["Jwt:Issuer"],
Audience = _configuration["Jwt:Audience"]
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return new AuthResponse
{
Token = tokenHandler.WriteToken(token),
FullName = user.FullName,
Role = user.Role,
Expiry = tokenDescriptor.Expires.Value
};
}
}
}
|