Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
136 commits
Select commit Hold shift + click to select a range
409bdaa
refactor: Começa a passar para interface web criando html base do sis…
caio-unicamp Sep 30, 2026
589b2e9
refactor: Inclui tela de login inicial a partir da autenticação
caio-unicamp Sep 30, 2026
5905617
refactor: Adiciona tela com as votações disponíveis e botão de logout
caio-unicamp Sep 30, 2026
fbf2444
refactor: Altera a inicialização do app com a nova estrutura
caio-unicamp Oct 1, 2026
a580cf0
chore: Adiciona bibliotecas necessárias para interface web
caio-unicamp Oct 1, 2026
f8164c7
chore: Adiciona importações dos routers
caio-unicamp Oct 1, 2026
948e287
chore: Placeholder para importações dos routers
caio-unicamp Oct 1, 2026
c1a163e
feat: Adiciona router para autenticação de usuário
caio-unicamp Oct 1, 2026
616e372
feat: Adiciona router para eleição da australia
caio-unicamp Oct 1, 2026
492cc03
feat: Adiciona router para partida de botc
caio-unicamp Oct 1, 2026
52f9d23
feat: Adiciona router para assembleia do caco
caio-unicamp Oct 1, 2026
1c28da5
refactor: Muda tela para eleição da austrália para interface wev
caio-unicamp Oct 1, 2026
7c3d172
refactor: Muda tela da partida de botc para interface web
caio-unicamp Oct 1, 2026
8289b90
refactor: Muda tela da assembleia do caco para interface web
caio-unicamp Oct 1, 2026
8e2ee5a
refactor: Muda o nome do href do botc
caio-unicamp Oct 1, 2026
96a2d33
refactor: Altera tela de sucesso para novo estilo de interface web
caio-unicamp Oct 1, 2026
0af6eef
chore: Passa o arquivo antigo de inicialização da sessão para o legad…
caio-unicamp Oct 1, 2026
e98b62d
feat: Adiciona estilização genérica a ser alterada futuramente para a…
caio-unicamp Oct 1, 2026
33590a8
refactor: Passa a estrutura de cadastro de novos usuários para a refa…
caio-unicamp Oct 1, 2026
8e4ce1f
feat: Altera a coleta de cookies para ficar concentrada em um arquivo…
caio-unicamp Oct 1, 2026
ba2a6d3
refactor: Muda a tela de cadastro para interface web
caio-unicamp Oct 1, 2026
b606bce
refactor: Muda tela de admin da gestão do caco
caio-unicamp Oct 1, 2026
0b0cf0b
chore: Adiciona importações visíveis na pasta
caio-unicamp Oct 1, 2026
bac79e7
feat: Adiciona página de admin para storyteller de botc
caio-unicamp Oct 1, 2026
a649cc8
feat: Faz alterações necessárias para funcionar o admin da gestão do …
caio-unicamp Oct 1, 2026
2feb56e
feat: Adiciona conferência de usuário para redirecionamento à página …
caio-unicamp Oct 1, 2026
58f9f5b
chore: Dando merge das mudanças de autenticação feitas na interface
caio-unicamp Oct 5, 2026
9aa2e9e
refactor: Muda router de autenticação após mudanças feitas no backend…
caio-unicamp Oct 5, 2026
2e5c105
fix: Conserta o nome da classe da gestão do caco
caio-unicamp Oct 5, 2026
ade6789
fix: Conserta os caminhos para execução usando o caminho absoluto em …
caio-unicamp Oct 5, 2026
95b4222
fix: Conserta quantidade de atributos de classe gestão do caco
caio-unicamp Oct 5, 2026
7e9a864
fix: Conserta nova versão da biblioteca passando o context de forma c…
caio-unicamp Oct 5, 2026
689d2e6
fix: Coloca name= em cada TemplateResponse pra não dar erro na ordem
caio-unicamp Oct 5, 2026
d8486ef
fix: Coloca str no base_dir pra não dar problema e sobe mais um diret…
caio-unicamp Oct 5, 2026
88b1e58
feat: Adiciona botão para cadastro
caio-unicamp Oct 5, 2026
09d8467
feat: Estiliza melhor os textos e botões
caio-unicamp Oct 5, 2026
9c5a0cb
fix: Conserta dependência para novo banco de ids de usuários
caio-unicamp Oct 5, 2026
7f5b71e
fix: Conserta conferência em banco no router de autenticação usando a…
caio-unicamp Oct 5, 2026
9dfa0f7
fix: Muda o usuario.nome para usuario.nome_real que é a forma correta…
caio-unicamp Oct 5, 2026
3e4e7c1
chore: Altera nome do antigo teste do cli
caio-unicamp Oct 5, 2026
8230164
test: Cria arquivo de teste para interface web
caio-unicamp Oct 5, 2026
90d6512
fix: Conserta o método httpx do teste para insersão de cookies direto…
caio-unicamp Oct 5, 2026
54a4ee5
test: Adiciona tests para fluxos nos módulos router
caio-unicamp Oct 5, 2026
96ccb4f
fix: Conserta caminhos pais de todos os routers
caio-unicamp Oct 5, 2026
704b55e
fix: Conserta o allow_redirects para follow_redirects onde estava fal…
caio-unicamp Oct 5, 2026
b5756b3
test: Testa dependência para acesso sem cookie e para username não ex…
caio-unicamp Oct 5, 2026
dac3f8e
test: Testa cadastros incorretos do auth_router
caio-unicamp Oct 5, 2026
fb258a0
test: Testa acessos e ações da gestão
caio-unicamp Oct 5, 2026
f115eb1
fix: Conserta o name sucesso.html que ainda estava solto
caio-unicamp Oct 5, 2026
2f5b4f9
refactor: Muda a exceção levantada pra não ficar uma coisa feia pro u…
caio-unicamp Oct 5, 2026
a3bf0e1
feat: Adiciona tratamento da nova exceção customizada
caio-unicamp Oct 5, 2026
02de873
docs: Adiciona comentários
caio-unicamp Oct 5, 2026
05b4ea8
fix: Conserta o assert de Sessão inválida depois que mudamos a exceção
caio-unicamp Oct 5, 2026
f2179c6
test: Adiciona testes para botc_router
caio-unicamp Oct 5, 2026
0b6cd90
fix: Cadastra um jogador temporário para garantir que ele existe no b…
caio-unicamp Oct 5, 2026
5868088
test: Testa acesso deslogado no router da australia
caio-unicamp Oct 5, 2026
05b3910
docs: Muda pra versão do httpx que não está deprecated
caio-unicamp Oct 5, 2026
93c03ae
fix: Fecha bloco de for que estava aberto no template da australia
caio-unicamp Oct 5, 2026
a594e6b
perf: Armazena o que é escrito no cadastro para não perder ao dar um …
caio-unicamp Oct 5, 2026
6b37961
style: Adiciona estilo nos alertas de sucesso e erro
caio-unicamp Oct 5, 2026
956bc45
fix: Volta na mensagem antiga pro teste ficar correto
caio-unicamp Oct 5, 2026
bd2e233
feat: Adiciona tipo candidato australia no tipo de usuário
caio-unicamp Oct 6, 2026
1bd5a19
refactor: Altera o método de processar voto na eleição da austrália f…
caio-unicamp Oct 6, 2026
0e63ee8
refactor: Altera o teste do voto na austrália a partir da mudança fei…
caio-unicamp Oct 6, 2026
7ace373
refactor: Altera a maneira que é salvo o banco de dados em memória e …
caio-unicamp Oct 6, 2026
649f34b
fix: Coloca os nomes corretos dos argumentos na criação de sessões de…
caio-unicamp Oct 6, 2026
db10e3a
feat: Tenta implementar bloqueio para votos duplos na eleição da aust…
caio-unicamp Oct 7, 2026
e462520
fix: Tira o mock dentro do router deixando a conferência de candidato…
caio-unicamp Oct 7, 2026
6e25ba9
feat: Adiciona o erro no alerta do html da votação da australia
caio-unicamp Oct 7, 2026
0f4df67
fix: Finaliza o bloqueio de votos duplos no contexto da austrália
caio-unicamp Oct 7, 2026
4362315
fix: Conserta em escrito em ingles no html do botc
caio-unicamp Oct 7, 2026
5a7ecfb
refactor: Muda o nome da função de processar voto no contexto da aust…
caio-unicamp Oct 7, 2026
3fa17b3
feat: Barra votação dupla em uma eleição de pauta
caio-unicamp Oct 7, 2026
1ca7852
feat: adiciona erro quando já votou
caio-unicamp Oct 7, 2026
23a790d
feat: Permite que membros da gestão iniciem votações
caio-unicamp Oct 7, 2026
ce642db
feat: Divide entre ações dos estudantes e da gestão do CACO
caio-unicamp Oct 7, 2026
4c12908
style: Estiliza botões da gestão e omite os botões de votação quando …
caio-unicamp Oct 7, 2026
266d923
fix: Conserta a inicialização de votações que não estava passando pra…
caio-unicamp Oct 7, 2026
64c890c
refactor: Tira votos da memória e faz conferência dinâmica
caio-unicamp Oct 8, 2026
97eec6a
feat: Adiciona uma tela de resultados na assembleia do caco
caio-unicamp Oct 8, 2026
702bd7b
style: Estiliza barra de progresso dos resultados do caco
caio-unicamp Oct 8, 2026
a2e349b
feat: Permite que usuários criados após iniciar uma assembleia partic…
caio-unicamp Oct 8, 2026
399094d
docs: Tira comentário de redirecionamento incorreto
caio-unicamp Oct 8, 2026
dd642cf
test: Testa cadastro após iniciar uma assembleia
caio-unicamp Oct 8, 2026
c8f2ca5
fix: Conserta o teste da rota do caco que agora precisa ter uma assem…
caio-unicamp Oct 8, 2026
547e1e3
fix: Conserta com o novo texto estilizado de resultados
caio-unicamp Oct 8, 2026
4c70c5d
fix: Passa o novo erro estilizado em vez do antigo feio
caio-unicamp Oct 8, 2026
80deb89
fix: Testa login real em vez de cookies manuais
caio-unicamp Oct 8, 2026
4572902
test: Testa se as verificações de escopo expulsam intrusos
caio-unicamp Oct 8, 2026
bbac296
test: Testa blocos de exceção no caco_router
caio-unicamp Oct 8, 2026
348b010
test: Testa blocos de exceção na australia_router
caio-unicamp Oct 8, 2026
9db2cc9
test: Testa blocos de exceção no botc_router
caio-unicamp Oct 8, 2026
b200010
test: Testa voto incompleto
caio-unicamp Oct 8, 2026
5330514
test: Testa voto inexistente na eleição do caco
caio-unicamp Oct 8, 2026
7e14030
test: Testa encerrar duas vezes a assembleia do caco
caio-unicamp Oct 8, 2026
b38c3b9
test: Testa se o mestre de botc registrou errado o número de votos
caio-unicamp Oct 8, 2026
530e7b0
fix: Conserta a busca por strings vazias e procura o status code
caio-unicamp Oct 8, 2026
1a983a7
fix: Tira testes ambíguos já que os de _excecoes_internas já replicam…
caio-unicamp Oct 8, 2026
2d852eb
fix: Conserta teste muito rígido quando não deveria na fraude de dife…
caio-unicamp Oct 8, 2026
5f2c32a
fix: Conserta que leo estava criado como player e tentou usá-lo de st…
caio-unicamp Oct 8, 2026
d834a05
feat: Adiciona tag de erro no html do botc
caio-unicamp Oct 8, 2026
6f79e61
fix: Verifica corretamente o erro
caio-unicamp Oct 8, 2026
6d7d028
feat: Atualiza a tela de jogadores botc
caio-unicamp Oct 8, 2026
3af2545
feat: Bloqueia inserir o mesmo número para candidatos diferentes
caio-unicamp Oct 8, 2026
5930271
test: Testa colocar diferentes candidatos no mesmo ranking
caio-unicamp Oct 8, 2026
4c8c204
feat: Adiciona uma maior conferência de empate de ranking
caio-unicamp Oct 8, 2026
5f08c3d
feat: Testa com mais abrangência a condição de empate
caio-unicamp Oct 8, 2026
dbbd7cd
fix: Passa um eleitor novo para votar em vez de um que já salvou o vo…
caio-unicamp Oct 8, 2026
f270e31
fix: Tira verificação dupla desnecessária
caio-unicamp Oct 8, 2026
369171a
test: Testa o caso do ID do usuário existir no mapa de cookies mas nã…
caio-unicamp Oct 8, 2026
78afe6c
test: Testa se o ra possui letras
caio-unicamp Oct 8, 2026
8e1f0f9
test: Testa se players normais conseguem registrar votos
caio-unicamp Oct 8, 2026
2cc6e48
test: Testa se um estudante consegue acessar os botões da gestão
caio-unicamp Oct 8, 2026
6a019a1
test: Testa votos duplos na eleição do caco
caio-unicamp Oct 8, 2026
5b6d884
test: Testa votos duplos australia
caio-unicamp Oct 8, 2026
180800f
test: Isola a arquitetura do estado global para o teste de voto duplo…
caio-unicamp Oct 8, 2026
994ae32
test: Testa métodos get das páginas de cada router
caio-unicamp Oct 8, 2026
a31232c
chore: Tira método ambíguo de verificação do método get da tela da au…
caio-unicamp Oct 8, 2026
6748803
chore: Tira método ambíguo de verificação do método get da tela do botc
caio-unicamp Oct 8, 2026
3fa63a4
chore: Tira método ambíguo de verificação do método get da tela do caco
caio-unicamp Oct 8, 2026
83026c9
chore: Ajuste no teste pós mudança das verificações dos routers dos 3…
caio-unicamp Oct 8, 2026
8b8389d
feat: Adiciona na main eleitores que já votaram
caio-unicamp Oct 8, 2026
eec5b84
chore: Tira conferência de if else desnecessária nos candidatos reais
caio-unicamp Oct 8, 2026
c830ff1
chore: remove a conferência se já votou na australia pois a main já c…
caio-unicamp Oct 8, 2026
9d24b0b
chore: remove a conferência se já votou no caco pois a main já cuida …
caio-unicamp Oct 8, 2026
65669d7
chore: Limpa ternário ambíguo da tela do botc de votos
caio-unicamp Oct 8, 2026
8d3c858
feat: Tira resultado em memória e pega o resultado real
caio-unicamp Oct 8, 2026
a33851c
chore: Tira importação dupla
caio-unicamp Oct 8, 2026
e834748
test: Adiciona testes para alcançar o coverage completo de branches e…
caio-unicamp Oct 8, 2026
227fa65
test: testa renderizar a tela quando já existem votos
caio-unicamp Oct 8, 2026
0478ed6
test: Testa disparar o HTTPException 403 explicitamente na rota de re…
caio-unicamp Oct 8, 2026
ad89165
test: Cobre as exceções que faltavam no router do caco que estavam se…
caio-unicamp Oct 8, 2026
cc7736f
chore: Fix para o linter não reclamar
caio-unicamp Oct 8, 2026
bd518b7
chore: Coloca o tipo annotated em vez de passar o Depends direto nos …
caio-unicamp Oct 8, 2026
0c252fa
chore: Adiciona tipos de erros específicos em vez de exceções genéric…
caio-unicamp Oct 8, 2026
676e464
chore: Passa os argumentos sem default para antes dos com default par…
caio-unicamp Oct 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
# Tests
pytest
pytest-cov

