Referencia: Controladores REST
@restController(path)
Decorador de clase. Registra un controlador HTTP bajo una ruta base.
import { restController } from '@wabot-dev/framework'
@restController('/api/productos')export class ProductoController { }La clase se resuelve en un contenedor hijo por cada request HTTP, por lo que puede inyectar dependencias con estado aislado.
Decoradores de método HTTP
Todos aceptan una ruta opcional (segmento adicional relativo al controlador). Si se omite, el endpoint queda en la ruta base.
import { onGet, onPost, onPut, onDelete } from '@wabot-dev/framework'| Decorador | Método HTTP | Ejemplo de ruta resultante |
|---|---|---|
@onGet(path?) | GET | GET /api/productos o GET /api/productos/:id |
@onPost(path?) | POST | POST /api/productos |
@onPut(path?) | PUT | PUT /api/productos/:id |
@onDelete(path?) | DELETE | DELETE /api/productos/:id |
@restController('/api/productos')export class ProductoController { @onGet() // GET /api/productos async listar() { }
@onGet('/:id') // GET /api/productos/:id async buscar(req: BuscarReq) { }
@onPost() // POST /api/productos async crear(req: CrearReq) { }
@onPut('/:id') // PUT /api/productos/:id async actualizar(req: ActualizarReq) { }
@onDelete('/:id') // DELETE /api/productos/:id async eliminar(req: BuscarReq) { }}Validación automática de request
El primer parámetro del método handler recibe la unión de body, query params y path params combinados en un solo objeto, validado automáticamente con los decoradores del framework.
import { isString, isNumber, isNotEmpty, isOptional, min } from '@wabot-dev/framework'
export class CrearProductoReq { @isString() @isNotEmpty() nombre: string = ''
@isNumber() @min(0) precio: number = 0
@isString() @isOptional() descripcion: string = ''}
export class BuscarReq { @isString() @isNotEmpty() id: string = '' // viene del path param :id}Si la validación falla, el framework retorna automáticamente 400 Bad Request con los detalles del error.
@middleware(MiddlewareClass)
Decorador de método. Aplica un middleware antes de ejecutar el handler.
import { middleware } from '@wabot-dev/framework'
@onGet('/:id')@middleware(AuthMiddleware)async buscar(req: BuscarReq) { }Se pueden encadenar varios middlewares:
@onPost()@middleware(AuthMiddleware)@middleware(RateLimitMiddleware)async crear(req: CrearReq) { }IMiddleware:
import { IMiddleware } from '@wabot-dev/framework'import { Request, Response, NextFunction } from 'express'
@injectable()export class AuthMiddleware implements IMiddleware { async handle(req: Request, res: Response, next: NextFunction) { const token = req.headers.authorization?.split(' ')[1] if (!isValid(token)) { res.status(401).json({ error: 'Unauthorized' }) return } next() }}RestRequest
Clase base que puedes extender en tus clases de request para acceder a los headers HTTP crudos.
import { RestRequest } from '@wabot-dev/framework'
export class MiReq extends RestRequest { @isString() @isNotEmpty() id: string = '' // Hereda: this.headers (objeto con todos los headers HTTP)}Respuestas
Los métodos retornan el valor directamente — el framework lo serializa como JSON con status 200.
Para retornar otros status codes lanza un CustomError:
import { CustomError } from '@wabot-dev/framework'
@onGet('/:id')async buscar(req: BuscarReq) { const item = await this.repo.find(req.id) if (!item) throw new CustomError({ message: 'No encontrado', httpCode: 404 }) return item}runRestControllers(controllers, container?)
Inicia el servidor Express y registra todos los controladores REST.
import { runRestControllers } from '@wabot-dev/framework'
await runRestControllers([ProductoController, UsuarioController])El puerto se configura con la variable de entorno PORT (default: 3000).