using AsbCloudApp.Data; using AsbCloudApp.Data.User; using AsbCloudApp.Repositories; using AsbCloudApp.Services; using AsbCloudInfrastructure.Repository; 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] public IActionResult Register(UserRegistrationDto 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 символов."), -6 => BadRequest("Пользователь с таким логином уже зарегистрирован."), _ => BadRequest(), }; } /// /// Смена пароля пользователя. Доступна пользователю и администратору /// /// Ок [Authorize] [HttpPut("{idUser}/ChangePassword")] 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(); var code = authService.ChangePassword(idUser, newPassword); return code switch { 0 => Ok(), -1 => BadRequest("Нет такого пользователя"), _ => BadRequest(), }; } } }