Files
fotospiel-app/app/Http/Controllers/Testing/TestEventController.php
Codex Agent 7ea34b3b20
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled
Gate testing API for staging E2E
2026-01-03 15:00:33 +01:00

92 lines
2.6 KiB
PHP

<?php
namespace App\Http\Controllers\Testing;
use App\Http\Controllers\Controller;
use App\Models\Event;
use App\Models\EventJoinToken;
use App\Services\EventJoinTokenService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
class TestEventController extends Controller
{
public function joinToken(Request $request, EventJoinTokenService $tokens): JsonResponse
{
abort_unless(config('e2e.testing_enabled'), 404);
$validated = $request->validate([
'event_id' => ['nullable', 'integer'],
'slug' => ['nullable', 'string'],
'ensure_active' => ['sometimes', 'boolean'],
]);
$eventId = $validated['event_id'] ?? null;
$slug = $validated['slug'] ?? null;
if (! $eventId && ! $slug) {
throw ValidationException::withMessages([
'event_id' => 'Provide either event_id or slug.',
]);
}
$eventQuery = Event::query();
if ($eventId) {
$eventQuery->whereKey($eventId);
} else {
$eventQuery->where('slug', $slug);
}
/** @var Event|null $event */
$event = $eventQuery->first();
if (! $event) {
return response()->json([
'data' => null,
], 404);
}
/** @var EventJoinToken|null $token */
$token = $event->joinTokens()->latest()->first();
if (! $token || (($validated['ensure_active'] ?? true) && ! $token->isActive())) {
$token = $tokens->createToken($event, [
'label' => 'Automation',
'metadata' => [
'generated_for' => 'testing_api',
],
]);
}
$plainToken = $token->token;
if (! $plainToken) {
throw ValidationException::withMessages([
'token' => 'Failed to resolve token value.',
]);
}
$joinUrl = route('guest.event', ['token' => $plainToken]);
$qrSvg = QrCode::format('svg')
->size(256)
->generate($joinUrl);
return response()->json([
'data' => [
'event_id' => $event->id,
'token_id' => $token->id,
'token' => $plainToken,
'join_url' => $joinUrl,
'qr_svg' => $qrSvg,
'expires_at' => $token->expires_at?->toIso8601String(),
'usage_count' => $token->usage_count,
'usage_limit' => $token->usage_limit,
],
]);
}
}