Encurtador full-stack com foco em arquitetura em camadas, cache, tarefas assíncronas e segurança.
- Slug base-62 de 8 chars via
secrets(~218 trilhões de combinações) - Slug custom com palavras reservadas (
admin,api,login…) - TTL opcional por link; Celery Beat desativa expirados
- Analytics: cliques diários, dispositivo, top referrers (cache Redis 30 s)
- JWT — access 15 min + refresh 7 dias com blacklist no logout
- Rate limit Redis no redirect (fixed-window 60s, 100 req/min por IP) +
UserRateThrottlepor ação no DRF - SSRF: bloqueia IPs privados (RFC1918, loopback, link-local) e IMDS (AWS/GCP)
- IPs armazenados como hash SHA-256 truncado
- Log de cliques assíncrono (Celery) — não bloqueia o 302
| Camada | Tecnologia |
|---|---|
| Backend | Django 6 + DRF 3.16 |
| Auth | SimpleJWT (rotação + blacklist) |
| Banco | PostgreSQL 16 |
| Cache / Broker | Redis 8 |
| Async | Celery 5 + django-celery-beat |
| Frontend | React 18 + TypeScript + Vite |
| Docs API | drf-spectacular (Swagger / OpenAPI 3) |
| Containers | Docker Compose v2 |
Pré-requisito: Docker Desktop ≥ 24
git clone https://github.com/GabriellAfonso/shorter.git
cd shorter
cp backend/.env.example backend/.env
docker compose up --build| Serviço | URL |
|---|---|
| Frontend | http://localhost:5173 |
| API | http://localhost:8000/api/v1/ |
| Swagger | http://localhost:8000/api/schema/swagger-ui/ |
| Admin | http://localhost:8000/core/ |
| Health | http://localhost:8000/api/v1/health/ |
Credenciais demo: admin@demo.com / admin1234 · user@demo.com / demo1234
Prefixo /api/v1/. Documentação interativa em /api/schema/swagger-ui/.
auth/— register, login, logout, token/refreshusers/me/— perfil, update, change-passwordlinks/— CRUD +links/{id}/analytics/?days=30s/{slug}/— redirect público 302health/— status DB + Redis
Feature-based:
backend/
├── config/ # settings, urls, celery
├── core/ # exceptions, permissions, utils, health
└── apps/
├── accounts/ # User custom + auth + profile
└── links/ # models, services, selectors, validators, throttles, tasks
Fluxo: Views → Services → Repositories/Selectors → Models. Views finas, regras de negócio nos services, queries + cache nos selectors.
- Cache de redirect — Redis consultado antes do DB (
redirect:{slug}). TTL = mín(expiry, 24 h). Redirect < 100 ms quente. - Log async —
log_click.delay()disparado após o 302. Worker persisteLinkClicke incrementaclick_countviaF(). - SSRF —
validate_target_urlparseia hostname, bloqueia IPs privados e schemes não HTTP(S). - JWT blacklist — refresh invalidado no logout via
simplejwt.token_blacklist. Axios intercepta 401 e renova access silenciosamente.
GNU General Public License v3.0 — veja LICENSE para detalhes.