Refactor API structure: update internal handling, enhance input retrieval, and improve template loading

This commit is contained in:
marc-go committed 2026-10-10 15:05:24 +02:00
1 parent a33de15f0c
commit 9cb50d7d28
13 files changed
+181 -95

No files matched your search

+2 -5
View File
@@ -1,7 +1,4 @@
COOKIE_TOKEN_SIGNATURE=628ef1d351018f7bb15dd5b5bc17fbc478fa6e7c7b993d136d5c03a4c2593c98
COOKIE_TOKEN_SIGNATURE=a11a9ea5fd839e616bd08ebc432f641a24ef1f4d74ca478f904e7a3122fc7a05
COOKIE_TOKEN_LIFETIME=86400
API_TOKEN_SIGNATURE=2740fbb0a179e0e9fd801798e21515cd8a20ae964e3ef0abdeaf92830eaeefb4
API_TOKEN_SIGNATURE=38bcd8a8e9ac3be83ddfcf4c12c19ccb3be70df00e48d43d4f63f54f014d1946
DB_FILE=database.db
+64 -13
View File
@@ -6,13 +6,17 @@ if ($debug) {
ini_set("display_startup_errors", 1);
error_reporting(E_ALL);
}
debug_print_backtrace();
// API Main Library
class gbAPI {
public $username;
public $input;
private $db;
private $config;
private $internal;
private $response;
private function b64url_encode($data) {
return rtrim(strtr(base64_encode($data), "+/", "-_"), "=");
@@ -23,10 +27,13 @@ class gbAPI {
}
function __construct($authRequired, $internal) {
define("APP_PATH", __DIR__ . "/../");
if (!defined("APP_PATH")) {
define("APP_PATH", __DIR__ . "/../");
}
$this->internal = $internal;
if ($authRequired) {
if ($authRequired && !$internal) {
if (!$this->checkAuth()) {
$status = 401;
$data = [
@@ -39,6 +46,27 @@ class gbAPI {
}
}
function getInput() {
if (isset($this->input)) {
return $this->input;
}elseif ($_SERVER["REQUEST_METHOD"] == "POST") {
try {
$input = json_decode(file_get_contents("php://input"), true);
} catch (JsonException $error) {
$this->answer(400, [
"error" => "invalid_body",
"error_text" => "Can not read request body: " . $error
]);
}
return $input;
}else{
$this->answer(400, [
"error" => "false_request_method",
"error_text" => "Only POST allowed"
], true);
}
}
function getConfig() {
if (isset($this->config)) {
return $config;
@@ -136,27 +164,49 @@ class gbAPI {
}
function answer($status, $data = [], $error = false) {
http_response_code($status);
header("Content-Type: application/json; charset=UTF-8");
if ($error) {
$json = [];
$return = [];
$json["status"] = $status;
$return["status"] = $status;
foreach ($data as $key => $value) {
$json[$key] = $value;
$return[$key] = $value;
}
}else{
$json = [
$return = [
"status" => $status,
"data" => $data
];
}
$return = json_encode($json);
die($return);
// Check if request is internal or external
if ($this->internal) {
$this->response = $return;
}else{
http_response_code($status);
header("Content-Type: application/json; charset=UTF-8");
$return = json_encode($return);
die($return);
}
}
function getAnswer() {
if (!isset($this->response)) {
$error = [
"status" => 500,
"error" => "empty_return",
"error_text" => "API Returned nothing."
];
return $error;
}
return $this->response;
}
function getResponse() {
return $this->response;
}
function dbCommand($command, $expectResult, $stmtArgsRequired = false, $stmtArgs = []) {
@@ -192,6 +242,7 @@ class gbAPI {
$command = "SELECT name, value FROM settings WHERE name = :name";
$value = $this->dbCommand($command, true, true, [":name" => $key]);
return $value;
return $value[0]["value"];
}
}
+3 -2
View File
@@ -2,11 +2,12 @@
// Set internal to false so that the answer goes to the client
if (!isset($internal)) {
$internal = false;
define("API_DIR", "../");
}
// Load Main Library
require "../api.php";
$api = new gbAPI(true);
require API_DIR . "api.php";
$api = new gbAPI(true, $internal);
$api->answer(200, [
"login" => true,
+4 -10
View File
@@ -2,22 +2,16 @@
// Set internal to false so that the answer goes to the client
if (!isset($internal)) {
$internal = false;
define("API_DIR", "../");
}
// Load API Library
require "../api.php";
require API_DIR . "api.php";
$api = new gbAPI(false);
$api = new gbAPI(false, $internal);
// Check Request Body
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
$api->answer(400, [
"error" => "false_request_method",
"error_text" => "Only POST allowed"
], true);
}
$input = json_decode(file_get_contents("php://input"), true);
$input = $api->getInput();
if (!isset($input["username"]) || !isset($input["password"])) {
$api->answer(400, [
+4 -10
View File
@@ -2,21 +2,15 @@
// Set internal to false so that the answer goes to the client
if (!isset($internal)) {
$internal = false;
define("API_DIR", "../");
}
// Load Main Library
require "../api.php";
require API_DIR . "api.php";
$api = new gbAPI(false);
$api = new gbAPI(false, $internal);
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
$api->answer(400, [
"error" => "false_request_method",
"error_text" => "Only POST allowed"
]);
}
$input = json_decode(file_get_contents("php://input"), true);
$input = $api->getInput();
if (!isset($input["name"]) || !isset($input["text"])) {
$api->answer(400, [
+3 -2
View File
@@ -2,12 +2,13 @@
// Set internal to false so that the answer goes to the client
if (!isset($internal)) {
$internal = false;
define("API_DIR", "../");
}
// Load Main Library
require "../api.php";
require API_DIR . "api.php";
$api = new gbAPI(false);
$api = new gbAPI(false, $internal);
// Get Entrys
$command = "SELECT * FROM entrys WHERE status = :status ORDER BY date DESC";
+3 -2
View File
@@ -2,12 +2,13 @@
// Set internal to false so that the answer goes to the client
if (!isset($internal)) {
$internal = false;
define("API_DIR", "../");
}
// Load Main Library
require "../api.php";
require API_DIR . "api.php";
$api = new gbAPI(false);
$api = new gbAPI(false, $internal);
// Get App Name
$command = "SELECT name, value FROM settings WHERE name = :name";
+12 -13
View File
@@ -1,18 +1,17 @@
<?php
// Load Main Libary
require "../api.php";
$api = new gbAPI(false);
// Check Request body
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
$api->answer(400, [
"error" => "false_request_method",
"error_text" => "Only POST allowed"
]);
// Set internal to false so that the answer goes to the client
if (!isset($internal)) {
$internal = false;
define("API_DIR", "../");
}
$input = json_decode(file_get_contents("php://input"), true);
// Load Main Libary
require API_DIR . "api.php";
$api = new gbAPI(false, $internal);
// Check Request body
$input = $api->getInput();
if (!isset($input["username"]) || !isset($input["password"]) || !isset($input["password_repeat"])) {
$api->answer(400, [
@@ -94,12 +93,12 @@ $env = "";
$cookie_token = bin2hex(random_bytes(32));
$env .= "COOKIE_TOKEN_SIGNATURE=" . $cookie_token . "\n";
$env .= "COOKIE_TOKEN_LIFETIME=86400\n";
$api_token = bin2hex(random_bytes(32));
$env .= "API_TOKEN_SIGNATURE=" . $api_token . "\n";
$env .= "DB_FILE=database.db";
$env .= "COOKIE_TOKEN_LIFETIME=86400";
file_put_contents(APP_PATH . ".env", $env);
+16
View File
@@ -0,0 +1,16 @@
<?php
// Set internal to false so that the answer goes to the client
if (!isset($internal)) {
$internal = false;
define("API_DIR", "../");
}
// Load Main Library
require API_DIR . "api.php";
$api = new gbAPI(false, $internal);
// Get Template
$template = $api->getSetting("template");
$api->answer(200, [
"template_name" => $template
]);
Executable → Regular
BIN
View File
Binary file not shown.
+58 -26
View File
@@ -1,33 +1,55 @@
<?php
class HTMLLoader {
private $template;
private $page;
private $templates;
private $tempalte_conf;
function __construct() {
// Check if Paths variables exists
if (!defined("TEMPLATE_PATH") || !defined("TEMPLATE_CONF") || !defined("APP_DOMAIN")) {
die("TEMPLATE_PATH or TEMPLATE_CONF are not defined at " . __FILE__);
}
$this->templates = json_decode(file_get_contents(TEMPLATE_CONF), true);
}
function setTemplate($template) {
// Check if template exists
$file = file_get_contents(TEMPLATE_CONF);
$json = json_decode($file, true);
if (!array_key_exists($template, $json) && array_key_exists("error", $json)) {
$this->showError('Template "' . $template . '" was not found.');
exit;
}elseif (!array_key_exists("error", $json)){
die("Error Template was not found.");
if (!array_key_exists($template, $this->templates)) {
die("Template " . $template . " not found.");
}
$this->page = $template;
if (!is_dir(TEMPLATE_PATH . $this->templates[$template]["dir_name"])) {
die("Template " . $template . " not found.");
}
$this->template = $template;
}
function getTemplate() {
// Call API
$call = new APICall("template/get.php");
$response = $call->response;
if ($response["status"] !== 200) {
$this->setTemplate("standard");
$this->showError("Template API Returned an error: " . $response["error_text"]);
}
$this->template = $response["data"]["template_name"];
}
function setPage($page) {
$this->page = $page;
}
function showError($error) {
$file = file_get_contents(TEMPLATE_CONF);
$json = json_decode($file, true);
$template_dir = $this->templates[$this->template]["dir_name"];
$template_conf = json_decode(file_get_contents(TEMPLATE_DIR . $template_dir));
$page = $json["error"];
$page = $tempalte_conf["error"];
$html = file_get_contents(TEMPLATE_PATH . $page["dir_name"] . "/" . $page["html_file"]);
$css = "";
@@ -35,12 +57,12 @@ class HTMLLoader {
// Get CSS
foreach ($page["css_files"] as $file) {
// Check if File exists
if (!is_file(TEMPLATE_PATH . $page["dir_name"] . "/" . $file)) {
$this->showError('CSS File <span class="code">' . $file . '</span> for Template <span class="code">error</span> in <span class="code">' . __FILE__ . "</span> not found.");
if (!is_file(TEMPLATE_PATH . $template_dir . "/" . $page["dir_name"] . "/" . $file)) {
die("CSS File " . $file . " not found.");
}
// Add CSS Files to HTML
$css .= '<link rel="stylesheet" type="text/css" href="http://' . APP_DOMAIN . "/templates/" . $page["dir_name"] . "/" . $file . '">';
$css .= '<link rel="stylesheet" type="text/css" href="http://' . APP_DOMAIN . "/templates/" . $template_dir . "/" . $page["dir_name"] . "/" . $file . '">';
}
$html = str_replace("%css%", $css, $html);
@@ -51,32 +73,42 @@ class HTMLLoader {
die($replace);
}
function show($args = []) {
function show($args = [], $showAppName = true) {
if (!isset($this->template)) {
$this->getTemplate();
}
$template = $this->template;
$file = file_get_contents(TEMPLATE_CONF);
$json = json_decode($file, true);
$template_dir = $this->templates[$template]["dir_name"];
$template_conf = TEMPLATE_PATH . $template_dir . "/template.json";
$page = $json[$template];
$html = file_get_contents(TEMPLATE_PATH . $page["dir_name"] . "/" . $page["html_file"]);
$file = file_get_contents($template_conf);
$tempalte_conf = json_decode($file, true);
$app_name = file_get_contents("http://" . APP_DOMAIN . "/api/settings/appname.php");
$app_name = json_decode($app_name, true);
$app_name = $app_name["data"]["application_name"];
$page = $tempalte_conf[$this->page];
$html = str_replace("%appname%", $app_name, $html);
$html = file_get_contents(TEMPLATE_PATH . $template_dir . "/" . $page["dir_name"] . "/" . $page["html_file"]);
if ($showAppName) {
$app_name = file_get_contents("http://" . APP_DOMAIN . "/api/settings/appname.php");
$app_name = json_decode($app_name, true);
$app_name = $app_name["data"]["application_name"];
$html = str_replace("%appname%", $app_name, $html);
}
// Get CSS
$css = "";
foreach ($page["css_files"] as $file) {
// Check if File exists
if (!is_file(TEMPLATE_PATH . $page["dir_name"] . "/" . $file)) {
if (!is_file(TEMPLATE_PATH . $template_dir . "/" . $page["dir_name"] . "/" . $file)) {
$this->showError('CSS File <span class="code">' . $file . '</span> for Template <span class="code">' . $this->template . '</span> in <span class="code">' . __FILE__ . "</span> not found.");
}
// Add CSS Files to HTML
$css .= '<link rel="stylessheet" text="text/css" href="' . APP_DOMAIN . "/templates/" . $page["dir_name"] . "/" . $file . '">';
$css .= '<link rel="stylessheet" text="text/css" href="' . APP_DOMAIN . "/templates/" . $template_dir . "/" . $page["dir_name"] . "/" . $file . '">';
}
$html = str_replace("%css%", $css, $html);
+4 -5
View File
@@ -13,12 +13,11 @@ require FRONTEND_PATH . "html_loader.php";
$htmlLoader = new HTMLLoader();
// Build Entry Page
$htmlLoader->setTemplate("entrys_frontend");
$htmlLoader->setPage("entrys_frontend");
$url = "http://" . APP_DOMAIN . "/api/entrys/get.php";
$response = file_get_contents($url);
$response = json_decode($response, true);
// Get entrys
$call = new APICall("entrys/get.php");
$response = $call->response;
if ($response["data"]["empty"]) {
$html_block = "<p>There aren'n any entrys yet. Be the first one!</p>";
+8 -7
View File
@@ -12,7 +12,7 @@ class gb {
define("APP_DOMAIN", $_SERVER["SERVER_NAME"]);
define("APP_PATH", __DIR__ . "/../");
define("FRONTEND_PATH", __DIR__ . "/");
define("API_PATH", __DIR__ . "/../api/");
define("API_DIR", __DIR__ . "/../api/");
define("TEMPLATE_PATH", FRONTEND_PATH . "templates/");
define("TEMPLATE_CONF", TEMPLATE_PATH . "templates.json");
@@ -28,29 +28,30 @@ class gb {
$html = new HTMLLoader();
// Set template to Setup an show it
$html->setTemplate("setup");
$html->show();
$html->setTemplate("standard");
$html->setPage("setup");
$html->show([], false);
}
}
// Internal API Call Library
class APICall {
private $response;
public $response;
private $error;
function __construct($path, $data) {
function __construct($path, $data = []) {
// Set $internal to true so the api return does not go to the browser
$internal = true;
// Check Path
if (!is_file(API_PATH . $path)) {
if (!is_file(API_DIR . $path)) {
$this->error("API Path invalid.");
return false;
}
// Call API
require API_PATH . $path;
require API_DIR . $path;
// Get return from the API Library
$response = $api->getAnswer();