using GozareshgirProgramManager.Application._Common.Interfaces;
using GozareshgirProgramManager.Application._Common.Models;
using GozareshgirProgramManager.Application.Modules.Users.Commands.LoginUser;
using GozareshgirProgramManager.Application.Modules.Users.Commands.RefreshUserToken;
using GozareshgirProgramManager.Application.Modules.Users.Commands.SignOutUser;
using GozareshgirProgramManager.Application.Modules.Users.Commands.SsoLogin;
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using ServiceHost.BaseControllers;
namespace ServiceHost.Areas.Admin.Controllers.ProgramManager;
///
/// کنترلر احراز هویت
///
public class AuthController : ProgramManagerBaseController
{
private readonly IAuthHelper _authHelper;
private readonly IMediator _mediator;
public AuthController(IAuthHelper authHelper, IMediator mediator)
{
_authHelper = authHelper;
_mediator = mediator;
}
///
/// ورود به سیستم با شناسه کاربری
///
/// شناسه کاربر
/// فقط Access Token - Refresh Token در سرور ذخیره میشود
[HttpPost("login")]
[AllowAnonymous]
public async Task>> Login([FromBody] LoginByIdRequest request)
{
var command = new LoginUserCommand(request.UserId);
var result = await _mediator.Send(command);
return result;
}
///
/// ورود به سیستم از طریق SSO با استفاده از توکن JWT
/// توکن JWT از query string دریافت میشود و Claims آن استخراج میشود
/// سپس کاربر بر اساس AccountId موجود در Claims لاگین میشود
///
/// JWT Token از سیستم خارجی
/// Access Token و اطلاعات کاربر
[HttpGet("sso-login")]
[AllowAnonymous]
public async Task>> SsoLogin([FromQuery] string token)
{
if (string.IsNullOrWhiteSpace(token))
{
return BadRequest(OperationResult.Failure("توکن الزامی است", ErrorType.BadRequest));
}
var command = new SsoLoginCommand(token);
var result = await _mediator.Send(command);
return result;
}
///
/// خروج از سیستم
///
[HttpPost("signout")]
[Authorize]
public new async Task> SignOut()
{
// دریافت Refresh Token از Header با استفاده از AuthHelper
var refreshToken = _authHelper.GetRefreshTokenFromCookie();
if (string.IsNullOrEmpty(refreshToken))
{
return OperationResult.Failure("توکن تازهسازی یافت نشد");
}
var command = new SignOutUserCommand(refreshToken);
var result = await _mediator.Send(command);
if (result.IsSuccess)
{
return Ok(result);
}
return StatusCode(result.ErrorType switch
{
ErrorType.Unauthorized => 401,
ErrorType.BadRequest => 400,
ErrorType.NotFound => 404,
_ => 500
}, result);
}
///
/// تازهسازی توکن دسترسی
/// توکن منقضی شده را میگیرد و Access Token جدید برمیگرداند
/// Refresh Token از دیتابیس خوانده میشود و به فرانت داده نمیشود
///
[HttpPost("refresh")]
[AllowAnonymous]
public async Task> RefreshAccessToken()
{
var refreshTokenCommand = new RefreshUserTokenCommand();
var result = await _mediator.Send(refreshTokenCommand);
return result;
}
///
/// دریافت اطلاعات کاربر جاری
///
[HttpGet("current")]
public IActionResult GetCurrentUser()
{
if (!_authHelper.IsAuthenticated())
{
return Unauthorized(new { message = "کاربر احراز هویت نشده است" });
}
return Ok(new
{
userId = _authHelper.GetCurrentUserId(),
fullName= _authHelper.GetCurrentFullName(),
roles = _authHelper.GetCurrentUserRoles()
});
}
}
///
/// درخواست ورود با شناسه کاربری
///
public class LoginByIdRequest
{
public long UserId { get; set; }
}