Files
autocrm/routes/web.php
T

83 lines
3.6 KiB
PHP

<?php
use App\Tenancy\TenantManager;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::get('/__check-activitylog/{token}', function (string $token) {
if ($token !== 'kx9zMq7vR3aF2') abort(404);
$report = [
'trait_exists' => trait_exists('Spatie\\Activitylog\\Traits\\LogsActivity'),
'class_exists_Activity' => class_exists('Spatie\\Activitylog\\Models\\Activity'),
'class_exists_LogOptions' => class_exists('Spatie\\Activitylog\\LogOptions'),
'auditable_loadable' => trait_exists('App\\Models\\Concerns\\Auditable'),
'composer_lock_present' => file_exists(base_path('composer.lock')),
'vendor_path_exists' => is_dir(base_path('vendor/spatie/laravel-activitylog')),
'vendor_path' => base_path('vendor/spatie/laravel-activitylog/src/Traits/LogsActivity.php'),
'vendor_file_exists' => file_exists(base_path('vendor/spatie/laravel-activitylog/src/Traits/LogsActivity.php')),
];
return response()->json($report, 200, [], JSON_PRETTY_PRINT);
});
Route::get('/', function () {
// On a tenant subdomain → redirect to the tenant panel.
if (app(TenantManager::class)->isResolved()) {
return redirect('/app');
}
// On the central domain → redirect to admin.
return redirect('/admin');
});
// PWA — manifest dinamic per tenant.
Route::get('/manifest.json', function (Request $request) {
$tenant = app(TenantManager::class)->current();
$name = $tenant?->display_name ?? $tenant?->name ?? 'AutoCRM';
$themeColor = $tenant?->settings['theme_color'] ?? '#3B82F6';
$shortName = $tenant?->slug ?? 'autocrm';
return response()->json([
'name' => $name,
'short_name' => mb_substr($shortName, 0, 12),
'description' => 'CRM autoservice — ' . $name,
'start_url' => '/app',
'display' => 'standalone',
'orientation' => 'any',
'background_color' => '#ffffff',
'theme_color' => $themeColor,
'lang' => $tenant?->settings['language'] ?? 'ro',
'icons' => [
['src' => '/pwa/icon-192.png', 'sizes' => '192x192', 'type' => 'image/png'],
['src' => '/pwa/icon-512.png', 'sizes' => '512x512', 'type' => 'image/png'],
['src' => '/pwa/icon-maskable.png', 'sizes' => '512x512', 'type' => 'image/png', 'purpose' => 'maskable'],
],
])->header('Cache-Control', 'public, max-age=3600');
});
// Service worker stub — minimal cache for shell.
Route::get('/sw.js', function () {
return response(<<<'JS'
const CACHE = 'autocrm-shell-v1';
const SHELL = ['/manifest.json'];
self.addEventListener('install', e => {
e.waitUntil(caches.open(CACHE).then(c => c.addAll(SHELL)));
});
self.addEventListener('activate', e => {
e.waitUntil(caches.keys().then(keys =>
Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))
));
});
self.addEventListener('fetch', e => {
const u = new URL(e.request.url);
if (e.request.method !== 'GET') return;
// network-first for app routes; cache-first for static
if (u.pathname.startsWith('/build/') || u.pathname.startsWith('/pwa/')) {
e.respondWith(caches.match(e.request).then(m => m || fetch(e.request).then(r => {
const copy = r.clone();
caches.open(CACHE).then(c => c.put(e.request, copy));
return r;
})));
}
});
JS, 200, ['Content-Type' => 'application/javascript', 'Cache-Control' => 'public, max-age=3600']);
});