doctor_controller

This commit is contained in:
Sayan Das 2026-03-30 19:16:52 +05:30
parent a3f7ff19e6
commit ecee841fbc

138
app/Controllers/Doctor.php Normal file
View File

@ -0,0 +1,138 @@
<?php
namespace App\Controllers;
use App\Models\AppointmentModel;
use App\Models\DoctorModel;
use CodeIgniter\HTTP\RedirectResponse;
class Doctor extends BaseController
{
public function dashboard()
{
if ($r = $this->requireRole('doctor')) {
return $r;
}
$db = \Config\Database::connect();
$userId = (int) session()->get('id');
$doctorModel = new DoctorModel();
$doctor = $doctorModel->where('user_id', $userId)->first();
if (! $doctor) {
return redirect()->to(site_url('/'))->with('error', 'Doctor profile not found.');
}
$doctorId = (int) $doctor['id'];
$query = $db->query('
SELECT a.*, u.name as patient_name
FROM appointments a
JOIN patients p ON p.id = a.patient_id
JOIN users u ON u.id = p.user_id
WHERE a.doctor_id = ?
', [$doctorId]);
$data['appointments'] = $query->getResult();
return view('doctor/dashboard', $data);
}
public function profile()
{
if ($r = $this->requireRole('doctor')) {
return $r;
}
$doctorModel = new DoctorModel();
$userId = (int) session()->get('id');
$doctor = $doctorModel->where('user_id', $userId)->first();
if (! $doctor) {
return redirect()->to(site_url('/'))->with('error', 'Doctor profile not found.');
}
if ($this->request->is('post')) {
$rules = [
'specialization' => 'required|min_length[2]|max_length[191]',
'experience' => 'permit_empty|max_length[100]',
'fees' => 'permit_empty|decimal',
'available_from' => 'permit_empty',
'available_to' => 'permit_empty',
];
if (! $this->validate($rules)) {
return redirect()->back()->withInput();
}
$update = [
'specialization' => $this->request->getPost('specialization'),
'experience' => $this->request->getPost('experience') ?: null,
'fees' => $this->request->getPost('fees') !== '' && $this->request->getPost('fees') !== null
? $this->request->getPost('fees')
: null,
'available_from' => $this->request->getPost('available_from') ?: null,
'available_to' => $this->request->getPost('available_to') ?: null,
];
if (! $doctorModel->update($doctor['id'], $update)) {
return redirect()->back()->withInput()->with('error', 'Could not update profile.');
}
return redirect()->to(site_url('doctor/profile'))->with('success', 'Profile updated.');
}
return view('doctor/profile', ['doctor' => $doctor]);
}
public function accept($id): RedirectResponse
{
if ($r = $this->requireRole('doctor')) {
return $r;
}
if (! $this->request->is('post')) {
return redirect()->to(site_url('doctor/dashboard'))->with('error', 'Invalid request.');
}
return $this->updateAppointmentStatus((int) $id, 'approved');
}
public function reject($id): RedirectResponse
{
if ($r = $this->requireRole('doctor')) {
return $r;
}
if (! $this->request->is('post')) {
return redirect()->to(site_url('doctor/dashboard'))->with('error', 'Invalid request.');
}
return $this->updateAppointmentStatus((int) $id, 'rejected');
}
private function updateAppointmentStatus(int $appointmentId, string $status): RedirectResponse
{
if ($appointmentId < 1) {
return redirect()->back();
}
$appointmentModel = new AppointmentModel();
$doctorModel = new DoctorModel();
$userId = (int) session()->get('id');
$doctor = $doctorModel->where('user_id', $userId)->first();
if (! $doctor) {
return redirect()->to(site_url('/'))->with('error', 'Doctor profile not found.');
}
$appointment = $appointmentModel->find($appointmentId);
if (! $appointment || (int) $appointment['doctor_id'] !== (int) $doctor['id']) {
return redirect()->back()->with('error', 'Invalid appointment.');
}
$appointmentModel->update($appointmentId, ['status' => $status]);
return redirect()->back()->with('success', 'Appointment updated.');
}
}