# lint
ruff

# Front-end
fastapi[standard]
jinja2
python-multipart
httpx2
8 changes: 7 additions & 1 deletion src/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from src.routers import australia_router, auth_router, botc_router, caco_router

from .australia import EleicaoAustralia
from .botc import SistemaEleitoralBotC
from .caco import EleicaoAssembleia
Expand All @@ -7,5 +9,9 @@
"EleicaoAssembleia",
"EleicaoAustralia",
"SistemaEleitoral",
"SistemaEleitoralBotC"
"SistemaEleitoralBotC",
"australia_router",
"auth_router",
"botc_router",
"caco_router"
]
File renamed without changes.
68 changes: 68 additions & 0 deletions src/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
from pathlib import Path

from fastapi import FastAPI, Request
from fastapi.responses import RedirectResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates

from src.australia import EleicaoAustralia
from src.autenticacao.australia import EleitorAustralia
from src.autenticacao.base import ServicoAutenticacao
from src.autenticacao.botc import JogadorBOTC
from src.autenticacao.caco import GestaoCACo
from src.botc import SistemaEleitoralBotC
from src.caco import EleicaoAssembleia
from src.routers import australia_router, auth_router, botc_router, caco_router
from src.routers.dependencias import RequerRedirecionamentoException

app = FastAPI(title="Sistema de Votação Web")

