using GermanApp.Application.DTOs.Auth; using GermanApp.Application.Interfaces; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Net; namespace GermanApp.Presentation.Controllers; /// /// Controller for authentication endpoints. /// Part of the Presentation layer. /// [ApiController] [Route("api/[controller]")] public class AuthController : ControllerBase { private readonly IAuthService _authService; public AuthController(IAuthService authService) { _authService = authService; } /// /// Register a new user. /// /// Registration data /// Authentication response with JWT token [HttpPost("register")] [ProducesResponseType(typeof(AuthResponse), (int)HttpStatusCode.OK)] [ProducesResponseType(typeof(string), (int)HttpStatusCode.BadRequest)] public async Task Register([FromBody] RegisterDto registerDto) { try { var result = await _authService.RegisterAsync(registerDto); return Ok(result); } catch (InvalidOperationException ex) { return BadRequest(ex.Message); } catch (Exception ex) { return StatusCode((int)HttpStatusCode.InternalServerError, ex.Message); } } /// /// Login an existing user. /// /// Login data /// Authentication response with JWT token [HttpPost("login")] [ProducesResponseType(typeof(AuthResponse), (int)HttpStatusCode.OK)] [ProducesResponseType(typeof(string), (int)HttpStatusCode.Unauthorized)] public async Task Login([FromBody] LoginDto loginDto) { try { var result = await _authService.LoginAsync(loginDto); return Ok(result); } catch (UnauthorizedAccessException ex) { return Unauthorized(ex.Message); } catch (Exception ex) { return StatusCode((int)HttpStatusCode.InternalServerError, ex.Message); } } /// /// Get current authenticated user information. /// /// Current user information [HttpGet("me")] [Authorize] [ProducesResponseType(typeof(AuthResponse), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task GetCurrentUser() { try { var userId = int.Parse(User.FindFirst("nameid")?.Value ?? "0"); if (userId == 0) return Unauthorized(); var user = await _authService.GetCurrentUserAsync(userId); if (user == null) return Unauthorized(); return Ok(new AuthResponse { UserId = user.Id, Username = user.Username, Email = user.Email }); } catch (Exception ex) { return StatusCode((int)HttpStatusCode.InternalServerError, ex.Message); } } }