$request->attributes->get('tenant_id'), 'error' => $exception->getMessage(), ]); return ApiError::response( 'profile_user_missing', 'Profil nicht verfügbar', 'Für diesen Tenant konnte kein Account gefunden werden.', Response::HTTP_NOT_FOUND ); } return response()->json([ 'data' => $this->transformUser($user), ]); } public function update(ProfileUpdateRequest $request): JsonResponse { try { $user = TenantAuth::resolveAdminUser($request); } catch (\Throwable $exception) { Log::warning('[TenantProfile] Unable to resolve user for profile update', [ 'tenant_id' => $request->attributes->get('tenant_id'), 'error' => $exception->getMessage(), ]); return ApiError::response( 'profile_user_missing', 'Profil nicht verfügbar', 'Für diesen Tenant konnte kein Account gefunden werden.', Response::HTTP_NOT_FOUND ); } $data = $request->validated(); $updates = []; $emailChanged = false; if (isset($data['name']) && $data['name'] !== $user->name) { $updates['name'] = $data['name']; } if (array_key_exists('preferred_locale', $data) && $data['preferred_locale'] !== $user->preferred_locale) { $updates['preferred_locale'] = $data['preferred_locale'] ? Str::lower($data['preferred_locale']) : null; } if (isset($data['email']) && Str::lower($data['email']) !== Str::lower((string) $user->email)) { $updates['email'] = $data['email']; $updates['email_verified_at'] = null; $emailChanged = true; } if ($request->filled('password')) { $currentPassword = (string) $request->input('current_password'); if (! $request->filled('current_password') || ! Hash::check($currentPassword, $user->password)) { return ApiError::response( 'profile.invalid_current_password', 'Aktuelles Passwort ungültig', 'Das aktuelle Passwort stimmt nicht.', Response::HTTP_UNPROCESSABLE_ENTITY, [ 'errors' => [ 'current_password' => ['Das aktuelle Passwort stimmt nicht.'], ], ] ); } $updates['password'] = $request->input('password'); } if ($updates !== []) { $user->forceFill($updates); $user->save(); if ($emailChanged) { try { $user->sendEmailVerificationNotification(); } catch (\Throwable $exception) { Log::error('[TenantProfile] Failed to send verification email after profile update', [ 'user_id' => $user->getKey(), 'tenant_id' => $request->attributes->get('tenant_id'), 'error' => $exception->getMessage(), ]); } } } return response()->json([ 'message' => 'Profil erfolgreich aktualisiert.', 'data' => $this->transformUser($user->fresh()), ]); } /** * @return array */ private function transformUser(User $user): array { return [ 'id' => $user->getKey(), 'name' => $user->name, 'email' => $user->email, 'preferred_locale' => $user->preferred_locale, 'email_verified' => $user->email_verified_at !== null, 'email_verified_at' => $user->email_verified_at?->toIso8601String(), ]; } }