CPE Console
Repositório: cpe-console
Backend e console de gestão da Chamada Escolar (matrícula da rede). Configura as chamadas, recebe as inscrições do portal público, pontua e classifica os candidatos, gerencia a fila de espera e expõe a API consumida pelo portal. Sincroniza dados com o sistema acadêmico (Syens).
Manual de uso: Chamada Escolar.
Usuários, perfis, contexto e permissões
Autenticação. O console não tem cadastro próprio de usuários: a pessoa
autentica com a conta do sistema acadêmico (Syens). A partir daí o cpe-console
cria uma UserSession (token JWT, via concerns Tokenizable/Sessionable) que
guarda os dados vindos do Syens (syens_data): nome, e-mail, escolas permitidas e
os papéis.
Papéis. Dois papéis vêm do Syens e definem o que o usuário pode fazer:
- Gestor da Chamada Escolar (
cpe_manager?) — acesso de administração. - Visualizador (
cpe_viewer?) — somente consulta.
Contexto. Os dados são escopados pelo Customer (cliente/rede de ensino, com
um ref que liga ao Syens) e pelas escolas permitidas da sessão. As regras de
funcionamento da chamada ficam em um registro único Settings.
Permissões e menus. A autorização usa Pundit (app/policies/). Cada área
tem sua policy — classification, planning, public_call, question,
subscription, sync. O menu é controlado pela MenuPolicy (ex.:
show_administration? e show_settings? só liberam para o gestor).
Stack
- Linguagem: Ruby 3.4.6
- Framework: Rails 7.2
- Banco: PostgreSQL
- Busca: Elasticsearch
- Autorização: Pundit (
app/policies) - Autenticação/API: JWT
- Jobs: Sidekiq
- Auditoria: audited
- Front-end: React 18 + esbuild
Como rodar localmente
- Use as versões do
.tool-versions(Ruby 3.4.6). - Rode
bin/setuppara instalar dependências e preparar o banco. - Suba a aplicação com
foreman start -f Procfile.dev(oudocker-compose up). - Bootstrap de um ambiente novo: abra o console (
bundle exec rails c) e crie oCustomere oSettings(registro único), preenchendo com os dados do cliente:
Customer.create!(
name: "SEDU", # nome do cliente (obrigatório e único)
ref: 1, # referência do cliente no sistema acadêmico
active: true
)
Settings.create!(
classification_rule: "default", # "default" ou "cariacica"
score_methods: "none", # CSV dos métodos de pontuação ou "none"
visual_identity: "es" # identidade visual do portal
# ...demais campos opcionais (integração com o Educação, reCAPTCHA, etc.)
)
Variáveis de ambiente
Configuradas em .env e acessadas por um objeto Settings (não use ENV
espalhado pelo código). As principais:
- Banco e infraestrutura:
DB_HOST,DB_PORT,DB_NAME,DB_USERNAME,DB_PASSWORD,REDIS_URL,ELASTICSEARCH_URL,DOMAIN,SENTRY_DSN. - Integração com o Syens/Educação:
EDUCACAO_URL,EDUCACAO_KEY,EDUCACAO_CUSTOMER_ID,EDUCACAO_CADASTRO_ID. - Pontuação e classificação:
SCORE_METHODS,DISABILITY_POINTS,CLASSIFICATION_VIEW,SIBLING_IN_SCHOOL_QUESTION_ID,SIBLING_IN_SCHOOL_ANSWER_ID. - Portal e antifraude:
API_KEY,RECAPTCHA_SITE_KEY,RECAPTCHA_SECRET_KEY,GOOGLE_API_KEY(Distance Matrix/Geocoding),IDV.
Padrões do projeto
Destaque para app/interactor/ (interactors que orquestram pontuação e
classificação), além de policies/, serializers/, services/, jobs/ e
sidekiq/. Os controllers de API ficam em app/controllers/api/v1.
Modelos centrais: public_call (chamada), subscription (inscrição),
classification, score, offer, question/answer, customer (rede/tenant),
school, school_year, curriculum, além de distance_log/geocoding_log
(integração com o Google Maps) e sync (sincronização com o acadêmico).
Pontuação e classificação acontecem em duas etapas — primeiro pontuar, depois classificar:
- As regras de pontuação vivem nos interactors, em classes
Score. - Quais regras pontuam é definido por
SCORE_METHODS, por exemplo:disability, maria_penha_law, ciase, distance, school_neighborhood, same_school_sibling, school_zone, sibling_in_school. - Todo ano os critérios devem ser revisados (pesos por distância, novos
critérios) e, se necessário, um novo
Scoreé implementado.
A lógica funcional está descrita no manual, em Processamento e Classificação.
BigPicture
Deploy
Imagem Docker publicada no Amazon ECR (chamada-publica): docker build →
docker tag <conta>.dkr.ecr.us-east-1.amazonaws.com/chamada-publica:TAG →
docker push. Infraestrutura AWS provisionada pelo InfraSpawn
(cpe.tf).