Skip to content

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'
DecoradorMétodo HTTPEjemplo de ruta resultante
@onGet(path?)GETGET /api/productos o GET /api/productos/:id
@onPost(path?)POSTPOST /api/productos
@onPut(path?)PUTPUT /api/productos/:id
@onDelete(path?)DELETEDELETE /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).