@app.exception_handler(RequerRedirecionamentoException)
async def auth_exception_handler(request: Request, exc: RequerRedirecionamentoException):
return RedirectResponse(url="/", status_code=302)

# Pega o diretório absoluto onde o main.py está (a pasta src/)
BASE_DIR = Path(__file__).resolve().parent

# Configuração do Frontend com caminhos absolutos
app.mount("/static", StaticFiles(directory=str(BASE_DIR / "static")), name="static")
templates = Jinja2Templates(directory=str(BASE_DIR / "templates"))

# --- INICIALIZAÇÃO DO BANCO EM MEMÓRIA ---
banco_auth = ServicoAutenticacao()
# Usuários pré-cadastrados para teste <- Talvez seja melhor mudar depois
banco_auth.registrar(EleitorAustralia("caio", "senha123", "Caio Lima"))
banco_auth.registrar(GestaoCACo("julia", "admin", "Julia Nardo"))
banco_auth.registrar(JogadorBOTC("leo", "botc123", "Leonardo Carvalho"))

# Injeta o banco nas rotas
app.state.banco_auth = banco_auth


# Inicialização das eleições
# Cria a eleição da Austrália com os candidatos
CANDIDATOS_AUSTRALIA = ["Candidato A", "Candidato B", "Candidato C"]
eleicao_australia = EleicaoAustralia(candidatos_ids=CANDIDATOS_AUSTRALIA, cedulas=[])
app.state.eleicao_australia = eleicao_australia

