tenant; return response()->json([ 'message' => 'Settings erfolgreich abgerufen.', 'data' => [ 'id' => $tenant->id, 'settings' => $tenant->settings ?? [], 'updated_at' => $tenant->settings_updated_at?->toISOString(), ], ]); } public function notificationPreferences( Request $request, TenantNotificationPreferences $preferencesService ): JsonResponse { $tenant = $request->tenant; $defaults = TenantNotificationPreferences::defaults(); $resolved = []; foreach (array_keys($defaults) as $key) { $resolved[$key] = $preferencesService->shouldNotify($tenant, $key); } return response()->json([ 'data' => [ 'defaults' => $defaults, 'preferences' => $resolved, 'overrides' => $tenant->notification_preferences ?? null, 'meta' => [ 'credit_warning_sent_at' => $tenant->credit_warning_sent_at?->toIso8601String(), 'credit_warning_threshold' => $tenant->credit_warning_threshold, ], ], ]); } public function updateNotificationPreferences( NotificationPreferencesRequest $request, TenantNotificationPreferences $preferencesService ): JsonResponse { $tenant = $request->tenant; $payload = $request->validated()['preferences']; $tenant->update([ 'notification_preferences' => $payload, ]); $tenant->refresh(); $resolved = []; foreach (array_keys(TenantNotificationPreferences::defaults()) as $key) { $resolved[$key] = $preferencesService->shouldNotify($tenant->fresh(), $key); } return response()->json([ 'message' => 'Benachrichtigungseinstellungen aktualisiert.', 'data' => [ 'preferences' => $resolved, 'overrides' => $tenant->notification_preferences, 'meta' => [ 'credit_warning_sent_at' => $tenant->credit_warning_sent_at?->toIso8601String(), 'credit_warning_threshold' => $tenant->credit_warning_threshold, ], ], ]); } /** * Update the tenant's settings. */ public function update(SettingsStoreRequest $request): JsonResponse { $tenant = $request->tenant; $settings = $request->validated()['settings']; $tenant->update([ 'settings' => $settings, 'settings_updated_at' => now(), ]); return response()->json([ 'message' => 'Settings erfolgreich aktualisiert.', 'data' => [ 'id' => $tenant->id, 'settings' => $settings, 'updated_at' => now()->toISOString(), ], ]); } /** * Reset tenant settings to defaults. */ public function reset(Request $request): JsonResponse { $tenant = $request->tenant; $defaultSettings = [ 'branding' => [ 'logo_url' => null, 'primary_color' => '#3B82F6', 'secondary_color' => '#1F2937', 'font_family' => 'Inter, sans-serif', ], 'features' => [ 'photo_likes_enabled' => true, 'event_checklist' => true, 'custom_domain' => false, 'advanced_analytics' => false, ], 'custom_domain' => null, 'contact_email' => $tenant->contact_email, 'event_default_type' => 'general', ]; $tenant->update([ 'settings' => $defaultSettings, 'settings_updated_at' => now(), ]); return response()->json([ 'message' => 'Settings auf Standardwerte zurueckgesetzt.', 'data' => [ 'id' => $tenant->id, 'settings' => $defaultSettings, 'updated_at' => now()->toISOString(), ], ]); } /** * Validate custom domain availability. */ public function validateDomain(Request $request): JsonResponse { $domain = $request->input('domain'); if (! $domain) { return ApiError::response( 'domain_missing', 'Domain erforderlich', 'Bitte gib eine Domain an.', Response::HTTP_BAD_REQUEST ); } if (! $this->isValidDomain($domain)) { return response()->json([ 'available' => false, 'message' => 'Ungueltiges Domain-Format.', ]); } $taken = Tenant::where('custom_domain', $domain) ->where('id', '!=', $request->tenant->id) ->exists(); return response()->json([ 'available' => ! $taken, 'message' => $taken ? 'Domain ist bereits vergeben.' : 'Domain ist verfuegbar.', ]); } private function isValidDomain(string $domain): bool { return filter_var($domain, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME) !== false; } }