using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using PlaylistShared.Api.Entities; using PlaylistShared.Api.Services; using PlaylistShared.Shared.DTO; [ApiController] [Route("api/[controller]")] public class AccountController : ControllerBase { private readonly UserManager _userManager; private readonly SignInManager _signInManager; private readonly JwtService _jwtService; public AccountController(UserManager userManager, SignInManager signInManager, JwtService jwtService) { _userManager = userManager; _signInManager = signInManager; _jwtService = jwtService; } [HttpPost("register")] public async Task>> Register(RegisterRequest request) { var user = new ApplicationUser { UserName = request.Username, Email = request.Email }; var result = await _userManager.CreateAsync(user, request.Password); if (!result.Succeeded) return BadRequest(ApiResponse.Fail(new ErrorResponse { StatusCode = 400, Message = string.Join(", ", result.Errors.Select(e => e.Description)) })); return await GenerateTokenResponse(user); } [HttpPost("login")] public async Task>> Login(LoginRequest request) { var user = await _userManager.FindByNameAsync(request.Username); if (user == null) return Unauthorized(ApiResponse.Fail(new ErrorResponse { StatusCode = 401, Message = "Неверное имя пользователя или пароль" })); var result = await _signInManager.CheckPasswordSignInAsync(user, request.Password, false); if (!result.Succeeded) return Unauthorized(ApiResponse.Fail(new ErrorResponse { StatusCode = 401, Message = "Неверное имя пользователя или пароль" })); return await GenerateTokenResponse(user); } private async Task>> GenerateTokenResponse(ApplicationUser user) { var (token, refreshToken, expiration) = await _jwtService.GenerateTokenAsync(user); return Ok(ApiResponse.Ok(new LoginResponse { Token = token, RefreshToken = refreshToken, Expiration = expiration })); } [HttpPost("refresh-token")] public async Task>> RefreshToken([FromBody] RefreshTokenRequest request) { var user = _userManager.Users.FirstOrDefault(u => u.RefreshToken == request.RefreshToken && u.RefreshTokenExpiryUtc > DateTime.UtcNow); if (user == null) return Unauthorized(ApiResponse.Fail(new ErrorResponse { StatusCode = 401, Message = "Неверный или просроченный refresh token" })); return await GenerateTokenResponse(user); } }