using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SurveyBackend.Core.Contexts; using SurveyBackend.Core.Services; using SurveyBackend.DTOs.User; using SurveyBackend.Mappers; using IAuthorizationService = SurveyBackend.Core.Services.IAuthorizationService; namespace SurveyBackend.Controllers; /// /// Контроллер для всего связанного с авторизацией пользователей /// [ApiController] [Route("api/auth")] public class AuthController : ControllerBase { private readonly IAuthorizationService _authorizationService; private readonly IUserContext _userContext; private readonly IUserService _userService; /// /// Нет ну вы прикалываетесь что ли мне ща каждый контроллер описывать? /// /// public AuthController(IAuthorizationService authorizationService, IUserContext userContext, IUserService userService) { _authorizationService = authorizationService; _userContext = userContext; _userService = userService; } /// /// Авторизация /// /// Принимает на вход email и password. При отсутствии такого email вернет 404, при неправильном пароле 401, при успехе 200 и валидный токен /// /// Success: Возвращает токен /// Unauthorized: Неправильный пароль /// [AllowAnonymous] [HttpPost("login")] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status200OK)] public async Task LogIn([FromBody] UserLoginDto loginData) { var token = await _authorizationService.LogInUser(loginData.Email, loginData.Password); return Ok(new { token = token }); } /// /// Регистрация /// /// Принимает на вход кучу всяких полей, потом разберемся /// /// [AllowAnonymous] [HttpPost("register")] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status200OK)] public async Task Register([FromBody] UserRegistrationDto registerData) { var token = await _authorizationService.RegisterUser( UserMapper.UserRegistrationToModel(registerData)); return Ok(new { token = token }); } /// /// Получить информацию о нынешнем юзере /// /// Возвращает инфо о пользователе, токен которого был использован /// [Authorize] [HttpGet("me")] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status200OK)] public async Task GetMe() { var userId = _userContext.UserId; var user = await _userService.GetUserById(userId); var result = UserMapper.ModelToOutput(user); return Ok(result); } }