Viewing File: /home/assersoft/public_html/audiogramnew/app/Controllers/UsersController.php
<?php
namespace App\Controllers;
require_once APPPATH . 'Helpers/TokenGenerator.php';
use App\Models\ClinicsModel;
use App\Models\SubscriptionsModel;
use App\Validation\ClinicRules;
use App\Validation\UserRules;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\RESTful\ResourceController;
use Exception;
use TokenGenerator;
class UsersController extends ResourceController
{
protected $modelName = 'App\Models\UsersModel';
protected $format = 'json';
// protected $rules = new UserRules();
// protected $clinicRules = new ClinicRules();
// protected $clinicModel = new ClinicsModel();
/**
* Return an array of resource objects, themselves in array format.
*
* @return ResponseInterface
*/
public function index()
{
$clinicRules = new ClinicRules();
if(!$this->validate($clinicRules->clinicId)) {
return $this->fail($this->validator->getErrors());
}
$data = $this->model->where('clinic_id', $this->request->getVar('clinic_id'))->findAll();
foreach ($data as &$user) {
unset($user['password']);
}
return $this->respond($data);
}
/**
* Return the properties of a resource object.
*
* @param int|string|null $id
*
* @return ResponseInterface
*/
public function show($id = null)
{
if($id === null) {
return $this->failNotFound("User ID not found");
}
$data = $this->model->find($id);
if ($data == null) {
return $this->failNotFound("User not found");
}
unset($data['password']);
return $this->respond($data);
}
/**
* Create a new resource object, from "posted" parameters.
*
* @return ResponseInterface
*/
public function create()
{
$rules = new UserRules();
if(!$this->validate($rules->createUser)) {
return $this->failValidationErrors($this->validator->getErrors());
}
$data = (array) $this->request->getVar();
$data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
$this->model->insert($data);
$userId = $this->model->getInsertID();
if(!$userId) {
return $this->fail('Failed to create user');
}
return $this->respondCreated($userId);
}
/**
* Add or update a model resource, from "posted" properties.
*
* @param int|string|null $id
*
* @return ResponseInterface
*/
public function update($id = null)
{
if($id === null) {
return $this->failNotFound("User ID not found");
}
$rules = new UserRules();
if(!$this->validate($rules->updateUser)) {
return $this->fail($this->validator->getErrors());
}
$data = $this->request->getVar();
if (isset($data['password'])) {
$data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
}
$user = $this->model->find($id);
if ($user == null) {
return $this->failNotFound("User not found");
}
$user = $this->model->update($id, $data);
if(!$user) {
return $this->fail('Failed to update user');
}
return $this->respondUpdated($user);
}
/**
* Delete the designated resource object from the model.
*
* @param int|string|null $id
*
* @return ResponseInterface
*/
public function delete($id = null)
{
if($id === null) {
return $this->failNotFound("User ID not found");
}
$user = $this->model->find($id);
if ($user == null) {
return $this->failNotFound("User not found");
}
$user = $this->model->delete($id);
if(!$user) {
return $this->fail('Failed to delete user');
}
return $this->respondDeleted($user);
}
public function register() {
$rules = new UserRules();
if(!$this->validate($rules->register)) {
return $this->failValidationErrors($this->validator->getErrors());
}
$data = $this->request->getJSON();
$clinicData = (array) $data->clinicData;
$clinicData['subscription_status'] = 1;
$subscriptionData = [
'subscription_end_date' => date('Y-m-d', strtotime('+1 month')),
'subscription_start_date' => date('Y-m-d'),
'subscription_fees' => 0.00,
'subscription_days' => 30
];
$userData = (array) $data->userData;
$clinicModel = new ClinicsModel();
$clinicId = $clinicModel->insert($clinicData);
if (!$clinicId) {
return $this->fail($clinicModel->errors());
}
$subscriptionData['clinic_id'] = $clinicId;
$subscriptionModel = new SubscriptionsModel();
if (!$subscriptionModel->insert($subscriptionData)) {
return $this->fail($subscriptionModel->errors());
}
$subscriptionId = $subscriptionModel->getInsertID();
$userData['clinic_id'] = $clinicId;
$userData['usertype'] = 'admin';
$userData['password'] = password_hash($userData['password'], PASSWORD_DEFAULT);
if(!$this->model->insert($userData)) {
return $this->fail($this->model->errors());
}
$userId = $this->model->getInsertID();
// send email with credentials.
$loginPath = env('APP_URL') . '/login';
$message = "Thanks for registering your clinic.\n
Your username is {$clinicId}_{$userData['username']}\n
Your password is {$userData['password']}\n
Please use this username to login at $loginPath .\n
Note: Please dont share your credentials with anyone.";
$email = \Config\Services::email();
$email->setTo($userData['email']);
$email->setSubject('Registration Completed');
$email->setMessage($message);
// $email->send();
if (!$email->send()) {
// return $this->fail($email->printDebugger());
return $this->fail(['error' => 'Failed to send email', 'debug' => $email->printDebugger()]);
}
return $this->respondCreated($userId);
}
public function login()
{
try {
$rules = new UserRules();
if(!$this->validate($rules->login)) {
return $this->failValidationErrors($this->validator->getErrors());
}
$data = (array) $this->request->getJSON();
$user = $this->model->join('clinics', 'clinics.clinic_id = users.clinic_id')
->select('users.*, clinics.clinic_name, clinics.clinic_id')
->where('clinics.clinic_id', $data['clinic_id'])
->where('users.username', $data['username'])
->first();
if (!$user) {
return $this->failNotFound("User not found");
}
if (!password_verify($data['password'], $user['password'])) {
return $this->failUnauthorized('Invalid password');
}
$clinicModel = new ClinicsModel();
$subscriptionModel = new SubscriptionsModel();
$clinicData = $clinicModel->find($user['clinic_id']);
if (!$clinicData) {
return $this->failNotFound("Clinic not found");
}
$latestSubscription = $subscriptionModel
->where('clinic_id', $user['clinic_id'])
->orderBy('subscription_end_date', 'DESC')
->first();
if (!$latestSubscription) {
$clinicModel->update($user['clinic_id'], ['subscription_status' => 0]);
return $this->failForbidden("No active subscription found.");
}
$currentDate = date('Y-m-d');
$status = (strtotime($latestSubscription['subscription_end_date']) >= strtotime($currentDate)) ? 1 : 0;
if ($clinicData['subscription_status'] !== $status) {
$clinicModel->update($user['clinic_id'], ['subscription_status' => $status]);
}
if ($status === 0) {
return $this->failForbidden("Subscription expired.");
}
$token = TokenGenerator::generate($user['username'], $user['usertype']);
$this->response->setCookie('token', $token, 86400 * 30);
unset($user['password']);
$user['clinic_name'] = $clinicData['clinic_name'];
} catch (\Exception $e) {
return $this->failServerError($e->getMessage());
}
return $this->respond($user);
}
public function logout()
{
$this->response->setCookie('token', '', time() - 3600);
return $this->respond('User logged out');
}
public function isLoggedIn() {
$token = $this->request->getCookie('token');
if(!$token) {
return $this->failForbidden('No token provided');
}
try {
$decoded = TokenGenerator::verify($token);
if (!$decoded) {
$this->failForbidden('Invalid or expired token');
return;
}
return $this->respond($decoded);
} catch (Exception $e) {
return $this->failServerError('Invalid token');
}
}
}
Back to Directory
File Manager