2023-10-22 01:46:22 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
class Model {
|
|
|
|
public $data;
|
|
|
|
public $id = false;
|
|
|
|
public $redis;
|
|
|
|
|
|
|
|
function __construct()
|
|
|
|
{
|
|
|
|
//redis
|
|
|
|
if ($GLOBALS['redis'])
|
|
|
|
$this->redis = $GLOBALS['redis'];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Magic getter function
|
|
|
|
*
|
|
|
|
* @param $name Variable name
|
|
|
|
*
|
|
|
|
* @return mixed
|
|
|
|
*/
|
|
|
|
public function __get($name)
|
|
|
|
{
|
|
|
|
if (isset($this->data[$name]))
|
|
|
|
return $this->data[$name];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Magic setter function
|
|
|
|
*
|
|
|
|
* @return mixed
|
|
|
|
*/
|
|
|
|
public function __set($name, $value)
|
|
|
|
{
|
|
|
|
$this->data[$name] = $value;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getDBFields()
|
|
|
|
{
|
|
|
|
return $this->dbFields;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns all data fields but removes filtered datapoints like passwords, etc
|
|
|
|
*/
|
|
|
|
public function getDataFiltered()
|
|
|
|
{
|
|
|
|
$data = $this->data;
|
|
|
|
if(is_array($this->hidden))
|
|
|
|
foreach($this->hidden as $secretfield)
|
|
|
|
unset($data[$secretfield]);
|
|
|
|
foreach($this->dbFields as $field=>$options)
|
|
|
|
if($options['type']=='csv')
|
|
|
|
$data[$field] = ($data[$field]?explode(';',$data[$field]):[]);
|
|
|
|
return $data;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function save()
|
|
|
|
{
|
2023-10-22 23:05:24 +02:00
|
|
|
if (!$this->id)
|
|
|
|
$this->id = gen_ulid();
|
2023-10-22 01:46:22 +02:00
|
|
|
if (!$this->validate())
|
|
|
|
return false;
|
|
|
|
foreach($this->dbFields as $field=>$options)
|
|
|
|
{
|
|
|
|
if(isset($this->data[$field]))
|
2023-10-22 23:05:24 +02:00
|
|
|
{
|
|
|
|
if($options['type']=='array')
|
|
|
|
$GLOBALS['redis']->hset($this->dbTable.':'.$this->id,$field,json_encode($this->data[$field]));
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$GLOBALS['redis']->hset($this->dbTable.':'.$this->id,$field,$this->data[$field]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-22 01:46:22 +02:00
|
|
|
}
|
2023-10-22 23:05:24 +02:00
|
|
|
|
|
|
|
return $this->id;
|
2023-10-22 01:46:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public function load($id)
|
|
|
|
{
|
|
|
|
$this->id = $id;
|
2023-10-22 23:05:24 +02:00
|
|
|
if(!$GLOBALS['redis']->exists($this->dbTable.':'.$this->id))
|
2023-10-23 10:00:19 +02:00
|
|
|
throw new Exception($this->dbTable.':'.$this->id.' not found');
|
2023-10-22 01:46:22 +02:00
|
|
|
$keys = array_keys($this->dbFields);
|
|
|
|
|
|
|
|
foreach($keys as $key)
|
|
|
|
{
|
2023-10-22 23:05:24 +02:00
|
|
|
$value = $GLOBALS['redis']->hget($this->dbTable.':'.$this->id,$key);
|
2023-10-22 01:46:22 +02:00
|
|
|
|
|
|
|
if($value!==NULL) //we'll leave null values
|
2023-10-22 23:05:24 +02:00
|
|
|
switch($this->dbFields[$key]['type'])
|
|
|
|
{
|
|
|
|
case 'int': $value = intval($value);break;
|
|
|
|
case 'bool': $value = boolval($value);break;
|
|
|
|
case 'float': $value = floatval($value);break;
|
|
|
|
case 'double': $value = doubleval($value);break;
|
|
|
|
case 'array':
|
|
|
|
$value = json_decode($value,true);
|
|
|
|
if($value===null)
|
|
|
|
$value = [];
|
|
|
|
break;
|
|
|
|
}
|
2023-10-22 01:46:22 +02:00
|
|
|
$this->data[$key] = $value;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param array $data
|
|
|
|
*/
|
|
|
|
private function validate()
|
|
|
|
{
|
|
|
|
if (!$this->dbFields)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
$data = $this->data;
|
|
|
|
|
|
|
|
foreach ($this->dbFields as $key => $options) {
|
|
|
|
$type = null;
|
|
|
|
$required = false;
|
|
|
|
|
|
|
|
if(in_array('autoupdate',$options))
|
|
|
|
$this->data[$key] = NULL;
|
|
|
|
|
|
|
|
if (isset($data[$key]))
|
|
|
|
$value = $data[$key];
|
|
|
|
else
|
|
|
|
$value = null;
|
|
|
|
|
|
|
|
if (is_array($value))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (isset($desc[0]))
|
|
|
|
$type = $desc[0];
|
|
|
|
if (in_array('required',$options))
|
|
|
|
$required = true;
|
|
|
|
|
|
|
|
if($value===null && $options['autoValMethod'])
|
|
|
|
{
|
|
|
|
if(method_exists($this,$options['autoValMethod']))
|
|
|
|
$value = $this->{$options['autoValMethod']}();
|
|
|
|
else if(function_exists($options['autoValMethod']))
|
|
|
|
$value = $options['autoValMethod']();
|
|
|
|
else
|
|
|
|
$value = null;
|
|
|
|
$this->data[$key] = $value;
|
|
|
|
}
|
|
|
|
|
|
|
|
if($options['default']!==null && $value===null)
|
|
|
|
$value = $options['default'];
|
|
|
|
|
|
|
|
if ($required && strlen($value) == 0) {
|
|
|
|
throw new Exception($this->dbTable . "." . $key . " is required");
|
|
|
|
}
|
|
|
|
if ($value == null)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
switch ($type) {
|
|
|
|
case 'email':
|
|
|
|
$regexp = null;
|
|
|
|
if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
|
|
|
|
throw new Exception("$type validation failed");
|
|
|
|
}
|
|
|
|
break;
|
2023-10-22 23:05:24 +02:00
|
|
|
case 'array':
|
|
|
|
if(!is_array($value))
|
|
|
|
throw new Exception('Dogs validation failed');
|
|
|
|
break;
|
2023-10-22 01:46:22 +02:00
|
|
|
case 'csv':
|
|
|
|
case "text":
|
|
|
|
$regexp = null;
|
|
|
|
break;
|
|
|
|
case "int":
|
|
|
|
$regexp = "/^[0-9]*$/";
|
|
|
|
break;
|
|
|
|
case "double":
|
|
|
|
$regexp = "/^[0-9\.]*$/";
|
|
|
|
break;
|
|
|
|
case "bool":
|
|
|
|
$regexp = '/^(yes|no|0|1|true|false)$/i';
|
|
|
|
break;
|
|
|
|
case "datetime":
|
|
|
|
$regexp = "/^[0-9a-zA-Z -:]*$/";
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
$regexp = $type;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (!$regexp)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (!preg_match($regexp, $value)) {
|
|
|
|
throw new Exception("$type validation failed");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
function delete()
|
|
|
|
{
|
2023-10-22 23:05:24 +02:00
|
|
|
return $GLOBALS['redis']->del($this->dbTable.':'.$this->id);
|
2023-10-22 01:46:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function gen_shorthash(){
|
|
|
|
return substr(uniqid(),-7);
|
|
|
|
}
|
|
|
|
|
|
|
|
function getDateTime($time=false)
|
|
|
|
{
|
|
|
|
return date('Y-m-d H:i:s',($time?$time:time()));
|
|
|
|
}
|
|
|
|
}
|