group(function () { Route::get('/login', [\App\Http\Controllers\Auth\LoginController::class, 'create'])->name('login'); Route::post('/login', [\App\Http\Controllers\Auth\LoginController::class, 'store']) ->middleware('throttle:5,1'); // rate limit: 5 tentativas por minuto }); Route::middleware('auth')->group(function () { Route::post('/logout', [\App\Http\Controllers\Auth\LoginController::class, 'destroy'])->name('logout'); // ---------- Área do operador ---------- Route::middleware('can:gerenciar,App\Models\Sessao')->prefix('admin')->name('admin.')->group(function () { Route::get('/', [\App\Http\Controllers\Admin\DashboardController::class, 'index'])->name('dashboard'); // ----- Sessões (inclui pauta, votação, quórum, pedidos de fala) ----- Route::middleware('modulo:sessoes')->group(function () { Route::resource('sessoes', \App\Http\Controllers\Admin\SessaoController::class) ->parameters(['sessoes' => 'sessao']); Route::post('sessoes/{sessao}/iniciar-quorum', [\App\Http\Controllers\Admin\SessaoController::class, 'iniciarQuorum']) ->name('sessoes.iniciar-quorum'); Route::post('sessoes/{sessao}/encerrar', [\App\Http\Controllers\Admin\SessaoController::class, 'encerrar']) ->name('sessoes.encerrar'); Route::get('sessoes/{sessao}/painel', \App\Livewire\Admin\PainelOperador::class) ->name('sessoes.painel'); Route::get('sessoes/{sessao}/votacao', \App\Livewire\Admin\QuorumVotacao::class) ->name('sessoes.votacao'); Route::post('sessao-materias/{sessaoMateria}/iniciar-votacao', [\App\Http\Controllers\Admin\VotacaoController::class, 'iniciar']) ->name('votacao.iniciar'); Route::post('sessao-materias/{sessaoMateria}/encerrar-votacao', [\App\Http\Controllers\Admin\VotacaoController::class, 'encerrar']) ->name('votacao.encerrar'); Route::post('sessao-materias/{sessaoMateria}/votar-por/{vereador}', [\App\Http\Controllers\Admin\VotacaoController::class, 'votarPor']) ->name('votacao.votar-por'); Route::post('quorum/{sessao}/{vereador}', [\App\Http\Controllers\Admin\QuorumController::class, 'atualizar']) ->name('quorum.atualizar'); Route::post('quorum/{sessao}/segunda-chamada', [\App\Http\Controllers\Admin\QuorumController::class, 'segundaChamada']) ->name('quorum.segunda-chamada'); Route::post('pedidos-fala/{pedidoFala}/autorizar', [\App\Http\Controllers\Admin\PedidoFalaController::class, 'autorizar']) ->name('pedidos-fala.autorizar'); Route::post('pedidos-fala/{pedidoFala}/encerrar', [\App\Http\Controllers\Admin\PedidoFalaController::class, 'encerrar']) ->name('pedidos-fala.encerrar'); }); // ----- Matérias ----- Route::middleware('modulo:materias')->group(function () { Route::get('materias', [\App\Http\Controllers\Admin\MateriaController::class, 'index'])->name('materias.index'); Route::get('materias/nova', \App\Livewire\Admin\MateriaForm::class)->name('materias.create'); Route::get('materias/{materia}/editar', \App\Livewire\Admin\MateriaForm::class)->name('materias.edit'); }); // ----- Usuários ----- Route::middleware('modulo:usuarios')->group(function () { Route::resource('usuarios', \App\Http\Controllers\Admin\UsuarioController::class) ->parameters(['usuarios' => 'usuario']) ->except(['show', 'destroy']); Route::post('usuarios/{usuario}/resetar-senha', [\App\Http\Controllers\Admin\UsuarioController::class, 'resetarSenha']) ->name('usuarios.resetar-senha'); Route::post('usuarios/{usuario}/toggle-ativo', [\App\Http\Controllers\Admin\UsuarioController::class, 'toggleAtivo']) ->name('usuarios.toggle-ativo'); }); // ----- Legislaturas ----- Route::middleware('modulo:legislaturas')->group(function () { Route::get('legislaturas', [\App\Http\Controllers\Admin\LegislaturaController::class, 'index'])->name('legislaturas.index'); Route::post('legislaturas', [\App\Http\Controllers\Admin\LegislaturaController::class, 'store'])->name('legislaturas.store'); Route::put('legislaturas/{legislatura}', [\App\Http\Controllers\Admin\LegislaturaController::class, 'update'])->name('legislaturas.update'); Route::get('sessoes-legislativas', [\App\Http\Controllers\Admin\SessaoLegislativaController::class, 'index'])->name('sessoes-legislativas.index'); Route::post('sessoes-legislativas', [\App\Http\Controllers\Admin\SessaoLegislativaController::class, 'store'])->name('sessoes-legislativas.store'); Route::put('sessoes-legislativas/{sessoesLegislativa}', [\App\Http\Controllers\Admin\SessaoLegislativaController::class, 'update'])->name('sessoes-legislativas.update'); }); // ----- Comissões ----- Route::middleware('modulo:comissoes')->group(function () { Route::resource('comissoes', \App\Http\Controllers\Admin\ComissaoController::class) ->parameters(['comissoes' => 'comissao']) ->except(['show', 'destroy']); }); // ----- Cadastros ----- Route::middleware('modulo:cadastros')->group(function () { Route::get('cadastros', \App\Livewire\Admin\Cadastros::class)->name('cadastros.index'); }); // ----- Protocolo ----- Route::middleware('modulo:protocolo')->group(function () { Route::get('protocolos', [\App\Http\Controllers\Admin\ProtocoloController::class, 'index'])->name('protocolos.index'); Route::get('protocolos/novo', \App\Livewire\Admin\ProtocoloForm::class)->name('protocolos.create'); Route::get('protocolos/{protocolo}/editar', \App\Livewire\Admin\ProtocoloForm::class)->name('protocolos.edit'); }); // ----- Atas ----- Route::middleware('modulo:atas')->group(function () { Route::get('atas', [\App\Http\Controllers\Admin\AtaController::class, 'index'])->name('atas.index'); Route::get('atas/nova', \App\Livewire\Admin\AtaForm::class)->name('atas.create'); Route::get('atas/{ata}/editar', \App\Livewire\Admin\AtaForm::class)->name('atas.edit'); Route::get('atas/{ata}/visualizar', [\App\Http\Controllers\Admin\AtaController::class, 'visualizar'])->name('atas.visualizar'); Route::post('sessoes/{sessao}/gerar-ata', [\App\Http\Controllers\Admin\AtaController::class, 'gerarParaSessao'])->name('atas.gerar'); Route::post('atas/{ata}/publicar', [\App\Http\Controllers\Admin\AtaController::class, 'publicar'])->name('atas.publicar'); }); // ----- Configurações ----- Route::middleware('modulo:configuracoes')->group(function () { Route::get('configuracoes', [\App\Http\Controllers\Admin\ConfiguracaoController::class, 'edit'])->name('configuracoes.edit'); Route::put('configuracoes', [\App\Http\Controllers\Admin\ConfiguracaoController::class, 'update'])->name('configuracoes.update'); }); // ----- Relatórios ----- Route::middleware('modulo:relatorios')->prefix('relatorios')->name('relatorios.')->group(function () { Route::get('/', [\App\Http\Controllers\Admin\RelatorioController::class, 'index'])->name('index'); Route::get('sessao/{sessao}', [\App\Http\Controllers\Admin\RelatorioController::class, 'sessao'])->name('sessao'); Route::get('sessao/{sessao}/pdf', [\App\Http\Controllers\Admin\RelatorioController::class, 'sessaoPdf'])->name('sessao-pdf'); Route::get('frequencia', [\App\Http\Controllers\Admin\RelatorioController::class, 'frequencia'])->name('frequencia'); Route::get('frequencia/pdf', [\App\Http\Controllers\Admin\RelatorioController::class, 'frequenciaPdf'])->name('frequencia-pdf'); Route::get('frequencia/csv', [\App\Http\Controllers\Admin\RelatorioController::class, 'frequenciaCsv'])->name('frequencia-csv'); Route::get('votos-vereador', [\App\Http\Controllers\Admin\RelatorioController::class, 'votosVereador'])->name('votos-vereador'); Route::get('votos-vereador/pdf', [\App\Http\Controllers\Admin\RelatorioController::class, 'votosVereadorPdf'])->name('votos-vereador-pdf'); Route::get('votos-vereador/csv', [\App\Http\Controllers\Admin\RelatorioController::class, 'votosVereadorCsv'])->name('votos-vereador-csv'); Route::get('produtividade', [\App\Http\Controllers\Admin\RelatorioController::class, 'produtividade'])->name('produtividade'); Route::get('produtividade/pdf', [\App\Http\Controllers\Admin\RelatorioController::class, 'produtividadePdf'])->name('produtividade-pdf'); Route::get('produtividade/csv', [\App\Http\Controllers\Admin\RelatorioController::class, 'produtividadeCsv'])->name('produtividade-csv'); Route::get('protocolos', [\App\Http\Controllers\Admin\RelatorioController::class, 'protocolos'])->name('protocolos'); Route::get('protocolos/pdf', [\App\Http\Controllers\Admin\RelatorioController::class, 'protocolosPdf'])->name('protocolos-pdf'); Route::get('protocolos/csv', [\App\Http\Controllers\Admin\RelatorioController::class, 'protocolosCsv'])->name('protocolos-csv'); }); }); // ---------- Área do vereador ---------- Route::prefix('vereador')->name('vereador.')->group(function () { // Painel ao vivo (Livewire) — presença + voto, atualiza sozinho Route::get('/', \App\Livewire\Vereador\PainelVotacao::class)->name('painel'); Route::post('presenca/{sessao}', [\App\Http\Controllers\Vereador\QuorumController::class, 'confirmar']) ->name('presenca.confirmar'); Route::post('votar/{sessaoMateria}', [\App\Http\Controllers\Vereador\VotoController::class, 'store']) ->name('votar'); Route::post('pedir-fala/{sessao}', [\App\Http\Controllers\Vereador\PedidoFalaController::class, 'store']) ->name('pedir-fala'); }); }); // ---------- Painel público (sem login) ---------- Route::prefix('publico')->name('publico.')->group(function () { Route::get('/', [\App\Http\Controllers\Publico\HomeController::class, 'index'])->name('home'); Route::get('sessoes', [\App\Http\Controllers\Publico\SessaoController::class, 'index'])->name('sessoes'); Route::get('sessoes/{sessao}', [\App\Http\Controllers\Publico\SessaoController::class, 'show'])->name('sessoes.show'); Route::get('sessoes/{sessao}/ao-vivo', \App\Livewire\Publico\ResultadoAoVivo::class)->name('sessoes.ao-vivo'); Route::get('votacoes', [\App\Http\Controllers\Publico\VotacaoController::class, 'index'])->name('votacoes'); Route::get('votacoes.csv', [\App\Http\Controllers\Publico\VotacaoController::class, 'exportCsv'])->name('votacoes.csv'); Route::get('atas', [\App\Http\Controllers\Publico\AtaController::class, 'index'])->name('atas.index'); Route::get('atas/{ata}', [\App\Http\Controllers\Publico\AtaController::class, 'show'])->name('atas.show'); });