You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.8 KiB
71 lines
1.8 KiB
<?php
|
|
|
|
namespace IQBall\Core;
|
|
|
|
use IQBall\Core\Http\HttpResponse;
|
|
|
|
/**
|
|
* Represent an action.
|
|
* @template S session
|
|
*/
|
|
class Action {
|
|
public const NO_AUTH = 1;
|
|
public const AUTH_USER = 2;
|
|
public const AUTH_ADMIN = 3;
|
|
|
|
/**
|
|
* @var callable(mixed[], S): HttpResponse $action action to call
|
|
*/
|
|
protected $action;
|
|
|
|
private int $authType;
|
|
|
|
/**
|
|
* @param callable(mixed[], S): HttpResponse $action
|
|
*/
|
|
protected function __construct(callable $action, int $authType) {
|
|
$this->action = $action;
|
|
$this->authType = $authType;
|
|
}
|
|
|
|
public function getAuthType(): int {
|
|
return $this->authType;
|
|
}
|
|
|
|
/**
|
|
* Runs an action
|
|
* @param mixed[] $params
|
|
* @param S $session
|
|
* @return HttpResponse
|
|
*/
|
|
public function run(array $params, $session): HttpResponse {
|
|
$params = array_values($params);
|
|
$params[] = $session;
|
|
return call_user_func_array($this->action, $params);
|
|
}
|
|
|
|
/**
|
|
* @param callable(mixed[], S): HttpResponse $action
|
|
* @return Action<S> an action that does not require to have an authorization.
|
|
*/
|
|
public static function noAuth(callable $action): Action {
|
|
return new Action($action, self::NO_AUTH);
|
|
}
|
|
|
|
/**
|
|
* @param callable(mixed[], S): HttpResponse $action
|
|
* @return Action<S> an action that does require to have an authorization.
|
|
*/
|
|
public static function auth(callable $action): Action {
|
|
return new Action($action, self::AUTH_USER);
|
|
}
|
|
|
|
/**
|
|
* @param callable(mixed[], S): HttpResponse $action
|
|
* @return Action<S> an action that does require to have an authorization, and to be an administrator.
|
|
*/
|
|
public static function admin(callable $action): Action {
|
|
return new Action($action, self::AUTH_ADMIN);
|
|
}
|
|
}
|