Files
WebAPP/app/Services/InvitationService.php
Rhino 2e24a40d68 Stand: SMTP-Test, Admin-Mail-Tab, Notifiable-Fix, Lazy-Quill
- Fix: Notifiable-Trait zum User-Model hinzugefuegt (behebt notify()-500er)
- Installer: SMTP-Verbindungstest mit EsmtpTransport + Ueberspringen-Link
- Admin: Neuer E-Mail-Tab mit SMTP-Konfiguration + Verbindungstest
- Admin: Lazy Quill-Initialisierung (nur sichtbare Locale wird geladen)
- Uebersetzungen: 17 neue Mail-Keys in allen 6 Sprachen

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 07:30:37 +01:00

63 lines
1.8 KiB
PHP
Executable File

<?php
namespace App\Services;
use App\Enums\UserRole;
use App\Models\Invitation;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
class InvitationService
{
public function createInvitation(array $data, User $admin): Invitation
{
$rawToken = bin2hex(random_bytes(32));
$invitation = new Invitation([
'email' => $data['email'] ?? null,
'expires_at' => now()->addDays((int) ($data['expires_in_days'] ?? 7)),
'created_at' => now(),
]);
// Token gehasht speichern — Klartext nur in der URL (V05)
$invitation->token = hash('sha256', $rawToken);
$invitation->created_by = $admin->id;
$invitation->save();
if (!empty($data['player_ids'])) {
$invitation->players()->attach($data['player_ids']);
}
// raw_token für die URL-Generierung bereitstellen (nicht persistiert)
$invitation->raw_token = $rawToken;
return $invitation;
}
public function redeemInvitation(Invitation $invitation, array $userData): User
{
return DB::transaction(function () use ($invitation, $userData) {
$user = User::create([
'name' => $userData['name'],
'email' => $userData['email'],
'password' => $userData['password'],
]);
$user->is_active = true;
$user->role = UserRole::User;
$user->save();
// Eltern-Kind-Zuordnungen aus der Einladung übernehmen
foreach ($invitation->players as $player) {
$user->children()->attach($player->id, [
'created_at' => now(),
]);
}
$invitation->accepted_at = now();
$invitation->save();
return $user;
});
}
}