# Cria a assembleia do CACo
alunos_caco = [banco_auth._mapa_usernames["julia"]] # IDs dos alunos habilitados
eleicao_caco = EleicaoAssembleia(alunos_cadastrados_ids=alunos_caco, eleitores_ids=alunos_caco, duracao_ciclo=60)
app.state.eleicao_caco = eleicao_caco
app.state.eleitores_australia_votaram = set()
app.state.eleitores_caco_votaram = set()

# Cria a partida do BoTC
sistema_botc = SistemaEleitoralBotC(jogadores_vivos=10)
app.state.sistema_botc = sistema_botc

# Registro dos controladores
app.include_router(auth_router.router)
app.include_router(australia_router.router)
app.include_router(botc_router.router)
app.include_router(caco_router.router)

@app.get("/")
async def root(request: Request):
# Redireciona a raiz direto para o login
return templates.TemplateResponse(request=request, name="login.html", context={})
5 changes: 5 additions & 0 deletions src/routers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from .dependencias import obter_usuario_logado

__all__ = [
"obter_usuario_logado"
]
97 changes: 97 additions & 0 deletions src/routers/australia_router.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
from pathlib import Path
from typing import Annotated

from fastapi import APIRouter, Depends, Request
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.templating import Jinja2Templates

from src.autenticacao.base import Usuario

