Registration rework

+ InvitesRepository
+ AdminsRepository
+ rework jwt
This commit is contained in:
Artemy
2025-06-24 14:27:08 +07:00
parent 410a1ce1cc
commit ce013eae49
37 changed files with 2084 additions and 29 deletions
@@ -4,6 +4,8 @@ using Govor.Core.Infrastructure.Extensions;
using Govor.Core.Models;
using Govor.Core.Repositories.Users;
using Govor.API.Services;
using Govor.Core.Repositories.Admins;
using Govor.Core.Repositories.Invaites;
namespace Govor.API.Services.Authentication;
@@ -13,38 +15,64 @@ public class AuthService : IAccountService
private readonly IPasswordHasher _passwordHasher;
private readonly IJwtService _jwtService;
private readonly IUsersRepository _usersRepository;
private readonly IInvitesRepository _invitesRepository;
private readonly IAdminsRepository _adminsRepository;
public AuthService(IUsersRepository usersRepository, IJwtService jwtService, IPasswordHasher passwordHasher)
public AuthService(IUsersRepository usersRepository,
IJwtService jwtService,
IPasswordHasher passwordHasher,
IInvitesRepository invitesRepository,
IAdminsRepository adminsRepository)
{
_usersRepository = usersRepository;
_jwtService = jwtService;
_passwordHasher = passwordHasher;
_invitesRepository = invitesRepository;
_adminsRepository = adminsRepository;
}
public async Task<string> RegistrationAsync(string name, string password)
public async Task<string> RegistrationAsync(string name, string password, string inviteCode)
{
// 1. Проверка существования имени
if (await _usersRepository.ExistsUsernameAsync(name))
throw new UserAlreadyExistException(name);
// 2. Проверка валидности инвайта
var invite = await _invitesRepository.GetByCodeAsync(inviteCode);
// 3. Генерация пароля
var passwordHash = _passwordHasher.Hash(password);
// 4. Создание пользователя
var user = new User
{
Id = Guid.NewGuid(),
Username = name,
Description = string.Empty,
PasswordHash = passwordHash,
CreatedOn = DateOnly.FromDateTime(DateTime.Now),
Description = string.Empty,
CreatedOn = DateOnly.FromDateTime(DateTime.UtcNow),
IconId = Guid.NewGuid(),
WasOnline = DateTime.UtcNow
//Role = role == "Admin" ? "Admin" : "User" // Ограничение ролей
WasOnline = DateTime.UtcNow,
InviteId = invite.Id
};
// 5. Добавление пользователя
await _usersRepository.AddAsync(user);
// 6. Назначение роли, если инвайт — админский
if (invite.IsAdmin)
{
await _adminsRepository.AddAsync(new Admin
{
UserId = user.Id
});
}
// 7. Генерация токена
return _jwtService.GenerateJwtToken(user);
}
public async Task<string> LoginAsync(string name, string password)
{
if (await _usersRepository.ExistsUsernameAsync(name) == false)
@@ -4,6 +4,6 @@ namespace Govor.API.Services.Authentication.Interfaces;
public interface IAccountService
{
public Task<string> RegistrationAsync(string name, string password);
public Task<string> RegistrationAsync(string name, string password, string inviteCode);
public Task<string> LoginAsync(string name, string password);
}
@@ -3,6 +3,8 @@ using System.Security.Claims;
using System.Text;
using Govor.API.Services.Authentication.Interfaces;
using Govor.Core.Models;
using Govor.Core.Repositories.Admins;
using Govor.Core.Repositories.Invaites;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
@@ -11,14 +13,22 @@ namespace Govor.API.Services.Authentication;
public class JwtService : IJwtService
{
private JwtOption _jwtOption;
private IInvitesRepository _invitesRepository;
public JwtService(IOptions<JwtOption> options)
{
_jwtOption = options.Value;
}
public string GenerateJwtToken(User user)
{
Claim[] claims = [new("userID", user.Id.ToString())];
var invite = _invitesRepository.GetByIdAsync(user.InviteId).Result;
var claims = new[]
{
new Claim("userID", user.Id.ToString()),
new Claim(ClaimTypes.Role, invite.IsAdmin ? "Admin" : "User", ClaimValueTypes.String)
};
var singing = new SigningCredentials(
new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtOption.SecretKeу)),