Files
fotospiel-app/app/Services/EventJoinTokenService.php
Codex Agent 64a5411fb9 - Reworked the tenant admin login page
- Updated the User model to implement Filament’s tenancy contracts
- Seeded a ready-to-use demo tenant (user, tenant, active package, purchase)
- Introduced a branded, translated 403 error page to replace the generic forbidden message for unauthorised admin hits
- Removed the public “Register” links from the marketing header
- hardened join event logic and improved error handling in the guest pwa.
2025-10-13 12:50:46 +02:00

93 lines
2.8 KiB
PHP

<?php
namespace App\Services;
use App\Models\Event;
use App\Models\EventJoinToken;
use Illuminate\Support\Arr;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class EventJoinTokenService
{
public function createToken(Event $event, array $attributes = []): EventJoinToken
{
return DB::transaction(function () use ($event, $attributes) {
$tokenValue = $this->generateUniqueToken();
$payload = [
'event_id' => $event->id,
'token' => $tokenValue,
'label' => Arr::get($attributes, 'label'),
'usage_limit' => Arr::get($attributes, 'usage_limit'),
'metadata' => Arr::get($attributes, 'metadata', []),
];
if ($expiresAt = Arr::get($attributes, 'expires_at')) {
$payload['expires_at'] = $expiresAt instanceof Carbon
? $expiresAt
: Carbon::parse($expiresAt);
}
if ($createdBy = Arr::get($attributes, 'created_by')) {
$payload['created_by'] = $createdBy;
}
return EventJoinToken::create($payload);
});
}
public function revoke(EventJoinToken $joinToken, ?string $reason = null): EventJoinToken
{
$joinToken->revoked_at = now();
if ($reason) {
$metadata = $joinToken->metadata ?? [];
$metadata['revoked_reason'] = $reason;
$joinToken->metadata = $metadata;
}
$joinToken->save();
return $joinToken;
}
public function incrementUsage(EventJoinToken $joinToken): void
{
$joinToken->increment('usage_count');
}
public function findToken(string $token, bool $includeInactive = false): ?EventJoinToken
{
return EventJoinToken::query()
->where('token', $token)
->when(! $includeInactive, function ($query) {
$query->whereNull('revoked_at')
->where(function ($query) {
$query->whereNull('expires_at')
->orWhere('expires_at', '>', now());
})
->where(function ($query) {
$query->whereNull('usage_limit')
->orWhereColumn('usage_limit', '>', 'usage_count');
});
})
->first();
}
public function findActiveToken(string $token): ?EventJoinToken
{
return $this->findToken($token);
}
protected function generateUniqueToken(int $length = 48): string
{
do {
$token = Str::random($length);
} while (EventJoinToken::where('token', $token)->exists());
return $token;
}
}