from .dependencias import obter_usuario_logado

# Pega o diretório absoluto onde o main.py está (a pasta src/)
BASE_DIR = Path(__file__).resolve().parent.parent

router = APIRouter(prefix="/australia", tags=["Australia"])
templates = Jinja2Templates(directory=str(BASE_DIR / "templates"))

@router.get("/votar", response_class=HTMLResponse)
async def tela_votacao(request: Request, usuario: Annotated[Usuario, Depends(obter_usuario_logado)]):
# Valida apenas a permissão da pauta, pois o Depends já garantiu o login
if "AUSTRALIA" not in usuario.escopo:
return RedirectResponse(url="/", status_code=302)

eleicao = request.app.state.eleicao_australia
candidatos_reais = list(eleicao.candidatos)

return templates.TemplateResponse(
name="australia.html",
request=request,
context={"candidatos": candidatos_reais}
)

@router.post("/votar")
async def processar_voto_australia(request: Request, usuario: Annotated [Usuario, Depends(obter_usuario_logado)]):
if "AUSTRALIA" not in usuario.escopo:
# Redirect para a raiz em caso de fraude de escopo:
return RedirectResponse(url="/", status_code=302)

# Recupera a eleição do estado global
eleicao = request.app.state.eleicao_australia
candidatos_reais = list(eleicao.candidatos.keys()) if isinstance(eleicao.candidatos, dict) else eleicao.candidatos

