select( 'papel.id', 'papel.nome' ) ->whereNull('papel.deleted_at') ->when( $currentLotacao->usuario->is_administrador !== true, fn ($q) => $q ->whereExists(fn ($q) => $q->select(DB::raw(1)) ->from('administracao_gestor_papel') ->join('administracao_gestor', 'administracao_gestor.id', 'administracao_gestor_papel.gestor_id') ->where('administracao_gestor.usuario_id', $currentLotacao->usuario_id) ->whereColumn('administracao_gestor_papel.papel_id', 'papel.id') )); return datatables()->of($papeis)->skipTotalRecords()->make(true); } public function index() { $this->auth(__FUNCTION__); $papeis = $this->get(Papel::class)->orderBy('nome')->get(); return response()->json($papeis, Response::HTTP_OK); } public function create() { $this->auth(__FUNCTION__); return [ 'form' => $this->getFormData(), 'model' => [ 'nome' => null, 'permissoes' => [] ] ]; } public function store(PapelRequest $request) { $this->auth(__FUNCTION__); $papel = new Papel; $params = $request->all(); DB::transaction(function () use ($papel, $params) { $papel->fill($params); $papel->save(); $permissoes = $papel->permissoes()->sync($params['permissoes']); foreach ($permissoes['attached'] as $permissao) { PapelPermissaoHistorico::create([ 'acao_id' => HistoricoAcao::CADASTRO, 'papel_id' => $papel->id, 'permissao_id' => $permissao, ]); } foreach ($permissoes['detached'] as $permissao) { PapelPermissaoHistorico::create([ 'acao_id' => HistoricoAcao::EXCLUSAO, 'papel_id' => $papel->id, 'permissao_id' => $permissao, ]); } }); return response()->json($papel->fresh(), Response::HTTP_CREATED); } public function show($id) { $this->auth(__FUNCTION__); return response()->json($this->get(Papel::class, $id), Response::HTTP_OK); } public function edit($id) { $this->auth(__FUNCTION__); $papel = Papel::findOrFail($id); return [ 'form' => $this->getFormData(), 'model' => [ 'nome' => $papel->nome, 'permissoes' => $papel->permissoes->pluck('id'), ], ]; } public function getFormData() { $currentLotacao = self::getCurrentLotacao(); return [ 'modulos' => Modulo::whereHas('funcionalidades') ->when($currentLotacao->usuario->is_administrador !== true, fn ($q) => $q ->whereHas('funcionalidades.permissoes.gestores', fn ($q) => $q ->where('usuario_id', $currentLotacao->usuario_id) ) ) ->orderBy('nome') ->get() ->map(fn ($modulo) => [ 'id' => $modulo->id, 'nome' => $modulo->nome, 'funcionalidades' => $modulo->funcionalidades() ->when($currentLotacao->usuario->is_administrador !== true, fn ($q) => $q ->whereHas('permissoes.gestores', fn ($q) => $q ->where('usuario_id', $currentLotacao->usuario_id) ) ) ->orderBy('nome') ->get() ->map(fn ($funcionalidade) => [ 'id' => $funcionalidade->id, 'nome' => $funcionalidade->nome, 'permissoes' => $funcionalidade->permissoes() ->when($currentLotacao->usuario->is_administrador !== true, fn ($q) => $q ->whereHas('gestores', fn ($q) => $q ->where('usuario_id', $currentLotacao->usuario_id) ) ) ->get() ->map(fn ($permissao) => [ 'id' => $permissao->id, 'nome' => $permissao->crudAcao->nome, ]), ]), ]), ]; } public function update(PapelRequest $request, $id) { $this->auth(__FUNCTION__); $papel = Papel::findOrFail($id); $params = $request->all(); DB::transaction(function () use ($papel, $params) { $papel->update($params); $permissoes = $papel->permissoes()->sync($params['permissoes']); foreach ($permissoes['attached'] as $permissao) { PapelPermissaoHistorico::create([ 'acao_id' => HistoricoAcao::CADASTRO, 'papel_id' => $papel->id, 'permissao_id' => $permissao, ]); } foreach ($permissoes['detached'] as $permissao) { PapelPermissaoHistorico::create([ 'acao_id' => HistoricoAcao::EXCLUSAO, 'papel_id' => $papel->id, 'permissao_id' => $permissao, ]); } }); return response()->json($papel->fresh(), Response::HTTP_OK); } public function destroy($id) { $this->auth(__FUNCTION__); Papel::findOrFail($id)->delete(); return response()->json(null, Response::HTTP_NO_CONTENT); } }