boerse
All checks were successful
Deploy / deploy-staging (push) Successful in 6s
Deploy / deploy-production (push) Has been skipped

This commit is contained in:
2026-04-22 01:31:18 +02:00
parent a1bab34bd3
commit 91dc84d027
16 changed files with 1697 additions and 86 deletions

View File

@@ -0,0 +1,13 @@
<?php
declare(strict_types=1);
require_auth();
$assets = app()->assets();
if ($assets) {
$assets->addStyle('/module/boersenchecker/asset?file=boersenchecker.css');
$assets->addScript('/module/boersenchecker/asset?file=boersenchecker.js', 'footer', true);
}
$page = new \Modules\Boersenchecker\Support\InstrumentPage();
module_tpl('boersenchecker', 'instruments', $page->handle());

View File

@@ -0,0 +1,30 @@
<?php
$file = (string)($_GET['file'] ?? '');
$base = realpath(__DIR__ . '/../assets');
$map = [
'boersenchecker.css' => $base . '/boersenchecker.css',
'boersenchecker.js' => $base . '/boersenchecker.js',
];
if (!isset($map[$file])) {
http_response_code(404);
exit('Not found');
}
$path = $map[$file];
if (!$base || !is_file($path) || !str_starts_with($path, $base)) {
http_response_code(404);
exit('Not found');
}
$ext = pathinfo($path, PATHINFO_EXTENSION);
if ($ext === 'css') {
header('Content-Type: text/css; charset=utf-8');
} elseif ($ext === 'js') {
header('Content-Type: application/javascript; charset=utf-8');
} else {
header('Content-Type: application/octet-stream');
}
readfile($path);
exit;

View File

@@ -0,0 +1,53 @@
<?php
declare(strict_types=1);
require_auth();
$user = auth_user() ?? [];
$isAdmin = auth_is_admin();
$ownerSub = trim((string) ($user['sub'] ?? 'local'));
$requestedOwner = trim((string) ($_GET['owner_sub'] ?? ''));
if ($isAdmin && $requestedOwner !== '') {
$ownerSub = $requestedOwner;
}
$instrumentId = (int) ($_GET['instrument_id'] ?? 0);
if ($instrumentId <= 0) {
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['ok' => false, 'message' => 'instrument_id fehlt.'], JSON_UNESCAPED_UNICODE);
exit;
}
$pdo = module_fn('boersenchecker', 'pdo');
module_fn('boersenchecker', 'ensure_schema');
$instrumentTable = module_fn('boersenchecker', 'table', 'instruments');
$positionTable = module_fn('boersenchecker', 'table', 'positions');
$stmt = $pdo->prepare(
'SELECT i.id, i.name, i.symbol
FROM ' . $instrumentTable . ' i
INNER JOIN ' . $positionTable . ' p ON p.instrument_id = i.id
WHERE i.id = :id AND p.owner_sub = :owner_sub
LIMIT 1'
);
$stmt->execute([
'id' => $instrumentId,
'owner_sub' => $ownerSub,
]);
$instrument = $stmt->fetch(PDO::FETCH_ASSOC);
header('Content-Type: application/json; charset=utf-8');
if (!is_array($instrument)) {
echo json_encode(['ok' => false, 'message' => 'Aktie nicht verfuegbar.'], JSON_UNESCAPED_UNICODE);
exit;
}
$symbol = trim((string) ($instrument['symbol'] ?? ''));
if ($symbol === '') {
echo json_encode(['ok' => false, 'message' => 'Fuer diese Aktie ist kein Symbol hinterlegt.'], JSON_UNESCAPED_UNICODE);
exit;
}
$result = module_fn('boersenchecker', 'alpha_vantage_fetch_chart_series', $symbol);
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
exit;

View File

@@ -0,0 +1,13 @@
<?php
declare(strict_types=1);
require_auth();
$assets = app()->assets();
if ($assets) {
$assets->addStyle('/module/boersenchecker/asset?file=boersenchecker.css');
$assets->addScript('/module/boersenchecker/asset?file=boersenchecker.js', 'footer', true);
}
$page = new \Modules\Boersenchecker\Support\DashboardPage();
module_tpl('boersenchecker', 'dashboard', $page->handle());

View File

@@ -3,5 +3,11 @@ declare(strict_types=1);
require_auth();
$page = new \Modules\Boersenchecker\Support\DashboardPage();
module_tpl('boersenchecker', 'dashboard', $page->handle());
$assets = app()->assets();
if ($assets) {
$assets->addStyle('/module/boersenchecker/asset?file=boersenchecker.css');
$assets->addScript('/module/boersenchecker/asset?file=boersenchecker.js', 'footer', true);
}
$page = new \Modules\Boersenchecker\Support\HomePage();
module_tpl('boersenchecker', 'home', $page->handle());