using Application.Endpoints; using Application.Endpoints.Doctors.Login; using Application.Endpoints.Doctors.Profile; using Application.Endpoints.Doctors.Registration; using Application.Endpoints.Doctors.ResetPassword; using Application.Services.Database.MongoDB; using Application.Services.Database.PostgreSQL; using Application.Services.HashingAlgorithms; using Application.Services.Jwt; using Core.Entities; using Microsoft.AspNetCore.Mvc; namespace API.Controllers; [ApiController] [Route("api/[controller]")] public class DoctorsController : ControllerBase { private readonly IAppointmentsMongoDbService _appointmentsMongoDbService; private readonly IDoctorRepository _database; private readonly IHashingAlgorithms _hashingAlgorithms; private readonly IJwtService _jwtService; public DoctorsController(IDoctorRepository database, IHashingAlgorithms hashingAlgorithms, IJwtService jwtService, IAppointmentsMongoDbService appointmentsMongoDbService) { _database = database; _hashingAlgorithms = hashingAlgorithms; _jwtService = jwtService; _appointmentsMongoDbService = appointmentsMongoDbService; } [HttpPost("register")] public async Task> Register(DoctorRegistrationDto doctorRegistrationDto) { var handler = new DoctorRegistrationHandler(_database, _hashingAlgorithms); var response = await handler.Handle(doctorRegistrationDto).ConfigureAwait(false); return StatusCode(response.StatusCode, response); } [HttpPost("login")] public async Task> Login(DoctorLoginDto doctorLoginDto) { var handler = new DoctorLoginHandler(_database, _hashingAlgorithms); var response = await handler.Handle(doctorLoginDto).ConfigureAwait(false); /* if (response.Data != null) { Doctor doctor = (Doctor)response.Data; var authToken = _jwtService.GenerateJwtToken(doctor.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 }); var newToken = _jwtService.RefreshToken(oldToken); return StatusCode(HttpStatusCodes.OK, new BaseResponse { StatusCode = HttpStatusCodes.OK, Message = "Token refreshed successfully.", Data = new { Token = newToken } }); } [HttpPost("reset_password")] public async Task> ResetPassword(DoctorResetPasswordDto resetDoctorDto) { var handler = new DoctorResetPasswordHandler(_database, _hashingAlgorithms); var response = await handler.Handle(resetDoctorDto).ConfigureAwait(false); return StatusCode(response.StatusCode, response); } [HttpGet] public async Task> GetAllDoctors() { var handler = new DoctorProfileHandler(_database, _hashingAlgorithms); var response = await handler.HandleGetAll(); return StatusCode(response.StatusCode, response); } [HttpGet("{id}")] public async Task> GetDoctor(Guid id) { var handler = new DoctorProfileHandler(_database, _hashingAlgorithms); var response = await handler.HandleGet(id); return StatusCode(response.StatusCode, response); } [HttpPut] public async Task> UpdateDoctorProfile(DoctorProfileUpdateDto doctorUpdateDto) { var handler = new DoctorProfileHandler(_database, _hashingAlgorithms); var response = await handler.HandleUpdate(doctorUpdateDto).ConfigureAwait(false); return StatusCode(response.StatusCode, response); } [HttpDelete("{id}")] public async Task> DeleteDoctorProfile(Guid id) { var handler = new DoctorProfileHandler(_database, _hashingAlgorithms); var response = await handler.HandleDelete(id).ConfigureAwait(false); if (response.StatusCode < HttpStatusCodes.BadRequest) DeleteDoctorAppointments(id); return StatusCode(response.StatusCode, response); } private async void DeleteDoctorAppointments(Guid doctorId) { var criteria = new List<(string FieldName, string Value)> { ("DoctorId", doctorId.ToString()) }; var appointments = await _appointmentsMongoDbService.FindAsync(criteria); if (!appointments.Any()) return; await _appointmentsMongoDbService.DeleteByIdAsync(appointments[0].Id); } }