MatchPredict é uma plataforma full-stack de palpites de futebol focada na Premier League. Usuários autenticados acompanham partidas sincronizadas, registram palpites de placar antes do kickoff e acompanham ranking, estatísticas, transparência e histórico dos seus palpites.
- Cadastro, login JWT e recuperação de senha por e-mail.
- Listagem de partidas com filtros, paginação, status, rodada, times e placar quando disponível.
- Criação, edição e exclusão de palpites antes do bloqueio por kickoff/status.
- Página "Meus Palpites" exibindo exclusivamente palpites já feitos pelo usuário, separados entre ativos e histórico por rodada.
- Transparência de palpites por partida, respeitando ocultação antes do kickoff.
- Pontuação automática: 3 pontos por placar exato, 1 por vencedor/empate correto e 0 por erro.
- Ranking geral, ranking do usuário autenticado e estatísticas individuais.
- Sincronização administrativa de liga, times, jogadores, partidas e resultados via ESPN.
- Scheduler backend para atualizar resultados e processar fixtures encerradas.
- Deploy com Docker Compose, backend, frontend e Cloudflare Tunnel.
- Next.js 15
- React 19
- TypeScript
- Tailwind CSS
- TanStack Query
- Axios
- React Hook Form
- Zod
- Lucide React
- Sonner
- NestJS 11
- TypeScript
- Prisma ORM
- PostgreSQL
- JWT com Passport
- Class Validator e Class Transformer
- Swagger
- NestJS Schedule
- NestJS Throttler
- Nodemailer
- PostgreSQL/Neon
- Docker
- Docker Compose
- TrueNAS
- Cloudflare Tunnel
- ESPN APIs como fonte de dados esportivos
Usuario
-> Frontend Next.js
-> API NestJS (/api/v1)
-> Prisma ORM
-> PostgreSQL
API NestJS
-> ESPN APIs para dados esportivos
-> SMTP para recuperação de senha
-> Scheduler para resultados e processamento de pontuação
O frontend é separado do backend e consome a API REST por services HTTP. O backend concentra autenticação, validação, regras de negócio, sincronização esportiva, processamento de resultados e persistência.
Auth: cadastro, login, recuperação e redefinição de senha.Users: perfil e estatísticas do usuário autenticado.Football: listagem e sincronização de dados esportivos.Predictions: criação, edição, exclusão, transparência e processamento de palpites.Standings: ranking geral e posição do usuário.Email: envio SMTP de recuperação de senha.Prisma: acesso ao banco PostgreSQL.
- Visão geral
- Requisitos funcionais
- Regras de negócio
- Modelagem do banco
- Endpoints da API
- Arquitetura
- Roadmap
- Node.js 20+
- npm
- PostgreSQL acessível localmente ou via Neon
cd backend
npm install
cp .env.example .env
npx prisma generate
npm run start:devConfigure backend/.env com valores reais no ambiente local. Não versione secrets.
Variáveis principais:
PORT=3000
DATABASE_URL=<postgresql-url>
JWT_SECRET=<jwt-secret>
FRONTEND_URL=http://localhost:3001
EMAIL_PROVIDER=smtp
SMTP_HOST=<smtp-host>
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=<smtp-user>
SMTP_PASSWORD=<smtp-password>
EMAIL_FROM="MatchPredict <no-reply@example.com>"
ESPN_API_URL=https://site.api.espn.com/apis/site/v2
ESPN_CORE_API_URL=https://sports.core.api.espn.com/v2
ESPN_LEAGUE=eng.1
ESPN_COUNTRY=England
ESPN_LEAGUE_LOGO=<league-logo-url>cd frontend
npm install
npm run devVariável pública usada pelo frontend:
NEXT_PUBLIC_API_URL=http://localhost:3000/api/v1O repositório possui compose.yaml com três serviços principais:
backend: API NestJS exposta localmente em127.0.0.1:3001no host.frontend: aplicação Next.js exposta em3002no host.cloudflared: túnel Cloudflare usando configuração local em./cloudflared.
Exemplo de execução:
docker compose up --buildAntes de usar Docker, configure os arquivos de ambiente locais esperados pelo compose e mantenha secrets fora do Git.
Backend:
cd backend
npm run lint
npm run build
npm test
npm run test:e2eFrontend:
cd frontend
npm run lint
npm run build- JWT é usado para proteger rotas autenticadas.
- Rotas administrativas exigem usuário com papel
ADMIN. - DTOs usam validação com whitelist e bloqueio de campos não permitidos.
- Recuperação de senha armazena apenas hash do token.
- Exemplos de ambiente neste README usam placeholders e não devem conter credenciais reais.
- Arquivos
.envlocais devem permanecer fora dos commits.
- A pontuação atual considera apenas placar previsto.
- MVP existe na modelagem, mas não está implementado no fluxo funcional de palpite ou pontuação.
- A modelagem suporta ligas e temporadas, mas a experiência atual é focada na temporada ativa da Premier League.
- Existem endpoints administrativos no backend, mas ainda não há painel administrativo completo no frontend.
SyncLogexiste no schema, mas ainda não é usado para registrar sincronizações reais.
Projeto de portfólio. Defina uma licença formal antes de distribuir ou reutilizar em outro contexto.
