| Current Path : /var/www/html/dynaweb-cms-v1/app/Http/Controllers/Backend/ |
| Current File : /var/www/html/dynaweb-cms-v1/app/Http/Controllers/Backend/RouteController.php |
<?php
namespace App\Http\Controllers\Backend;
use App\Http\Controllers\Controller;
use App\Models\Backend\Route;
use App\Services\RouteScanner;
use App\Services\ControllerScanner;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Cache;
class RouteController extends Controller
{
protected RouteScanner $routeScanner;
protected ControllerScanner $controllerScanner;
public function __construct(RouteScanner $routeScanner, ControllerScanner $controllerScanner)
{
$this->routeScanner = $routeScanner;
$this->controllerScanner = $controllerScanner;
}
public function index(Request $request)
{
$query = Route::query();
if ($request->filled('search')) {
$search = $request->search;
$query->where(function ($q) use ($search) {
$q->where('name', 'like', "%{$search}%")
->orWhere('uri', 'like', "%{$search}%")
->orWhere('controller', 'like', "%{$search}%")
->orWhere('action', 'like', "%{$search}%");
});
}
if ($request->filled('type') && $request->type !== 'all') {
$query->where('type', $request->type);
}
if ($request->filled('status') && $request->status !== 'all') {
$status = $request->status === 'active' ? 1 : 0;
$query->where('status', $status);
}
if ($request->filled('method')) {
$query->where('method', $request->method);
}
$routes = $query->orderBy('uri')->paginate(20)->withQueryString();
$types = ['web', 'api', 'admin'];
$methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'];
return view('backend.module.routes.index', [
'routes' => $routes,
'types' => $types,
'methods' => $methods,
]);
}
public function create()
{
$types = ['web', 'api', 'admin'];
$methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'];
return view('backend.module.routes.create', [
'types' => $types,
'methods' => $methods,
]);
}
public function store(Request $request)
{
$validated = $request->validate(Route::rules());
Route::create($validated);
return redirect()
->route('admin.routes.index')
->with('success', 'Route created successfully.');
}
public function edit($id)
{
$types = ['web', 'api', 'admin'];
$methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'];
$route = Route::findOrFail($id);
return view('backend.module.routes.edit', [
'route' => $route,
'types' => $types,
'methods' => $methods,
]);
}
public function update(Request $request, $id)
{
$route = Route::findOrFail($id);
$validated = $request->validate(Route::rules($route->id));
$route->update($validated);
return redirect()
->route('admin.routes.index')
->with('success', 'Route updated successfully.');
}
public function destroy($id)
{
$route = Route::findOrFail($id);
$route->delete();
return redirect()
->route('admin.routes.index')
->with('success', 'Route deleted successfully.');
}
public function bulkDelete(Request $request)
{
$ids = $request->ids ?? [];
if (empty($ids)) {
return redirect()->route('admin.routes.index')->with('error', 'No routes selected.');
}
Route::whereIn('id', $ids)->delete();
return redirect()
->route('admin.routes.index')
->with('success', count($ids) . ' routes deleted successfully.');
}
public function bulkStatus(Request $request)
{
$ids = $request->ids ?? [];
$status = $request->status === 'activate';
if (empty($ids)) {
return redirect()->route('admin.routes.index')->with('error', 'No routes selected.');
}
Route::whereIn('id', $ids)->update(['status' => $status]);
$statusText = $status ? 'activated' : 'deactivated';
return redirect()
->route('admin.routes.index')
->with('success', count($ids) . " routes {$statusText} successfully.");
}
public function generate(Request $request)
{
$source = $request->get('source', 'all');
$created = 0;
$updated = 0;
if ($source === 'routes' || $source === 'all') {
$scannedRoutes = $this->routeScanner->scan();
foreach ($scannedRoutes as $scanned) {
$existing = Route::where('uri', $scanned['uri'])
->where('method', $scanned['method'])
->first();
if ($existing) {
$existing->update([
'name' => $scanned['name'] ?? $existing->name,
'controller' => $scanned['controller'] ?? $existing->controller,
'action' => $scanned['action'] ?? $existing->action,
'middleware' => $scanned['middleware'] ?? $existing->middleware,
'type' => $scanned['type'] ?? $existing->type,
]);
$updated++;
} else {
Route::create([
'name' => $scanned['name'],
'uri' => $scanned['uri'],
'method' => $scanned['method'],
'controller' => $scanned['controller'],
'action' => $scanned['action'],
'middleware' => $scanned['middleware'],
'type' => $scanned['type'],
'status' => true,
]);
$created++;
}
}
}
if ($source === 'controllers' || $source === 'all') {
$scannedControllers = $this->controllerScanner->scan();
foreach ($scannedControllers as $scanned) {
$existing = Route::where('uri', $scanned['uri'])
->where('method', $scanned['method'])
->where('controller', $scanned['controller'])
->first();
if (!$existing) {
Route::create([
'uri' => $scanned['uri'],
'method' => $scanned['method'],
'controller' => $scanned['controller'],
'action' => $scanned['action'],
'type' => $scanned['type'],
'status' => true,
]);
$created++;
}
}
}
$message = "Generated {$created} new routes, updated {$updated} existing routes.";
if ($request->expectsJson()) {
return response()->json([
'success' => true,
'message' => $message,
'created' => $created,
'updated' => $updated,
]);
}
return redirect()
->route('admin.routes.index')
->with('success', $message);
}
public function sync(Request $request)
{
$scannedRoutes = $this->routeScanner->scan();
$scannedControllers = $this->controllerScanner->scan();
$allScanned = array_merge($scannedRoutes, $scannedControllers);
$scannedUris = array_unique(array_column($allScanned, 'uri'));
$dbRoutes = Route::all();
$dbUris = $dbRoutes->pluck('uri')->toArray();
$missingInDb = array_diff($scannedUris, $dbUris);
$extraInDb = array_diff($dbUris, $scannedUris);
$created = 0;
$deleted = 0;
foreach ($allScanned as $scanned) {
if (in_array($scanned['uri'], $missingInDb)) {
Route::create([
'name' => $scanned['name'] ?? null,
'uri' => $scanned['uri'],
'method' => $scanned['method'],
'controller' => $scanned['controller'] ?? null,
'action' => $scanned['action'] ?? null,
'middleware' => $scanned['middleware'] ?? null,
'type' => $scanned['type'],
'status' => true,
]);
$created++;
}
}
$extraRoutes = Route::whereIn('uri', $extraInDb)->get();
foreach ($extraRoutes as $route) {
if (!$route->name || !str_starts_with($route->name, 'generated_')) {
continue;
}
$route->delete();
$deleted++;
}
$message = "Sync complete: Added {$created} routes, removed {$deleted} stale routes.";
if ($request->expectsJson()) {
return response()->json([
'success' => true,
'message' => $message,
'created' => $created,
'deleted' => $deleted,
]);
}
return redirect()
->route('admin.routes.index')
->with('success', $message);
}
public function refresh(Request $request)
{
Artisan::call('route:clear');
Cache::flush();
$this->routeScanner->clearCache();
$this->controllerScanner->clearCache();
$scannedRoutes = $this->routeScanner->scan();
if ($request->expectsJson()) {
return response()->json([
'success' => true,
'message' => 'Route cache cleared and rescanned.',
'total_scanned' => count($scannedRoutes),
]);
}
return redirect()
->route('admin.routes.index')
->with('success', 'Route cache cleared and rescanned. ' . count($scannedRoutes) . ' routes found.');
}
public function available(Request $request)
{
$scannedRoutes = $this->routeScanner->scan();
$dbRoutes = Route::all()->pluck('uri')->toArray();
$scannedUris = array_unique(array_column($scannedRoutes, 'uri'));
$available = array_diff($scannedUris, $dbRoutes);
$registered = array_intersect($scannedUris, $dbRoutes);
if ($request->expectsJson()) {
return response()->json([
'available' => array_values($available),
'registered' => array_values($registered),
'available_count' => count($available),
'registered_count' => count($registered),
]);
}
return view('backend.module.routes.available', [
'available' => $available,
'registered' => $registered,
]);
}
}