Skip to content

marcosffp/biblioo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

602 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

banner

Biblioo

Rede social de leitura com estantes virtuais, feed social, comunidades com chat em tempo real, seis algoritmos independentes de recomendação personalizada e assistente de IA conversacional.


Stack

Backend

Java Spring Boot MySQL Neo4j Redis OpenSearch RabbitMQ

Frontend

Next.js React TypeScript Tailwind CSS

Mobile

Flutter Dart Bloc

Infra e Deploy

Cloud Run Cloud Build GitHub Actions Vercel Docker TiDB Cloud Cloudinary


Sumário


Sobre o projeto

O Biblioo é uma plataforma digital de comunidade literária desenvolvida para leitores ativos brasileiros. O projeto parte de um problema real — 53% dos brasileiros não leram um livro nos últimos três meses (Retratos da Leitura, 2024) — e propõe uma solução que reúne em um único ambiente tudo que um leitor precisa: organização de leitura, descoberta inteligente de novos títulos, interação social e identidade literária.

O sistema foi construído em três frentes complementares:

  • Backend em Spring Boot 4 (Java 25) com arquitetura Hexagonal em monólito modular de 11 domínios, implantado em Google Cloud Run
  • Frontend web em Next.js 16 (React 19 + TypeScript), com notificações SSE e chat WebSocket em tempo real
  • App mobile em Flutter 3.11, offline-first para Android e iOS, com BLoC e persistência local via Drift/SQLite

O assistente Bibo, alimentado pelo Google Gemini via Spring AI, vai além de responder perguntas: ele entende linguagem natural e executa ações diretamente na plataforma — cria comunidades, organiza estantes, monta coleções e orienta o leitor dentro do ecossistema Biblioo.


Funcionalidades

Área O que o leitor pode fazer
Autenticação Cadastro com e-mail/senha ou Google OAuth; redefinição de senha por e-mail; criação de senha para contas Google
Estantes e biblioteca Criar estantes e coleções personalizadas; registrar status de leitura (Quero Ler, Lendo, Lido, Abandonei); atualizar progresso por páginas; visualizar streak de dias ativos; importar biblioteca do Goodreads via CSV
Feed social Publicar posts com texto, imagens e GIFs; escrever reviews com nota de 1–5 estrelas; curtir, comentar e responder; visualizar feed personalizado de quem segue
Comunidades Criar comunidades públicas ou privadas; chat em tempo real via WebSocket; votação democrática de livros; convites por link ou diretos; solicitações de entrada com aprovação; gestão de roles (owner, moderador, membro)
Recomendações 6 trilhas algorítmicas independentes com critérios distintos + Roll Dice universal
DNA Literário Perfil analítico automático com arquétipo dominante, temas preferidos, velocidade de leitura e distribuição de gêneros; snapshots anuais
Assistente Bibo Chat em linguagem natural com execução de ações na plataforma; histórico de conversas persistido
Notificações In-app via SSE (web, tempo real) e push via Firebase FCM (mobile); badge de não lidas
Perfil e social Seguir/ser seguido; perfis públicos e privados com aprovação de seguidores; busca de usuários; upload de avatar e banner
Descoberta Top 10 livros e comunidades em tendência (atualizado a cada 15 minutos); busca full-text por título, autor ou ISBN
Compartilhamento Cápsulas visuais de estatísticas de leitura geradas pelo backend e compartilháveis em redes sociais

Sistema de Recomendação

O sistema de recomendação é o diferencial central do Biblioo. São seis trilhas algorítmicas totalmente independentes, cada uma cobrindo um ângulo diferente de descoberta de leitura. Nenhuma usa IA generativa: os resultados são gerados por algoritmos determinísticos e estatísticos, acionados por eventos de domínio via RabbitMQ e cacheados no Redis por usuário.

