using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SurveyBackend.Core.Contexts;
using SurveyBackend.Core.Services;
using SurveyBackend.DTOs;
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);
}
}