using Application.Endpoints; using Application.Endpoints.Patients.Login; using Application.Endpoints.Patients.Profile; using Application.Endpoints.Patients.Registration; using Application.Endpoints.Patients.ResetPassword; using Application.Services.Database; using Application.Services.HashingAlgorithms; using Application.Services.Jwt; using Core.Entities; using Microsoft.AspNetCore.Mvc; namespace API.Controllers; [ApiController] [Route("api/[controller]")] public class PatientsController : ControllerBase { private readonly IHashingAlgorithms _hashingAlgorithms; private readonly IPatientRepository _patientRepository; private readonly IJwtService _jwtService; public PatientsController(IPatientRepository patientRepository, IHashingAlgorithms hashingAlgorithms, IJwtService jwtService) { _patientRepository = patientRepository; _hashingAlgorithms = hashingAlgorithms; _jwtService = jwtService; } [HttpGet] public async Task> GetAllPatients() { var handler = new PatientProfileHandler(_patientRepository, _hashingAlgorithms); var response = await handler.HandleGetAll(); return StatusCode(response.StatusCode, response); } [HttpGet("{id}")] public async Task> GetPatient(Guid id) { var handler = new PatientProfileHandler(_patientRepository, _hashingAlgorithms); var response = await handler.HandleGet(id); return StatusCode(response.StatusCode, response); } [HttpPost("login")] public async Task> Login(PatientLoginDto patientLoginDto) { var handler = new PatientLoginHandler(_patientRepository); var response = await handler.Handle(patientLoginDto).ConfigureAwait(false); if (response.Data != null) { Patient patient = (Patient)response.Data; var authToken = _jwtService.GenerateJwtToken(patient.Email); HttpContext.Response.Headers.Add("Authorization", $"Bearer {authToken}"); } return StatusCode(response.StatusCode, response); } [HttpPost("refresh_token")] public async Task> RefreshToken() { var authorizationHeader = Request.Headers["Authorization"].FirstOrDefault(); if (string.IsNullOrEmpty(authorizationHeader) || !authorizationHeader.StartsWith("Bearer ")) { return StatusCode(HttpStatusCodes.BadRequest, new BaseResponse { StatusCode = HttpStatusCodes.BadRequest, Message = "Invalid request header format.", Data = null }); } var oldToken = authorizationHeader.Substring("Bearer ".Length).Trim(); if (!_jwtService.ValidateJwtToken(oldToken)) { return StatusCode(HttpStatusCodes.Unauthorized, new BaseResponse { StatusCode = HttpStatusCodes.Unauthorized, Message = "Invalid JWT token.", Data = null }); } else { var newToken = _jwtService.RefreshToken(oldToken); return StatusCode(HttpStatusCodes.OK, new BaseResponse { StatusCode = HttpStatusCodes.OK, Message = "Token refreshed successfully.", Data = new { Token = newToken } }); } } [HttpPost("register")] public async Task> Register(PatientRegistrationDto patientRegistrationDto) { var handler = new PatientRegistrationHandler(_patientRepository, _hashingAlgorithms); var response = await handler.Handle(patientRegistrationDto).ConfigureAwait(false); return StatusCode(response.StatusCode, response); } [HttpPost("reset_password")] public async Task> ResetPassword(PatientResetPasswordDto patientResetPasswordDto) { var handler = new PatientResetPasswordHandler(_patientRepository, _hashingAlgorithms); var response = await handler.Handle(patientResetPasswordDto).ConfigureAwait(false); return StatusCode(response.StatusCode, response); } [HttpPut] public async Task> UpdatePatientProfile(PatientProfileDto patientDto) { var handler = new PatientProfileHandler(_patientRepository, _hashingAlgorithms); var response = await handler.HandleUpdate(patientDto).ConfigureAwait(false); return StatusCode(response.StatusCode, response); } [HttpDelete("{id}")] public async Task> DeletePatientProfile(Guid id) { var handler = new PatientProfileHandler(_patientRepository, _hashingAlgorithms); var response = await handler.HandleDelete(id).ConfigureAwait(false); return StatusCode(response.StatusCode, response); } }