Trilha Estratégia Algoritmo
T1 — BecauseYouRead "Quem leu o mesmo livro também leu estes..." Grafo Neo4j — co-leitura com mínimo de 2 leitores em comum; jitter ±3% para diversificação
T2 — FavoriteGenreNow "Você está numa fase de ficção científica..." Detecção dos 3 gêneros dominantes atuais do leitor; prioriza títulos com avaliações suficientes
T3 — TrendingInCommunities "Este livro está em alta nas comunidades agora..." Score de engajamento com decay exponencial de 10%/hora; deduplica por janela de 24h
T4 — CatalogSurprise "Saia da zona de conforto..." Thompson Sampling — parâmetros Beta(α, β) por (usuário, livro) persistidos no Redis; aprende com cada interação
T5 — SimilarAuthors "Leitores com gosto parecido adoraram estes..." Filtragem colaborativa em 2 níveis via Neo4j; leitores similares até 2 saltos no grafo
T6 — RereadWorthIt "Faz um tempo — pode ser o momento certo para reler..." Repetição espaçada: intervalo = nota × 30 dias × 1,5^n_releituras; mínimo 90 dias desde a última leitura
Roll Dice "Surpreenda-me" Seleção aleatória entre os resultados das 6 trilhas combinadas

Arquitetura geral

A aplicação segue o estilo Hexagonal (Ports & Adapters) em uma arquitetura de monólito modular, com 11 domínios de negócio independentes que se comunicam exclusivamente via eventos RabbitMQ — sem chamadas diretas entre módulos.

Arquitetura de domínio

Arquitetura de infraestrutura

Padrões de destaque:

Padrão Onde se aplica
Outbox Publicação assíncrona garantida no RabbitMQ dentro de @Transactional
Fanout-on-write Feed com threshold de 10.000 seguidores
Thompson Sampling Recomendação T4 — aprendizado bayesiano por interação
Spaced Repetition Recomendação T6 — intervalo ótimo de releitura
Collaborative Filtering Recomendação T5 — grafo Neo4j 2 níveis
Sliding Window Cache Feed Redis com warm-size de 200 itens
Offline-first (mobile) Drift/SQLite local + sync remoto ao reconectar
Idempotência por event_id Todos os consumers RabbitMQ
Session affinity + FanoutExchange Chat WebSocket com múltiplas instâncias Cloud Run

Ambientes em produção

O backend está implantado em dois ambientes independentes no Google Cloud Run (us-central1), com pipeline de CI/CD automatizado (~12 min do commit ao deploy).

Portfolio Produção
URL biblioo-portfolio-595140312227.us-central1.run.app biblioo-producao-595140312227.us-central1.run.app
Instâncias 0–2 (hiberna sem tráfego) 1–10 (sempre ativa)
Recursos 1 Gi RAM · 1 vCPU 2 Gi RAM · 2 vCPU
Banco TiDB Cloud Serverless TiDB Cloud Serverless
Cache Upstash (Redis) Upstash (Redis)
Mensageria CloudAMQP Little Lemur CloudAMQP Little Lemur
Grafo Neo4j Aura Free Neo4j Aura Free
Busca Bonsai.io Hobby (HTTPS) GCE VM e2-small via VPC interna
Swagger UI /swagger-ui.html /swagger-ui.html

Pipeline CI/CD:

flowchart TD
    A["Repo privado — PUC Minas org\npush em main · dev · prod"]
    B["GitHub Actions\nEspelha branches no repo público\nmarcosffp/biblioo"]
    C["Cloud Build trigger\nAtivado exclusivamente por push na branch prod"]
    D1["docker build ./code/back"]
    D2["docker push → Artifact Registry\nbackend:latest"]
    D3["gcloud run deploy biblioo-portfolio"]
    D4["gcloud run deploy biblioo-producao\nTroca de revisão sem downtime"]

    A --> B
    B --> C
    C --> D1
    D1 --> D2
    D2 --> D3
    D3 --> D4
Loading

Frontend Web

O frontend web está implantado na Vercel, com integração direta ao repositório GitHub: cada push na branch main aciona um deploy automático.

