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'],
];
}
}