| Campo | Valor |
|---|---|
| Nome do Sistema | FiveLib (Sucessor do DevAcademicX) |
| Segmento | Plataforma de centralização de documentação e indexação de ferramentas de desenvolvimento |
| Versão | 1.0.0 |
| Data de Consolidação | Maio de 2026 |
| Website | fivelib.vercel.app |
| Repositório | github.com/fivelibx/fivelib |
| Nome | Cargo / Título | Foco de Contribuição |
|---|---|---|
| Lucas Paiva Santos de Oliveira | Lead Full Stack Developer & Architect | Arquitetura, Backend, Frontend, Infraestrutura, Segurança |
| Felipe Gonçalves | Contributor | Autenticação, lógica de interações (Stars/Favorites) |
| Mateus Alves Marques Macido | Colaborador Acadêmico | Modelagem de sistemas, PRD, ERD |
| Rodrigo Moraes dos Santos | Colaborador Acadêmico | Modelagem de sistemas, regras de negócio |
| Nicolas Rosa Santos | Colaborador Acadêmico | Modelagem de sistemas, regras de negócio |
| Raian Luis dos Santos | Colaborador Acadêmico | Modelagem de sistemas, planejamento |
No ecossistema atual de desenvolvimento de software, a fragmentação de informações é um obstáculo crítico. Desenvolvedores, especialmente iniciantes, enfrentam uma curva de aprendizado acentuada devido à dispersão de documentações oficiais, tutoriais de terceiros e ferramentas auxiliares em múltiplas plataformas e repositórios.
O FiveLib provê um ambiente unificado e curado que reúne bibliotecas, frameworks e documentações técnicas essenciais, operando sobre três pilares:
- Centralização: Hub único para consulta de links oficiais e recursos de apoio
- Orientação: Facilitar o onboarding de novos programadores através de uma interface objetiva e funcional
- Comunidade: Permitir a interação entre pares para validação de ferramentas e troca de experiências técnicas
O projeto abrange os seguintes módulos:
- Módulo de Consulta e Indexação (RF01): Motor de busca para localização de documentações, bibliotecas e ferramentas, categorizadas por linguagem e utilidade
- Gestão de Identidade (RF05): Sistema de cadastro e autenticação de usuários para controle de acesso
- Módulo de Persistência — Biblioteca Pessoal (RF02/RF04): Funcionalidade para salvar links favoritos e gerenciar referências externas privadas
- Módulo de Suporte e Feedback (RF03/RN04): Interface de contato (Helpdesk) para reporte de problemas e sugestões com fluxo de moderação administrativa
| Stakeholder | Interesse no Sistema |
|---|---|
| Alunos | Localizar documentações oficiais de forma rápida para acelerar o aprendizado |
| Desenvolvedores (Comunidade) | Centralizar links de ferramentas favoritas |
| Mantenedores de Bibliotecas | Ter suas ferramentas divulgadas em um portal voltado para o ensino |
| Professores / Orientadores | Utilizar a plataforma como repositório centralizado de referências |
| Administradores do Sistema | Monitorar uso, moderar conteúdo e garantir integridade do banco de dados |
| Ator | Descrição |
|---|---|
| Usuário Visitante | Indivíduo não autenticado que acessa a plataforma para consultas e visualização de links (RF01) |
| Usuário Registrado | Estudante autenticado com permissão para salvar favoritos, links privados e abrir tickets (RF02/RF05) |
| Moderador | Responsável técnico por validar reportes e aprovar conteúdo pendente (RN04) |
| Administrador | Gestor com privilégios totais para gerenciar usuários e manter a base de dados (UC03/UC04) |
| ID | Requisito |
|---|---|
| RF01 | O sistema deve permitir a busca e filtragem de bibliotecas e ferramentas por nome, linguagem ou categoria |
| RF02 | O sistema deve permitir que o usuário autenticado armazene links de interesse em seu perfil pessoal |
| RF03 | O sistema deve permitir que o usuário reporte links quebrados ou inativos para análise da moderação |
| RF04 | O sistema deve permitir que o usuário adicione URLs externas à sua conta de forma privada |
| RF05 | O sistema deve prover funcionalidades de cadastro, login e encerramento de sessão |
| ID | Requisito |
|---|---|
| RNF01 | O sistema deve ser operável por usuários sem treinamento prévio em até 5 minutos de navegação |
| RNF02 | O acesso às funcionalidades de persistência deve exigir autenticação via e-mail |
| RNF03 | A interface deve ser compatível com resoluções de tela de 360px a 1920px (Mobile e Desktop) |
| RNF04 | O tempo de resposta das consultas não deve exceder 10 segundos |
| RNF05 | O sistema deve ser distribuído como uma imagem Docker compatível com sistemas x86_64 |
| ID | Regra |
|---|---|
| RN01 | O cadastro de contas e o envio de formulários de suporte são restritos a usuários com idade igual ou superior a 18 anos |
| RN02 | O sistema não deve permitir o registro de dois ou mais usuários com o mesmo endereço de e-mail |
| RN03 | As preferências e links salvos na biblioteca pessoal (RF02/RF04) são vinculados ao ID do usuário e não são visíveis para outros usuários |
| RN04 | Toda mensagem enviada pelo formulário de suporte receberá inicialmente o status "Pendente" e será visível apenas no painel do Administrador |
| Código | Nome | Ator Principal |
|---|---|---|
| UC01 | Acessar Home | Usuário |
| UC02 | Salvar Preferências | Usuário Registrado |
| UC03 | Banir Usuário | Administrador |
| UC04 | Restringir Usuário | Administrador |
- O usuário acessa a Landing Page (estado: Visitante)
- O usuário realiza busca ou filtragem por linguagem/ferramenta (RF01)
- O sistema retorna os links e detalhes técnicos da ferramenta selecionada
- O usuário opta por realizar Login/Cadastro para desbloquear funções de personalização (RNF02)
- O sistema vincula a ferramenta ou o link externo ao perfil do usuário e confirma o salvamento (RF02/RF04)
O sistema é baseado em uma arquitetura distribuída e conteinerizada, segmentando responsabilidades entre interface, processamento lógico, envio de mensagens transacionais e persistência de dados relacionais.
| Componente | Tecnologia | Plataforma | Responsabilidade |
|---|---|---|---|
| Frontend | Next.js 16 (App Router) | Vercel (Edge Network / CDN) | Interface de usuário, SSR, gerenciamento de estado |
| Backend | FastAPI + 3.12+ | Render (Docker Container) | API REST, regras de negócio, autenticação JWT |
| Banco de Dados | PostgreSQL | Supabase | Persistência de dados relacionais |
| Mensageria | Brevo (API/SMTP) | SaaS | Disparo assíncrono de e-mails transacionais |
| Migrações | Alembic | Docker Volume | Versionamento e controle de schema do banco |
| Entidade A | Relacionamento | Entidade B | Cardinalidade | Justificativa |
|---|---|---|---|---|
| User | Possui | Favorite | 0:N | Um usuário pode não ter favoritos ou ter vários (RF02/RN03) |
| Tool | É favoritada em | Favorite | 0:N | Uma ferramenta pode ser nova e não ter favoritos |
| User | Cadastra | PrivateLink | 0:N | O usuário decide se quer adicionar links privados (RF04/RN03) |
| User | Abre | SupportTicket | 1:N | Restrito a usuários cadastrados (+18 anos) conforme RN01 |
| SupportTicket | Pertence a | User | 1:1 | Cada ticket é obrigatoriamente vinculado a um autor (RN04) |
Finalidade: Gestão de identidade, controle de fluxo de ativação, recuperação de credenciais, conformidade de termos e perfis de acesso (RF05).
PK: id | FK: Nenhuma
| Atributo | Tipo | Restrições | Descrição |
|---|---|---|---|
id |
int4 |
PK, DEFAULT nextval() | Identificador único incremental |
nome |
VARCHAR(255) |
NOT NULL | Nome completo do usuário |
email |
VARCHAR(255) |
NOT NULL, UNIQUE | E-mail institucional ou pessoal |
senha |
VARCHAR(255) |
NOT NULL | Hash criptográfico da senha |
data_nascimento |
DATE |
NOT NULL | Data para validação de maioridade (RN01) |
perfil |
VARCHAR(255) |
NOT NULL, CHECK | Nível de acesso no sistema |
criado_at |
TIMESTAMPTZ |
NOT NULL, DEFAULT NOW() | Data e hora de criação da conta |
is_active |
BOOLEAN |
DEFAULT FALSE | Status de ativação da conta via e-mail |
verification_code |
VARCHAR |
NULLABLE | Código temporário para ativação da conta |
verification_expires_at |
TIMESTAMPTZ |
NULLABLE | Prazo de expiração do código de ativação |
accepted_terms |
BOOLEAN |
DEFAULT FALSE | Flag de aceite dos termos de uso |
accepted_terms_at |
TIMESTAMPTZ |
NULLABLE | Timestamp do momento do aceite |
reset_password_code |
TEXT |
NULLABLE | Token de recuperação de credenciais |
reset_password_expires_at |
TIMESTAMPTZ |
NULLABLE | Expiração do token de recuperação |
titulo_profissional |
VARCHAR(150) |
NULLABLE | Cargo técnico exibido no perfil |
github |
VARCHAR(50) |
NULLABLE | Username do perfil do GitHub |
linkedin |
VARCHAR(50) |
NULLABLE | Username do perfil do LinkedIn |
Constraint:
CHECK (perfil IN ('superadmin', 'admin', 'moderador', 'user'))
Finalidade: Catálogo centralizado de tecnologias, bibliotecas e frameworks com indexação de metadados visuais (RF01).
PK: id | FK: Nenhuma
| Atributo | Tipo | Restrições | Descrição |
|---|---|---|---|
id |
int4 |
PK, DEFAULT nextval() | Identificador único incremental |
nome |
VARCHAR(255) |
NOT NULL, UNIQUE | Nome da biblioteca ou framework |
descricao |
TEXT |
NOT NULL | Descrição técnica simplificada |
url_oficial |
TEXT |
NOT NULL | Link para documentação oficial |
linguagem |
VARCHAR(255) |
NOT NULL | Linguagem principal do ecossistema |
status_ativo |
BOOLEAN |
NOT NULL, DEFAULT TRUE | Visibilidade da ferramenta no app |
stars |
int4 |
NOT NULL, DEFAULT 0 | Contador global de favoritadas |
tags |
VARCHAR(255)[] |
NOT NULL, DEFAULT '{}' | Array de sub-tecnologias (ex:{UI, SPA}) |
categoria |
VARCHAR(255) |
NOT NULL, DEFAULT 'Geral' | Categoria principal para filtros |
icon_slug |
VARCHAR(255) |
NULLABLE | Slug identificador do ícone (Lucide React) |
Finalidade: Persistência de itens favoritados pelos usuários (RF02).
PK Composta: (usuario_id, ferramenta_id) | FK: usuario_id, ferramenta_id
| Atributo | Tipo | Restrições | Descrição |
|---|---|---|---|
usuario_id |
int4 |
PK, FK (user.id) |
Referência ao id do usuário |
ferramenta_id |
int4 |
PK, FK (tool.id) |
Referência ao id da ferramenta |
adicionado_at |
TIMESTAMPTZ |
NOT NULL, DEFAULT NOW() | Timestamp do favoritismo |
Finalidade: Armazenamento de URLs externas e personalizadas cadastradas pelo usuário (RF04/RN03).
PK: id | FK: usuario_id
| Atributo | Tipo | Restrições | Descrição |
|---|---|---|---|
id |
int4 |
PK, DEFAULT nextval() | Identificador único incremental |
usuario_id |
int4 |
FK (user.id), NOT NULL |
Proprietário do link privado |
titulo |
VARCHAR(255) |
NOT NULL | Nome amigável dado ao link |
url |
TEXT |
NOT NULL | URL externa salva pelo usuário |
Finalidade: Canal de reporte de bugs, feedbacks técnicos e auditoria interna via painel administrativo (RF03/RN04).
PK: id | FK: usuario_id
| Atributo | Tipo | Restrições | Descrição |
|---|---|---|---|
id |
int4 |
PK, DEFAULT nextval() | Identificador único incremental |
usuario_id |
int4 |
FK (user.id), NOT NULL |
Autor logado que gerou o ticket |
email_contato |
VARCHAR(255) |
NOT NULL | E-mail para retorno da resolução |
mensagem |
TEXT |
NOT NULL | Detalhamento do chamado ou bug |
secao_site |
VARCHAR(255) |
NOT NULL | Contexto/Página onde ocorreu o problema |
status |
VARCHAR(255) |
NOT NULL, DEFAULT 'Pendente' | Estado do fluxo do ticket |
criado_at |
TIMESTAMPTZ |
NOT NULL, DEFAULT NOW() | Data e hora de abertura do chamado |
observacao_admin |
TEXT |
NULLABLE | Nota interna pela moderação/admin |
Estados do ticket:
'Pendente'→'Em Análise'→'Resolvido'
| Índice | Finalidade |
|---|---|
user_email_unique |
Garante que não existam dois cadastros com o mesmo e-mail |
tool_nome_unique |
Impede a duplicidade de ferramentas com o mesmo nome |
favorite_usuario_id_idx |
Otimiza a busca de ferramentas favoritadas de um usuário |
favorite_ferramenta_id_idx |
Agiliza a contagem de usuários que favoritaram uma ferramenta |
favorite_adicionado_at_idx |
Ordenação cronológica dos favoritos |
private_link_usuario_id_idx |
Acelera o carregamento da biblioteca de links no dashboard |
support_ticket_usuario_id_idx |
Vincula rapidamente o histórico de chamados por ID de usuário |
support_ticket_status_idx |
Filtragem de tickets com status 'Pendente' pelo painel admin |
Base URL (Local): http://localhost:8001/api/v1
Content-Type: application/json
Autenticação: Bearer JWT (Authorization: Bearer <token>)
| Método | Rota | Autenticação | Descrição |
|---|---|---|---|
POST |
/auth/register |
Pública | Cadastro. Valida maioridade (+18). Salva com is_active=false. Envia código via Brevo (Background Task) |
POST |
/auth/verify |
Pública | Ativação de conta. Compara o código e muta is_active para true se válido |
POST |
/auth/login |
Pública | Autenticação. Retorna Token JWT se credenciais válidas e is_active=true |
POST |
/auth/forgot-password |
Pública | Gera código temporário de redefinição e despacha via Brevo |
POST |
/auth/reset-password |
Pública | Consome o código gerado e atualiza o hash da senha no banco |
| Método | Rota | Autenticação | Descrição |
|---|---|---|---|
GET |
/resources |
Pública | Listagem paginada de ferramentas ativas. Suporta queries por q, linguagem, categoria e tag |
POST |
/resources |
JWT (admin / superadmin) |
Criação de recursos. Rota protegida por middleware de papel no JWT |
| Método | Rota | Autenticação | Descrição |
|---|---|---|---|
GET |
/users/me |
JWT | Dados consolidados do usuário autenticado |
PUT |
/users/me |
JWT | Atualização cadastral e inserção de perfis sociais (github, linkedin, titulo_profissional) |
GET |
/users/me/favorites |
JWT | Lista de objetos Tool marcados como favoritos |
POST |
/users/me/favorites |
JWT | Toggle de favorito (insere ou remove o registro e atualiza o contador stars) |
POST |
/users/me/custom-links |
JWT | Persiste registros na tabela private_link |
| Método | Rota | Autenticação | Descrição |
|---|---|---|---|
POST |
/support/tickets |
JWT | Insere nova linha em support_ticket com status inicial 'Pendente' |
PATCH |
/support/tickets/{id} |
JWT (moderador / admin) |
Altera status do ticket e permite anexar notas em observacao_admin |
| Controle | Descrição |
|---|---|
| Isolamento de Credenciais | Nenhuma chave (DATABASE_URL, JWT_SECRET, BREVO_API_KEY) reside em arquivos commitados. Injeção exclusiva via runtime das plataformas Render e Vercel |
| CORS Restrito | Middleware de CORS do FastAPI travado em nível de domínio, recusando requisições de origens que não correspondam à URL final da Vercel |
| Validação Estrutural | Payloads de entrada e saída blindados por esquemas declarativos doPydantic (backend) e Zod (frontend), bloqueando injeções de payloads malformados |
| Isolamento de Tokens | Variáveis sem prefixo NEXT_PUBLIC_ nunca são expostas ao browser, operando exclusivamente em Server-Side Components |
| Hashing de Senhas | Hash criptográfico via bcrypt — credenciais nunca armazenadas em texto plano |
| Tokens Temporários | Códigos de ativação e recuperação de senha com janela de expiração (verification_expires_at, reset_password_expires_at) |
Data: 14/05/2026 | Responsável: Lucas Paiva Santos de Oliveira
Branch analisada: develop | Ambiente: Python 3.12+ / Node.js 22 / Docker
| Ferramenta | Versão | Finalidade |
|---|---|---|
safety |
3.7.0 | Vulnerabilidades em dependências Python |
bandit |
1.9.4 | Análise estática de segurança do código Python |
npm audit |
— | Vulnerabilidades em dependências JavaScript |
hadolint |
latest | Boas práticas nos Dockerfiles |
trufflehog |
2.2.1 | Detecção de segredos expostos no histórico Git |
| Camada | Status | Observação |
|---|---|---|
Dependências Python (safety) |
✅ Aprovado | PyJWT atualizado de 2.10.1 → ≥2.12.0 durante a auditoria (CVE-2026-32597) |
Código Python (bandit) |
✅ Aprovado | 1 falso positivo:"bearer" em auth.py:43 — tipo padrão OAuth2 (RFC 6750), não senha hardcoded |
Dependências JavaScript (npm audit) |
✅ Aprovado | 2 falsos positivos:postcss <8.5.10 reportado contra next@16.2.6, que já possui o fix internamente |
Dockerfiles (hadolint) |
✅ Aprovado | Nenhum problema encontrado em backend/Dockerfile ou frontend/Dockerfile |
Segredos no Git (trufflehog) |
✅ Aprovado | Apenas strings de exemplo/placeholder encontradas (.env.example, alembic.ini) — nenhuma credencial real exposta |
Resultado geral: APROVADO para merge na main ✅
Backend:
| Pacote | Versão Atual | Versão Latest | Ação |
|---|---|---|---|
bcrypt |
4.1.2 | 5.0.0 | Atualizar após entrega — major, testar compatibilidade |
websockets |
15.0.1 | 16.0 | Atualizar — dependência do supabase-py |
PyJWT |
2.12.0+ | 2.12.0+ | ✅ Atualizado durante auditoria |
Frontend:
| Pacote | Versão Atual | Versão Latest | Ação |
|---|---|---|---|
zod |
3.25.76 | 4.4.3 | Adiar — breaking changes na v4 |
typescript |
5.7.3 | 6.0.3 | Adiar — breaking changes na v6 |
lucide-react |
0.564.0 | 1.16.0 | Adiar — major version |
recharts |
2.15.0 | 3.8.1 | Adiar — major version |
sonner |
1.7.4 | 2.0.7 | Adiar — major version |
Atualizações de major version foram adiadas intencionalmente para evitar breaking changes próximo à entrega. Revisão recomendada após a apresentação final.
O Kanban foi adotado pela necessidade de flexibilidade para uma equipe de 5 desenvolvedores. Permite fluxo de trabalho constante onde as tarefas (Issues) transitam entre estados sem a necessidade de ciclos fechados (Sprints).
Fluxo de trabalho: To Do (Backlog) → In Progress → Review (Code Review) → Done
Gestão: GitHub Projects
Vantagens para o contexto:
- Ausência de papéis formais complexos permite foco na execução técnica
- Quadro visual em tempo real para identificar gargalos
- Limitação de WIP (Work in Progress) para evitar sobrecarga de membros
| Diretriz | Descrição |
|---|---|
| Decoupling | Frontend e Backend operam como entidades isoladas. Nenhuma lógica de negócio deve residir na interface |
| API-Driven | Todas as funcionalidades devem ser modeladas e expostas via endpoints antes de qualquer implementação no Frontend |
| Conventional Commits | Uso mandatório do padrão feat/, fix/, docs/, chore/ para integridade do histórico Git |
| Documentation First | Todas as especificações técnicas são mantidas isoladas no diretório /docs |
| Risco | Impacto | Mitigação |
|---|---|---|
| Incompatibilidade de Ambiente | Alto — sistema pode não rodar na máquina de todos os desenvolvedores | Uso de Docker para padronizar o ambiente (RNF05) |
| Atraso na integração da API | Médio — Frontend pode ficar travado aguardando rotas do Backend | Definição prévia do contrato de API e uso de dados estáticos (mock) para testes |
| Baixa Qualidade dos Links | Médio — plataforma pode perder credibilidade com URLs quebradas | Implementação do sistema de Reporte de Links (RF03) e moderação ativa |
| Perda de Dados no Banco | Alto — falhas em migrações SQL podem corromper tabelas | Backups periódicos do volume de dados e controle de versão do schema via Alembic |
| Evolução | Descrição | Objetivo Técnico |
|---|---|---|
| App Mobile Nativo | Aplicação Android/iOS utilizando a mesma API do Backend | Arquitetura Cross-platform sem duplicação de lógica |
| Gamificação de Estudos | Sistema de conquistas e trilhas de aprendizado para iniciantes | Aumentar engajamento e retenção de alunos |
| Integração com AI | Assistente para sugerir bibliotecas com base no perfil do desenvolvedor | Personalização da experiência de busca via LLMs |
| API de Terceiros | Exposição da base de dados para consulta por outros sistemas | Transformar o FiveLib em um Data Provider |
O ambiente de desenvolvimento é totalmente conteinerizado via Docker.
# Subir todo o ecossistema (Frontend, Backend e Banco de Dados)
make up
# Alternativa sem Makefile
docker-compose up --buildVariáveis de ambiente necessárias (jamais commitadas):
| Variável | Componente | Descrição |
|---|---|---|
DATABASE_URL |
Backend | URL de conexão com o PostgreSQL do Supabase |
JWT_SECRET |
Backend | Chave secreta para assinatura dos tokens JWT |
BREVO_API_KEY |
Backend | Chave de API para disparo de e-mails transacionais |
NEXT_PUBLIC_API_URL |
Frontend | URL pública da API (Render) |
O FiveLib consolida a centralização de documentações e ferramentas para orientar estudantes e programadores em um ambiente de informações fragmentadas. A plataforma entrega uma solução objetiva que otimiza a busca e serve como guia prático para o desenvolvimento técnico de seus usuários.
A elaboração desta especificação proporcionou à equipe uma visão macro e aplicada da Engenharia de Software. O mapeamento de atores, casos de uso, requisitos funcionais, não funcionais e regras de negócio estabelece a base para mitigar riscos e alinhar o escopo, garantindo que as etapas de implementação ocorram de forma organizada, assertiva e escalável.
