Ejemplos
Ejemplos

Ejemplos de Fox Framework

Esta sección contiene ejemplos prácticos que muestran cómo implementar diferentes características y patrones utilizando Fox Framework.

API RESTful Básica

Un ejemplo simple de API RESTful con controladores, rutas y middleware.

// src/controllers/todo.controller.ts
import { Request, Response } from 'express';
 
export class TodoController {
  private todos = [
    { id: 1, title: 'Aprender Fox Framework', completed: false },
    { id: 2, title: 'Crear un API REST', completed: false }
  ];
 
  getAll = (_req: Request, res: Response): void => {
    res.json(this.todos);
  };
 
  getById = (req: Request, res: Response): void => {
    const id = parseInt(req.params.id);
    const todo = this.todos.find(t => t.id === id);
 
    if (!todo) {
      res.status(404).json({ error: 'Todo not found' });
      return;
    }
 
    res.json(todo);
  };
 
  create = (req: Request, res: Response): void => {
    const { title } = req.body;
 
    if (!title) {
      res.status(400).json({ error: 'Title is required' });
      return;
    }
 
    const newTodo = {
      id: this.todos.length + 1,
      title,
      completed: false
    };
 
    this.todos.push(newTodo);
    res.status(201).json(newTodo);
  };
 
  update = (req: Request, res: Response): void => {
    const id = parseInt(req.params.id);
    const todoIndex = this.todos.findIndex(t => t.id === id);
 
    if (todoIndex === -1) {
      res.status(404).json({ error: 'Todo not found' });
      return;
    }
 
    this.todos[todoIndex] = { ...this.todos[todoIndex], ...req.body };
    res.json(this.todos[todoIndex]);
  };
 
  delete = (req: Request, res: Response): void => {
    const id = parseInt(req.params.id);
    const todoIndex = this.todos.findIndex(t => t.id === id);
 
    if (todoIndex === -1) {
      res.status(404).json({ error: 'Todo not found' });
      return;
    }
 
    const deletedTodo = this.todos.splice(todoIndex, 1)[0];
    res.json(deletedTodo);
  };
}
// src/routes/todo.routes.ts
import { Router } from 'express';
import { TodoController } from '../controllers/todo.controller';
 
const todoRouter = Router();
const todoController = new TodoController();
 
todoRouter.get('/todos', todoController.getAll);
todoRouter.get('/todos/:id', todoController.getById);
todoRouter.post('/todos', todoController.create);
todoRouter.put('/todos/:id', todoController.update);
todoRouter.delete('/todos/:id', todoController.delete);
 
export default todoRouter;
// src/server/index.ts
import express from 'express';
import { FoxFactory } from '@foxframework/core';
import todoRouter from '../routes/todo.routes';
 
const app = express();
app.use(express.json());
 
const fox = new FoxFactory(app);
 
// Health endpoint (via FoxFactory)
fox.get('/', (_req, res) => {
  res.json({ name: 'todo-api', version: '1.0.0' });
});
 
// Register routes
app.use('/api', todoRouter);
 
const PORT = Number(process.env.PORT) || 3000;
app.listen(PORT, () => {
  console.log(`🦊 Todo API running on http://localhost:${PORT}`);
});

Aplicación con Cache System

Este ejemplo muestra cómo implementar un sistema de caché para mejorar el rendimiento:

// src/controllers/product.controller.ts
import { Request, Response } from 'express';
 
// Simple in-memory cache (use @foxframework/db-redis for production)
const cache = new Map<string, { data: any; expiresAt: number }>();
 
function cacheGet<T>(key: string): T | null {
  const entry = cache.get(key);
  if (!entry || entry.expiresAt < Date.now()) {
    cache.delete(key);
    return null;
  }
  return entry.data as T;
}
 
function cacheSet(key: string, data: any, ttlSeconds = 3600): void {
  cache.set(key, { data, expiresAt: Date.now() + ttlSeconds * 1000 });
}
 
export class ProductController {
  async getProducts(_req: Request, res: Response): Promise<void> {
    const cacheKey = 'products:all';
 
    const cachedProducts = cacheGet<any[]>(cacheKey);
    if (cachedProducts) {
      console.log('Returning products from cache');
      res.json(cachedProducts);
      return;
    }
 
    console.log('Fetching products from database');
    const products = await this.fetchProductsFromDB();
 
    cacheSet(cacheKey, products);
    res.json(products);
  }
 
  private async fetchProductsFromDB(): Promise<any[]> {
    await new Promise(resolve => setTimeout(resolve, 500));
    return [
      { id: 1, name: 'Laptop', price: 999.99 },
      { id: 2, name: 'Smartphone', price: 699.99 },
      { id: 3, name: 'Headphones', price: 199.99 }
    ];
  }
}

Vea más ejemplos completos en nuestro repositorio de ejemplos en GitHub (opens in a new tab).