# Verifica se o usuário logado já votou
if usuario.id in request.app.state.eleitores_australia_votaram:
return templates.TemplateResponse(
request=request,
name="australia.html",
context={
"candidatos": candidatos_reais,
"erro": "Você já registrou seu voto nesta eleição."
}
)

form_data = await request.form()

# Coleta e ordena os candidatos com base nos números digitados
tuplas_posicao = []
for chave, valor in form_data.items():
if chave.startswith("posicao_") and valor.strip().isdigit():
nome_candidato = chave.replace("posicao_", "")
tuplas_posicao.append((int(valor), nome_candidato))

# Ordena a lista pela nota (1, 2, 3...)
tuplas_posicao.sort(key=lambda x: x[0])
cedula_ordenada = [candidato for posicao, candidato in tuplas_posicao]

try:
# O usuário não pode pular candidatos
if len(cedula_ordenada) != len(eleicao.candidatos):
raise ValueError(f"Erro: Você ranqueou {len(cedula_ordenada)} candidatos. Você deve ranquear exatamente todos os {len(candidatos_reais)} candidatos.")

posicoes_originais = [pos for pos, cand in tuplas_posicao]
posicoes_esperadas = list(range(1, len(candidatos_reais) + 1))

if sorted(posicoes_originais) != posicoes_esperadas:
raise ValueError("As posições informadas são inválidas. Não é permitido repetir números ou pular posições.\nInsira um número diferente para cada candidato.")

# Deposita a cédula na urna
eleicao.cedulas.append(cedula_ordenada)

# Marca que este usuário já votou
request.app.state.eleitores_australia_votaram.add(usuario.id)

return templates.TemplateResponse(
request=request,
name="sucesso.html",
context={"mensagem": "Voto registrado com sucesso na Eleição Federal!"}
)
except ValueError as e:
return templates.TemplateResponse(
request=request,
name="australia.html",
context={
"candidatos": candidatos_reais,
"erro": str(e)
}
)
134 changes: 134 additions & 0 deletions src/routers/auth_router.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
from pathlib import Path
from typing import Annotated

from fastapi import APIRouter, Depends, Form, Request
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.templating import Jinja2Templates

from src.autenticacao.australia import CandidatoAustralia, EleitorAustralia
from src.autenticacao.base import Usuario
from src.autenticacao.botc import JogadorBOTC, StoryTellerBOTC
from src.autenticacao.caco import EstudanteCACo, GestaoCACo

from .dependencias import obter_usuario_logado

# Pega o diretório absoluto onde o main.py está (a pasta src/)
BASE_DIR = Path(__file__).resolve().parent.parent

router = APIRouter()
templates = Jinja2Templates(directory=str(BASE_DIR / "templates"))

@router.get("/admin", response_class=HTMLResponse)
async def painel_admin(request: Request, usuario: Annotated [Usuario, Depends(obter_usuario_logado)]):
# Impede que usuários comuns entrem na tela de gestão
if "GESTAO" not in usuario.escopo and "STORYTELLER" not in usuario.escopo:
return RedirectResponse(url="/dashboard")

