Your IP : 216.73.216.79


Current Path : /var/www/html/dynaweb-cms-v1/app/Http/Controllers/Backend/
Upload File :
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,
        ]);
    }
}