Compare commits

...
Author SHA1 Message Date
Bruno Eckhardt 4782a2c401 new api with url request 2026-05-13 11:02:42 +02:00
Bruno Eckhardt 3d8c4291be fix error msg 2026-05-11 14:16:41 +02:00
Bruno Eckhardt a0afeabb27 maybe hotfix 2026-05-11 13:18:05 +02:00
Bruno Eckhardt 96c27a8722 changes 2026-05-11 13:14:16 +02:00
Bruno Eckhardt 4478f7e82f error logging 2026-05-11 13:09:04 +02:00
Bruno Eckhardt c1f3c3ea4e new function get berufsschulberichte 2026-05-11 12:54:37 +02:00
Bruno Eckhardt 2a8564d3bf caching for api 2026-05-11 12:53:15 +02:00
Tower 14f4143207 fix 2026-04-10 21:43:17 +02:00
Tower 53b4bd3423 fixes 2026-04-08 16:53:49 +02:00
Bruno Eckhardt 386bef9094 refresh fixes 2026-04-08 16:34:06 +02:00
Bruno Eckhardt 4e52aa468f fix: minus temperaturen 2026-03-27 06:50:19 +01:00
Bruno Eckhardt f4b65903f7 store error mails in Mailing Table 2026-03-26 08:10:57 +01:00
Bruno Eckhardt 29a1be5d22 enable and disable error logging in errorMailing 2026-03-26 07:52:59 +01:00
8 changed files with 144 additions and 79 deletions

No files matched your search

