using API.Application.Users.Commands; using API.Application.Users.Queries; using API.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using System.Text.RegularExpressions; using Helpers; using Microsoft.AspNetCore.Identity; using API.Persistence.Repositories; using API.Persistence.Services; namespace API.Controllers { [Route("api/[controller]")] [ApiController] public class UsersController : ControllerBase { private readonly QueryAllUsers _queryAllUsers; private readonly QueryUserById _queryUserById; private readonly CreateUser _createUser; private readonly UpdateUser _updateUser; private readonly DeleteUser _deleteUser; private readonly LoginUser _loginUser; private readonly TokenHelper _tokenHelper; private readonly IUserRepository _repository; public UsersController( QueryAllUsers queryAllUsers, QueryUserById queryUserById, CreateUser createUser, UpdateUser updateUser, DeleteUser deleteUser, LoginUser loginUser, TokenHelper tokenHelper, IUserRepository repository ) { _queryAllUsers = queryAllUsers; _queryUserById = queryUserById; _createUser = createUser; _updateUser = updateUser; _deleteUser = deleteUser; _loginUser = loginUser; _tokenHelper = tokenHelper; _repository = repository; } [HttpPost("login")] public async Task Login(LoginDTO login) { return await _loginUser.Handle(login); } //[Authorize] [HttpGet] public async Task>> GetUsers() { return await _queryAllUsers.Handle(); } [HttpGet("{id}")] public async Task> GetUser(string id) { return await _queryUserById.Handle(id); } [Authorize] [HttpPut] public async Task PutUser([FromForm ]UpdateUserDTO UpdateUserDTO) { return await _updateUser.Handle(UpdateUserDTO); } [HttpPost] public async Task> PostUser(SignUpDTO signUpDTO) { return await _createUser.Handle(signUpDTO); } [Authorize] [HttpDelete("{id}")] public async Task DeleteUser(string id) { return await _deleteUser.Handle(id); } [HttpPost("/RefreshToken")] public async Task RefreshToken(RefreshTokenDTO refreshTokenDTO) { User user = await _repository.QueryUserByRefreshTokenAsync(refreshTokenDTO.RefreshToken); return new OkObjectResult(_tokenHelper.GenerateJwtToken(user)); } } }