Diego
← Voltar para projetos

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