/
GhostIn
/
MatuningApi
Обзор
Документация
Войти
/
GhostIn
/
MatuningApi
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
Аналитика
Безопасность
laba/four
Matuning/WebApi/Controllers/AuthController.cs
119 строк
6 KB
GhostInn
fux
20 дек 2024, 23:50
20 дек 2024, 23:50
68c435a
Код
Авторство
О чём код?
using Matuning.Domain.Interfaces; using Matuning.Domain.Models.DTO; using Matuning.Domain.Models.Users; using Microsoft.AspNetCore.Mvc; namespace Matuning.WebApi.Controllers; [Route("api/[controller]")] [ApiController] public class AuthController : ControllerBase { private readonly IUsersRepository _usersRepository; private readonly IPasswordHasherService _passwordHasher; private readonly ILogger<AuthController> _logger; public AuthController(IUsersRepository usersRepository, IPasswordHasherService passwordHasher, ILogger<AuthController> logger) { _usersRepository = usersRepository ?? throw new ArgumentNullException(nameof(usersRepository)); _passwordHasher = passwordHasher ?? throw new ArgumentNullException(nameof(passwordHasher)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } [HttpPost("register")] public async Task<IActionResult> RegisterAsync([FromBody] RegisterRequest request) { if (request == null) { _logger.LogWarning("RegisterAsync: Запрос регистрации пуст."); return BadRequest(new { message = "Request body is required." }); } if (!ModelState.IsValid) { _logger.LogWarning("RegisterAsync: Модель запроса регистрации не валидна."); return BadRequest(new { message = "Некорректные данные." }); } try { // Проверка уникальности Username var existingUser = await _usersRepository.GetUserByUsernameAsync(request.Username); if (existingUser != null) { _logger.LogWarning("RegisterAsync: Пользователь с именем {Username} уже существует.", request.Username); return Conflict(new { message = "Username already exists." }); } // Хеширование пароля var hashedPassword = _passwordHasher.HashPassword(new User(), request.Password); // Создание нового пользователя var newUser = new User { Username = request.Username, PasswordHash = hashedPassword, RegistrationDate = DateTime.UtcNow }; bool userCreated = await _usersRepository.AddUserAsync(newUser); if (!userCreated) { _logger.LogError("RegisterAsync: Не удалось создать пользователя {Username}.", request.Username); return StatusCode(500, new { message = "Failed to create user." }); } _logger.LogInformation("RegisterAsync: Пользователь {Username} успешно зарегистрирован.", request.Username); return Ok(new { message = "User registered successfully." }); } catch (Exception ex) { _logger.LogError(ex, "RegisterAsync: Внутренняя ошибка при регистрации пользователя."); return StatusCode(500, new { message = "Internal server error." }); } } [HttpPost("login")] public async Task<IActionResult> LoginAsync([FromBody] LoginRequest request) { if (request == null) { _logger.LogWarning("LoginAsync: Запрос авторизации пуст."); return BadRequest(new { message = "Request body is required." }); } if (!ModelState.IsValid) { _logger.LogWarning("LoginAsync: Модель запроса авторизации не валидна."); return BadRequest(new { message = "Некорректные данные." }); } try { // Поиск пользователя по имени var user = await _usersRepository.GetUserByUsernameAsync(request.Username); if (user == null) { _logger.LogWarning("LoginAsync: Пользователь с именем {Username} не найден.", request.Username); return Unauthorized(new { message = "Invalid credentials." }); } // Проверка пароля bool isPasswordValid = _passwordHasher.VerifyPassword(user, user.PasswordHash, request.Password); if (!isPasswordValid) { _logger.LogWarning("LoginAsync: Неверный пароль для пользователя {Username}.", request.Username); return Unauthorized(new { message = "Invalid credentials." }); } _logger.LogInformation("LoginAsync: Пользователь {Username} успешно авторизовался.", request.Username); return Ok(new { message = "Good" }); } catch (Exception ex) { _logger.LogError(ex, "LoginAsync: Внутренняя ошибка при авторизации пользователя."); return StatusCode(500, new { message = "Internal server error." }); } } }