service->authUser(); return $this->successResponse(payload: new UserResource($user)); } public function index(): JsonResponse { $items = $this->service->getAll(); return $this->successResponse( payload: UserResource::collection($items), ); } public function indexByUnit(): JsonResponse { $items = $this->service->getAllByUnit(); return $this->successResponse( payload: UserResource::collection($items), ); } public function store(UserRequest $request): JsonResponse { $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), message: __("messages.created"), code: 201, ); } 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 { $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"), ); } public function destroy(int $id): JsonResponse { $this->authorizeFranchiseeUser($this->service->findById($id)); $this->service->delete($id); return $this->successResponse( message: __("messages.deleted"), code: 204, ); } public function updateMe(UserRequest $request): JsonResponse { $user = Auth::user(); $user->update($request->safe()->only(['password'])); return $this->successResponse( payload: new UserResource($user->fresh(['state', 'units'])), 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.'); } }