| 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 : |
<?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";