using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Tiku.Application.Auth; namespace Tiku.Api.Controllers; [ApiController] [Route("api/auth")] public sealed class AuthController(IAuthService authService) : ControllerBase { [AllowAnonymous] [HttpPost("login/password")] public async Task> LoginWithPassword( PasswordLoginHttpRequest request, CancellationToken cancellationToken) { var result = await authService.LoginWithPasswordAsync( new PasswordLoginRequest( request.TenantId, request.Phone, request.Password, GetIpAddress(), Request.Headers.UserAgent.ToString()), cancellationToken); return Ok(result); } [AllowAnonymous] [HttpPost("login/sms")] public async Task> LoginWithSms( SmsLoginHttpRequest request, CancellationToken cancellationToken) { var result = await authService.LoginWithSmsAsync( new SmsLoginRequest( request.TenantId, request.Phone, request.Code, GetIpAddress(), Request.Headers.UserAgent.ToString()), cancellationToken); return Ok(result); } [AllowAnonymous] [HttpPost("refresh")] public async Task> Refresh( RefreshHttpRequest request, CancellationToken cancellationToken) { var result = await authService.RefreshAsync( new RefreshSessionRequest( request.RefreshToken, GetIpAddress(), Request.Headers.UserAgent.ToString()), cancellationToken); return Ok(result); } [AllowAnonymous] [HttpPost("logout")] public async Task Logout( RefreshHttpRequest request, CancellationToken cancellationToken) { await authService.LogoutAsync( new LogoutSessionRequest(request.RefreshToken), cancellationToken); return NoContent(); } private string? GetIpAddress() { return HttpContext.Connection.RemoteIpAddress?.ToString(); } } public sealed record PasswordLoginHttpRequest( Guid TenantId, string Phone, string Password); public sealed record SmsLoginHttpRequest( Guid TenantId, string Phone, string Code); public sealed record RefreshHttpRequest(string RefreshToken);