using AsbCloudApp.Data; 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; public AuthController(IAuthService authService) { this.authService = authService; } /// /// Аутентификация пользователя /// /// /// Токен отмены задачи /// новый токен /// логин и пароль не подходят [AllowAnonymous] [HttpPost("login")] [SwaggerOperation(OperationId = "login")] [ProducesResponseType(typeof(UserTokenDto), (int)System.Net.HttpStatusCode.OK)] public async Task LoginAsync([FromBody] AuthDto auth, CancellationToken token = default) { var userToken = await authService.LoginAsync(auth.Login, auth.Password, token).ConfigureAwait(false); if (userToken is null) Forbid(); return Ok(userToken); } /// /// Продление срока действия токена /// /// новый токен [Authorize] [HttpGet("refresh")] public IActionResult Refresh() { var newToken = authService.Refresh(User); return Ok(newToken); } /// /// Регистрация пользователя. Доступна администратору /// /// Ок [HttpPost] public IActionResult Register(UserDto user) { var code = authService.Register(user); return code switch { 0 => Ok(), -1 => BadRequest("Логин должен быть длиннее 3х знаков."), -2 => BadRequest("Пароль должен быть длиннее 3х знаков."), -3 => BadRequest("Email не должен быть длиннее 255 знаков."), -4 => BadRequest("Телефон не должен быть длиннее 50 знаков."), -5 => BadRequest("Название должности не должно быть длиннее 255 символов."), _ => BadRequest(), }; } /// /// Смена пароля пользователя. Доступна пользователю и администратору /// /// Ок [Authorize] [HttpPut("{idUser}/ChangePassword")] public IActionResult ChangePassword([FromRoute]int idUser, [FromBody]string newPassword) { const string roleName = "Администратор"; var allow = (User.GetUserId() == idUser) || User.IsInRole(roleName); if (!allow) return Forbid($"You must be an {roleName} or user with id:{idUser}."); var code = authService.ChangePassword(idUser, newPassword); return code switch { 0 => Ok(), -1 => BadRequest("Нет такого пользователя"), _ => BadRequest(), }; } } }