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