URL
Frontend Web biblioo-rust.vercel.app

A variável NEXT_PUBLIC_API_URL está configurada na Vercel apontando para o backend de Produção (biblioo-producao-595140312227.us-central1.run.app).


Performance

A suíte de testes de performance foi desenvolvida em K6 com 71 testes cobrindo 8 domínios funcionais, cada um com três perfis obrigatórios: load (carga normal sustentada), spike (pico abrupto) e stress (degradação progressiva).

Resultado final: 71/71 testes aprovados · 0 falhas funcionais (5xx)

Destaque Resultado
Maior throughput 1 538 req/s — user-stress com 600 VUs simultâneos
Menor latência p95 8,42 ms — book-spike com 300 VUs
Chat WebSocket (spike) 11 ms de entrega p95 · 100% de integridade · zero duplicatas
Trending e ShareCard < 40 ms p95 mesmo a 600 VUs — cache Redis efetivo
Recomendações (6 trilhas) 728 ms p95 no load com 500 VUs — aceitável dado que percorre Neo4j + Redis + MySQL em paralelo
Roll Dice 21 ms p95 no load com 600 VUs
DNA Literário 34 ms p95 no load · 0% de falhas até 500 VUs

Todos os valores acima foram medidos em ambiente local (localhost). Em produção, aplica-se fator conservador de 4× para refletir os recursos restritos do Cloud Run. Os RNFs foram definidos com esse fator incorporado e todos são atendidos com margem.


Índice de documentação

Documentação arquitetural (docs/)

# Documento Conteúdo
1 Apresentação Problema, objetivos do trabalho, definições e abreviaturas
2 Nosso Produto Visão do produto, É/Não É · Faz/Não Faz, personas
3 Requisitos RF-01 a RF-40, RNF-01 a RNF-22, restrições e mecanismos arquiteturais
4 Modelagem Histórias de usuário, visão lógica, modelo de dados
5 Wireframes Wireframes web (Login, Feed, Estante, Coleção, Comunidades, Perfil, Recomendação) e mobile
6 Projeto da Solução Decisões arquiteturais e projeto técnico da solução
7 Avaliação da Arquitetura ATAM simplificado com 5 cenários e dados reais de testes K6
8 ATAM Completo Avaliação ATAM detalhada: 6 cenários, 2 riscos, 5 não-riscos, 4 tradeoffs, 3 sensibilidades, 7 evidências de teste, plano de ação

READMEs por subprojeto (code/)

Subprojeto README Conteúdo
Código (visão geral) code/README.md Índice rápido dos três subprojetos e instruções gerais
Backend code/back/README.md Arquitetura hexagonal, estratégia de feed (fanout + threshold + backfill), regras de arquitetura, infraestrutura Docker, testes K6, endpoints completos
Frontend Web code/front/README.md Páginas, componentes, hooks, serviços, WebSocket/STOMP, SSE
App Mobile code/mobile/README.md Arquitetura BLoC, rotas, offline-first, screens

Testes de performance (code/back/performance-tests/)

Documento Conteúdo
Relatório Geral Visão consolidada dos 71 testes — todos os domínios, resultados e análise
Documento de Avaliação Critérios de aprovação, thresholds e metodologia
DomainFeed — Relatório Resultados detalhados: feed, post, comment, review
DomainFeed — Observações Análise técnica dos testes de feed
DomainUser — Relatório Resultados detalhados: user, social, social-requests
DomainUser — Observações Análise técnica dos testes de usuário e grafo social

Schemas e artefatos (docs/schema/)

Arquivo Conteúdo
docs/schema/biblioo.dbml Modelo de banco de dados completo em DBML
docs/schema/biblioo.components.puml Diagrama de componentes PlantUML

Artefatos de projeto (assets/)

