Files
codecanyon-rest-api-for-per…/api/models/REST_model.php
2025-10-29 11:09:43 +01:00

404 lines
16 KiB
PHP

<?php
defined('BASEPATH') or exit('No direct script access allowed');
class REST_model extends App_Model
{
/**
* Token
*/
protected $CI;
/**
* Token
*/
protected $token;
public function __construct()
{
parent::__construct();
$this->load->config('api');
$this->load->config('rest');
$this->load->library('Authorization_Token');
if (!$this->db->table_exists(db_prefix() . $this->config->item('rest_keys_table'))) {
$this->db->query('CREATE TABLE `' . db_prefix() . $this->config->item('rest_keys_table') . '` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user` VARCHAR(50) NOT NULL,
`name` VARCHAR(50) NOT NULL,
`token` VARCHAR(255) NOT NULL,
`expiration_date` DATETIME NULL,
`permission_enable` TINYINT(4) DEFAULT 0,
`quota_limit` INT(11) NOT NULL DEFAULT 1000,
`quota_remaining` INT(11) NOT NULL DEFAULT 1000,
`quota_reset` DATETIME NOT NULL,
`rate_limit` INT(11) NOT NULL DEFAULT 60,
`rate_remaining` INT(11) NOT NULL DEFAULT 60,
`rate_reset` DATETIME NOT NULL,
`level` INT(11) NULL,
`ignore_limits` INT(11) NULL,
PRIMARY KEY (`id`));
');
}
if (!$this->db->table_exists(db_prefix() . $this->config->item('rest_key_permissions_table'))) {
$this->db->query('CREATE TABLE `' . db_prefix() . $this->config->item('rest_key_permissions_table') . '` (
`key_id` int(11) NOT NULL,
`feature` varchar(50) NOT NULL,
`capability` varchar(50) NOT NULL);
');
}
if (!$this->db->table_exists(db_prefix() . $this->config->item('rest_key_limits_table'))) {
$this->db->query('CREATE TABLE `' . db_prefix() . $this->config->item('rest_key_limits_table') . '` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`key_id` INT(11) NOT NULL,
`uri` VARCHAR(511) NOT NULL,
`class` VARCHAR(511) NOT NULL,
`method` VARCHAR(511) NOT NULL,
`ip_address` VARCHAR(63) NOT NULL,
`time` DATETIME NOT NULL,
`error` VARCHAR(63) NULL,
PRIMARY KEY (`id`));
');
}
}
public function get_permissions($id = '', $feature = '', $capability = '')
{
$this->db->select('*');
if ('' != $id) {
$this->db->where('key_id', $id);
if ('' != $feature) {
$this->db->where('feature', $feature);
}
if ('' != $capability) {
$this->db->where('capability', $capability);
}
return $this->db->get(db_prefix() . $this->config->item('rest_key_permissions_table'))->result_array();
}
return [];
}
public function set_permissions($id, $permissions)
{
if ('' != $id) {
if ($permissions) {
foreach ($permissions as $feauture => $capabilities) {
foreach ($capabilities as $capability) {
if (!$this->get_permissions($id, $feauture, $capability)) {
$this->add_permissions($id, $feauture, $capability);
}
}
$feature_permissions = $this->get_permissions($id, $feauture);
foreach ($feature_permissions as $feature_permission) {
if (!in_array($feature_permission['capability'], array_values($capabilities))) {
$this->remove_permissions($id, $feauture, $feature_permission['capability']);
}
}
}
}
$api_permissions = $this->get_permissions($id);
foreach ($api_permissions as $permission) {
$permission_exist = true;
if (isset($permissions[$permission['feature']])) {
$permission_exist = false;
foreach ($permissions[$permission['feature']] as $capability) {
if ($capability == $permission['capability']) {
$permission_exist = true;
}
}
} else {
$permission_exist = false;
}
if (!$permission_exist) {
$this->remove_permissions($id, $permission['feature'], $permission['capability']);
}
}
}
}
public function add_permissions($id = '', $feature = '', $capability = '')
{
$permissions = [];
if ('' != $id) {
if ('' != $feature) {
$api_permissions = get_available_api_permissions();
foreach ($api_permissions as $api_feature => $api_permission) {
if ($api_feature == $feature) {
foreach ($api_permission['capabilities'] as $api_capability => $name) {
if ('' != $capability) {
if ($api_capability == $capability) {
$permissions[] = [
'key_id' => $id,
'feature' => $feature,
'capability' => $api_capability,
];
}
} else {
$permissions[] = [
'key_id' => $id,
'feature' => $feature,
'capability' => $api_capability,
];
}
}
}
}
}
}
foreach ($permissions as $permission) {
$this->db->insert(db_prefix() . $this->config->item('rest_key_permissions_table'), $permission);
if ($this->db->affected_rows() > 0) {
log_activity('New API Permssion Added [API ID: ' . $permission['key_id'] . ', Feature: ' . $permission['feature'] . ', Capability: ' . $permission['capability'] . ']');
}
}
}
public function remove_permissions($id = '', $feature = '', $capability = '')
{
if ('' != $id) {
$this->db->where('key_id', $id);
if ('' != $feature) {
$this->db->where('feature', $feature);
}
if ('' != $capability) {
$this->db->where('capability', $capability);
}
$this->db->delete(db_prefix() . $this->config->item('rest_key_permissions_table'));
if ($this->db->affected_rows() > 0) {
log_activity('API Permssion Deleted [API ID: ' . $id . ', Feature: ' . $feature . ', Capability: ' . $capability . ']');
return true;
}
}
return false;
}
public function get_user($id = '')
{
$this->db->select('*');
if ('' != $id) {
$this->db->where('id', $id);
}
return $this->db->get(db_prefix() . $this->config->item('rest_keys_table'))->result_array();
}
public function add_user($data)
{
$permissions = isset($data['permissions']) ? $data['permissions'] : [];
unset($data['permissions']);
$payload = [
'user' => $data['user'],
'name' => $data['name'],
];
// Load Authorization Library or Load in autoload config file
// generate a token
$data['token'] = $this->authorization_koken->generateToken($payload);
$today = date('Y-m-d H:i:s');
$data['expiration_date'] = to_sql_date($data['expiration_date'], true);
$data['permission_enable'] = 1;
$this->db->insert(db_prefix() . $this->config->item('rest_keys_table'), $data);
$insert_id = $this->db->insert_id();
if ($insert_id) {
log_activity('New User Added [ID: ' . $insert_id . ', Name: ' . $data['name'] . ']');
}
$this->set_permissions($insert_id, $permissions);
return $insert_id;
}
public function update_user($data, $id)
{
$permissions = isset($data['permissions']) ? $data['permissions'] : [];
unset($data['permissions']);
$data['expiration_date'] = to_sql_date($data['expiration_date'], true);
$data['permission_enable'] = 1;
$this->db->where('id', $id);
$user = $this->db->get(db_prefix() . $this->config->item('rest_keys_table'))->row();
if (isset($user)) {
if ($user->quota_limit != $data['quota_limit']) {
$data['quota_remaining'] = $data['quota_limit'];
}
if ($user->qrate_limit != $data['rate_limit']) {
$data['rate_remaining'] = $data['rate_limit'];
}
}
$result = false;
$this->db->where('id', $id);
$this->db->update(db_prefix() . $this->config->item('rest_keys_table'), $data);
if ($this->db->affected_rows() > 0) {
log_activity('Ticket User Updated [ID: ' . $id . ' Name: ' . $data['name'] . ']');
$result = true;
}
$this->set_permissions($id, $permissions);
return $result;
}
public function delete_user($id)
{
$this->remove_permissions($id);
$this->db->where('id', $id);
$this->db->delete(db_prefix() . $this->config->item('rest_keys_table'));
if ($this->db->affected_rows() > 0) {
log_activity('User Deleted [ID: ' . $id . ']');
return true;
}
return false;
}
public function check_token($token)
{
$this->db->where('token', $token);
$user = $this->db->get(db_prefix() . $this->config->item('rest_keys_table'))->row();
if (isset($user)) {
return true;
}
return false;
}
public function check_token_permission($token, $feature = '', $capability = '')
{
$this->db->where('token', $token);
$user = $this->db->get(db_prefix() . $this->config->item('rest_keys_table'))->row();
if (isset($user)) {
if ($user->permission_enable) {
$this->db->where('key_id', $user->id);
$this->db->where('feature', $feature);
$this->db->where('capability', $capability);
$permission = $this->db->get(db_prefix() . $this->config->item('rest_key_permissions_table'))->row();
if (isset($permission)) {
return true;
}
} else {
return true;
}
}
return false;
}
public function statistics($period = 'hourly', $uri_method = '') {
$now = time();
$now_date = strtotime($now);
$current_week_day = date('w', $now);
$all_apis = [];
$chart = [
"labels" => [],
"datasets" => [
[
"label" => _l("success"),
"data" => [],
"borderColor" => "rgb(0, 255, 0)",
"backgroundColor" => "rgba(0, 255, 0, 0.1)"
],
[
"label" => _l("expiration_date"),
"data" => [],
"borderColor" => "rgb(200, 50, 100)",
"backgroundColor" => "rgba(200, 50, 100, 0.1)"
],
[
"label" => _l("quota_remaining"),
"data" => [],
"borderColor" => "rgb(200, 0, 200)",
"backgroundColor" => "rgba(200, 0, 200, 0.1)"
],
[
"label" => _l("rate_remaining"),
"data" => [],
"borderColor" => "rgb(200, 100, 0)",
"backgroundColor" => "rgba(200, 100, 0, 0.1)"
],
]
];
if ($period) {
if ($period == 'hourly') {
$period_total = 23;
} else if ($period == 'daily') {
$period_total = 30;
} else if ($period == 'weekly') {
$period_total = 3;
} else if ($period == 'monthly') {
$period_total = 11;
}
for ($period_index = $period_total; $period_index >= 0; $period_index--) {
if ($period == 'hourly') {
$chart["labels"][] = date('M d H', $now - $period_index * 60 * 60);
} else if ($period == 'daily') {
$chart["labels"][] = date('M d', $now - $period_index * 60 * 60 * 24);
} else if ($period == 'weekly') {
$chart["labels"][] = date('M d', $now - ($current_week_day - 1 + $period_index * 7) * 60 * 60 * 24) . " ~ " . date('M d', $now - ($current_week_day - 1 + ($period_index - 1) * 7 + 1) * 60 * 60 * 24);
} else if ($period == 'monthly') {
$chart["labels"][] = date('Y M', strtotime(date('Y-m-01', strtotime("$now_date -$period_index months"))));
}
foreach ($chart["datasets"] as $chart_dataset_index => $chart_dataset) {
$this->db->select("uri, method, time, COUNT(*) AS total, error");
if ($uri_method) {
$uri_methods = explode(" ", urldecode($uri_method));
$uri = $uri_methods[0];
$method = $uri_methods[1];
$this->db->where("uri", $uri);
$this->db->where("method", $method);
}
if ($chart_dataset["label"] == _l("success")) {
$this->db->where('error', NULL);
} else {
$this->db->where('error', $chart_dataset["label"]);
}
if ($period == 'hourly') {
$this->db->where('time >=', date('Y-m-d H', $now - $period_index * 60 * 60));
$this->db->where('time <', date('Y-m-d H', $now - ($period_index - 1) * 60 * 60));
} else if ($period == 'daily') {
$this->db->where('time >=', date('Y-m-d', $now - $period_index * 60 * 60 * 24));
$this->db->where('time <', date('Y-m-d', $now - ($period_index - 1) * 60 * 60 * 24));
} else if ($period == 'weekly') {
$this->db->where('time >=', date('Y-m-d', $now - ($current_week_day - 1 + $period_index * 7) * 60 * 60 * 24));
$this->db->where('time <', date('Y-m-d', $now - ($current_week_day - 1 + ($period_index - 1) * 7) * 60 * 60 * 24));
} else if ($period == 'monthly') {
$this->db->where('time >=', date('Y-m-01', strtotime("$now_date -$period_index months")));
$this->db->where('time <=', date('Y-m-t', strtotime("$now_date -$period_index months")));
}
$period_apis = $this->db->get(db_prefix() . $this->config->item('rest_key_limits_table'))->row();
$chart["datasets"][$chart_dataset_index]["data"][] = $period_apis->total;
}
}
}
echo json_encode($chart);
}
public function endpoints() {
$endpoints = [];
$this->db->select("CONCAT(uri, ' ', method) as uri_method");
$this->db->group_by("uri_method");
$endpoint_apis = $this->db->get(db_prefix() . $this->config->item('rest_key_limits_table'))->result_array();
foreach ($endpoint_apis as $endpoint_api) {
$endpoints[] = $endpoint_api["uri_method"];
}
return $endpoints;
}
}