O GrindSense é o motor de back-end de um projeto de Iniciação Científica (IC) desenvolvido para o evento NEXT 2026 (FIAP). Trata-se de uma plataforma de gamificação adaptativa que ajusta a carga de produtividade de estudantes com base nos seus dados biométricos (Variabilidade da Frequência Cardíaca - HRV e qualidade de sono), recolhidos via integração com dispositivos wearables (Fitbit).
O objetivo principal é mitigar o burnout académico, substituindo a gamificação punitiva (como a perda de streaks) por um sistema que respeita a recuperação fisiológica (Modo Anti-Shame).
O projeto foi construído focando no Estado da Arte do ecossistema TypeScript moderno, garantindo performance, segurança e testabilidade:
- Clean Architecture: Separação estrita em camadas de Rotas, Controladores e Serviços (
Routes -> Controllers -> Services), tornando as regras de negócio independentes do framework HTTP. - Runtime de Alta Performance: Utilização do Bun e ElysiaJS, oferecendo tempos de resposta em microssigundos e validação estrita de esquemas na borda (Edge Validation).
- Gestão de Sessões & Segurança: Implementação do Better-Auth para gestão unificada de identidade, mitigando vulnerabilidades comuns de autenticação (rotação de tokens e invalidação de sessões).
- Transações ACID: Uso do Drizzle ORM com
db.transaction()para garantir a consistência na distribuição de pontos de experiência (XP) e status das tarefas diárias. - Deploy Imutável e Distroless: Dockerização com compilação standalone (multi-stage build). A imagem de produção baseia-se em
gcr.io/distroless/base-debian12, removendo vulnerabilidades de shell e garantindo um cold start quase instantâneo.
- Bun instalado localmente.
- Docker e Docker Compose instalados.
- Credenciais de Desenvolvedor da Fitbit (Client ID e Secret).
Crie um ficheiro .env na raiz do projeto com base no formato abaixo:
# Base de Dados
DB_USER="admin"
DB_PASSWORD="admin_password"
DB_NAME="grindsense"
DB_HOST="localhost"
DB_PORT=5432
DATABASE_URL=postgresql://admin:admin_password@localhost:5432/grindsense
DATABASE_TEST_URL="postgresql://admin:admin_password@localhost:5432/grindsense_test"
PORT=3000
# Better Auth
BETTER_AUTH_SECRET=gerar_uma_chave_aleatoria_longa
BETTER_AUTH_URL=http://localhost:3000
# Cache/Redis Stream
REDIS_URL="redis://localhost:6379"
# OTEL
OTEL_SERVICE_NAME="grindsense-api"
OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4318/v1/traces"O ambiente Docker subirá a base de dados PostgreSQL, executará as migrações através de um Init Container e iniciará a API de forma isolada e segura.
# Sobe toda a infraestrutura em background
docker-compose up -dCaso queira correr o servidor localmente para desenvolvimento:
# Instala as dependências
bun install
# Sobe a base de dados, o worker e o redis via Docker
docker-compose up -d db grindsense-iot-worker redis
# Aplica as migrações na base de dados
bun run db:push
# Aplica o seed no banco
bun run db:seed
# Inicia o servidor em modo watch (hot-reload)
bun dev# Sobe a base de dados, o worker e o redis via Docker
docker-compose up -d db grindsense-iot-worker redis
# Aplica as migrações na base de dados de teste
bun run tests:setup
# Executa os testes de integração
bun testEste repositório possui uma pipeline configurada no GitHub Actions. A cada push na branch main:
- O código é validado.
- A imagem Docker é construída usando o Dockerfile distroless otimizado.
- A imagem é publicada automaticamente no GitHub Container Registry (GHCR).
Desenvolvido como projeto de Iniciação Científica para o NEXT 2026 - FIAP.