HEX
Server: LiteSpeed
System: Linux s1049.use1.mysecurecloudhost.com 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: xedaptot (3356)
PHP: 8.3.31
Disabled: NONE
Upload Files
File: /home/xedaptot/be.naniguide.com/app/Http/Controllers/Refactor/Admin/SearchController.php
<?php

namespace App\Http\Controllers\Refactor\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class SearchController extends Controller
{
    /**
     * Unified power search endpoint — returns JSON for all admin searchable entities.
     */
    public function search(Request $request)
    {
        $keyword = trim($request->keyword ?? '');
        $limit = 5;

        $categories = [];

        if ($keyword !== '') {
            // Customers
            $customers = \App\Model\Customer::search($keyword)
                ->orderBy('updated_at', 'desc')
                ->paginate($limit);

            if ($customers->total() > 0) {
                $categories[] = [
                    'key' => 'customers',
                    'label' => trans('refactor/admin_search.section.customers'),
                    'icon' => 'people',
                    'total' => $customers->total(),
                    'items' => $customers->map(function ($c) {
                        $user = $c->user;
                        $name = $user ? trim($user->first_name . ' ' . $user->last_name) : '';
                        $email = $user ? $user->email : '';
                        $sub = $c->getCurrentActiveSubscription();
                        $planName = $sub && $sub->plan ? $sub->plan->name : '';
                        $subStatus = $sub ? ucfirst($sub->status) : 'No subscription';

                        return [
                            'type' => 'customer',
                            'title' => $name ?: $email,
                            'subtitle' => $email,
                            'url' => route('refactor.admin.customers.edit', $c->uid),
                            'icon' => 'person',
                            'badge' => [
                                'label' => ucfirst($c->status),
                                'color' => $c->status === 'active' ? 'green' : 'default',
                            ],
                            'avatar' => [
                                'initials' => strtoupper(substr($name ?: $email, 0, 1)),
                                'color' => (ord(strtoupper(substr($name ?: $email, 0, 1))) % 8) + 1,
                            ],
                            'meta' => [
                                'plan' => $planName ?: '—',
                                'subscription' => $subStatus,
                                'joined' => $c->created_at ? $c->created_at->format('M j, Y') : '',
                            ],
                        ];
                    })->values()->toArray(),
                ];
            }

            // Plans
            $plans = \App\Model\Plan::search($keyword)
                ->orderBy('updated_at', 'desc')
                ->paginate($limit);

            if ($plans->total() > 0) {
                $categories[] = [
                    'key' => 'plans',
                    'label' => trans('refactor/admin_search.section.plans'),
                    'icon' => 'payments',
                    'total' => $plans->total(),
                    'items' => $plans->map(function ($p) {
                        $price = $p->price > 0 ? $p->getFormattedPrice() : 'Free';

                        return [
                            'type' => 'plan',
                            'title' => $p->name,
                            'subtitle' => $price,
                            'url' => route('refactor.admin.plans.general', $p->uid),
                            'icon' => 'payments',
                            'badge' => [
                                'label' => ucfirst($p->status),
                                'color' => $p->status === 'active' ? 'green' : 'default',
                            ],
                        ];
                    })->values()->toArray(),
                ];
            }

            // Sending Servers
            $sendingServers = \App\Model\SendingServer::search($keyword)
                ->orderBy('updated_at', 'desc')
                ->paginate($limit);

            if ($sendingServers->total() > 0) {
                $categories[] = [
                    'key' => 'sending_servers',
                    'label' => trans('refactor/admin_search.section.sending_servers'),
                    'icon' => 'dns',
                    'total' => $sendingServers->total(),
                    'items' => $sendingServers->map(function ($s) {
                        return [
                            'type' => 'sending_server',
                            'title' => $s->name,
                            'subtitle' => $s->type ?? '',
                            'url' => route('refactor.admin.sending-servers.edit', $s->uid),
                            'icon' => 'dns',
                            'badge' => [
                                'label' => ucfirst($s->status),
                                'color' => $s->status === 'active' ? 'green' : 'default',
                            ],
                        ];
                    })->values()->toArray(),
                ];
            }

            // System Email Templates
            $templates = \App\Model\SystemEmailTemplate::whereHas('template', function ($q) use ($keyword) {
                $q->where('templates.name', 'like', '%' . $keyword . '%');
            })->with('template')
                ->paginate($limit);

            if ($templates->total() > 0) {
                $categories[] = [
                    'key' => 'templates',
                    'label' => trans('refactor/admin_search.section.templates'),
                    'icon' => 'web',
                    'total' => $templates->total(),
                    'items' => $templates->map(function ($set) {
                        $t = $set->template;
                        $categories = $t && $t->categories ? $t->categories->pluck('name')->implode(', ') : '';

                        return [
                            'type' => 'template',
                            'title' => $t ? $t->name : $set->name,
                            'subtitle' => '',
                            'url' => route('refactor.admin.email-templates.index'),
                            'icon' => 'web',
                            'thumb' => $t ? $t->getThumbUrl() : null,
                            'meta' => [
                                'category' => $categories ?: '',
                                'created' => $t && $t->created_at ? $t->created_at->format('M j, Y') : '',
                                'updated' => $t && $t->updated_at ? $t->updated_at->format('M j, Y') : '',
                            ],
                            'actions' => [
                                ['label' => 'Preview', 'url' => route('refactor.admin.email-templates.index'), 'icon' => 'visibility'],
                            ],
                        ];
                    })->values()->toArray(),
                ];
            }

            // Form Templates (admin)
            $formTemplates = \App\Model\FormTemplate::search($keyword)
                ->with('template')
                ->paginate($limit);

            if ($formTemplates->total() > 0) {
                $categories[] = [
                    'key' => 'form_templates',
                    'label' => trans('refactor/admin_search.section.form_templates'),
                    'icon' => 'dynamic_form',
                    'total' => $formTemplates->total(),
                    'items' => $formTemplates->map(function ($ft) {
                        $t = $ft->template;
                        $thumb = $t ? $t->getThumbUrl() : null;

                        return [
                            'type' => 'form',
                            'title' => $ft->name,
                            'subtitle' => '',
                            'url' => route('refactor.admin.form-templates.index'),
                            'icon' => 'dynamic_form',
                            'thumb' => $thumb,
                            'thumb_ratio' => 'landscape',
                            'meta' => [
                                'created' => $ft->created_at ? $ft->created_at->format('M j, Y') : '',
                            ],
                        ];
                    })->values()->toArray(),
                ];
            }
        }

        return response()->json([
            'categories' => $categories,
        ]);
    }

