Compare commits

...

2 Commits

Author SHA1 Message Date
8502508a11 Merge branch 'main' of https://gitea.tpsoft.org/TPsoft.org/APIlite 2025-06-01 19:20:11 +02:00
a59044102c added format and endpoint into constructor,
fixed processing of parameters in methods,
added return for HTML manual,
chaged TypeScript code to class object export as default
2025-06-01 19:19:48 +02:00
3 changed files with 63 additions and 17 deletions

View File

@ -18,23 +18,40 @@ class APIlite
{ {
private string $apiName = ''; private string $apiName = '';
private string $endpoint = '';
private $methods = array(); private $methods = array();
public function __construct() public function __construct(?string $format = null, ?string $endpoint = null)
{ {
register_shutdown_function(array($this, '_shutdownHandler')); register_shutdown_function(array($this, '_shutdownHandler'));
$this->endpoint = $endpoint ?? $this->getCurrentUrl();
$this->analyzeClass(); $this->analyzeClass();
if (isset($_REQUEST['action'])) { if (isset($_REQUEST['action'])) {
$this->doAction($_REQUEST['action']); $this->doAction($_REQUEST['action']);
} else { } else {
global $argv; global $argv;
$switches = array_map('strtolower', is_array($argv) ? $argv : []); if (isset($_REQUEST['format'])) {
if ((isset($_REQUEST['format']) && $_REQUEST['format'] == 'html') || in_array('--html', $switches)) { $format = $_REQUEST['format'];
$this->printHelpHTML(); }
} elseif ((isset($_REQUEST['format']) && $_REQUEST['format'] == 'typescript') || in_array('--typescript', $switches)) { if (isset($argv)) {
$this->printHelpTypescript(); $switches = array_map('strtolower', is_array($argv) ? $argv : []);
} else { if (in_array('--html', $switches)) {
$this->printHelpJSON(); $format = 'html';
}
if (in_array('--typescript', $switches)) {
$format = 'typescript';
}
}
switch ($format) {
case 'html':
$this->printHelpHTML();
break;
case 'typescript':
$this->printHelpTypescript();
break;
default:
$this->printHelpJSON();
break;
} }
} }
} }
@ -50,7 +67,7 @@ class APIlite
private function analyzeClass(): bool private function analyzeClass(): bool
{ {
$refClass = new \ReflectionClass($this); $refClass = new \ReflectionClass($this);
$this->apiName = $refClass->getName(); $this->apiName = $refClass->getShortName();
$this->methods = array(); $this->methods = array();
foreach ($refClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $ref_method) { foreach ($refClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $ref_method) {
$method_name = $ref_method->getName(); $method_name = $ref_method->getName();
@ -81,11 +98,28 @@ class APIlite
if ($ref_param->isOptional()) { if ($ref_param->isOptional()) {
$param['default'] = $ref_param->getDefaultValue(); $param['default'] = $ref_param->getDefaultValue();
} }
$param['doc'] = $this->parseParamDoc($method['doc'], $param['name']); if (!is_null($method['doc'])) {
$param['doc'] = $this->parseParamDoc($method['doc'], $param['name']);
}
$method['params'][] = $param; $method['params'][] = $param;
} }
if ($ref_method->hasReturnType()) { if ($ref_method->hasReturnType()) {
$method['return'] = $ref_method->getReturnType()->getName(); $ref_type = $ref_method->getReturnType();
if ($ref_type instanceof \ReflectionNamedType) {
$method['return'] = $ref_type->getName();
}
if ($ref_type instanceof \ReflectionUnionType
|| $ref_type instanceof \ReflectionIntersectionType )
{
$types = $ref_type->getTypes();
$method['return'] = [];
foreach ($types as $type) {
if ($type instanceof \ReflectionNamedType) {
$method['return'][] = $type->getName();
}
}
}
} }
$this->methods[] = $method; $this->methods[] = $method;
} }

View File

@ -306,6 +306,16 @@
</div> </div>
</div> </div>
<?php } ?> <?php } ?>
<h3 style="margin-bottom: 1rem; color: #2c3e50; display: inline-block;">Return:</h3>
<?php if (is_string($method['return'])) { ?>
<code class="parameter-type"><?php echo $method['return']; ?></code>
<?php } ?>
<?php if (is_array($method['return'])) foreach ($method['return'] as $return) { ?>
<code class="parameter-type"><?php echo $return; ?></code>
<?php } ?>
</div> </div>
<?php } ?> <?php } ?>
</section> </section>

View File

@ -5,8 +5,8 @@
* <?php echo date('Y-m-d H:i:s'); ?> * <?php echo date('Y-m-d H:i:s'); ?>
*/ */
export const backend = { class <?php echo $this->apiName; ?> {
endpont: window.location.origin + "<?php echo $this->apiName; ?>.php", endpont = "<?php echo $this->endpoint; ?>";
/* ---------------------------------------------------- /* ----------------------------------------------------
* General API call * General API call
@ -31,7 +31,7 @@ export const backend = {
}); });
xhttp.open('POST', this.endpont + '?action=' + method); xhttp.open('POST', this.endpont + '?action=' + method);
xhttp.send(form_data); xhttp.send(form_data);
}, }
callPromise(method, data) { callPromise(method, data) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -43,20 +43,22 @@ export const backend = {
} }
}); });
}) })
}, }
/* ---------------------------------------------------- /* ----------------------------------------------------
* API actions * API actions
*/ */
help() { help() {
return this.callPromise('__HELP__', {}); return this.callPromise('__HELP__', {});
}, }
<?php if (is_array($this->methods)) foreach ($this->methods as $method) { <?php if (is_array($this->methods)) foreach ($this->methods as $method) {
echo "\t".$method['name'].'('.implode(', ', array_map(function($param) { return $param['name']; }, $method['params'])).') {'; echo "\t".$method['name'].'('.implode(', ', array_map(function($param) { return $param['name']; }, $method['params'])).') {';
echo "\n\t\treturn this.callPromise('".$method['name']."', {".implode(', ', array_map(function($param) { return $param['name'].': '.$param['name']; }, $method['params']))."});"; echo "\n\t\treturn this.callPromise('".$method['name']."', {".implode(', ', array_map(function($param) { return $param['name'].': '.$param['name']; }, $method['params']))."});";
echo "\n\t},\n\n"; echo "\n\t}\n\n";
} }
?> ?>
}; };
export default new BackendAPI();