Преглед на файлове

Refactor permission system, caching and routes

Move bit flags into Permission model and add Permission::getBit().
Introduce HasPermissions trait and attach it to User; simplify
CheckPermission middleware to delegate checks and handle guests. Add
caching for role/guest permission lookups and clear cache in the
RefreshPermissions command. Streamline seeder syncing using Permission
constants and update-or-create logic. Convert route files to controller
group format and adjust endpoints. Minor cleanup: simplify getAll()
queries in services.
Denis преди 2 месеца
родител
ревизия
0213728208

+ 8 - 0
app/Commands/RefreshPermissions.php

@@ -2,11 +2,13 @@
 
 namespace App\Commands;
 
+use App\Enums\UserTypeEnum;
 use App\Models\Permission;
 use App\Models\UserTypePermission;
 use Illuminate\Console\Command;
 use Database\Seeders\PermissionSeeder;
 use Database\Seeders\UserTypePermissionSeeder;
+use Illuminate\Support\Facades\Cache;
 
 class RefreshPermissions extends Command
 {
@@ -53,6 +55,12 @@ public function handle()
             $this->userTypePermissionSeeder->run();
             $this->info('UserTypePermission seeder completed successfully.');
 
+            // Clear cache
+            foreach (UserTypeEnum::toArray() as $type) {
+                Cache::forget("permissions_role_{$type}");
+            }
+            Cache::forget("permissions_guest");
+
             $this->info('Permissions refresh completed successfully!');
             return Command::SUCCESS;
         } catch (\Exception $e) {

+ 2 - 2
app/Http/Controllers/UserController.php

@@ -12,9 +12,9 @@ class UserController extends Controller
 {
     public function __construct(protected UserService $service) {}
 
-    public function me(): JsonResponse
+    public function authUser(): JsonResponse
     {
-        $user = $this->service->me();
+        $user = $this->service->authUser();
         return $this->successResponse(payload: new UserResource($user));
     }
 

+ 18 - 46
app/Http/Middleware/CheckPermission.php

@@ -5,72 +5,44 @@
 use Closure;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
+use App\Models\Permission;
 use App\Services\UserTypePermissionService;
 
 class CheckPermission
 {
     public function __construct(
-        protected UserTypePermissionService $userTypePermissionService,
+        protected UserTypePermissionService $service
     ) {}
 
-    /**
-     * Handle an incoming request.
-     *
-     * @param \Illuminate\Http\Request $request
-     * @param \Closure $next
-     * @param string $scopes A string of scopes separated by '|' to check a single permission against.
-     * @param string $permissionType The type of permission to check for each scope.
-     * @return \Symfony\Component\HttpFoundation\Response
-     */
     public function handle(Request $request, Closure $next, string $scopes, string $permissionType)
     {
         $user = Auth::user();
 
-        $userPermissions = [];
-
-        $userPermissions = $user
-            ? $this->userTypePermissionService->allPermissionsByUserType($user->type)
-            : $this->userTypePermissionService->allGuestPermissions();
-
-        $hasPermission = false;
-        foreach (explode(separator: '|', string: $scopes) as $scope) {
-            if ($this->hasPermission(userPermissions: $userPermissions, scope: $scope, permissionType: $permissionType)) {
-                $hasPermission = true;
-                break;
+        if (!$user) {
+            if ($this->checkGuest($scopes, $permissionType)) {
+                return $next($request);
             }
+            return response()->json(['message' => 'Unauthorized'], 401);
         }
 
-        if (!$hasPermission) {
-            return response()->json(data: ['message' => 'Unauthorized'], status: 403);
+        foreach (explode('|', $scopes) as $scope) {
+            if ($user->hasPermission($scope, $permissionType)) {
+                return $next($request);
+            }
         }
 
-        return $next($request);
+        return response()->json(['message' => 'Forbidden', 'code' => 403], 403);
     }
 
-    private function hasPermission($userPermissions, string $scope, string $permissionType): bool
+    protected function checkGuest(string $scopes, string $permissionType): bool
     {
-        $bitwisePermissionTable = [
-            'view' => 1,
-            'add' => 2,
-            'edit' => 4,
-            'delete' => 8,
-            'print' => 16,
-            'export' => 32,
-            'import' => 64,
-            'limit' => 128,
-            'menu' => 256,
-        ];
+        $requiredBit = Permission::getBit($permissionType);
+        $permissions = $this->service->allGuestPermissions();
 
-        $requiredPermission = $bitwisePermissionTable[$permissionType] ?? 0;
-
-        $permissionRecord = $userPermissions->first(function ($permission) use ($scope) {
-            return $permission->permission->scope === $scope;
-        });
-
-        if (!$permissionRecord) {
-            return false;
+        foreach (explode('|', $scopes) as $scope) {
+            $perm = $permissions->first(fn($p) => $p->permission->scope === $scope);
+            if ($perm && ($perm->bits & $requiredBit)) return true;
         }
-
-        return ($permissionRecord->bits & $requiredPermission) === $requiredPermission;
+        return false;
     }
 }

+ 30 - 0
app/Models/Permission.php

@@ -90,6 +90,18 @@ class Permission extends Model
 
     protected $guarded = ["id"];
 
+    public const VIEW   = 1;
+    public const ADD    = 2;
+    public const EDIT   = 4;
+    public const DELETE = 8;
+    public const PRINT  = 16;
+    public const EXPORT = 32;
+    public const IMPORT = 64;
+    public const LIMIT  = 128;
+    public const MENU   = 256;
+    public const CRUD = self::MENU | self::VIEW | self::ADD | self::EDIT | self::DELETE;
+    public const ALL_PERMS = 511;
+
     /**
      * The attributes that should be cast.
      *
@@ -103,6 +115,24 @@ protected function casts(): array
         ];
     }
 
+    public static function getBit(string $type): int
+    {
+        $type = strtoupper($type);
+
+        return match ($type) {
+            'VIEW'   => self::VIEW,
+            'ADD'    => self::ADD,
+            'EDIT'   => self::EDIT,
+            'DELETE' => self::DELETE,
+            'PRINT'  => self::PRINT,
+            'EXPORT' => self::EXPORT,
+            'IMPORT' => self::IMPORT,
+            'LIMIT'  => self::LIMIT,
+            'MENU'   => self::MENU,
+            default  => 0,
+        };
+    }
+
     /**
      * @return HasMany
      */

+ 2 - 1
app/Models/User.php

@@ -4,6 +4,7 @@
 
 use App\Enums\LanguageEnum;
 use App\Enums\UserTypeEnum;
+use App\Traits\HasPermissions;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Foundation\Auth\User as Authenticatable;
 use Illuminate\Notifications\Notifiable;
@@ -44,7 +45,7 @@
  */
 class User extends Authenticatable
 {
-    use HasFactory, Notifiable, HasApiTokens;
+    use HasFactory, Notifiable, HasApiTokens, HasPermissions;
 
     protected $guarded = ["id"];
 

+ 1 - 1
app/Services/CityService.php

@@ -9,7 +9,7 @@ class CityService
 {
     public function getAll(): Collection
     {
-        return City::query()->orderBy("created_at", "desc")->get();
+        return City::orderBy("created_at", "desc")->get();
     }
 
     public function findById(int $id): ?City

+ 1 - 1
app/Services/CountryService.php

@@ -9,7 +9,7 @@ class CountryService
 {
     public function getAll(): Collection
     {
-        return Country::query()->orderBy("created_at", "desc")->get();
+        return Country::orderBy("created_at", "desc")->get();
     }
 
     public function findById(int $id): ?Country

+ 1 - 1
app/Services/PermissionService.php

@@ -9,7 +9,7 @@ class PermissionService
 {
     public function getAll(): Collection
     {
-        return Permission::query()->orderBy("created_at", "desc")->get();
+        return Permission::orderBy("created_at", "desc")->get();
     }
 
     public function findById(int $id): ?Permission

+ 1 - 1
app/Services/StateService.php

@@ -9,7 +9,7 @@ class StateService
 {
     public function getAll(): Collection
     {
-        return State::query()->orderBy("created_at", "desc")->get();
+        return State::orderBy("created_at", "desc")->get();
     }
 
     public function findById(int $id): ?State

+ 4 - 3
app/Services/UserService.php

@@ -9,14 +9,15 @@
 
 class UserService
 {
-    public function me(): ?User
+    public function authUser(): ?User
     {
-        return Auth::user();
+        $user = Auth::user();
+        return $user;
     }
 
     public function getAll(): Collection
     {
-        return User::query()->orderBy("created_at", "desc")->get();
+        return User::orderBy("created_at", "desc")->get();
     }
 
     public function findById(int $id): ?User

+ 9 - 2
app/Services/UserTypePermissionService.php

@@ -5,17 +5,24 @@
 use App\Enums\UserTypeEnum;
 use Illuminate\Database\Eloquent\Collection;
 use App\Models\UserTypePermission;
+use Cache;
 
 class UserTypePermissionService
 {
     public function allGuestPermissions(): ?Collection
     {
-        return UserTypePermission::where("user_type", "guest")->get();
+        return Cache::remember("permissions_guest", 60 * 60 * 24, function () {
+            return UserTypePermission::with('permissions')->where("user_type", "guest")->get();
+        });
     }
 
     public function allPermissionsByUserType(
         UserTypeEnum $userType,
     ): ?Collection {
-        return UserTypePermission::where("user_type", $userType->value)->get();
+        return Cache::remember("permissions_role_{$userType->value}", 60 * 60 * 24, function () use ($userType) {
+            return UserTypePermission::with('permission')
+                ->where('user_type', $userType)
+                ->get();
+        });
     }
 }

+ 23 - 0
app/Traits/HasPermissions.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Traits;
+
+use App\Enums\UserTypeEnum;
+use App\Models\Permission;
+use App\Services\UserTypePermissionService;
+use Illuminate\Support\Facades\App;
+
+trait HasPermissions
+{
+    public function hasPermission(string $scope, string $accessType): bool
+    {
+        $requiredBit = Permission::getBit($accessType);
+        if ($requiredBit === 0) return false;
+
+        $service = App::make(UserTypePermissionService::class);
+        $permissions = $service->allPermissionsByUserType($this->type);
+        $perm = $permissions->first(fn($p) => $p->permission->scope === $scope);
+
+        return $perm && ($perm->bits & $requiredBit);
+    }
+}

+ 7 - 19
database/seeders/PermissionSeeder.php

@@ -12,60 +12,48 @@ public function __construct(
         protected PermissionService $permissionService,
     ) {}
 
-    const VIEW    = 1;
-    const ADD     = 2;
-    const EDIT    = 4;
-    const DELETE  = 8;
-    const PRINT   = 16;
-    const EXPORT  = 32;
-    const IMPORT  = 64;
-    const LIMIT   = 128;
-    const MENU    = 256;
-
-    const ALL_PERMS    = 511;
-
     public function run(): void
     {
         $permissions = [
             [
                 "scope" => "dashboard",
                 "description" => "Dashboard",
-                "bits" => self::ALL_PERMS,
+                "bits" => Permission::ALL_PERMS,
                 "children" => [],
             ],
             [
                 "scope" => "config",
                 "description" => "Configurações",
-                "bits" => self::MENU,
+                "bits" => Permission::MENU | Permission::VIEW,
                 "children" => [
                     [
                         "scope" => "config.user",
                         "description" => "Configurações de Usuários",
-                        "bits" => self::MENU | self::VIEW | self::ADD | self::EDIT | self::DELETE,
+                        "bits" => Permission::CRUD,
                         "children" => [],
                     ],
                     [
                         "scope" => "config.permission",
                         "description" => "Configurações de Permissões",
-                        "bits" => self::MENU | self::VIEW | self::ADD | self::EDIT | self::DELETE,
+                        "bits" => Permission::CRUD,
                         "children" => [],
                     ],
                     [
                         "scope" => "config.city",
                         "description" => "Configurações de Cidades",
-                        "bits" => self::MENU | self::VIEW | self::ADD | self::EDIT | self::DELETE,
+                        "bits" => Permission::CRUD,
                         "children" => [],
                     ],
                     [
                         "scope" => "config.country",
                         "description" => "Configurações de Países",
-                        "bits" => self::MENU | self::VIEW | self::ADD | self::EDIT | self::DELETE,
+                        "bits" => Permission::CRUD,
                         "children" => [],
                     ],
                     [
                         "scope" => "config.state",
                         "description" => "Configurações de Estados",
-                        "bits" => self::MENU | self::VIEW | self::ADD | self::EDIT | self::DELETE,
+                        "bits" => Permission::CRUD,
                         "children" => [],
                     ],
                 ],

+ 32 - 32
database/seeders/UserTypePermissionSeeder.php

@@ -6,59 +6,59 @@
 use App\Models\UserTypePermission;
 use Illuminate\Database\Seeder;
 use App\Enums\UserTypeEnum;
-use Illuminate\Support\Facades\Log;
 
 class UserTypePermissionSeeder extends Seeder
 {
-    /**
-     * Seed the application's database.
-     */
     public function run(): void
     {
+        $allPermissions = Permission::all()->keyBy('scope');
         foreach (UserTypeEnum::cases() as $userType) {
+            $dataToSync = [];
             switch ($userType) {
                 case UserTypeEnum::ADMIN:
-                    $permissions = Permission::get()->map(function ($permission) {
-                        return [
-                            'scope' => $permission->scope,
-                            'bits' => $permission->bits,
+                    foreach ($allPermissions as $scope => $perm) {
+                        $dataToSync[] = [
+                            'scope' => $scope,
+                            'bits'  => $perm->bits
                         ];
-                    })->toArray();
-                    $this->seedUserTypePermissions($permissions, UserTypeEnum::ADMIN->value);
+                    }
                     break;
-
                 case UserTypeEnum::USER:
-                    $userPermissions = [
-                        ['scope' => 'dashboard', 'bits' => 1],
-                        ['scope' => 'config.user', 'bits' => 5],
-                        ['scope' => 'config.city', 'bits' => 1],
-                        ['scope' => 'config.country', 'bits' => 1],
-                        ['scope' => 'config.state', 'bits' => 1],
+                    $dataToSync = [
+                        ['scope' => 'dashboard',      'bits' => Permission::VIEW],
+                        ['scope' => 'config.user',    'bits' => Permission::VIEW | Permission::EDIT],
+                        ['scope' => 'config.city',    'bits' => Permission::VIEW],
+                        ['scope' => 'config.country', 'bits' => Permission::VIEW],
+                        ['scope' => 'config.state',   'bits' => Permission::VIEW],
                     ];
-                    $this->seedUserTypePermissions($userPermissions, UserTypeEnum::USER->value);
                     break;
-
                 case UserTypeEnum::GUEST:
-                    $guestPermissions = [
-                        ['scope' => 'config.user', 'bits' => 1],
+                    $dataToSync = [
+                        ['scope' => 'config.user', 'bits' => Permission::VIEW],
                     ];
-                    $this->seedUserTypePermissions($guestPermissions, UserTypeEnum::GUEST->value);
                     break;
             }
+            if (!empty($dataToSync)) {
+                $this->seedUserTypePermissions($dataToSync, $userType->value, $allPermissions);
+            }
         }
     }
 
-    private function seedUserTypePermissions(array $permissions, string $userType): void
+    private function seedUserTypePermissions(array $permissionDataList, string $userType, $allPermissions): void
     {
-        foreach ($permissions as $permissionData) {
-            $permission = Permission::where('scope', $permissionData['scope'])->first();
-            if ($permission) {
-                $userTypePermission = UserTypePermission::firstOrNew([
-                    'user_type' => $userType,
-                    'permission_id' => $permission->id,
-                    'bits' => $permissionData['bits'],
-                ]);
-                $userTypePermission->save();
+        foreach ($permissionDataList as $data) {
+            $permissionModel = $allPermissions->get($data['scope']);
+
+            if ($permissionModel) {
+                UserTypePermission::updateOrCreate(
+                    [
+                        'user_type'     => $userType,
+                        'permission_id' => $permissionModel->id,
+                    ],
+                    [
+                        'bits' => $data['bits']
+                    ]
+                );
             }
         }
     }

+ 9 - 7
routes/authRoutes/city.php

@@ -3,16 +3,18 @@
 use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\CityController;
 
-Route::get('/city', [CityController::class, 'index'])->middleware('permission:config.city,view');
+Route::controller(CityController::class)->prefix('city')->group(function () {
+    Route::get('/', 'index')->middleware('permission:config.city,view');
 
-Route::post('/city', [CityController::class, 'store'])->middleware('permission:config.city,add');
+    Route::post('/', 'store')->middleware('permission:config.city,add');
 
-Route::get('/city/{id}', [CityController::class, 'show'])->middleware('permission:config.city,view');
+    Route::get('/{id}', 'show')->middleware('permission:config.city,view');
 
-Route::put('/city/{id}', [CityController::class, 'update'])->middleware('permission:config.city,edit');
+    Route::put('/{id}', 'update')->middleware('permission:config.city,edit');
 
-Route::delete('/city/{id}', [CityController::class, 'destroy'])->middleware('permission:config.city,delete');
+    Route::delete('/{id}', 'destroy')->middleware('permission:config.city,delete');
 
-Route::get('/city-state/{id}', [CityController::class, 'allByStateId'])->middleware('permission:config.city,view');
+    Route::get('/state/{id}', 'allByStateId')->middleware('permission:config.state|config.city,view');
 
-Route::get('/city-country/{id}', [CityController::class, 'allByCountryId'])->middleware('permission:config.city,view');
+    Route::get('/country/{id}', 'allByCountryId')->middleware('permission:config.country|config.city,view');
+});

+ 7 - 5
routes/authRoutes/country.php

@@ -3,12 +3,14 @@
 use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\CountryController;
 
-Route::get('/country', [CountryController::class, 'index'])->middleware('permission:config.country,view');
+Route::controller(CountryController::class)->prefix('country')->group(function () {
+    Route::get('/', 'index')->middleware('permission:config.country,view');
 
-Route::post('/country', [CountryController::class, 'store'])->middleware('permission:config.country,add');
+    Route::post('/', 'store')->middleware('permission:config.country,add');
 
-Route::get('/country/{id}', [CountryController::class, 'show'])->middleware('permission:config.country,view');
+    Route::get('/{id}', 'show')->middleware('permission:config.country,view');
 
-Route::put('/country/{id}', [CountryController::class, 'update'])->middleware('permission:config.country,edit');
+    Route::put('/{id}', 'update')->middleware('permission:config.country,edit');
 
-Route::delete('/country/{id}', [CountryController::class, 'destroy'])->middleware('permission:config.country,delete');
+    Route::delete('/{id}', 'destroy')->middleware('permission:config.country,delete');
+});

+ 7 - 5
routes/authRoutes/permission.php

@@ -3,12 +3,14 @@
 use App\Http\Controllers\PermissionController;
 use Illuminate\Support\Facades\Route;
 
-Route::get('/permission', [PermissionController::class, 'index'])->middleware('permission:config.permission,view');
+Route::controller(PermissionController::class)->prefix('permission')->group(function () {
+    Route::get('/', 'index')->middleware('permission:config.permission,view');
 
-Route::get('/permission-no-tree', [PermissionController::class, 'allNoTree'])->middleware('permission:config.permission,view');
+    Route::post('/', 'store')->middleware('permission:config.permission,add');
 
-Route::get('/permission/{id}', [PermissionController::class, 'show'])->middleware('permission:config.permission,view');
+    Route::get('/{id}', 'show')->middleware('permission:config.permission,view');
 
-Route::post('/permission/{id}', [PermissionController::class, 'update'])->middleware('permission:config.permission,edit');
+    Route::put('/{id}', 'update')->middleware('permission:config.permission,edit');
 
-Route::post('/permission', [PermissionController::class, 'store'])->middleware('permission:config.permission,add');
+    Route::delete('/{id}', 'destroy')->middleware('permission:config.permission,delete');
+});

+ 8 - 6
routes/authRoutes/state.php

@@ -3,14 +3,16 @@
 use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\StateController;
 
-Route::get('/state', [StateController::class, 'index'])->middleware('permission:config.state,view');
+Route::controller(StateController::class)->prefix('state')->group(function () {
+    Route::get('/', 'index')->middleware('permission:config.state,view');
 
-Route::post('/state', [StateController::class, 'store'])->middleware('permission:config.state,add');
+    Route::post('/', 'store')->middleware('permission:config.state,add');
 
-Route::get('/state/{id}', [StateController::class, 'show'])->middleware('permission:config.state,view');
+    Route::get('/{id}', 'show')->middleware('permission:config.state,view');
 
-Route::put('/state/{id}', [StateController::class, 'update'])->middleware('permission:config.state,edit');
+    Route::put('/{id}', 'update')->middleware('permission:config.state,edit');
 
-Route::delete('/state/{id}', [StateController::class, 'destroy'])->middleware('permission:config.state,delete');
+    Route::delete('/{id}', 'destroy')->middleware('permission:config.state,delete');
 
-Route::get('/state-country/{id}', [StateController::class, 'allByCountryId'])->middleware('permission:config.state,view');
+    Route::get('/country/{id}', 'allByCountryId')->middleware('permission:config.state|config.country,view');
+});

+ 9 - 7
routes/authRoutes/user.php

@@ -3,16 +3,18 @@
 use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\UserController;
 
-Route::get('/user/me', [UserController::class, 'me']);
+Route::controller(UserController::class)->prefix('user')->group(function () {
+    Route::get('/current/auth', 'authUser');
 
-Route::get('/user', [UserController::class, 'index'])->middleware('permission:config.user,view');
+    Route::get('/', 'index')->middleware('permission:config.user,view');
 
-Route::post('/user', [UserController::class, 'store'])->middleware('permission:config.user,add');
+    Route::post('/', 'store')->middleware('permission:config.user,add');
 
-Route::get('/user/{id}', [UserController::class, 'show'])->middleware('permission:config.user,view');
+    Route::get('/{id}', 'show')->middleware('permission:config.user,view');
 
-Route::put('/user/{id}', [UserController::class, 'update'])->middleware('permission:config.user,edit');
+    Route::put('/{id}', 'update')->middleware('permission:config.user,edit');
 
-Route::delete('/user/{id}', [UserController::class, 'destroy'])->middleware('permission:config.user,delete');
+    Route::delete('/{id}', 'destroy')->middleware('permission:config.user,delete');
 
-Route::get('/user-types', [UserController::class, 'getUserTypes'])->middleware('permission:config.user,view');
+    Route::get('/all/types', 'getUserTypes')->middleware('permission:config.user,view');
+});

+ 1 - 1
routes/authRoutes/user_type_permission.php

@@ -3,4 +3,4 @@
 use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\UserTypePermissionController;
 
-Route::get('/permissions-by-type', [UserTypePermissionController::class, 'allPermissionsByUserType']);
+Route::get('/permissions/user/type', [UserTypePermissionController::class, 'allPermissionsByUserType']);

+ 1 - 1
routes/noAuthRoutes/user_type_permission.php

@@ -3,4 +3,4 @@
 use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\UserTypePermissionController;
 
-Route::get('/permissions-by-type/guest', [UserTypePermissionController::class, 'allGuestPermissions']);
+Route::get('/permissions/user/type/guest', [UserTypePermissionController::class, 'allGuestPermissions']);

+ 7 - 10
storage/stubs/Route.stub

@@ -3,17 +3,14 @@
 use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\{{modelName}}Controller;
 
-Route::get('/{{modelNameSnakeCase}}', [{{modelName}}Controller::class, 'index'])
-    ->middleware('permission:{{modelNameSnakeCase}},view');
+Route::controller({{modelName}}Controller::class)->prefix('{{modelNameSnakeCase}}')->group(function () {
+    Route::get('/', 'index')->middleware('permission:{{modelNameSnakeCase}},view');
 
-Route::post('/{{modelNameSnakeCase}}', [{{modelName}}Controller::class, 'store'])
-    ->middleware('permission:{{modelNameSnakeCase}},add');
+    Route::post('/', 'store')->middleware('permission:{{modelNameSnakeCase}},add');
 
-Route::get('/{{modelNameSnakeCase}}/{id}', [{{modelName}}Controller::class, 'show'])
-    ->middleware('permission:{{modelNameSnakeCase}},view');
+    Route::get('/{id}', 'show')->middleware('permission:{{modelNameSnakeCase}},view');
 
-Route::put('/{{modelNameSnakeCase}}/{id}', [{{modelName}}Controller::class, 'update'])
-    ->middleware('permission:{{modelNameSnakeCase}},edit');
+    Route::put('/{id}', 'update')->middleware('permission:{{modelNameSnakeCase}},edit');
 
-Route::delete('/{{modelNameSnakeCase}}/{id}', [{{modelName}}Controller::class, 'destroy'])
-    ->middleware('permission:{{modelNameSnakeCase}},delete');
+    Route::delete('/{id}', 'destroy')->middleware('permission:{{modelNameSnakeCase}},delete');
+});

+ 1 - 2
storage/stubs/Service.stub

@@ -9,8 +9,7 @@ class {{modelName}}Service
 {
     public function getAll(): Collection
     {
-        return {{modelName}}::query()
-            ->orderBy('created_at', 'desc')
+        return {{modelName}}::orderBy('created_at', 'desc')
             ->get();
     }