Neosrate
Plataforma social estilo Reddit — API Spring Boot + front React/TypeScript, com upload de mídia para S3.
Back-end (API)
- Java 21
- Spring Boot 3
- Spring Security
- Spring Data JPA
- MySQL 8
- JWT (Auth0)
- BCrypt
- ModelMapper
- AWS S3 SDK
Front-end
- React 18
- TypeScript
- Vite (SWC)
- React Router DOM 6
- Axios
- Tailwind CSS 3
- Phosphor React
- jwt-decode
Full-screen para maior qualidade.
Contexto
Neosrate é uma plataforma social estilo Reddit. Usuários criam comunidades (c/nome), publicam posts com texto, imagem ou vídeo, curtem, comentam e acompanham feed personalizado com as comunidades que seguem. Dashboard para editar perfil, foto, posts e comunidades. Interface dark com acento violeta/slate.
O back-end (Spring Boot 3 + Java 21 + MySQL 8) implementa autenticação JWT stateless, upload de mídia para S3 com validação de tipo de arquivo, e deleção transacional explícita de usuários e comunidades.
O front-end (React 18 + TypeScript + Vite) consome a API via Axios, gerencia auth em localStorage com verificação de expiração via jwt-decode, e implementa paginação server-side para posts e client-side para comentários.
Decisões técnicas
API · JWT stateless via OncePerRequestFilter
Cada request passa pelo SecurityFilter que extrai o token do header Authorization, valida assinatura HMAC256 via Auth0 SDK e injeta o UserDetails no SecurityContext. CSRF desabilitado — sem cookie de sessão. Token carrega userId, username e email como claims, sem roundtrip ao banco para identificar o caller.
API · AWS S3 para todos os arquivos de mídia
Imagens de perfil, fotos de comunidade e mídia de posts vão direto para S3 — banco guarda só o file_path. S3Service valida tipo de arquivo (JPEG, PNG, GIF, MP4) antes do upload e usa naming com timestamp para evitar colisão. Novos usuários e comunidades recebem imagem padrão via cópia server-side no próprio S3, sem trafegar o arquivo.
API · Delete manual via @Transactional no lugar de FK constraint
Deleção de usuário ou comunidade limpa todas as tabelas relacionadas (posts, comentários, likes, memberships, perfil) via chamadas sequenciais aos repositories dentro de um único @Transactional. A ordem é explícita e rastreável.
Front · Auth via localStorage + jwt-decode
Auth vive em quatro chaves no localStorage (authenticated, token, userId, username). No carregamento da app, o token é decodificado com jwt-decode para checar expiração sem roundtrip ao servidor. Estado de autenticação propagado por props onde necessário.
Front · Paginação server-side para posts, client-side para comentários
Posts usam paginação no servidor: maxPerPagecresce +10 a cada “carregar mais”, API retorna só o slice necessário. Comentários são fetched de uma vez e fatiados no cliente: comments.filter(c => c.postId === id).slice(0, maxComments).
Rodar localmente
Necessário: Docker e Git instalados.
mkdir neosrate-local && cd neosrate-local
git clone https://github.com/odgiedev/neosrate
git clone https://github.com/odgiedev/neosrate-api
cp neosrate/.env.example neosrate/.env
cp neosrate-api/.env.example neosrate-api/.env
# Terminal 1 — API
cd neosrate-api && docker compose up
# Terminal 2 — Front
cd neosrate && docker compose up