API REST que sirve información sobre diferentes tipos de pan del mundo. Construida con Cloudflare Workers, HonoJS, D1, Prisma y Zod.
URL de Producción: https://bread-api.infraforge.cc
- Runtime: Cloudflare Workers
- Framework: HonoJS
- Base de datos: Cloudflare D1 (SQLite)
- ORM: Prisma con adaptador D1
- Validación: Zod
- Lenguaje: TypeScript
- Package Manager: pnpm
Cada pan contiene la siguiente información:
{
id: number;
name: string;
country: string;
year_created: number | null;
description: string;
characteristics: string[];
ingredients: string[];
image_url: string;
created_at: Date;
updated_at: Date;
}Información general de la API.
Respuesta:
{
"name": "Bread API",
"version": "1.0.0",
"description": "API serving information about world-famous breads",
"endpoints": {
"breads": "/breads",
"breadById": "/breads/:id"
}
}Lista todos los panes con soporte para filtros y paginación.
Query Parameters:
country(opcional): Filtrar por país (case-insensitive). Ejemplo:?country=Francesearch(opcional): Buscar en nombre y descripción. Ejemplo:?search=sourlimit(opcional): Número de resultados (default: 20, max: 100). Ejemplo:?limit=10offset(opcional): Offset para paginación (default: 0). Ejemplo:?offset=10
Ejemplo de Petición:
curl "https://bread-api.infraforge.cc/breads?country=France&limit=5"Respuesta:
{
"data": [
{
"id": 1,
"name": "Baguette",
"country": "France",
"year_created": 1920,
"description": "A long, thin loaf of French bread...",
"characteristics": [
"Crispy golden crust",
"Soft, airy interior with large holes"
],
"ingredients": ["Wheat flour", "Water", "Salt", "Yeast"],
"image_url": "https://images.unsplash.com/...",
"created_at": "2025-12-19T20:00:00.000Z",
"updated_at": "2025-12-19T20:00:00.000Z"
}
],
"total": 1,
"limit": 5,
"offset": 0
}Obtiene los detalles completos de un pan específico.
Path Parameters:
id: ID numérico del pan
Ejemplo de Petición:
curl "https://bread-api.infraforge.cc/breads/1"Respuesta:
{
"id": 1,
"name": "Baguette",
"country": "France",
"year_created": 1920,
"description": "A long, thin loaf of French bread...",
"characteristics": [
"Crispy golden crust",
"Soft, airy interior with large holes",
"Long and thin shape (60-70cm)",
"Light and slightly chewy texture"
],
"ingredients": ["Wheat flour", "Water", "Salt", "Yeast"],
"image_url": "https://images.unsplash.com/...",
"created_at": "2025-12-19T20:00:00.000Z",
"updated_at": "2025-12-19T20:00:00.000Z"
}Errores:
404: Pan no encontrado400: ID inválido
- Node.js 18+
- pnpm (o npm/yarn)
- Cuenta de Cloudflare con D1
# Clonar el repositorio
git clone <repo-url>
cd bread-api
# Instalar dependencias
pnpm installLas credenciales de Cloudflare D1 ya están configuradas en wrangler.jsonc:
- Account ID:
a27eeb35a8bef00d5bff5170a654c417 - Database ID:
77ed88f9-a1b4-4927-aa2c-7f61c88fb45c - Database Name:
bread-db
pnpm prisma:generateEste comando genera el cliente de Prisma basado en el esquema definido en prisma/schema.prisma.
# Crear una nueva migración
pnpm prisma:migrate
# Ejecutar la migración en D1 remoto
pnpm wrangler d1 execute bread-db --remote --file=./prisma/migrations/<nombre_migracion>/migration.sqlNota: Como D1 es una base de datos remota, las migraciones deben ejecutarse usando el CLI de Wrangler.
El seed script contiene 20 panes famosos del mundo con datos reales e históricos.
# Para desarrollo local (requiere configuración adicional)
# Este comando usa una base de datos SQLite local
pnpm seed
# Para ejecutar seed en D1 remoto, necesitas adaptar el script o insertar datos manualmenteNota: El script de seed está configurado para SQLite local. Para D1, considera ejecutar el seed localmente primero y luego migrar o adaptar el script para usar D1.
pnpm devLa API estará disponible en http://localhost:8787
# Listar todos los panes
curl http://localhost:8787/breads
# Filtrar por país
curl "http://localhost:8787/breads?country=France"
# Buscar
curl "http://localhost:8787/breads?search=sour"
# Obtener un pan específico
curl http://localhost:8787/breads/1
# Paginación
curl "http://localhost:8787/breads?limit=5&offset=5"Asegúrate de estar autenticado con Cloudflare:
pnpm wrangler loginEl archivo wrangler.jsonc ya está configurado con:
- Nombre del worker:
bread-api - Binding de D1:
DB - Compatibilidad con Node.js para Prisma
# Ejecutar la migración en la base de datos D1 remota
pnpm wrangler d1 execute bread-db --remote --file=./prisma/migrations/<nombre_migracion>/migration.sqlpnpm deployEste comando:
- Empaqueta tu aplicación
- Minifica el código
- Despliega a Cloudflare Workers
- Configura automáticamente el binding con D1
Después del despliegue, tu API estará disponible en:
https://bread-api.<tu-subdomain>.workers.dev- O en tu dominio personalizado configurado en Cloudflare
- Baguette (Francia, 1920)
- Ciabatta (Italia, 1982)
- Croissant (Francia, 1683)
- Sourdough (Egipto, ~3700 AC)
- Naan (India, 1300)
- Pita (Medio Oriente, ~2500 AC)
- Focaccia (Italia, ~500 AC)
- Challah (Israel, 1400)
- Brioche (Francia, 1404)
- Pretzel (Alemania, 610)
- Pan de Bono (Colombia, 1850)
- Tortilla (México, ~500 AC)
- Pumpernickel (Alemania, 1450)
- Bagel (Polonia, 1610)
- Injera (Etiopía, ~100 AC)
- Roti (India, ~2500 AC)
- Cornbread (Estados Unidos, 1700)
- Pan de Muerto (México, 1500)
- Damper (Australia, 1800)
- Arepa (Venezuela, ~3000 AC)
CREATE TABLE Bread (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
country TEXT NOT NULL,
year_created INTEGER,
description TEXT NOT NULL,
characteristics TEXT NOT NULL, -- JSON array
ingredients TEXT NOT NULL, -- JSON array
image_url TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_bread_country ON Bread(country);
CREATE INDEX idx_bread_name ON Bread(name);# Desarrollo
pnpm dev # Ejecutar en modo desarrollo
pnpm deploy # Desplegar a producción
# Prisma
pnpm prisma:generate # Generar cliente de Prisma
pnpm prisma:migrate # Crear nueva migración
# Base de datos
pnpm wrangler d1 execute bread-db --remote --command="SELECT * FROM Bread LIMIT 5"
pnpm wrangler d1 execute bread-db --local --command="SELECT * FROM Bread"
# Seed
pnpm seed # Poblar base de datos localbread-api/
├── prisma/
│ ├── schema.prisma # Esquema de Prisma
│ ├── seed.ts # Script de seed con 20 panes
│ └── migrations/ # Migraciones SQL
├── src/
│ ├── index.ts # Entrada principal de la app
│ ├── types.ts # Definiciones de tipos
│ ├── validators.ts # Validadores Zod
│ └── routes/
│ └── breads.ts # Rutas de panes
├── wrangler.jsonc # Configuración de Cloudflare Workers
├── tsconfig.json # Configuración de TypeScript
├── package.json # Dependencias y scripts
└── README.md # Este archivo- Solo lectura: La API solo expone endpoints GET. La administración de datos se hace manualmente en D1.
- CORS: Habilitado para todas las rutas.
- Rate Limiting: Usa los límites por defecto de Cloudflare Workers (100k requests/día en plan gratuito).
- Validación: Todos los parámetros de entrada son validados con Zod.
pnpm prisma:generateAsegúrate de usar el flag --remote para la base de datos en la nube:
pnpm wrangler d1 execute bread-db --remote --file=./prisma/migrations/xxx/migration.sqlEl seed script usa SQLite local. Para D1, considera:
- Ejecutar el seed localmente primero
- Exportar los datos
- Importarlos a D1 usando wrangler
MIT
Desarrollado para demostrar el uso de Cloudflare Workers, D1, y tecnologías modernas de TypeScript.