فهرست منبع

feat(user-type): permite código customizado e edição de grupos

- store aceita slug opcional (normalizado); update (PUT /user-type/{id})
  para nome e código, bloqueado quando is_system.
- Valida slug único e formato [A-Za-z0-9_].

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ebagabee 1 هفته پیش
والد
کامیت
231a57ce58
3فایلهای تغییر یافته به همراه56 افزوده شده و 3 حذف شده
  1. 30 0
      app/Http/Controllers/UserTypeController.php
  2. 25 3
      app/Services/UserTypeService.php
  3. 1 0
      routes/authRoutes/user_type.php

+ 30 - 0
app/Http/Controllers/UserTypeController.php

@@ -7,6 +7,7 @@
 use App\Services\UserTypeService;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
+use Illuminate\Validation\Rule;
 
 class UserTypeController extends Controller
 {
@@ -34,6 +35,7 @@ public function store(Request $request): JsonResponse
     {
         $data = $request->validate([
             'label' => 'required|string|max:100',
+            'slug'  => 'nullable|string|max:100|regex:/^[A-Za-z0-9_]+$/|unique:user_types,slug',
         ]);
 
         $item = $this->service->create($data);
@@ -45,6 +47,34 @@ public function store(Request $request): JsonResponse
         );
     }
 
+    public function update(Request $request, int $id): JsonResponse
+    {
+        $data = $request->validate([
+            'label' => 'required|string|max:100',
+            'slug'  => [
+                'required',
+                'string',
+                'max:100',
+                'regex:/^[A-Za-z0-9_]+$/',
+                Rule::unique('user_types', 'slug')->ignore($id),
+            ],
+        ]);
+
+        $item = $this->service->update($id, $data);
+
+        if (!$item) {
+            return $this->errorResponse(
+                message: 'Grupo não encontrado ou não pode ser editado.',
+                code:    422,
+            );
+        }
+
+        return $this->successResponse(
+            payload: ['id' => $item->id, 'slug' => $item->slug, 'label' => $item->label, 'is_system' => $item->is_system],
+            message: __('messages.updated'),
+        );
+    }
+
     public function destroy(int $id): JsonResponse
     {
         $deleted = $this->service->delete($id);

+ 25 - 3
app/Services/UserTypeService.php

@@ -20,15 +20,37 @@ public function findBySlug(string $slug): ?UserType
 
     public function create(array $data): UserType
     {
-        $slug = strtoupper(Str::slug($data['label'], '_'));
-
         return UserType::create([
-            'slug'      => $slug,
+            'slug'      => $this->normalizeSlug($data['slug'] ?? $data['label']),
             'label'     => $data['label'],
             'is_system' => false,
         ]);
     }
 
+    /**
+     * Grupos de sistema (is_system) não podem ser editados.
+     */
+    public function update(int $id, array $data): ?UserType
+    {
+        $model = UserType::find($id);
+
+        if (!$model || $model->is_system) {
+            return null;
+        }
+
+        $model->update([
+            'slug'  => $this->normalizeSlug($data['slug'] ?? $model->slug),
+            'label' => $data['label'] ?? $model->label,
+        ]);
+
+        return $model->fresh();
+    }
+
+    private function normalizeSlug(string $value): string
+    {
+        return strtoupper(Str::slug($value, '_'));
+    }
+
     public function delete(int $id): bool
     {
         $model = UserType::find($id);

+ 1 - 0
routes/authRoutes/user_type.php

@@ -8,5 +8,6 @@
     Route::post('/', 'store')->middleware('permission:config.user-type,add');
     Route::get('/{slug}/permissions', 'permissions')->middleware('permission:config.user-type,view');
     Route::put('/{slug}/permissions', 'updatePermissions')->middleware('permission:config.user-type,edit');
+    Route::put('/{id}', 'update')->whereNumber('id')->middleware('permission:config.user-type,edit');
     Route::delete('/{id}', 'destroy')->middleware('permission:config.user-type,delete');
 });