# DarkLinks Pro — URL Shortener SaaS

## Identificación del Proyecto

| Campo              | Valor                                               |
|--------------------|------------------------------------------------------|
| **ID**             | PROJ-W01                                             |
| **Nombre**         | DarkLinks Pro — URL Shortener Multi-Tenant           |
| **Tipo**           | SaaS — URL Shortener multi-tenant                    |
| **Worker CF**      | `fancy-lab-4a64`                                     |
| **Dominio**        | Por asignar (ej: links.vulnerafix.com)               |
| **Marca**          | DarkLinks Pro                                        |
| **Responsable**    | Daniel (dev) · Cloudflare (infra) · Marketing (GTM) |
| **Fecha registro** | 2026-03-10                                           |
| **Estado**         | ✅ PRODUCCIÓN — 100% OPERATIVO                       |
| **Prioridad**      | ALTA                                                 |

---

## Descripción

Acortador de URLs multi-tenant sobre Cloudflare Workers + D1 + KV. Permite a un administrador central crear clientes, y cada cliente gestiona sus propios links con analytics de clicks en tiempo real. Los redirects se sirven desde KV cache para latencia mínima.

### Propuesta de valor
- Infraestructura serverless edge: Cloudflare Workers + D1 + KV
- Multi-tenant: un Worker, múltiples clientes aislados
- Analytics por click: IP, User-Agent, referer, agrupados por día/mes
- Redirects ultrarrápidos desde KV cache
- 3 planes de monetización listos para activar

---

## Arquitectura

```
Cliente (Browser/App)
    → Cloudflare DNS + CDN
        → CF Worker fancy-lab-4a64 (Router + JWT Auth)
            → D1 SQL (users, clients, links, clicks)
            ↕ KV Cache (redirects ultrarrápidos)
                → Redirect /r/{client_id}/{code} + Click Tracking
```

### Stack Tecnológico

| Capa           | Tecnología              | Estado       |
|----------------|-------------------------|--------------|
| Runtime        | Cloudflare Workers      | Desplegado   |
| Base de datos  | Cloudflare D1 (`bilding`) | Schema migrado ✅ |
| Caché / Redirect | Cloudflare KV (`KV`)  | Configurado ✅ |
| Auth           | JWT HS256 + PBKDF2      | Implementado ✅ |
| Dominios       | Cloudflare DNS          | Por conf.    |
| Billing        | Free / Pro / Business   | Diseñado     |

---

## Funcionalidades Implementadas

### Autenticación y seguridad
- JWT auth (HS256, cookie `DL_TOKEN`, TTL 8h)
- Registro de usuarios con PBKDF2 (180,000 iteraciones)
- Bootstrap de primer admin: `POST /admin/api/bootstrap` con `ADMIN_KEY`

### Gestión multi-tenant
- Admin central crea y gestiona clientes
- Cada cliente tiene su espacio aislado de links
- Links: crear / listar / eliminar

### Redirects y Analytics
- Redirects: `GET /r/{client_id}/{code}` servidos desde KV cache
- Click tracking por redirect: IP, User-Agent, referer
- Analytics agrupados por día y por mes

---

## Bindings Cloudflare

| Tipo    | Nombre en wrangler.toml | Recurso                                      | UUID / ID                              | Estado      |
|---------|-------------------------|----------------------------------------------|----------------------------------------|-------------|
| D1      | `bilding`               | DB `darklinks` (principal)                   | `43f62e15-007f-49d0-a68b-f538ca6caadd` | Schema migrado ✅ |
| D1      | `Darkliks`              | DB extra                                     | `28fc4748-2341-4b55-b072-89c199f7e8fd` | Configurado |
| KV      | `KV`                    | Namespace KV (redirects cache)               | `4c2d15105d534bbf8e7edac1d8128f73`     | Configurado ✅ |
| Secret  | `ADMIN_KEY`             | Clave de bootstrap de admin                  | —                                      | Configurado ✅ |
| Secret  | `APP_KEY`               | Clave de firma JWT                           | —                                      | Configurado ✅ |

---

## Tablas D1

