Files
rkm-conectasus-ci-sandbox/api/app/Http/Controllers/Administracao/PapelController.php
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

202 lines
6.5 KiB
PHP

<?php
namespace App\Http\Controllers\Administracao;
use App\Enums\Administracao\HistoricoAcao;
use App\Http\Controllers\Controller;
use App\Http\Requests\Administracao\PapelRequest;
use App\Models\Administracao\Modulo;
use App\Models\Administracao\Papel;
use App\Models\Administracao\PapelPermissaoHistorico;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
class PapelController extends Controller
{
protected $modulo = 'administracao';
protected $funcionalidade = 'papel';
public function datatable()
{
$currentLotacao = self::getCurrentLotacao();
$papeis = DB::table('administracao_papel AS papel')
->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);
}
}