2019-01-13 13:06:32 +00:00
|
|
|
<?php
|
|
|
|
namespace AirQuality;
|
|
|
|
|
|
|
|
class Validator {
|
|
|
|
private $target_data;
|
|
|
|
private $tests = [];
|
|
|
|
|
|
|
|
public function __construct($in_target_data) {
|
|
|
|
$this->target_data = $in_target_data;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function exists($key) {
|
|
|
|
$this->add_test(
|
|
|
|
$key,
|
|
|
|
function($data) { return isset($data); },
|
|
|
|
400,
|
|
|
|
"Error: The field $key wasn't found in your request."
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function is_numberish($key) {
|
|
|
|
$this->add_test(
|
|
|
|
$key,
|
|
|
|
function($data) { return is_numeric($data); },
|
|
|
|
400,
|
|
|
|
"Error: The field $key in your request isn't a number."
|
|
|
|
);
|
|
|
|
}
|
|
|
|
public function is_min_length($key, $min_length) {
|
|
|
|
$this->add_test(
|
|
|
|
$key,
|
|
|
|
function($data) use ($min_length) { return mb_strlen($data) >= $min_length; },
|
|
|
|
400,
|
|
|
|
"Error: The field $key is too short - it must be a minimum of $min_length characters."
|
|
|
|
);
|
|
|
|
}
|
|
|
|
public function is_max_length($key, $max_length) {
|
|
|
|
$this->add_test(
|
|
|
|
$key,
|
|
|
|
function($data) use ($max_length) { return mb_strlen($data) <= $max_length; },
|
|
|
|
400,
|
|
|
|
"Error: The field $key is too long - it must be a maximum of $max_length characters."
|
|
|
|
);
|
|
|
|
}
|
2019-02-24 16:55:33 +00:00
|
|
|
public function is_preset_value(string $key, array $values, int $error_code) {
|
|
|
|
$this->add_test(
|
|
|
|
$key,
|
|
|
|
function($data) use ($values) {
|
|
|
|
return in_array($data, $values);
|
|
|
|
},
|
|
|
|
$error_code,
|
|
|
|
"Error: The value for the field $key is not valid. Valid values: " . implode(", ", $values) . "."
|
|
|
|
);
|
|
|
|
}
|
2019-01-13 13:06:32 +00:00
|
|
|
|
|
|
|
public function are_equal($key_a, $key_b, $message) {
|
|
|
|
$key_b_data = $this->target_data[$key_b];
|
|
|
|
$this->add_test(
|
|
|
|
$key_a,
|
|
|
|
function($data) use($key_b_data) {
|
|
|
|
return $data === $key_b_data;
|
|
|
|
},
|
|
|
|
400,
|
|
|
|
$message
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function matches_regex($key, $regex, $message) {
|
|
|
|
$this->add_test(
|
|
|
|
$key,
|
|
|
|
function($data) use($regex) {
|
|
|
|
return preg_match($regex, $data) === 1;
|
|
|
|
},
|
|
|
|
400,
|
|
|
|
$message
|
|
|
|
);
|
|
|
|
}
|
2019-01-15 15:46:24 +00:00
|
|
|
|
2019-01-13 13:06:32 +00:00
|
|
|
|
2019-01-14 20:41:25 +00:00
|
|
|
public function is_datetime($key) {
|
|
|
|
$this->add_test(
|
|
|
|
$key,
|
|
|
|
function($data) {
|
|
|
|
return strtotime($data) !== false;
|
|
|
|
},
|
|
|
|
400,
|
|
|
|
"The datetime provided in the '$key' parameter is invalid."
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2019-01-13 13:06:32 +00:00
|
|
|
public function add_test($key, $test, $response_code, $message) {
|
|
|
|
$new_test = [
|
|
|
|
"key" => $key,
|
|
|
|
"test" => $test,
|
|
|
|
"response_code" => $response_code,
|
|
|
|
"message" => $message
|
|
|
|
];
|
|
|
|
|
|
|
|
$this->tests[] = $new_test;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function send_error($code, $message) {
|
|
|
|
http_response_code($code);
|
|
|
|
header("content-type: text/plain");
|
|
|
|
exit($message);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function run() {
|
|
|
|
foreach($this->tests as $test) {
|
|
|
|
|
|
|
|
if(!isset($this->target_data[$test["key"]]) || !$test["test"]($this->target_data[$test["key"]])) {
|
|
|
|
$this->send_error($test["response_code"], $test["message"]);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|