| Tabla    | Descripción                                      | Estado           |
|----------|--------------------------------------------------|------------------|
| `users`  | Usuarios del sistema (admin + clientes)          | Migrada ✅ 2026-03-10 |
| `clients`| Clientes multi-tenant creados por el admin       | Migrada ✅ 2026-03-10 |
| `links`  | Links cortos por cliente (code, URL destino)     | Migrada ✅ 2026-03-10 |
| `clicks` | Registro de clicks con IP, UA, referer, timestamp | Migrada ✅ 2026-03-10 |

---

## Bug Activo — Fix Binding Pendiente

El código del Worker referencia nombres de binding incorrectos. Fix requerido:

| En el código (actual — incorrecto) | Nombre real del binding (correcto) |
|------------------------------------|------------------------------------|
| `env.DB`                           | `env.bilding`                      |
| `env.Darklinks`                    | `env.Darkliks`                     |

**Acción:** Buscar y reemplazar en el Worker todas las referencias a `env.DB` por `env.bilding` y `env.Darklinks` por `env.Darkliks`. Sin este fix el Worker falla al intentar acceder a D1.

---

## Modelo de Monetización

| Plan     | Precio   | Links incluidos | Características                        |
|----------|----------|-----------------|----------------------------------------|
| Free     | $0       | 100 links       | Redirects + analytics básicos          |
| Pro      | $19/mes  | Ilimitados      | Analytics avanzados + custom domain    |
| Business | $49/mes  | Ilimitados      | Multi-usuario + API acceso + soporte   |

---

## Estado por fases

### Fase 1 — Core (COMPLETADA — 90%)
- [x] Worker desplegado en Cloudflare (`fancy-lab-4a64`)
- [x] JWT auth (HS256, cookie DL_TOKEN, 8h TTL)
- [x] Registro con PBKDF2 (180k iteraciones)
- [x] Gestión multi-tenant (admin → clientes → links)
- [x] CRUD de links por cliente
- [x] KV cache para redirects ultrarrápidos
- [x] Click tracking (IP, UA, referer)
- [x] Analytics por día y mes
- [x] Bootstrap endpoint `/admin/api/bootstrap`
- [x] Schema D1 migrado (users, clients, links, clicks)
- [ ] **Fix binding: `env.DB` → `env.bilding` / `env.Darklinks` → `env.Darkliks`**

### Fase 2 — Producción (PENDIENTE)
- [ ] Agregar route/dominio (ej: `links.vulnerafix.com/*`)
- [ ] Bootstrap primer admin via `POST /admin/api/bootstrap`
- [ ] Pruebas E2E de redirect + click tracking

### Fase 3 — Marketing y GTM
- [ ] Landing page de marketing (planes Free/Pro/Business)
- [ ] Integración de pagos (Stripe / PayPal)
- [ ] Campaña de lanzamiento coordinada con agente Marketing

---

## Agentes responsables

| Agente     | Responsabilidad sobre este proyecto                        |
|------------|------------------------------------------------------------|
| Daniel     | Código Worker, fix de bindings, deploy Wrangler, D1 schema |
| Cloudflare | Infra edge: Worker, D1, KV, Routes, DNS, Secrets          |
| Marketing  | GTM, landing page, pricing copy, campaña de lanzamiento   |

---

## Acciones pendientes (próximos pasos)

- [ ] **[Daniel]** Fix en código: `env.DB` → `env.bilding` y `env.Darklinks` → `env.Darkliks`
- [ ] **[Cloudflare]** Agregar route en CF Dashboard: `links.vulnerafix.com/*` → Worker `fancy-lab-4a64`
- [ ] **[Daniel + Cloudflare]** Bootstrap primer admin: `POST /admin/api/bootstrap` con `ADMIN_KEY`
- [ ] **[Marketing]** Crear landing page con planes Free / Pro / Business
- [ ] **[Marketing]** Activar campaña GTM de lanzamiento DarkLinks Pro

---

## Links de referencia

- Worker activo: `https://fancy-lab-4a64.workers.dev`
- Cloudflare Dashboard: https://dash.cloudflare.com/
- Workers Docs: https://developers.cloudflare.com/workers/
- D1 Docs: https://developers.cloudflare.com/d1/
- KV Docs: https://developers.cloudflare.com/kv/