    // ========================================================================
    // Legacy endpoints (kept for backward compat — old topbar still uses them)
    // ========================================================================

    public function general(Request $request)
    {
        $items = [
            [
                'names' => [trans('messages.settings'), trans('messages.general')],
                'url' => route('refactor.admin.settings.general'),
                'keywords' => [
                    trans('messages.api'), trans('messages.site_logo'), trans('messages.site_favicon'),
                    trans('messages.site_offline_message'), trans('messages.site_keyword'),
                    trans('messages.site_description'), trans('messages.site_online'),
                    trans('messages.login_recaptcha'), trans('messages.builder'),
                ],
            ],
            [
                'names' => [trans('messages.settings'), trans('messages.system_email')],
                'url' => route('refactor.admin.settings.mailer'),
                'keywords' => [trans('messages.smtp'), trans('messages.system.sendmail')],
            ],
            [
                'names' => [trans('messages.settings'), trans('messages.system_urls')],
                'url' => route('refactor.admin.settings.urls'),
                'keywords' => [],
            ],
            [
                'names' => [trans('messages.settings'), trans('messages.upgrade_manager')],
                'url' => route('refactor.admin.settings.upgrade'),
                'keywords' => [],
            ],
            [
                'names' => [trans('messages.settings'), trans('messages.background_job')],
                'url' => route('refactor.admin.settings.cronjob'),
                'keywords' => [trans('messages.smtp'), 'crontab cron'],
            ],
            [
                'names' => [trans('messages.settings'), trans('messages.license_tab')],
                'url' => route('refactor.admin.settings.license'),
                'keywords' => [],
            ],
            [
                'names' => [trans('messages.subscriptions')],
                'url' => route('refactor.admin.subscriptions.index'),
                'keywords' => [
                    trans('messages.subscription.resume'), trans('messages.subscription.cancel_now'),
                    trans('messages.subscription.change_plan'), trans('messages.invoices'),
                    trans('messages.transactions'), trans('messages.payment_method'),
                ],
            ],
            [
                'names' => [trans('messages.dashboard')],
                'url' => route('refactor.admin.dashboard'),
                'keywords' => [trans('messages.home')],
            ],
            [
                'names' => [trans('messages.templates')],
                'url' => route('refactor.admin.email-templates.index'),
                'keywords' => [],
            ],
            [
                'names' => [trans('messages.sending_servers')],
                'url' => route('refactor.admin.sending-servers.index'),
                'keywords' => ['Amazon SMTP sendgrid mailgun elastic Sparkpost smtp sendmail'],
            ],
            [
                'names' => [trans('messages.customers')],
                'url' => route('refactor.admin.customers.index'),
                'keywords' => [],
            ],
            [
                'names' => [trans('messages.plans')],
                'url' => route('refactor.admin.plans.index'),
                'keywords' => [],
            ],
            [
                'names' => [trans('messages.plan'), trans('messages.currencies')],
                'url' => route('refactor.admin.currencies.index'),
                'keywords' => [trans('messages.payment')],
            ],
            [
                'names' => [trans('messages.sending'), trans('messages.bounce_handlers')],
                'url' => route('refactor.admin.bounce-handlers.index'),
                'keywords' => [],
            ],
            [
                'names' => [trans('messages.sending'), trans('messages.feedback_loop_handlers')],
                'url' => route('refactor.admin.fbl-handlers.index'),
                'keywords' => [],
            ],
            [
                'names' => [trans('messages.settings'), trans('messages.languages')],
                'url' => route('refactor.admin.languages.index'),
                'keywords' => [],
            ],
            [
                'names' => [trans('messages.settings'), trans('messages.payment_gateways')],
                'url' => route('refactor.admin.payment-gateways.index'),
                'keywords' => ['Stripe StripeSubscription Offline', trans('messages.payment')],
            ],
            [
                'names' => [trans('messages.settings'), trans('messages.plugins')],
                'url' => route('refactor.admin.plugins.index'),
                'keywords' => [],
            ],
        ];

        $results = filterSearchArray($items, $request->keyword);

        return view('refactor.pages.admin.search.general', [
            'keyword' => $request->keyword,
            'results' => $results,
        ]);
    }

