EURECA e uma aplicacao web full-stack de comunidade social. O projeto combina feed de publicacoes, perfis, comentarios, notificacoes, conversas privadas em tempo real, upload de imagens, relacoes de seguidores e uma experiencia de assinatura Eureca Plus.
O repositorio esta dividido em duas aplicacoes independentes:
frontend: interface em React + Vitebackend: API em NestJS + Prisma + PostgreSQL
- Cadastro e login com JWT
- Login por email ou nome de usuario
- Perfil com nome, usuario, area, bio, interesses e estado Eureca Plus
- Feed publico acessivel sem login
- Feed autenticado com estado de curtida por usuario
- Feed de posts das pessoas seguidas
- Criacao e remocao de posts
- Upload de imagens para posts
- Curtir e descurtir posts
- Contagem de visualizacoes
- Comentarios em posts
- Respostas a comentarios
- Edicao e remocao de comentarios proprios
- Denuncia de posts
- Sugestoes de perfis para seguir
- Seguir e deixar de seguir usuarios
- Listagem de seguidores e seguindo
- Tendencias calculadas a partir dos posts reais
- Notificacoes para curtidas, comentarios, respostas, mensagens privadas e avisos da plataforma
- Marcacao de notificacoes como lidas
- Conversas privadas com mensagens e estado de leitura
- Atualizacoes de conversa em tempo real via Socket.IO
- Area Eureca Plus com ativacao e cancelamento de plano
- Conta de desenvolvimento para testes locais
- React 19
- Vite 7
- lucide-react
- socket.io-client
- CSS proprio
- NestJS 11
- Prisma 7
- PostgreSQL
- JWT
- Passport
- bcrypt
- Multer
- Socket.IO
EURECA/
|-- backend/
| |-- prisma/
| |-- src/
| | |-- auth/
| | |-- comments/
| | |-- conversations/
| | |-- notifications/
| | |-- posts/
| | |-- uploads/
| | `-- users/
| |-- test/
| `-- package.json
|-- frontend/
| |-- src/
| | |-- api/
| | |-- components/
| | |-- config/
| | |-- features/
| | |-- hooks/
| | `-- views/
| `-- package.json
`-- README.md
- Node.js
- npm
- PostgreSQL local
O projeto nao usa workspace na raiz. Frontend e backend sao instalados e executados separadamente.
cd backend
npm install
cd ../frontend
npm installCrie o arquivo backend/.env:
DATABASE_URL="postgresql://USER:PASSWORD@localhost:5432/eureca"
JWT_SECRET="troque-este-segredo"
PORT=3000Opcionalmente, crie frontend/.env:
VITE_API_URL="http://localhost:3000"Se VITE_API_URL nao for definido, o frontend usa http://localhost:3000.
Dentro de backend:
npx prisma migrate devPara aplicar migrations existentes em outro ambiente:
npx prisma migrate deploycd backend
npm run start:devAPI padrao:
http://localhost:3000
Healthcheck:
curl http://localhost:3000/healthcd frontend
npm run devFrontend padrao:
http://localhost:5173
O backend salva imagens enviadas para posts em backend/uploads/posts e expoe esses arquivos em:
http://localhost:3000/uploads/posts/<arquivo>
Formatos aceitos:
- JPG
- PNG
- WebP
Limite por imagem:
5 MB
O frontend possui um atalho para login local com a conta:
email: dev@eureca.local
password: dev123456
username: dev_eureca
Se a conta ainda nao existir, o frontend tenta cria-la automaticamente.
| Script | Descricao |
|---|---|
npm run start:dev |
inicia a API em modo desenvolvimento |
npm run start |
inicia a API |
npm run build |
compila o backend |
npm run start:prod |
roda a versao compilada |
npm run test |
executa testes unitarios |
npm run test:e2e |
executa testes end-to-end |
npm run test:cov |
gera cobertura de testes |
npm run lint |
executa ESLint com correcao automatica |
npm run format |
formata arquivos TypeScript |
| Script | Descricao |
|---|---|
npm run dev |
inicia o Vite |
npm run build |
gera build de producao |
npm run preview |
serve a build localmente |
npm run lint |
executa ESLint |
GET /healthPOST /auth/register
POST /auth/loginExemplo de cadastro:
{
"email": "dev@eureca.local",
"password": "dev123456",
"name": "Dev Eureca",
"username": "dev_eureca",
"role": "Engenharia de Software",
"bio": "Conta local para testar publicacoes, curtidas e conversas da Eureca.",
"interests": ["Frontend", "Backend", "Comunidade"]
}No login, o campo email tambem aceita o nome de usuario, com ou sem @.
GET /users/me
GET /users/me/suggestions
PATCH /users/me/eureca-plus
DELETE /users/me/eureca-plus
POST /users/:id/follow
DELETE /users/:id/follow
GET /users/:id/followers
GET /users/:id/following
GET /users/:idRotas me, Eureca Plus, sugestoes e follow/unfollow exigem JWT.
GET /posts
GET /posts/me/feed
GET /posts/me/following
GET /posts/trends
POST /posts
DELETE /posts/:id
POST /posts/:id/like
DELETE /posts/:id/like
POST /posts/:id/view
POST /posts/:id/reportO feed autenticado retorna informacoes como:
- autor
- imagem do post
- quantidade de curtidas
- quantidade de comentarios
- quantidade de visualizacoes
- estado
viewerLiked - informacoes de seguidores do autor quando aplicavel
POST /uploads/imagesEssa rota exige JWT e recebe multipart/form-data com o arquivo no campo image.
Resposta resumida:
{
"imageUrl": "http://localhost:3000/uploads/posts/arquivo.webp",
"path": "/uploads/posts/arquivo.webp",
"filename": "arquivo.webp",
"originalName": "imagem.webp",
"mimeType": "image/webp",
"size": 12345
}GET /posts/:postId/comments
POST /posts/:postId/comments
PATCH /comments/:id
DELETE /comments/:idA listagem de comentarios aceita paginacao:
limit
cursor
parentCommentId
Comentarios podem responder diretamente a um post ou a outro comentario.
GET /notifications
PATCH /notifications/:id/read
PATCH /notifications/read-allAs notificacoes sao protegidas por autenticacao e podem apontar para posts, comentarios, conversas ou mensagens.
GET /conversations
POST /conversations
GET /conversations/:id/messages
POST /conversations/:id/messages
PATCH /conversations/:id/readTodas as rotas de conversa exigem JWT. A listagem de mensagens aceita:
limit
cursor
O canal em tempo real usa Socket.IO no mesmo host da API. O token JWT pode ser enviado em auth.token ou no header Authorization: Bearer <token>.
Principais entidades do Prisma:
User: conta cadastradaUserFollow: relacao entre seguidor e usuario seguidoPost: publicacao criada por um usuarioPostLike: curtida de usuario em postPostReport: denuncia de usuario em postComment: comentario ou respostaNotification: alerta gerado por interacao social, mensagem privada ou aviso da plataformaConversation: conversa privadaConversationParticipant: participante e estado de leitura da conversaMessage: mensagem enviada em uma conversa
Restricoes importantes:
User.emaile unicoUser.usernamee unico quando preenchido- Um usuario nao pode curtir o mesmo post duas vezes
- Um usuario nao pode denunciar o mesmo post duas vezes
- A relacao seguidor/seguindo e unica por par de usuarios
- Conversas, mensagens, comentarios, curtidas, denuncias e notificacoes relacionadas usam exclusao em cascata quando aplicavel
- Comentarios e mensagens possuem indices para paginacao por data
- O backend aceita CORS do frontend local em
http://localhost:5173ehttp://127.0.0.1:5173 - O backend serve arquivos locais do diretorio
uploads - O feed publico funciona sem autenticacao
- Criar posts, enviar imagens, curtir, comentar, denunciar, seguir usuarios, abrir conversas e acessar notificacoes exige JWT
- O frontend persiste sessao no navegador
- Visualizacoes podem ser registradas sem login
- O realtime de conversas desconecta sockets sem token valido
Backend:
cd backend
npm run build
npm run test
npm run test:e2eFrontend:
cd frontend
npm run lint
npm run buildAntes do ultimo push de codigo, foram executados:
cd backend && npm run build
cd backend && npm test -- --runInBand
cd frontend && npm run build- Tornar CORS configuravel por ambiente
- Adicionar moderacao administrativa para denuncias
- Persistir preferencia de plano Eureca Plus com fluxo real de pagamento
- Evoluir conversas 1:1 para grupos
- Conectar mais areas de descoberta a dados reais
- Criar scripts unificados na raiz do projeto
- Adicionar deploy automatizado para frontend e backend