Selaa lähdekoodia

Get all permissions & user information new fields

moell 1 vuosi sitten
vanhempi
säilyke
44308a1222

+ 9 - 1
app/Console/Commands/InitializeRoutePermission.php

@@ -3,6 +3,7 @@
 namespace App\Console\Commands;
 
 use App\Models\Permission;
+use App\Models\PermissionGroup;
 use Illuminate\Console\Command;
 use Illuminate\Support\Facades\Route;
 
@@ -29,6 +30,10 @@ class InitializeRoutePermission extends Command
     {
         $routes = Route::getRoutes();
 
+        $permissionGroup = PermissionGroup::query()->firstOrCreate([
+            'name' => 'default',
+        ]);
+
         foreach ($routes as $route) {
             if (! $route->getName()) {
                 continue;
@@ -36,7 +41,10 @@ class InitializeRoutePermission extends Command
 
             Permission::query()->firstOrCreate([
                 'name' => $route->getName(),
-                'guard_name' => 'api'
+                'guard_name' => 'api',
+            ], [
+                'description' => $route->getName(),
+                'permission_group_id' => $permissionGroup->id,
             ]);
         }
     }

+ 23 - 0
app/Http/Controllers/API/PermissionController.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Http\Controllers\API;
+
+use App\Http\Controllers\Controller;
+use App\Http\Resources\API\PermissionGroupResource;
+use App\Models\PermissionGroup;
+
+class PermissionController extends Controller
+{
+    public function groupPermissions()
+    {
+        $permissionGroups = PermissionGroup::query()
+            ->with(['permissions' => function ($query)  {
+                $query->where('guard_name', 'api');
+            }])
+            ->get()->filter(function($item)  {
+                return count($item->permissions) > 0;
+            });
+
+        return PermissionGroupResource::collection($permissionGroups);
+    }
+}

+ 24 - 0
app/Http/Resources/API/PermissionGroupResource.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Http\Resources\API;
+
+use App\Http\Resources\PermissionResource;
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class PermissionGroupResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return [
+            'id' => $this->id,
+            'name' => $this->name,
+            'permissions' => PermissionResource::collection($this->permissions),
+        ];
+    }
+}

+ 4 - 0
app/Http/Resources/API/UserInfoResource.php

@@ -19,6 +19,10 @@ class UserInfoResource extends JsonResource
             'name' => $this->name,
             'email' => $this->email,
             'username' => $this->username,
+            'phone' => $this->phone,
+            'avatar' => $this->avatar,
+            'created_at' => (string)$this->created_at,
+            'created_by' => new UserProfileResource($this->createdBy),
             'company' => new SimpleCompanyResource($this->company),
             'role' => new RoleResource($this->role),
         ];

+ 20 - 0
app/Models/PermissionGroup.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class PermissionGroup extends Model
+{
+    use HasFactory;
+
+    public $timestamps = false;
+
+    protected $fillable = ['id', 'name'];
+
+    public function permissions()
+    {
+        return $this->hasMany(Permission::class);
+    }
+}

+ 5 - 0
app/Models/User.php

@@ -62,4 +62,9 @@ class User extends Authenticatable
     {
         return $this->belongsTo(Role::class);
     }
+
+    public function createdBy(): \Illuminate\Database\Eloquent\Relations\BelongsTo
+    {
+        return $this->belongsTo(User::class, 'created_by');
+    }
 }

+ 27 - 0
database/migrations/2024_02_04_111346_create_permission_groups_table.php

@@ -0,0 +1,27 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::create('permission_groups', function (Blueprint $table) {
+            $table->id();
+            $table->string('name');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('permission_groups');
+    }
+};

+ 28 - 0
database/migrations/2024_02_04_111646_add_permission_group_id_to_permissions.php

@@ -0,0 +1,28 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::table('permissions', function (Blueprint $table) {
+            $table->integer('permission_group_id')->nullable();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('permissions', function (Blueprint $table) {
+            $table->dropColumn('permission_group_id');
+        });
+    }
+};

+ 31 - 0
database/migrations/2024_02_04_115653_add_phone_avatar_to_users_table.php

@@ -0,0 +1,31 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::table('users', function (Blueprint $table) {
+            $table->string('phone', 30)->nullable();
+            $table->string('avatar', 250)->nullable();
+            $table->tinyInteger('status')->default(1);
+            $table->integer('created_by')->nullable();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('users', function (Blueprint $table) {
+            $table->dropColumn(['phone', 'avatar', 'status', 'created_by']);
+        });
+    }
+};

+ 2 - 0
routes/api.php

@@ -53,5 +53,7 @@ Route::middleware(['auth:sanctum'])->group(function () {
             ->name("project.requirement"); //项目需求
         Route::get("project/{project}/not-link-asset-requirement", [API\ProjectController::class, "notLinkAssetRequirement"])
             ->name("project.not-link-asset-requirement"); //项目未关联的资产需求
+
+        Route::get("permission", [API\PermissionController::class, 'groupPermissions'])->name("permission.group-permission");
     });
 });

+ 25 - 0
tests/Feature/API/PermissionTest.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace Tests\Feature\API;
+
+
+use Tests\Feature\TestCase;
+
+class PermissionTest extends TestCase
+{
+    public function test_get_group_permissions(): void
+    {
+        $response = $this->get(route('permission.group-permission'));
+
+        $response->assertStatus(200)
+            ->assertJsonStructure([
+                'data' => [
+                    '*' => [
+                        'id',
+                        'name',
+                        'permissions'
+                    ]
+                ]
+            ]);
+    }
+}