    public function customers(Request $request)
    {
        $customers = \App\Model\Customer::search($request->keyword)->paginate(5);

        return view('refactor.pages.admin.search.customers', [
            'keyword' => $request->keyword,
            'customers' => $customers,
        ]);
    }

    public function templates(Request $request)
    {
        $templates = \App\Model\SystemEmailTemplate::paginate(5)->map(function ($item) {
            return $item->template;
        });

        return view('refactor.pages.admin.search.templates', [
            'keyword' => $request->keyword,
            'templates' => $templates,
        ]);
    }

    public function plans(Request $request)
    {
        $plans = \App\Model\Plan::search($request->keyword)->paginate(5);

        return view('refactor.pages.admin.search.plans', [
            'keyword' => $request->keyword,
            'plans' => $plans,
        ]);
    }

    public function sendingServers(Request $request)
    {
        $sendingServers = \App\Model\SendingServer::search($request->keyword)->paginate(5);

        return view('refactor.pages.admin.search.sending_servers', [
            'keyword' => $request->keyword,
            'sending_servers' => $sendingServers,
        ]);
    }

    /**
     * Get admin pages for client-side instant search.
     */
    public static function getPages()
    {
        return [
            // Core
            ['title' => trans('refactor/admin_search.page.dashboard'), 'description' => trans('refactor/admin_search.desc.dashboard'), 'url' => route('refactor.admin.dashboard'), 'icon' => 'dashboard', 'keywords' => 'home overview statistics summary'],
            ['title' => trans('refactor/admin_search.page.customers'), 'description' => trans('refactor/admin_search.desc.customers'), 'url' => route('refactor.admin.customers.index'), 'icon' => 'people', 'keywords' => 'users accounts manage customer list'],
            ['title' => trans('refactor/admin_search.page.plans'), 'description' => trans('refactor/admin_search.desc.plans'), 'url' => route('refactor.admin.plans.index'), 'icon' => 'payments', 'keywords' => 'pricing billing plan quota limit'],
            ['title' => trans('refactor/admin_search.page.subscriptions'), 'description' => trans('refactor/admin_search.desc.subscriptions'), 'url' => route('refactor.admin.subscriptions.index'), 'icon' => 'card_membership', 'keywords' => 'subscription billing approve terminate renew cancel recurring'],
            ['title' => trans('refactor/admin_search.page.invoices'), 'description' => trans('refactor/admin_search.desc.invoices'), 'url' => route('refactor.admin.invoices.index'), 'icon' => 'receipt_long', 'keywords' => 'invoice payment transaction receipt billing history'],

            // Sending infrastructure
            ['title' => trans('refactor/admin_search.page.sending_servers'), 'description' => trans('refactor/admin_search.desc.sending_servers'), 'url' => route('refactor.admin.sending-servers.index'), 'icon' => 'dns', 'keywords' => 'smtp server amazon ses sendgrid mailgun sparkpost elastic postmark gmail'],
            ['title' => trans('refactor/admin_search.page.bounce_handlers'), 'description' => trans('refactor/admin_search.desc.bounce_handlers'), 'url' => route('refactor.admin.bounce-handlers.index'), 'icon' => 'replay', 'keywords' => 'bounce imap handler hard soft delivery'],
            ['title' => trans('refactor/admin_search.page.fbl_handlers'), 'description' => trans('refactor/admin_search.desc.fbl_handlers'), 'url' => route('refactor.admin.fbl-handlers.index'), 'icon' => 'feedback', 'keywords' => 'feedback loop complaint spam report abuse'],
            ['title' => trans('refactor/admin_search.page.blacklist'), 'description' => trans('refactor/admin_search.desc.blacklist'), 'url' => route('refactor.admin.blacklist.index'), 'icon' => 'block', 'keywords' => 'blacklist block suppress email import'],
            ['title' => trans('refactor/admin_search.page.verification_servers'), 'description' => trans('refactor/admin_search.desc.verification_servers'), 'url' => route('refactor.admin.verification-servers.index'), 'icon' => 'mark_email_read', 'keywords' => 'verification server validate email clean hygiene'],
            ['title' => trans('refactor/admin_search.page.warmup_strategies'), 'description' => trans('refactor/admin_search.desc.warmup_strategies'), 'url' => route('refactor.admin.warmup-strategies.index'), 'icon' => 'trending_up', 'keywords' => 'warmup strategy ip reputation ramp volume'],

            // Templates
            ['title' => trans('refactor/admin_search.page.templates'), 'description' => trans('refactor/admin_search.desc.templates'), 'url' => route('refactor.admin.email-templates.index'), 'icon' => 'web', 'keywords' => 'email template design html system'],
            ['title' => trans('refactor/admin_search.page.form_templates'), 'description' => trans('refactor/admin_search.desc.form_templates'), 'url' => route('refactor.admin.form-templates.index'), 'icon' => 'dynamic_form', 'keywords' => 'form template signup popup subscribe opt-in'],
            ['title' => trans('refactor/admin_search.page.page_templates'), 'description' => trans('refactor/admin_search.desc.page_templates'), 'url' => route('refactor.admin.system-pages.index'), 'icon' => 'web_stories', 'keywords' => 'page template landing pricing unsubscribe'],

            // Billing & Payment
            ['title' => trans('refactor/admin_search.page.currencies'), 'description' => trans('refactor/admin_search.desc.currencies'), 'url' => route('refactor.admin.currencies.index'), 'icon' => 'currency_exchange', 'keywords' => 'currency money usd eur format'],
            ['title' => trans('refactor/admin_search.page.payment_gateways'), 'description' => trans('refactor/admin_search.desc.payment_gateways'), 'url' => route('refactor.admin.payment-gateways.index'), 'icon' => 'credit_card', 'keywords' => 'stripe stripe-subscription offline payment gateway'],
            ['title' => trans('refactor/admin_search.page.sending_credit_plans'), 'description' => trans('refactor/admin_search.desc.sending_credit_plans'), 'url' => route('refactor.admin.sending-credit-plans.index'), 'icon' => 'toll', 'keywords' => 'sending credit plan topup buy extra'],
            ['title' => trans('refactor/admin_search.page.remote_plan_mappings'), 'description' => trans('refactor/admin_search.desc.remote_plan_mappings'), 'url' => route('refactor.admin.remote-plan-mappings.index'), 'icon' => 'sync_alt', 'keywords' => 'remote plan mapping stripe subscription sync'],

            // Access & Administration
            ['title' => trans('refactor/admin_search.page.admins'), 'description' => trans('refactor/admin_search.desc.admins'), 'url' => route('refactor.admin.admins.index'), 'icon' => 'shield_person', 'keywords' => 'admin user staff team member'],
            ['title' => trans('refactor/admin_search.page.admin_groups'), 'description' => trans('refactor/admin_search.desc.admin_groups'), 'url' => route('refactor.admin.admin-groups.index'), 'icon' => 'admin_panel_settings', 'keywords' => 'admin group role permission access'],
            ['title' => trans('refactor/admin_search.page.roles'), 'description' => trans('refactor/admin_search.desc.roles'), 'url' => route('refactor.admin.roles.index'), 'icon' => 'assignment_ind', 'keywords' => 'role permission access control rbac'],
            ['title' => trans('refactor/admin_search.page.languages'), 'description' => trans('refactor/admin_search.desc.languages'), 'url' => route('refactor.admin.languages.index'), 'icon' => 'translate', 'keywords' => 'language translation locale i18n multilingual'],
            ['title' => trans('refactor/admin_search.page.plugins'), 'description' => trans('refactor/admin_search.desc.plugins'), 'url' => route('refactor.admin.plugins.index'), 'icon' => 'extension', 'keywords' => 'plugin addon module extension install'],
            ['title' => trans('refactor/admin_search.page.notifications'), 'description' => trans('refactor/admin_search.desc.notifications'), 'url' => route('refactor.admin.notifications.index'), 'icon' => 'notifications', 'keywords' => 'notification alert message'],
            ['title' => trans('refactor/admin_search.page.tracking_log'), 'description' => trans('refactor/admin_search.desc.tracking_log'), 'url' => route('refactor.admin.tracking-log.index'), 'icon' => 'analytics', 'keywords' => 'tracking log delivery open click bounce report'],

            // Settings (enriched keywords — includes actual setting key names for discoverability)
            ['title' => trans('refactor/admin_search.page.settings_general'), 'description' => trans('refactor/admin_search.desc.settings_general'), 'url' => route('refactor.admin.settings.general'), 'icon' => 'settings', 'keywords' => 'general config site_name site_keyword site_description site_online site_offline_message site_logo_light site_logo_dark site_favicon logo favicon brand name description keyword captcha recaptcha captcha_engine login_recaptcha registration_recaptcha embedded_form_recaptcha recaptcha_site_key recaptcha_secret_key builder enable_user_registration default_language custom_script online offline seo'],
            ['title' => trans('refactor/admin_search.page.settings_mailer'), 'description' => trans('refactor/admin_search.desc.settings_mailer'), 'url' => route('refactor.admin.settings.mailer'), 'icon' => 'mail', 'keywords' => 'smtp mailer system email notification sendmail transport host port email.default.skip_failed_message'],
            ['title' => trans('refactor/admin_search.page.settings_urls'), 'description' => trans('refactor/admin_search.desc.settings_urls'), 'url' => route('refactor.admin.settings.urls'), 'icon' => 'link', 'keywords' => 'url domain app host site address frontend_scheme backend_scheme'],
            ['title' => trans('refactor/admin_search.page.settings_upgrade'), 'description' => trans('refactor/admin_search.desc.settings_upgrade'), 'url' => route('refactor.admin.settings.upgrade'), 'icon' => 'system_update', 'keywords' => 'upgrade update version patch upload'],
            ['title' => trans('refactor/admin_search.page.settings_cronjob'), 'description' => trans('refactor/admin_search.desc.settings_cronjob'), 'url' => route('refactor.admin.settings.cronjob'), 'icon' => 'schedule', 'keywords' => 'cron job background queue worker schedule task php_bin_path cronjob_last_execution'],
            ['title' => trans('refactor/admin_search.page.settings_license'), 'description' => trans('refactor/admin_search.desc.settings_license'), 'url' => route('refactor.admin.settings.license'), 'icon' => 'verified_user', 'keywords' => 'license license_type license_status license_supported_until key activation code purchase envato'],
            ['title' => trans('refactor/admin_search.page.settings_payment'), 'description' => trans('refactor/admin_search.desc.settings_payment'), 'url' => route('refactor.admin.settings.payment'), 'icon' => 'account_balance', 'keywords' => 'payment tax invoice bill checkout settings invoice.format invoice.current'],
            ['title' => trans('refactor/admin_search.page.settings_advanced'), 'description' => trans('refactor/admin_search.desc.settings_advanced'), 'url' => route('refactor.admin.settings.advanced'), 'icon' => 'tune', 'keywords' => 'advanced settings debug queue configuration site_name site_keyword site_description site_logo_light site_logo_dark site_favicon site_online site_offline_message license license_type license_status license_supported_until captcha_engine login_recaptcha recaptcha_site_key recaptcha_secret_key builder enable_user_registration default_language custom_script frontend_scheme backend_scheme php_bin_path 2fa_enable geoip automation email_verification signature tracking_domain blacklist notification campaign list verified_sender'],
            ['title' => trans('refactor/admin_search.page.settings_logs'), 'description' => trans('refactor/admin_search.desc.settings_logs'), 'url' => route('refactor.admin.settings.logs'), 'icon' => 'bug_report', 'keywords' => 'system log error debug laravel exception stack trace'],

            // Admin Account
            ['title' => trans('refactor/admin_search.page.account_profile'), 'description' => trans('refactor/admin_search.desc.account_profile'), 'url' => route('refactor.admin.account.profile'), 'icon' => 'person', 'keywords' => 'profile name email password my account'],
            ['title' => trans('refactor/admin_search.page.account_api'), 'description' => trans('refactor/admin_search.desc.account_api'), 'url' => route('refactor.admin.account.api'), 'icon' => 'api', 'keywords' => 'api key token admin'],
            ['title' => trans('refactor/admin_search.page.account_2fa'), 'description' => trans('refactor/admin_search.desc.account_2fa'), 'url' => route('refactor.admin.account.2fa'), 'icon' => 'security', 'keywords' => 'two factor 2fa authentication google authenticator security otp'],
        ];
    }