+68 -54
View File
@@ -1,70 +1,84 @@
<?php
include_once '../controller/DatabaseController.php';
include_once '../controller/DataController.php';
include_once __DIR__ . '/../modules/Mail.php';
include_once(__DIR__ . '/../controller/DatabaseController.php');
include_once(__DIR__ . '/../controller/DataController.php');
include_once(__DIR__ . '/../modules/Mail.php');
header("Content-Type: application/json");
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Authorization, Function, Content-Type");
header("Access-Control-Allow-Methods: POST, GET, OPTIONS");
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit();
}
// 1. Daten aus der URL (GET) statt aus dem Header holen
$token = $_GET['token'] ?? '';
$function = $_GET['action'] ?? ''; // Ich habe es 'action' genannt, passend zur URL
$validTokens = [
"15a437d128c918633e57dc7d18118a073b807644f21731ed5a7ebcf3eca9e242",
];
$headers = getallheaders();
$token = $headers['Authorization'] ?? $headers['authorization'] ?? $_SERVER['HTTP_AUTHORIZATION'] ?? '';
$function = $headers['Function'] ?? $headers['function'] ?? '';
if (!in_array($token, $validTokens)) {
http_response_code(401);
$error = json_encode([
"error" => "Unauthorized",
"debug_received_token" => $token,
"debug_all_headers" => $headers
]);
errorMail(
"API Login failed",
$error,
);
echo $error;
// Prüfen, ob überhaupt etwas übergeben wurde
if (empty($token) || empty($function)) {
http_response_code(400);
echo json_encode(["error" => "Token oder Action fehlt in der URL"]);
exit;
}
if (in_array($token, $validTokens)) {
// 2. Token-Validierung direkt in der Datenbank (Performanter!)
// Annahme: Deine DatabaseShow kann Filter. Wenn nicht, hier das SQL anpassen.
$checkToken = DatabaseShow(
"API_Credentials",
"TOKEN",
"TOKEN = ?",
$token
);
if (empty($checkToken)) {
http_response_code(401);
// Loggen des Fehlversuchs
DatabaseInsert(
"API",
"CLIENT_IP, TOKEN, API, FUNKTION",
"API_LOGS",
"CLIENT_IP, TOKEN, API, FUNKTION, JSON",
(new getSpecificData())->getClientIP(),
$token,
(new getSpecificData())->getRequestURL(),
$function
$function,
json_encode(["error" => "Unauthorized"])
);
if ($function === "IPs") {
$data = DatabaseShow(
"logs",
"CLIENT_IP"
);
}
if ($function === "Ueberstunden") {
$data = DatabaseShow(
"Ueberstunden",
"MINUTEN"
);
}
echo json_encode(
[
"success" => true,
"data" => $data,
]
);
echo json_encode(["error" => "Zugriff verweigert", "hint" => "Token ungültig"]);
exit;
}
}
// 3. Logik-Teil mit switch (sauberer als viele IFs)
$data = null;
switch ($function) {
case "UeberstundenAbbau":
$data = DatabaseShow("Ueberstunden", "DATUM, MINUTEN", "GRUND = ?", "Abbau");
break;
case "UeberstundenAktuell":
$conn = db_connect();
$sql = "SELECT
(SELECT COALESCE(SUM(OVERTIME), 0) FROM Firmenberichte) AS berichte,
(SELECT COALESCE(SUM(MINUTEN), 0) FROM Ueberstunden WHERE GRUND = 'Abbau') AS abbau,
(SELECT COALESCE(SUM(MINUTEN), 0) FROM Ueberstunden WHERE GRUND = 'Aufbau') AS aufbau";
$res = $conn->query($sql);
$row = $res->fetch_object();
$data = ($row->berichte - $row->abbau + $row->aufbau) / 60;
break;
case "Berichte":
$data = DatabaseShowWithFK("Berufsschulberichte", $Berufsschulberichte);
break;
case "Stundenplan":
$data = DatabaseShowWithFK("Stundenplan", $Stundenplan, "ZEITEN, MO, DI, MI, DO, FR");
break;
default:
http_response_code(404);
echo json_encode(["error" => "Funktion '$function' nicht gefunden"]);
exit;
}
// 4. Erfolgreiche Antwort
echo json_encode([
"success" => true,
"data" => $data
]);
+1 -1
View File
@@ -3,7 +3,7 @@
class getSpecificData {
public function getWeather() {
$url = "https://api.openweathermap.org/data/2.5/weather?q=Berlin,DE&APPID=5bc3e1a438c58fca444c4370ac0517b2&units=metric";
$url = "https://api.openweathermap.org/data/2.5/weather?q=Jena,DE&APPID=5bc3e1a438c58fca444c4370ac0517b2&units=metric";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
+1
View File
@@ -65,6 +65,7 @@ function db_connect() {
errorMail(
"Database Connection failed",
$e->getMessage(),
false,
);
redirectToWebsite("https://blackpi.ipv64.net");
throw $e;
+44 -18
View File
@@ -147,10 +147,37 @@ function DatabaseUpdate($table, $set, $where, ...$values) {
return true;
}
function getFKValue($conn, $table, $key, $value, $id, &$cache) {
if ($id === null) return null;
$cacheKey = $table . "_" . $id;
if (isset($cache[$cacheKey])) {
return $cache[$cacheKey];
}
$stmt = $conn->prepare("SELECT `$value` FROM `$table` WHERE `$key` = ? LIMIT 1");
if (!$stmt) {
die("FK Prepare Fehler: " . $conn->error);
}
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result()->fetch_assoc();
$valueResult = $result[$value] ?? null;
$cache[$cacheKey] = $valueResult;
return $valueResult;
}
function DatabaseShowWithFK($table, $fkMap = [], $columns = "*", $where = "", ...$values) {
include_once 'DatabaseConnect.php';
$conn = db_connect();
$cache = [];
$select = is_array($columns) ? implode(", ", $columns) : $columns;
$sql = "SELECT $select FROM `$table`";
@@ -161,33 +188,32 @@ function DatabaseShowWithFK($table, $fkMap = [], $columns = "*", $where = "", ..
$stmt = $conn->prepare($sql);
if (!$stmt) die("Fehler beim Prepare: " . $conn->error);
if (!$stmt->execute($values)) die("Fehler beim Execute: " . $stmt->error);
if (!empty($values)) {
$stmt->execute($values);
} else {
$stmt->execute();
}
$result = $stmt->get_result();
if (!$result) die("Fehler beim get_result: " . $stmt->error);
$columnsResult = [];
while ($fieldinfo = $result->fetch_field()) {
$columnsResult[] = $fieldinfo->name;
}
if (!$result) die("Fehler beim get_result: " . $conn->error);
$rows = $result->fetch_all(MYSQLI_ASSOC);
foreach ($rows as &$row) {
foreach ($fkMap as $fkColumn => $fkInfo) {
if (isset($row[$fkColumn]) && $row[$fkColumn] !== null) {
$fkStmt = $conn->prepare(
"SELECT {$fkInfo['value']} FROM `{$fkInfo['table']}` WHERE {$fkInfo['key']} = ?"
);
if (!$fkStmt) die("Fehler beim Prepare FK: " . $conn->error);
$fkStmt->bind_param("i", $row[$fkColumn]);
$fkStmt->execute();
$fkResult = $fkStmt->get_result();
$fkRow = $fkResult->fetch_assoc();
$row[$fkColumn] = $fkRow ? $fkRow[$fkInfo['value']] : null;
if (!isset($row[$fkColumn]) || $row[$fkColumn] === null) {
continue;
}
$row[$fkColumn] = getFKValue(
$conn,
$fkInfo['table'],
$fkInfo['key'],
$fkInfo['value'],
$row[$fkColumn],
$cache
);
}
}
+2 -1
View File
@@ -93,7 +93,8 @@ function logging() {
} catch (mysqli_sql_exception $e) {
errorMail(
"Logging failed",
$e->getMessage()
$e->getMessage(),
true,
);
throw $e;
}
+11 -1
View File
@@ -24,7 +24,7 @@ function sendMail($subject, $message, $url, bool $log) {
}
}
function errorMail($title, $error) {
function errorMail($title, $error, bool $log) {
$headers = "From: bruno.eckhardt07@gmail.com\r\n";
mail(
"bruno.eckhardt07@gmail.com",
@@ -32,4 +32,14 @@ function errorMail($title, $error) {
$error,
$headers,
);
if ($log == true) {
DatabaseInsert(
"Mailing",
"DATUM, SUBJECT, MESSAGE, URL, CLIENT_IP",
(new getSpecificData())->getRequestTime(),
"ERROR: $title",
$error,
(new getSpecificData())->getClientIP(),
);
}
}
+2 -2
View File
@@ -42,7 +42,7 @@ $conn->close();
data: <?php echo json_encode($data); ?>,
borderColor: 'rgba(75, 192, 192, 1)',
backgroundColor: 'rgba(75, 192, 192, 0.2)',
fill: true,
fill: false,
tension: 0
}]
},
@@ -82,7 +82,7 @@ $conn->close();
}
},
y: {
min: 0,
min: -10,
max: 40,
title: {
display: true,
+15 -2
View File
@@ -1,4 +1,7 @@
<?php
include_once __DIR__ . '/../controller/DatabaseController.php';
include_once __DIR__ . '/../controller/RoutesController.php';
$conn = db_connect();
$view = $_GET['view'] ?? 'show';
$selectedService = $_GET['service'];
@@ -8,8 +11,17 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_overtime'])) {
$datum = $_POST['ot_date'];
$minuten = intval($_POST['ot_minutes']);
$grund = $conn->real_escape_string($_POST['ot_reason']);
$insert_sql = "INSERT INTO Ueberstunden (DATUM, MINUTEN, GRUND) VALUES ('$datum', $minuten, '$grund')";
$conn->query($insert_sql);
DatabaseInsert(
"Ueberstunden",
"DATUM, MINUTEN, GRUND",
$datum,
$minuten,
$grund
);
redirectToWebsite((new getSpecificData())->getReferer());
exit;
}
// --- Gesamtsumme berechnen ---
@@ -59,6 +71,7 @@ $gesamt_minuten = $minuten_berichte - $minuten_abbau + $minuten_aufbau;
<option value="">Bitte wählen</option>
<option value="Abbau">Abbau</option>
<option value="Aufbau">Aufbau</option>
<option value="Anderes">Anderes</option>
</select>
</div>
<button type="submit"