MyBookmark/Modules.User.WebApi/Controllers/AccountController.cs
2024-11-27 03:22:03 +03:00

157 lines
5.0 KiB
C#

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<AccountController> _logger;
public AccountController(UserContext userContext, IMediator mediator, ILogger<AccountController> logger)
{
_userContext = userContext;
_mediator = mediator;
_logger = logger;
}
[HttpGet("Sessions")]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(List<Session>))]
public async Task<IActionResult> GetSessions()
{
var user = await _userContext.GetUserInfo();
if (user?.AccountId == null) return Ok(new List<Session>());
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<IActionResult> 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<IActionResult> DeleteCurrentSession()
{
var user = await _userContext.GetUserInfo();
if (user?.AccountId == null) return Ok(new List<Session>());
return Ok(await _mediator.Send(new DeleteCurrentSessionCommand()));
}
[HttpPost("Sessions/DeleteAll")]
public async Task<IActionResult> DeleteAllSessions()
{
var user = await _userContext.GetUserInfo();
if (user?.AccountId == null) return Ok(new List<Session>());
return Ok(await _mediator.Send(new DeleteAllSessionsCommand
{
AccountId = user.AccountId.Value,
}));
}
[HttpPost("Login")]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(AuthenticationResultModel))]
[AllowAnonymous]
public async Task<IActionResult> 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<IActionResult> 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,
});
}
}