return templates.TemplateResponse(request=request, name="admin.html", context={"usuario": usuario})

@router.get("/cadastro", response_class=HTMLResponse)
async def tela_cadastro(request: Request):
return templates.TemplateResponse(request=request, name="cadastro.html", context={})

@router.post("/cadastro")
async def processar_cadastro(
request: Request,
tipo_conta: str = Form(...),
username: str = Form(...),
senha: str = Form(...),
senha_confirma: str = Form(...),
nome_real: str = Form(...),
ra: str = Form(None) # Opcional no form, obrigatório para EstudanteCACo
):
try:
if senha != senha_confirma: # Verifica se as senhas inseridas batem
raise ValueError("Senhas não conferem. Tente novamente")
banco = request.app.state.banco_auth

# Análise condicional do tipo de usuário
if tipo_conta == "CACO_ESTUDANTE":
if not ra or not ra.isnumeric():
raise ValueError("RA inválido. Tente novamente.")
novo_usuario = EstudanteCACo(username, senha, nome_real, int(ra))
elif tipo_conta == "CACO_GESTAO":
novo_usuario = GestaoCACo(username, senha, nome_real)
elif tipo_conta == "AUSTRALIA_ELEITOR":
novo_usuario = EleitorAustralia(username, senha, nome_real)
elif tipo_conta == "AUSTRALIA_CANDIDATO":
novo_usuario = CandidatoAustralia(username, senha, nome_real)
elif tipo_conta == "BOTC_JOGADOR":
novo_usuario = JogadorBOTC(username, senha, nome_real)
elif tipo_conta == "BOTC_STORYTELLER":
novo_usuario = StoryTellerBOTC(username, senha, nome_real)
else:
raise ValueError("Tipo de conta desconhecido.")

banco.registrar(novo_usuario)

# Adiciona alunos e gestores novos na lista de eleitores da assembleia ativa
if tipo_conta in ("CACO_ESTUDANTE", "CACO_GESTAO"):
eleicao_caco = request.app.state.eleicao_caco
eleicao_caco.alunos_cadastrados.add(novo_usuario.id)
eleicao_caco.eleitores.add(novo_usuario.id)

# Faz o login automático após cadastro
resposta = RedirectResponse(url="/dashboard", status_code=302)
resposta.set_cookie(key="sessao_usuario", value=username, httponly=True)
return resposta

except ValueError as erro:
# Devolve o HTML de erro preenchendo os dados antigos para não apagar a tela
return templates.TemplateResponse(
request=request,
name="cadastro.html",
context={
"erro": str(erro),
"tipo_conta_selecionada": tipo_conta,
"nome_real_digitado": nome_real,
"username_digitado": username,
"ra_digitado": ra
}
)

@router.post("/login")
async def processar_login(
request: Request,
username: str = Form(...),
senha: str = Form(...)
):
banco = request.app.state.banco_auth
try:
usuario = banco.login(username, senha)

# Redireciona para o painel principal após sucesso
resposta = RedirectResponse(url="/dashboard", status_code=302)

# Salva o ID/Username no Cookie do navegador
resposta.set_cookie(key="sessao_usuario", value=usuario.username, httponly=True)
return resposta

except ValueError as erro:
# Devolve a tela de login com a mensagem de erro (ex: "Senha incorreta")
return templates.TemplateResponse(
name="login.html",
request=request,
context={"erro": str(erro)}
)

@router.get("/dashboard")
async def painel_usuario(request: Request, usuario: Annotated [Usuario, Depends(obter_usuario_logado)]):
"""A dependência 'obter_usuario_logado' já verifica os cookies.
Busca no '_mapa_usernames' e devolve o objeto correto do '_banco_por_id'.
Se o cookie não existir, ela mesma já expulsa o usuário para a tela de erro 401.
"""
return templates.TemplateResponse(
request=request,
name="dashboard.html",
context={"usuario": usuario}
)

@router.get("/logout")
async def sair(request: Request):
resposta = RedirectResponse(url="/")
resposta.delete_cookie("sessao_usuario")
return resposta
Loading
Loading