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>
63 lines
2 KiB
PHP
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]);
|
|
}
|
|
}
|