BookTrack API é uma aplicação backend desenvolvida em FastAPI para o gerenciamento e análise de uma biblioteca pessoal. O sistema permite cadastrar livros, acompanhar o progresso de leitura, importar coleções via CSV e gerar análises literárias por gênero, autor e status de leitura.
Além de servir como ferramenta pessoal, o projeto oferece uma view pública limitada, possibilitando que terceiros explorem parte do acervo de forma segura.
A modelagem segue o padrão Star Schema, integrando conceitos de engenharia de dados e boas práticas de APIs REST. Este projeto foi idealizado como um estudo prático de POO em Python, FastAPI, modelagem de dados e deploy em nuvem.
booktrack_api/
├── booktrack_fastapi/
│ ├── core/ # Configurações gerais
│ ├── models/ # Modelos SQLAlchemy
│ ├── schemas/ # Schemas Pydantic
│ ├── repositories/ # Acesso ao banco
│ ├── services/ # Regras de negócio
│ ├── routers/ # Rotas da API
│ ├── utils/ # Funções auxiliares
│ └── main.py # Ponto de entrada
├── alembic/ # Migrações
├── requirements.txt
├── README.md
└── .env.example
POST /books/
{
"title": "1984",
"original_publication_year": 1949,
"total_pages": 328,
"publisher_id": 1,
"author_id": 3,
"format_id": 1,
"category_id": 6
}GET /books/?author_id=3&year=1949
{
"id": 1,
"title": "1984",
"publisher": {
"id": 1,
"name": "Penguin Books"
},
"format": {
"id": 1,
"name": "Físico"
},
"author": {
"id": 3,
"name": "George Orwell"
}
}- Criar uma API robusta em FastAPI
- Organizar tudo em camadas (Routers → Service → Repository → DB)
- Implementar consultas complexas
- Criar leitura expandida (view SQL)
- Proteger dados sensíveis com versão pública
- Desenvolver habilidades em backend moderno
- Planejar funcionalidades
- Criar diagrama ER
- Implementar models SQLAlchemy
- Criar rotas CRUD de Livros
- Escrever testes
- Configurar deploy no Render
erDiagram
%% ========== 1. BASIC DIMENSIONS ==========
AUTHORS {
int id PK
varchar name
varchar gender "M/F"
varchar country_of_origin
}
PUBLISHERS {
int id PK
varchar name UK
}
COLLECTIONS {
int id PK
varchar name
}
SHELVES {
int id PK
varchar name UK
}
FORMATS {
int id PK
varchar name UK
}
READING_STATUS {
int id PK
varchar name UK
}
TAGS {
int id PK
varchar name UK
}
%% ========== 2. HIERARCHICAL CATEGORIES ==========
CATEGORIES {
int id PK
varchar name
int parent_id FK "NULL = root category"
}
%% ========== 3. BOOKS ==========
BOOKS {
int id PK
int publisher_id FK
int collection_id FK
int format_id FK
int category_id FK
int authors FK
varchar title
int original_publication_year
int total_pages
text cover_url
}
%% ========== 5. READINGS ==========
READINGS {
int id PK
int book_id FK
int status_id FK
date start_date
date end_date
int pages_read
varchar personal_goal
date club_date
varchar club_name
}
%% ========== RELATIONSHIPS ==========
%% Book → Publishers (1:N)
PUBLISHERS ||--o{ BOOKS : "publishes"
%% Book → Collections (1:N)
COLLECTIONS ||--o{ BOOKS : "contains"
%% Book → Formats (1:N)
FORMATS ||--o{ BOOKS : "has"
%% Book → Authors (N:N)
BOOKS }o--o{ AUTHORS : "written by"
%% Book → Categories (N:N)
BOOKS }o--o{ CATEGORIES : "classified as"
%% Category → Category (self-relationship)
CATEGORIES }o--o{ CATEGORIES : "sub-category of"
%% Reading → Book (N:1)
BOOKS ||--o{ READINGS : "has readings"
%% Reading → ReadingStatus (N:1)
READING_STATUS ||--o{ READINGS : "defines"
%% Reading → Tags (N:N)
READINGS }o--o{ TAGS : "tagged with"
%% Reading → Shelves (N:N)
READINGS }o--o{ SHELVES : "stored in"
