using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Modules.User.Application; using Modules.User.Application.Commands; using Modules.User.Application.Queries; using Modules.User.WebApi.Models; using System.Net; namespace Modules.User.WebApi.Controllers; [ApiController] [Route("[controller]")] [ProducesResponseType(400, StatusCode = 400, Type = typeof(ProblemDetails))] [ProducesResponseType(401, StatusCode = 401, Type = typeof(UnauthorizedResult))] [Authorize] public class AccountController : ControllerBase { private readonly IMediator _mediator; private readonly UserContext _userContext; private readonly ILogger _logger; public AccountController(UserContext userContext, IMediator mediator, ILogger logger) { _userContext = userContext; _mediator = mediator; _logger = logger; } [HttpGet("Sessions")] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(List))] public async Task GetSessions() { var user = await _userContext.GetUserInfo(); if (user?.AccountId == null) return Ok(new List()); var sessions = await _mediator.Send(new GetAccountSessionsQuery { AccountId = user.AccountId.Value }); return Ok(sessions.Select(q => new Session { Id = q.Id, Country = q.ClientInfo.Location.Country, Region = q.ClientInfo.Location.Region, //Latitude = q.ClientInfo.Location.Latitude, //Longitude = q.ClientInfo.Location.Longutude, UserAgent = q.ClientInfo.UserAgent, ExpiredDate = q.ExpiredDate, })); } [HttpPost("Sessions/Delete")] [ProducesResponseType((int)HttpStatusCode.OK)] public async Task DeleteSession(DeleteSessionModel model) { var user = await _userContext.GetUserInfo(); if (user?.AccountId == null) return Unauthorized(); await _mediator.Send(new DeleteSessionCommand { AccountId = user.AccountId.Value, SessionId = model.SessionId, }); return Ok(); } [HttpPost("Sessions/DeleteCurrent")] public async Task DeleteCurrentSession() { var user = await _userContext.GetUserInfo(); if (user?.AccountId == null) return Ok(new List()); return Ok(await _mediator.Send(new DeleteCurrentSessionCommand())); } [HttpPost("Sessions/DeleteAll")] public async Task DeleteAllSessions() { var user = await _userContext.GetUserInfo(); if (user?.AccountId == null) return Ok(new List()); return Ok(await _mediator.Send(new DeleteAllSessionsCommand { AccountId = user.AccountId.Value, })); } [HttpPost("Login")] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(AuthenticationResultModel))] [AllowAnonymous] public async Task Login(LoginModel model) { var loginResult = await _mediator.Send(new LoginCommand { Email = model.Login, Password = model.Password, IsAdmin = false, Ip = model.Ip, Response = Response, //CookiePath = "Account/Refresh", CookiePath = "/", }); return Ok(new AuthenticationResultModel { AccessToken = loginResult.AccessToken, SessionExpireDate = loginResult.SessionExpireDate.ToString("O"), }); } [HttpPost("Refresh")] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(AuthenticationResultModel))] [AllowAnonymous] public async Task Refresh(RefreshModel model) { var refreshResult = await _mediator.Send(new RefreshTokensCommand { Ip = model.Ip, Response = Response, //CookiePath = "Account/Refresh", CookiePath = "/", }); //if (tokens != null) //{ // return Ok(tokens.Value.AccessToken); //} //else //{ // return Unauthorized(); //} return refreshResult == null ? Unauthorized() : Ok(new AuthenticationResultModel { AccessToken = refreshResult.AccessToken, SessionExpireDate = refreshResult.SessionExpireDate.ToString("O"), }); //return tokens == null ? Unauthorized() : Ok(new TokensModel //{ // AccessToken = tokens.Value.AccessToken, // RefreshToken = tokens.Value.RefreshToken, //}); } [HttpPost("Register")] [AllowAnonymous] public async Task Register(RegisterModel model) { var token = await _mediator.Send(new CreateUserCommand { Nickname = model.Nickname, Email = model.Login, Password = model.Password, //IsAdmin = false, }); } }