    /**
     * Get admin quick actions for client-side instant search.
     */
    public static function getActions()
    {
        return [
            ['title' => trans('refactor/admin_search.action.create_plan'), 'description' => trans('refactor/admin_search.action_desc.create_plan'), 'url' => route('refactor.admin.plans.create'), 'icon' => 'add_circle'],
            ['title' => trans('refactor/admin_search.action.create_sending_server'), 'description' => trans('refactor/admin_search.action_desc.create_sending_server'), 'url' => route('refactor.admin.sending-servers.select'), 'icon' => 'add_circle'],
            ['title' => trans('refactor/admin_search.action.create_customer'), 'description' => trans('refactor/admin_search.action_desc.create_customer'), 'url' => route('refactor.admin.customers.create'), 'icon' => 'add_circle'],
            ['title' => trans('refactor/admin_search.action.create_admin'), 'description' => trans('refactor/admin_search.action_desc.create_admin'), 'url' => route('refactor.admin.admins.create'), 'icon' => 'add_circle'],
            ['title' => trans('refactor/admin_search.action.create_currency'), 'description' => trans('refactor/admin_search.action_desc.create_currency'), 'url' => route('refactor.admin.currencies.create'), 'icon' => 'add_circle'],
            ['title' => trans('refactor/admin_search.action.go_dashboard'), 'description' => trans('refactor/admin_search.action_desc.go_dashboard'), 'url' => route('refactor.admin.dashboard'), 'icon' => 'home'],
            ['title' => trans('refactor/admin_search.action.go_settings'), 'description' => trans('refactor/admin_search.action_desc.go_settings'), 'url' => route('refactor.admin.settings.general'), 'icon' => 'settings'],
            ['title' => trans('refactor/admin_search.action.toggle_theme'), 'description' => trans('refactor/admin_search.action_desc.toggle_theme'), 'url' => '#toggle-theme', 'icon' => 'dark_mode'],
        ];
    }
}