using AsbCloudApp.Data; using AsbCloudApp.Data.User; using AsbCloudApp.Repositories; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Swashbuckle.AspNetCore.Annotations; using System.Threading; using System.Threading.Tasks; namespace AsbCloudWebApi.Controllers { /// /// Авторизация /// [Route("/auth")] [ApiController] public class AuthController : ControllerBase { private readonly IAuthService authService; private readonly IUserRepository userRepository; public AuthController(IAuthService authService, IUserRepository userRepository) { this.authService = authService; this.userRepository = userRepository; } /// /// Аутентификация пользователя /// /// /// Токен отмены задачи /// новый токен /// логин и пароль не подходят [AllowAnonymous] [HttpPost("login")] [SwaggerOperation(OperationId = "login")] [ProducesResponseType(typeof(UserTokenDto), (int)System.Net.HttpStatusCode.OK)] public async Task LoginAsync([FromBody] AuthDto auth, CancellationToken token) { var userToken = await authService.LoginAsync(auth.Login, auth.Password, token); if (userToken is null) Forbid(); return Ok(userToken); } /// /// Продление срока действия токена /// /// новый токен [Authorize] [HttpGet("refresh")] [ProducesResponseType(typeof(UserTokenDto), (int)System.Net.HttpStatusCode.OK)] public async Task RefreshAsync(CancellationToken token) { var userToken = await authService.RefreshAsync(User, token); if (userToken is null) Forbid(); return Ok(userToken); } /// /// Отправить заявку на регистрацию. Заявка подтверждается администратором. /// /// Информация о новом пользователе /// Ок [HttpPost] [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] public IActionResult Register(UserRegistrationDto user) { authService.Register(user); return Ok(); } /// /// Смена пароля пользователя. Доступна пользователю и администратору /// /// Ок [Authorize] [HttpPut("{idUser}/ChangePassword")] [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] public IActionResult ChangePassword([FromRoute] int idUser, [FromBody] string newPassword) { var editorUserId = User.GetUserId(); if (editorUserId is null) return Forbid(); if (!((editorUserId == idUser) || userRepository.HasPermission((int)editorUserId, "Auth.edit"))) return Forbid(); authService.ChangePassword(idUser, newPassword); return Ok(); } } }