monitor/api/src/Controller/AgentController.php
fds2610-bot 857fc88834 Phase 1 der Neuausrichtung: REST-API fuer Tickets/Events/Systeme/KPIs/Agenten
Setzt Phase 1 aus Visualization.md um: Vanilla-PHP-REST-API mit SQLite-Persistenz,
statischen API-Keys pro Agent, Codeberg-Sync fuer Backlog/Done, PHPUnit-Tests und
vollstaendiger API.md-Dokumentation - Vorgaben aus Detailantworten.md (F1-F16)
umgesetzt. Entwicklung/Build/Test laufen komplett in Docker-Compose-Containern
(PHP 8.2 + SQLite + Composer + PHPUnit/pcov), analog zum NC-Gantt-Projekt ist auf
dem Host kein PHP/Composer noetig.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-27 19:38:52 +02:00

63 lines
2 KiB
PHP

<?php
declare(strict_types=1);
namespace Monitor\Api\Controller;
use InvalidArgumentException;
use Monitor\Api\Http\Request;
use Monitor\Api\Http\Response;
use Monitor\Api\Repository\AgentRepository;
final class AgentController
{
public function __construct(private readonly AgentRepository $agents)
{
}
public function index(Request $request): Response
{
return Response::json(['agents' => $this->agents->all()]);
}
public function register(Request $request): Response
{
$displayName = trim((string) ($request->body['display_name'] ?? ''));
$role = (string) ($request->body['role'] ?? '');
if ($displayName === '') {
return Response::error('Feld "display_name" ist erforderlich.', 422);
}
try {
$result = $this->agents->register($displayName, $role);
} catch (InvalidArgumentException $e) {
return Response::error($e->getMessage(), 422);
}
// Der Klartext-API-Key wird nur bei der Registrierung einmalig zurueckgegeben.
return Response::json(['agent' => $result['agent'], 'api_key' => $result['api_key']], 201);
}
/**
* @param array<string, string> $params
* @param array<string, mixed> $authenticatedAgent
*/
public function activity(Request $request, array $params, array $authenticatedAgent): Response
{
if ((int) $params['id'] !== (int) $authenticatedAgent['id']) {
return Response::error('Ein Agent darf nur seine eigene Aktivitaet melden.', 403);
}
$state = (string) ($request->body['state'] ?? '');
if ($state === '') {
return Response::error('Feld "state" ist erforderlich.', 422);
}
$currentTicketId = isset($request->body['current_ticket']) ? (int) $request->body['current_ticket'] : null;
$agent = $this->agents->updateActivity((int) $params['id'], $state, $currentTicketId);
return Response::json(['agent' => $agent]);
}
}