- ReqHandler added
- interface reworked
This commit is contained in:
parent
356615c70b
commit
e6aadf0a5c
139
class/ReqHandler.php
Normal file
139
class/ReqHandler.php
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
// response types
|
||||||
|
const RESP_NONE = "none";
|
||||||
|
const RESP_PLAIN = "plain";
|
||||||
|
const RESP_JSON = "json";
|
||||||
|
|
||||||
|
// Request Handler Assignment class
|
||||||
|
// Members get populated when instantiated by ReqHandler;
|
||||||
|
// should not be used outside ReqHandler
|
||||||
|
class ReqHandlerAssignment
|
||||||
|
{
|
||||||
|
// members
|
||||||
|
public string $action; // action string
|
||||||
|
public array $params; // request parameters
|
||||||
|
public string $handler; // handler function
|
||||||
|
public string $hint; // human-readable hint about what this action performs
|
||||||
|
public string $level; // required command authentication level
|
||||||
|
public string $resp_type; // response type
|
||||||
|
public ReqHandler $rh; // reference to request handler
|
||||||
|
|
||||||
|
function __construct(string $action, array $params, string $level, string $handler, string $resp_type, string $hint, ReqHandler &$rh)
|
||||||
|
{
|
||||||
|
$this->action = $action;
|
||||||
|
$this->params = $params;
|
||||||
|
$this->level = $level;
|
||||||
|
$this->handler = $handler;
|
||||||
|
$this->resp_type = $resp_type;
|
||||||
|
$this->hint = $hint;
|
||||||
|
$this->rh = &$rh; // assign be reference
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Request Handler class
|
||||||
|
class ReqHandler
|
||||||
|
{
|
||||||
|
private array $mapping; // action-handler mapping
|
||||||
|
private array $request; // reference to $_REQUEST
|
||||||
|
private array $files; // reference to $_FILES
|
||||||
|
private string $level; // max privilege level
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
// create reference bindings
|
||||||
|
$this->request = &$_REQUEST;
|
||||||
|
$this->files = &$_FILES;
|
||||||
|
|
||||||
|
$this->mapping = [PRIVILEGE_NONE => [], PRIVILEGE_PLAYER => [], PRIVILEGE_CREATOR => [], PRIVILEGE_QUIZMASTER => []]; // create assignment categories
|
||||||
|
$this->level = PRIVILEGE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add new handler
|
||||||
|
function add(string|array $actions, array $params, string $level, string $handler, string $resp_type, string $hint): bool
|
||||||
|
{
|
||||||
|
// convert single actions to array
|
||||||
|
$actions = is_string($actions) ? [$actions] : $actions;
|
||||||
|
|
||||||
|
// cannot assign more than one handler to the same action
|
||||||
|
foreach ($actions as $action) {
|
||||||
|
if (in_array($action, $this->mapping[$level])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create the assignment object
|
||||||
|
$assignment = new ReqHandlerAssignment($action, $params, $level, $handler, $resp_type, $hint, $this);
|
||||||
|
$this->mapping[$level][$action] = $assignment;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ACTION_KEY = "action";
|
||||||
|
|
||||||
|
// Process possible pending request. Also check access privilege.
|
||||||
|
function process(string $level = null, string $action_key = self::ACTION_KEY) : array {
|
||||||
|
// get action
|
||||||
|
$action = $this->request[$action_key] ?? "";
|
||||||
|
|
||||||
|
// don't process empty actions
|
||||||
|
if (trim($action) === "") {
|
||||||
|
return ["", false];
|
||||||
|
}
|
||||||
|
|
||||||
|
// if privilege level is specified, then store
|
||||||
|
$this->level = $level ?? $this->level;
|
||||||
|
|
||||||
|
$resp = "";
|
||||||
|
$success = false;
|
||||||
|
|
||||||
|
// look up action
|
||||||
|
$categories = array_keys($this->mapping);
|
||||||
|
$highest_category_index = array_search($this->level, $categories);
|
||||||
|
for ($i = 0; ($i < count($categories)) && ($i <= $highest_category_index); $i++) {
|
||||||
|
// get category
|
||||||
|
$category = &$this->mapping[$categories[$i]];
|
||||||
|
|
||||||
|
// find the command level category that includes this action
|
||||||
|
if (array_key_exists($action, $category)) {
|
||||||
|
// get assignment
|
||||||
|
$assignment = &$category[$action];
|
||||||
|
|
||||||
|
// check that all required parameters were passed
|
||||||
|
$all_params_passed = true;
|
||||||
|
foreach ($assignment->params as $param) {
|
||||||
|
$all_params_passed &= array_key_exists($param, $this->request);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if params were provided, then invoke the callback
|
||||||
|
if ($all_params_passed) {
|
||||||
|
$handler = $assignment->handler;
|
||||||
|
$raw_resp = $handler($this, $this->request);
|
||||||
|
|
||||||
|
// convert response to preset response type
|
||||||
|
if ($assignment->resp_type !== RESP_NONE) { // if command returns with anything at all
|
||||||
|
if ($assignment->resp_type === RESP_JSON) { // JSON
|
||||||
|
$resp = json_encode($raw_resp);
|
||||||
|
} else if ($assignment->resp_type === RESP_PLAIN) { // PLAIN
|
||||||
|
$resp = $raw_resp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// processing successful
|
||||||
|
$success = true;
|
||||||
|
|
||||||
|
break; // break the loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return [$resp, $success];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set access privilege level
|
||||||
|
function set_privilege_level(string $level) {
|
||||||
|
$this->level = $level;
|
||||||
|
}
|
||||||
|
}
|
952
interface.php
952
interface.php
File diff suppressed because it is too large
Load Diff
@ -38,6 +38,10 @@
|
|||||||
width: calc(100vw - 3em);
|
width: calc(100vw - 3em);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
section.answer label {
|
||||||
|
max-width: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
section#infobox {
|
section#infobox {
|
||||||
top: unset;
|
top: unset;
|
||||||
left: 0;
|
left: 0;
|
||||||
|
@ -7,6 +7,7 @@ require_once "controller.php";
|
|||||||
|
|
||||||
$userdb = new \SleekDB\Store(USERDB, DATADIR, ["timeout" => false]);
|
$userdb = new \SleekDB\Store(USERDB, DATADIR, ["timeout" => false]);
|
||||||
|
|
||||||
|
const PRIVILEGE_NONE = "none";
|
||||||
const PRIVILEGE_PLAYER = "player";
|
const PRIVILEGE_PLAYER = "player";
|
||||||
const PRIVILEGE_CREATOR = "creator";
|
const PRIVILEGE_CREATOR = "creator";
|
||||||
const PRIVILEGE_QUIZMASTER = "admin"; // TODO: refactor!
|
const PRIVILEGE_QUIZMASTER = "admin"; // TODO: refactor!
|
||||||
|
Loading…
x
Reference in New Issue
Block a user