get('/', 'Auth\LoginController::index'); // Authentication $routes->group('', static function ($routes) { $routes->get('login', 'Auth\LoginController::index'); $routes->post('login', 'Auth\LoginController::authenticate'); $routes->get('logout', 'Auth\LoginController::logout'); $routes->get('register', 'Auth\RegisterController::index'); $routes->post('register', 'Auth\RegisterController::store'); $routes->get('verify/(:segment)', 'Auth\RegisterController::verify/$1'); $routes->get('forgot-password', 'Auth\PasswordController::forgot'); $routes->post('forgot-password', 'Auth\PasswordController::sendResetLink'); $routes->get('reset-password/(:segment)', 'Auth\PasswordController::reset/$1'); $routes->post('reset-password/(:segment)', 'Auth\PasswordController::updatePassword/$1'); }); // App modules protected by auth $routes->group('', ['filter' => 'auth'], static function ($routes) { $routes->group('dashboard', ['filter' => 'workspace'], static function ($routes) { $routes->get('/', 'Dashboard\DashboardController::index'); $routes->post('store', 'Dashboard\DashboardController::store'); $routes->get('view/(:num)', 'Dashboard\DashboardController::viewBoard/$1'); $routes->get('settings/(:num)', 'Dashboard\DashboardController::settings/$1'); $routes->post('settings/(:num)', 'Dashboard\DashboardController::updateSettings/$1'); $routes->post('delete/(:num)', 'Dashboard\DashboardController::delete/$1'); $routes->post('pin/(:num)', 'Dashboard\DashboardController::pinToggle/$1'); $routes->post('(:num)/layout', 'Dashboard\DashboardController::saveLayout/$1'); $routes->get('(:num)/variables', 'Dashboard\DashboardController::variables/$1'); $routes->post('(:num)/widget', 'Dashboard\DashboardController::addWidget/$1'); $routes->post('widget/(:num)/update', 'Dashboard\DashboardController::updateWidget/$1'); $routes->post('widget/(:num)/delete', 'Dashboard\DashboardController::removeWidget/$1'); }); $routes->get('profile', 'ProfileController::index'); $routes->post('profile/update', 'ProfileController::update'); $routes->post('profile/password', 'ProfileController::changePassword'); $routes->post('profile/generate-api-token', 'ProfileController::generateApiToken'); $routes->group('workspace', static function ($routes) { $routes->get('/', 'Workspace\WorkspaceController::index'); $routes->get('create', 'Workspace\WorkspaceController::create'); $routes->post('store', 'Workspace\WorkspaceController::store'); $routes->get('switch/(:num)', 'Workspace\WorkspaceController::switch/$1'); }); $routes->group('workspace', ['filter' => 'workspace'], static function ($routes) { $routes->get('settings/(:num)', 'Workspace\WorkspaceController::settings/$1'); $routes->post('update/(:num)', 'Workspace\WorkspaceController::update/$1'); $routes->post('delete/(:num)', 'Workspace\WorkspaceController::delete/$1'); $routes->get('members/(:num)', 'Workspace\WorkspaceMemberController::index/$1'); $routes->post('members/(:num)/role/(:num)', 'Workspace\WorkspaceMemberController::updateRole/$1/$2'); $routes->post('members/(:num)/remove/(:num)', 'Workspace\WorkspaceMemberController::remove/$1/$2'); $routes->get('invite/(:num)', 'Workspace\WorkspaceInvitationController::index/$1'); $routes->post('invite/(:num)', 'Workspace\WorkspaceInvitationController::send/$1'); $routes->post('invite/(:num)/cancel/(:num)', 'Workspace\WorkspaceInvitationController::cancel/$1/$2'); }); $routes->group('datasource', static function ($routes) { $routes->get('/', 'DataSource\DataSourceController::index', ['filter' => 'workspace']); $routes->get('view/(:num)', 'DataSource\DataSourceController::show/$1', ['filter' => 'workspace']); $routes->get('view/(:num)/proof', 'DataSource\DataSourceController::proof/$1', ['filter' => 'workspace']); $routes->get('create', 'DataSource\DataSourceController::create', ['filter' => 'workspace']); $routes->post('store', 'DataSource\DataSourceController::store', ['filter' => 'workspace']); $routes->get('edit/(:num)', 'DataSource\DataSourceController::edit/$1', ['filter' => 'workspace']); $routes->post('update/(:num)', 'DataSource\DataSourceController::update/$1', ['filter' => 'workspace']); $routes->post('delete/(:num)', 'DataSource\DataSourceController::delete/$1', ['filter' => 'workspace']); $routes->post('test', 'DataSource\DataSourceController::test', ['filter' => 'workspace']); $routes->get('(:num)/schema', 'DataSource\DataSourceController::schema/$1', ['filter' => 'workspace']); }); $routes->group('query', static function ($routes) { $routes->get('/', 'Query\QueryController::index', ['filter' => 'workspace']); $routes->get('create', 'Query\QueryController::create', ['filter' => 'workspace']); $routes->post('store', 'Query\QueryController::store', ['filter' => 'workspace']); $routes->get('view/(:num)', 'Query\QueryController::show/$1', ['filter' => 'workspace']); $routes->get('edit/(:num)', 'Query\QueryController::edit/$1', ['filter' => 'workspace']); $routes->post('update/(:num)', 'Query\QueryController::update/$1', ['filter' => 'workspace']); $routes->post('execute', 'Query\QueryController::execute', ['filter' => 'workspace']); $routes->post('detect-variables', 'Query\QueryController::detectVariables', ['filter' => 'workspace']); }); $routes->group('chart', static function ($routes) { $routes->get('/', 'Chart\ChartController::index', ['filter' => 'workspace']); $routes->get('create', 'Chart\ChartController::create', ['filter' => 'workspace']); $routes->post('store', 'Chart\ChartController::store', ['filter' => 'workspace']); $routes->get('edit/(:num)', 'Chart\ChartController::edit/$1', ['filter' => 'workspace']); $routes->post('update/(:num)', 'Chart\ChartController::update/$1', ['filter' => 'workspace']); $routes->post('delete/(:num)', 'Chart\ChartController::delete/$1', ['filter' => 'workspace']); $routes->post('duplicate/(:num)', 'Chart\ChartController::duplicate/$1', ['filter' => 'workspace']); $routes->get('saved-query/(:num)/variables', 'Chart\ChartController::savedQueryVariables/$1', ['filter' => 'workspace']); $routes->post('preview-query', 'Chart\ChartController::previewQuery', ['filter' => 'workspace']); $routes->post('preview-render', 'Chart\ChartController::previewRender', ['filter' => 'workspace']); $routes->post('(:num)/data', 'Chart\ChartController::data/$1', ['filter' => 'workspace']); $routes->get('(:num)/export', 'Chart\ChartController::export/$1', ['filter' => 'workspace']); }); $routes->group('alert', ['filter' => 'workspace'], static function ($routes) { $routes->get('/', 'Alert\AlertController::index'); $routes->get('create', 'Alert\AlertController::create'); $routes->post('store', 'Alert\AlertController::store'); $routes->get('edit/(:num)', 'Alert\AlertController::edit/$1'); $routes->post('update/(:num)', 'Alert\AlertController::update/$1'); $routes->post('delete/(:num)', 'Alert\AlertController::delete/$1'); $routes->post('mute/(:num)', 'Alert\AlertController::mute/$1'); $routes->post('unmute/(:num)', 'Alert\AlertController::unmute/$1'); $routes->get('history/(:num)', 'Alert\AlertController::history/$1'); }); $routes->get('sharing/links', 'Share\LinkController::listResource', ['filter' => 'workspace']); $routes->post('sharing/generate', 'Share\LinkController::generate', ['filter' => 'workspace']); $routes->post('sharing/revoke/(:num)', 'Share\LinkController::revoke/$1', ['filter' => 'workspace']); $routes->group('admin/users', ['filter' => 'role:superadmin'], static function ($routes) { $routes->get('/', 'Admin\UserController::index'); $routes->get('edit/(:num)', 'Admin\UserController::edit/$1'); $routes->post('update/(:num)', 'Admin\UserController::update/$1'); }); $routes->group('admin', ['filter' => 'role:superadmin'], static function ($routes) { $routes->get('settings', 'Admin\SettingsController::index'); $routes->post('settings', 'Admin\SettingsController::update'); }); $routes->group('audit', ['filter' => ['workspace', 'workspaceadmin']], static function ($routes) { $routes->get('/', 'Audit\AuditController::index'); $routes->get('detail/(:num)', 'Audit\AuditController::detail/$1'); }); $routes->group('settings', ['filter' => 'workspace'], static function ($routes) { $routes->get('workspace', 'Settings\SettingsController::workspace'); $routes->post('workspace', 'Settings\SettingsController::saveWorkspace'); }); $routes->group('settings', ['filter' => ['workspace', 'workspaceadmin']], static function ($routes) { $routes->get('notifications', 'Settings\SettingsController::notifications'); $routes->post('notifications/slack-webhook', 'Settings\SettingsController::saveSlackWebhook'); $routes->post('notifications/smtp-test', 'Settings\SettingsController::testSmtp'); $routes->post('notifications/slack-test', 'Settings\SettingsController::testSlack'); }); $routes->post('settings/theme', 'Settings\SettingsController::saveTheme'); }); $routes->get('invite/(:segment)', 'Workspace\WorkspaceInvitationController::accept/$1'); // Public share (no auth) $routes->get('share/(:segment)', 'Share\PublicController::show/$1'); $routes->post('share/(:segment)/unlock', 'Share\PublicController::unlock/$1'); $routes->post('share/(:segment)/chart/(:num)/data', 'Share\PublicController::chartData/$1/$2'); $routes->get('share/(:segment)/dashboard/variables', 'Share\PublicController::dashboardVariables/$1'); $routes->get('share/(:segment)/saved-query/(:num)/variables', 'Share\PublicController::savedQueryVariables/$1/$2'); // API v1 routes $routes->group('api/v1', ['filter' => 'apiauth'], static function ($routes) { $routes->options('(:any)', static fn() => service('response')->setStatusCode(200)); });