Преглед изворни кода

feat: enhance UserController for franchisee user handling; add franchisee activities, integrations, support, and unit routes

ebagabee пре 1 недеља
родитељ
комит
9aaff41ce7

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

@@ -2,6 +2,7 @@
 
 namespace App\Http\Controllers;
 
+use App\Http\Controllers\Concerns\ResolvesActiveUnit;
 use App\Services\UserService;
 use App\Http\Requests\UserRequest;
 use App\Http\Resources\UserResource;
@@ -11,6 +12,8 @@
 
 class UserController extends Controller
 {
+    use ResolvesActiveUnit;
+
     public function __construct(protected UserService $service) {}
 
     public function authUser(): JsonResponse
@@ -39,7 +42,12 @@ public function indexByUnit(): JsonResponse
 
     public function store(UserRequest $request): JsonResponse
     {
-        $item = $this->service->create($request->validated());
+        $data = $request->validated();
+        if ($this->isFranchiseeUsersRequest()) {
+            $data['unit_id'] = $this->activeUnitId();
+            $data['access_scope'] = 'unit';
+        }
+        $item = $this->service->create($data);
 
         return $this->successResponse(
             payload: new UserResource($item),
@@ -51,12 +59,20 @@ public function store(UserRequest $request): JsonResponse
     public function show(int $id): JsonResponse
     {
         $item = $this->service->findById($id);
+        $this->authorizeFranchiseeUser($item);
         return $this->successResponse(payload: new UserResource($item));
     }
 
     public function update(UserRequest $request, int $id): JsonResponse
     {
-        $item = $this->service->update($id, $request->validated());
+        $current = $this->service->findById($id);
+        $this->authorizeFranchiseeUser($current);
+        $data = $request->validated();
+        if ($this->isFranchiseeUsersRequest()) {
+            $data['unit_id'] = $this->activeUnitId();
+            $data['access_scope'] = 'unit';
+        }
+        $item = $this->service->update($id, $data);
         return $this->successResponse(
             payload: new UserResource($item),
             message: __("messages.updated"),
@@ -65,6 +81,7 @@ public function update(UserRequest $request, int $id): JsonResponse
 
     public function destroy(int $id): JsonResponse
     {
+        $this->authorizeFranchiseeUser($this->service->findById($id));
         $this->service->delete($id);
 
         return $this->successResponse(
@@ -94,4 +111,27 @@ public function updateMe(UserRequest $request): JsonResponse
             message: __("messages.updated"),
         );
     }
+
+    private function isFranchiseeUsersRequest(): bool
+    {
+        return request()->is('api/franchisee/users*');
+    }
+
+    private function authorizeFranchiseeUser(?\App\Models\User $user): void
+    {
+        if (!$this->isFranchiseeUsersRequest()) {
+            return;
+        }
+
+        abort_unless($user, 404);
+        $unitId = request()->input('active_unit_id');
+        abort_unless($unitId && $user->units()->where('units.id', $unitId)->exists(), 404);
+
+        $role = \App\Models\UnitUser::query()
+            ->where('unit_id', $unitId)
+            ->where('user_id', $user->id)
+            ->with('userType')
+            ->first()?->userType;
+        abort_if($role?->system_key === 'ADMIN_FRANCHISEE', 403, 'Administradores do sistema não podem ser editados.');
+    }
 }

+ 5 - 0
app/Services/UserService.php

@@ -31,6 +31,10 @@ public function getAllByUnit(): Collection
 
         return User::with(['state', 'units', 'userType'])
             ->whereHas('units', fn($q) => $q->where('units.id', $unitId))
+            ->whereNotIn('users.id', UnitUser::query()
+                ->where('unit_id', $unitId)
+                ->whereHas('userType', fn ($query) => $query->where('system_key', 'ADMIN_FRANCHISEE'))
+                ->select('user_id'))
             ->orderBy('name')
             ->get();
     }
@@ -130,6 +134,7 @@ public function getUserTypes(): \Illuminate\Database\Eloquent\Collection
         return \App\Models\UserType::query()
             ->when($scope === 'unit', fn ($query) => $query->where('unit_id', $unitId))
             ->when($scope === 'franchisor', fn ($query) => $query->whereNull('unit_id'))
+            ->where('is_system', false)
             ->orderBy('label')
             ->get();
     }

+ 21 - 0
routes/authRoutes/franchisee_activities.php

@@ -0,0 +1,21 @@
+<?php
+
+use App\Http\Controllers\KanbanController;
+use App\Http\Controllers\KanbanMediaController;
+use App\Http\Controllers\KanbanReplyController;
+use Illuminate\Support\Facades\Route;
+
+Route::prefix('franchisee/activities')->group(function () {
+    Route::get('/', [KanbanController::class, 'index'])->middleware('permission:franchisee_activities,view');
+    Route::post('/', [KanbanController::class, 'store'])->middleware('permission:franchisee_activities,add');
+    Route::post('/reorder', [KanbanController::class, 'reorder'])->middleware('permission:franchisee_activities,edit');
+    Route::put('/{id}', [KanbanController::class, 'update'])->whereNumber('id')->middleware('permission:franchisee_activities,edit');
+    Route::delete('/{id}', [KanbanController::class, 'destroy'])->whereNumber('id')->middleware('permission:franchisee_activities,delete');
+    Route::get('/{kanbanId}/replies', [KanbanReplyController::class, 'index'])->whereNumber('kanbanId')->middleware('permission:franchisee_activities,view');
+    Route::post('/{kanbanId}/replies', [KanbanReplyController::class, 'store'])->whereNumber('kanbanId')->middleware('permission:franchisee_activities,add');
+    Route::put('/{kanbanId}/replies/{id}', [KanbanReplyController::class, 'update'])->whereNumber(['kanbanId', 'id'])->middleware('permission:franchisee_activities,edit');
+    Route::delete('/{kanbanId}/replies/{id}', [KanbanReplyController::class, 'destroy'])->whereNumber(['kanbanId', 'id'])->middleware('permission:franchisee_activities,delete');
+    Route::get('/{kanbanId}/medias', [KanbanMediaController::class, 'index'])->whereNumber('kanbanId')->middleware('permission:franchisee_activities,view');
+    Route::post('/{kanbanId}/medias', [KanbanMediaController::class, 'store'])->whereNumber('kanbanId')->middleware('permission:franchisee_activities,add');
+    Route::delete('/{kanbanId}/medias/{id}', [KanbanMediaController::class, 'destroy'])->whereNumber(['kanbanId', 'id'])->middleware('permission:franchisee_activities,delete');
+});

+ 9 - 0
routes/authRoutes/franchisee_integrations.php

@@ -0,0 +1,9 @@
+<?php
+
+use App\Http\Controllers\UnitPaymentAccountController;
+use Illuminate\Support\Facades\Route;
+
+Route::prefix('franchisee/integrations')->group(function () {
+    Route::get('/asaas', [UnitPaymentAccountController::class, 'showMe'])->middleware('permission:franchisee_integrations,view');
+    Route::post('/asaas', [UnitPaymentAccountController::class, 'upsertMe'])->middleware('permission:franchisee_integrations,edit');
+});

+ 16 - 0
routes/authRoutes/franchisee_support.php

@@ -0,0 +1,16 @@
+<?php
+
+use App\Http\Controllers\SupportReplyController;
+use App\Http\Controllers\SupportTicketController;
+use Illuminate\Support\Facades\Route;
+
+Route::prefix('franchisee/support')->group(function () {
+    Route::get('/tickets', [SupportTicketController::class, 'index'])->middleware('permission:franchisee_support,view');
+    Route::post('/tickets', [SupportTicketController::class, 'store'])->middleware('permission:franchisee_support,add');
+    Route::put('/tickets/{id}', [SupportTicketController::class, 'update'])->whereNumber('id')->middleware('permission:franchisee_support,edit');
+    Route::delete('/tickets/{id}', [SupportTicketController::class, 'destroy'])->whereNumber('id')->middleware('permission:franchisee_support,delete');
+    Route::get('/tickets/{ticketId}/replies', [SupportReplyController::class, 'index'])->whereNumber('ticketId')->middleware('permission:franchisee_support,view');
+    Route::post('/tickets/{ticketId}/replies', [SupportReplyController::class, 'store'])->whereNumber('ticketId')->middleware('permission:franchisee_support,add');
+    Route::put('/tickets/{ticketId}/replies/{id}', [SupportReplyController::class, 'update'])->whereNumber(['ticketId', 'id'])->middleware('permission:franchisee_support,edit');
+    Route::delete('/tickets/{ticketId}/replies/{id}', [SupportReplyController::class, 'destroy'])->whereNumber(['ticketId', 'id'])->middleware('permission:franchisee_support,delete');
+});

+ 20 - 0
routes/authRoutes/franchisee_unit.php

@@ -0,0 +1,20 @@
+<?php
+
+use App\Http\Controllers\UnitController;
+use App\Http\Controllers\UnitHistoryController;
+use App\Http\Controllers\UnitMediaController;
+use App\Http\Controllers\UnitPartnerController;
+use Illuminate\Support\Facades\Route;
+
+Route::prefix('franchisee/unit')->group(function () {
+    Route::get('/', [UnitController::class, 'showMe'])->middleware('permission:franchisee_unit,view');
+    Route::post('/', [UnitController::class, 'updateMe'])->middleware('permission:franchisee_unit,edit');
+    Route::put('/', [UnitController::class, 'updateMe'])->middleware('permission:franchisee_unit,edit');
+    Route::get('/histories', [UnitHistoryController::class, 'indexMe'])->middleware('permission:franchisee_unit,view');
+    Route::get('/medias', [UnitMediaController::class, 'indexMe'])->middleware('permission:franchisee_unit,view');
+    Route::post('/medias', [UnitMediaController::class, 'storeMe'])->middleware('permission:franchisee_unit,add');
+    Route::get('/partners', [UnitPartnerController::class, 'indexMe'])->middleware('permission:franchisee_unit,view');
+    Route::post('/partners', [UnitPartnerController::class, 'storeMe'])->middleware('permission:franchisee_unit,add');
+    Route::put('/partners/{id}', [UnitPartnerController::class, 'updateMe'])->whereNumber('id')->middleware('permission:franchisee_unit,edit');
+    Route::delete('/partners/{id}', [UnitPartnerController::class, 'destroyMe'])->whereNumber('id')->middleware('permission:franchisee_unit,delete');
+});

+ 13 - 0
routes/authRoutes/franchisee_users.php

@@ -0,0 +1,13 @@
+<?php
+
+use App\Http\Controllers\UserController;
+use Illuminate\Support\Facades\Route;
+
+Route::prefix('franchisee/users')->controller(UserController::class)->group(function () {
+    Route::get('/', 'indexByUnit')->middleware('permission:franchisee_users,view');
+    Route::post('/', 'store')->middleware('permission:franchisee_users,add');
+    Route::get('/types', 'getUserTypes')->middleware('permission:franchisee_users,view');
+    Route::get('/{id}', 'show')->whereNumber('id')->middleware('permission:franchisee_users,view');
+    Route::put('/{id}', 'update')->whereNumber('id')->middleware('permission:franchisee_users,edit');
+    Route::delete('/{id}', 'destroy')->whereNumber('id')->middleware('permission:franchisee_users,delete');
+});

+ 1 - 0
routes/authRoutes/franchisor_registrations.php

@@ -5,6 +5,7 @@
 use Illuminate\Support\Facades\Route;
 
 Route::controller(UserController::class)->prefix('user')->group(function () {
+    Route::get('/all/types', 'getUserTypes')->middleware('permission:franchisor_registrations,view');
     Route::get('/', 'index')->middleware('permission:franchisor_registrations,view');
     Route::post('/', 'store')->middleware('permission:franchisor_registrations,add');
     Route::get('/{id}', 'show')->whereNumber('id')->middleware('permission:franchisor_registrations,view');

+ 0 - 6
routes/authRoutes/unit.php

@@ -7,10 +7,4 @@
     Route::get('/all/select', 'selectList')
         ->middleware('permission:franchisor_packages|franchisor_franchisee|franchisor_support|franchisor_activities|franchisor_registrations|config,view');
 
-    //
-
-    Route::get('/me', 'showMe');
-    Route::post('/me', 'updateMe');
-    Route::put('/me', 'updateMe');
-
 });

+ 0 - 9
routes/authRoutes/unit_history.php

@@ -1,9 +0,0 @@
-<?php
-
-use Illuminate\Support\Facades\Route;
-use App\Http\Controllers\UnitHistoryController;
-
-Route::controller(UnitHistoryController::class)->prefix('unit-history')->group(function () {
-    Route::get('/me', 'indexMe');
-
-});

+ 0 - 10
routes/authRoutes/unit_media.php

@@ -1,10 +0,0 @@
-<?php
-
-use Illuminate\Support\Facades\Route;
-use App\Http\Controllers\UnitMediaController;
-
-Route::controller(UnitMediaController::class)->prefix('unit-media')->group(function () {
-    Route::get('/me', 'indexMe');
-    Route::post('/me', 'storeMe');
-
-});

+ 0 - 12
routes/authRoutes/unit_partner.php

@@ -1,12 +0,0 @@
-<?php
-
-use Illuminate\Support\Facades\Route;
-use App\Http\Controllers\UnitPartnerController;
-
-Route::controller(UnitPartnerController::class)->prefix('unit-partner')->group(function () {
-    Route::get('/me', 'indexMe');
-    Route::post('/me', 'storeMe');
-    Route::put('/me/{id}', 'updateMe');
-    Route::delete('/me/{id}', 'destroyMe');
-
-});

+ 0 - 9
routes/authRoutes/unit_payment_account.php

@@ -1,9 +0,0 @@
-<?php
-
-use Illuminate\Support\Facades\Route;
-use App\Http\Controllers\UnitPaymentAccountController;
-
-Route::controller(UnitPaymentAccountController::class)->prefix('unit-payment-account')->group(function () {
-    Route::get('/me', 'showMe');
-    Route::post('/me', 'upsertMe');
-});

+ 0 - 3
routes/authRoutes/user.php

@@ -8,7 +8,4 @@
     Route::get('/current/auth', 'authUser');
     Route::put('/me', 'updateMe');
 
-    Route::get('/unit', 'indexByUnit')->middleware('permission:franchisee_users,view');
-    Route::get('/all/types', 'getUserTypes')
-        ->middleware('permission:franchisor_registrations|config.user,view');
 });