Subpasta README Conteúdo
Raiz assets/README.md Índice geral de todos os artefatos institucionais
Gerência assets/gerencia/README.md TAP, EAP (visão hierárquica e em árvore), ata de kickoff
Atas assets/atas/README.md Atas das sprints 2→3, 4→5 e 5→6 com resumo de decisões e responsáveis
Propriedade intelectual assets/inpi/README.md Documentos NIT/INPI: atas de acordo, procuração e termo de sigilo
Avaliação heurística assets/Avaliacao_Heuristica.pdf Relatório de avaliação heurística da interface (Nielsen)

Estrutura do repositório

biblioo/
├── code/
│   ├── back/                    # Backend — Spring Boot 4 · Java 25
│   │   └── performance-tests/   # Suíte K6: 71 testes · 8 domínios
│   ├── front/                   # Frontend — Next.js 16 · React 19
│   └── mobile/                  # App mobile — Flutter 3.11
├── docs/                        # Documentação arquitetural
│   ├── 1.apresentacao.md  –  8.atam.md
│   ├── imagens/
│   ├── schema/                  # biblioo.dbml · biblioo.components.puml
│   ├── wireframe/               # web/ · mobile/
│   └── weekly-report/
├── assets/
│   └── atas/                    # Atas de reunião (Sprint 2 → Sprint 5)
└── divulge/                     # Materiais de divulgação e apresentações

Integrantes

Nome GitHub E-mail institucional
Bernardo Souza Alvim @alvimdev bernardo.alvim@sga.pucminas.br
Carlos José Gomes Batista Figueiredo @CarlosJFigueiredo carlos.figueiredo.1507022@sga.pucminas.br
Gabriela Alvarenga Cardoso @gabialvarenga gabriela.cardoso.1026227@sga.pucminas.br
Marcos Alberto Ferreira Pinto @marcosffp mafpinto@sga.pucminas.br
Mateus Araújo Santos @mateuaraujo01 mateus.santos.1487920@sga.pucminas.br
Rafael Ganascini de Moura @RafaelMouraG rafael.ganascini@sga.pucminas.br

Orientadores

Nome
Cleiton Silva Tavares
Cristiano de Macêdo Neto
João Paulo Carneiro Aramuni

Curso de Engenharia de Software — Campus Lourdes Instituto de Informática e Ciências Exatas — Pontifícia Universidade Católica de Minas Gerais (PUC MINAS)


Como executar

Pré-requisitos

  • Git
  • Docker + Docker Compose
  • Java 25+ e Maven 3.9+
  • Node.js 20+ e npm 10+
  • Flutter SDK 3.11+

1. Clone o repositório

git clone https://github.com/ICEI-PUC-Minas-PPLES-TI/plf-es-2026-1-ti5-0492100-biblioo.git
cd plf-es-2026-1-ti5-0492100-biblioo

2. Backend

cd code/back
cp .env.example .env           # preencha com suas credenciais
docker-compose up -d           # MySQL · Redis · RabbitMQ · Neo4j · OpenSearch
./mvnw spring-boot:run         # API em http://localhost:8080

Swagger UI disponível em http://localhost:8080/swagger-ui.html

3. Frontend web

cd code/front
npm install
cp .env.example .env.local     # NEXT_PUBLIC_API_URL + NEXT_PUBLIC_GOOGLE_CLIENT_ID
npm run dev                    # http://localhost:3000

4. App mobile

cd code/mobile
flutter pub get
cp .env.example .env           # API_URL + GOOGLE_WEB_CLIENT_ID
dart run build_runner build --delete-conflicting-outputs
flutter run

Consulte os READMEs individuais de cada subprojeto para configuração completa de variáveis de ambiente, testes de performance (K6) e instruções de deploy em nuvem.


pucminas

Fonte do banner: João Paulo Carneiro Aramuni


About

Biblioo é uma rede social de leitura que reúne estantes virtuais, feed social, comunidades com chat em tempo real, recomendações personalizadas por seis algoritmos independentes e um assistente de IA conversacional para organizar leituras, descobrir livros e conectar leitores.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors