Files
acai-vscode-webbase/cms/lib/plugins/cms_api/v3/classes/ApiJsonBuilder.php

293 lines
13 KiB
PHP

<?php
class ApiJsonBuilder {
static $jsonConfig = [];
static $ignoreTables = ["accounts"];
static $ignoreSchemaTypes = ["separator", "upload"];
static function generateBaseConfig($options = []){
// $options = [
// "apartados" => [
// "GET" => false,
// "GETALL" => true,
// "SEARCH" => false,
// "POST" => false,
// "PATCH" => false,
// "DELETE" => false,
// "HIDDEN_FIELDS" => "num,breadcrumb",
// "NOT_EDITABLE" => "name"
// ]
// ];
$schemaFiles = array_slice(scandir(__DIR__.'/../../../../../data/schema/'), 2);
self::$jsonConfig = [
"host" => "https://".$_SERVER["HTTP_HOST"],
"basePath" => "/cms/lib/plugins/cms_api/v3/",
"title" => "CMS API de Coco Solution",
"info" => [],
"variables" => [
"baseHeaders" => self::getBaseHeaders()
]
];
$endPoints = [];
self::generateBaseCustom($endPoints);
foreach($schemaFiles as $schemaFile){
$tableName = str_replace(".ini.php","",$schemaFile);
if(in_array($tableName, self::$ignoreTables)) continue;
$schema = loadSchema($tableName);
$endPoints[$tableName] = [
"title" => @$schema["menuName"]?:"",
"description" => @$schema["menuDesc"]?:"",
"hiddenFields" => self::explodeFields(@$options[$tableName]['HIDDEN_FIELDS']),
"notEditableFields" => self::explodeFields(@$options[$tableName]['NOT_EDITABLE']),
"methods" => [
"GET" => self::generateBaseMethod($tableName,$schema),
"POST" => self::generateBaseMethod($tableName,$schema,["body"], true)
],
"search" => [
"methods" => [
"POST" => self::generateBaseSearch($tableName,$schema,["body"])
]
],
":" => [
"variable" => "num",
"methods" => [
"GET" => self::generateBaseMethod($tableName,$schema),
"PATCH" => self::generateBaseMethod($tableName,$schema,["body"]),
"DELETE" => self::generateBaseMethod($tableName,$schema)
]
]
];
if(isset($options[$tableName]) && !$options[$tableName]["GETALL"]) unset($endPoints[$tableName]["methods"]["GET"]);
if(isset($options[$tableName]) && !$options[$tableName]["POST"]) unset($endPoints[$tableName]["methods"]["POST"]);
if(isset($options[$tableName]) && !$options[$tableName]["GET"]) unset($endPoints[$tableName][":"]["methods"]["GET"]);
if(isset($options[$tableName]) && !$options[$tableName]["PATCH"]) unset($endPoints[$tableName][":"]["methods"]["PATCH"]);
if(isset($options[$tableName]) && !$options[$tableName]["DELETE"]) unset($endPoints[$tableName][":"]["methods"]["DELETE"]);
if(!count($endPoints[$tableName][":"]["methods"])) unset($endPoints[$tableName][":"]);
if(isset($options[$tableName]) && !$options[$tableName]["SEARCH"]) unset($endPoints[$tableName]["search"]);
}
self::$jsonConfig["endPoints"] = $endPoints;
file_put_contents("schemaBase.json", json_encode(self::$jsonConfig));
return self::$jsonConfig;
}
private static function explodeFields($fields) {
if (!$fields) return [];
return array_map('trim', array_values(array_filter(explode(',', $fields))));
}
private static function generateBaseMethod($tableName, $schema, $types = [], $checkRequireds = false){
$result = ["headers" => self::getBaseHeaders()];
if(in_array("body", $types)) {
$fields_from_table = [
"options" => [
"forceNum" => false,
"ignoreSchema" => false,
"return_last_id" => false,
"dieBeforeQuery" => false,
"generate_category_metadata" => false,
"prefix" => '$TABLE_PREFIX'
]
];
foreach ($schema as $schemaFieldName => $schemaField) {
if(is_array($schemaField)) {
if(
(isset($schemaField["type"]) && in_array($schemaField["type"], self::$ignoreSchemaTypes))
|| isset($schemaField['adminOnly'])
|| isset($schemaField['isSystemField'])
) { continue; }
$field_value = ["value" => "", "required" => false];
if(isset($schemaField["type"])) {
$field_value["schema"] = $schemaField;
switch ($schemaField["type"]) {
case 'checkbox':
$field_value["default"] = intval($schemaField['checkedByDefault']);
break;
default:
# code...
break;
}
}
if(isset($schemaField["defaultValue"]) && !empty($schemaField["defaultValue"])) $field_value["default"] = $schemaField["defaultValue"];
if($checkRequireds && isset($schemaField["isRequired"]) && $schemaField["isRequired"]) $field_value["required"] = true;
if(isset($schemaField["customColumnType"]) && $schemaField["customColumnType"]) $field_value["field_type"] = $schemaField["customColumnType"];
$fields_from_table[$schemaFieldName] = $field_value;
}
}
$result["body"] = ["data" => $fields_from_table];
}
return $result;
}
private static function generateBaseSearch($tableName, $schema, $types = [], $checkRequireds = false){
$result = [
"headers" => self::getBaseHeaders(),
"body" => [
$tableName => [
"where" => [
//"value" => [
// ["column" => "num", "value" => 1, "operator" => "="]
//],
"required" => false,
"docs" => [
"Valores posibles de operator: (=, like, !=)"
]
],
"order" => [
"value" => "num DESC",
"required" => false
],
"limit" => [
//"value" => 25,
"required" => false,
"docs" => [
"Valores posibles: String (Solo limit): 10",
"Valores posibles: String (Limit con offset): 0,10",
"Valores posibles: Array: ['limit' => 10, 'page' => 1]"
]
]
]
]
];
return $result;
}
private static function generateBaseCustom(&$endPoints) {
$endPoints["auth"] = [
"title" => "Login",
"description" => "Petición de Login. Sólo debe de ser ejecutado la primera vez para obtener el token. Una vez recogido el token se insertará en las cabeceras Authorization:Bearer {{token}}",
"methods" => [
"POST" => [
"headers" => [
"Content-length" => [
"value" => "0",
"description" => "",
"required" => true
],
"Content-type" => [
"value" => "application/json",
"required" => true
],
"Authorization" => [
"value" => "Login {{BASE64ENCODE(user:pass)}}",
"required" => true
]
]
]
]
];
$endPoints["bulk"] = [
"title" => "Registros en masa",
"description" => "Se realizan acciones a varios registros de varias tablas",
"controller" => "Bulk",
"methods" => [
"POST" => [
"headers" => self::getBaseHeaders(),
"body" => [
"{tableName}" => [
"where" => [
"value" => [
["column" => "num", "value" => 1, "operator" => "="]
],
"required" => false,
"docs" => [
"Valores posibles de operator: (=, like, !=)"
]
],
"order" => [
"value" => "num DESC",
"required" => false
],
"limit" => [
"value" => 10,
"required" => false
]
]
]
]
]
];
$endPoints["bulk_sync"] = [
"title" => "Sincronización de registros en masa",
"description" => "Se realizan acciones de inserción o actualización a varios registros de varias tablas utilizando la clave primaria num como referencia",
"controller" => "Bulk",
"methods" => [
"POST" => [
"headers" => self::getBaseHeaders(),
"body" => [
"{tableName}" => [
"records" => []
],
"{example}" => [
"{tableName}" => [
"records" => [
[
"num" => '{num1}',
"{field}" => '{value}',
"options"=> [
"forceNum"=> true
]
],
[
"num" => '{num2}',
"{field}" => '{value}',
],
[
"{field}" => '{value}',
]
],
"options" => [
"generate_category_metadata" => true
],
"#comentario" => "En este ejemplo el primer es un num forzado, <br> el segundo un update y el tercero una insercion"
]
]
]
]
]
];
$endPoints["upload"] = [
"title" => "Upload",
"description" => "Subida de ficheros al servidor",
"controller" => "Files",
"methods" => [
"POST" => [
"headers" => [
"Content-type" => [
"value" => "multipart/form-data",
"required" => true
],
"Authorization" => [
"value" => "Bearer {{TOKEN}}",
"required" => true
]
],
"body" => [
"field" => ["required" => true,"value" => "file","default" => "file"],
"file" => ["required" => false,"value" => "file (blob). O este campo o file_b64 son obligatorios"],
"file_b64" => ["required" => false,"value" => "file (base64)"],
"filename" => ["required" => false,"value" => "filename, requerido si se envía file_b64"],
"options" => ["required" => false,"value" => "array de opciones ( Info : https://github.com/verot/class.upload.php )"]
]
]
]
];
}
private static function getBaseHeaders() {
return [
"Content-type" => [
"value" => "application/json",
"required" => true
],
"Authorization" => [
"value" => "Bearer {{TOKEN}}",
"required" => true
]
];
}
}