Use this file to discover all available pages before exploring further.
La API DevJobs es una API REST construida con Express v5 en el módulo 04 y posteriormente respaldada por SQLite con TypeScript en el módulo 08. Todos los endpoints operan sobre listados de ofertas de empleo (jobs) y siguen las convenciones REST estándar. La validación de datos se realiza con Zod en ambas versiones.
Número de resultados a saltar (para paginación). Por defecto: 0.
Ejemplo de respuesta
{ "data": [ { "id": "7a4d1d8b-1e45-4d8c-9f1a-8c2f9a9121a4", "titulo": "Desarrollador de Software Senior", "empresa": "Tech Solutions Inc.", "ubicacion": "Remoto", "descripcion": "Buscamos un ingeniero de software con experiencia en desarrollo web y conocimientos en JavaScript, React y Node.js. El candidato ideal debe ser capaz de trabajar en equipo y tener buenas habilidades de comunicación.", "data": { "technology": ["react", "node", "javascript"], "modalidad": "remoto", "nivel": "senior" } }, { "id": "d35b2c89-5d60-4f26-b19a-6cfb2f1a0f57", "titulo": "Analista de Datos", "empresa": "Data Driven Co.", "ubicacion": "Ciudad de México", "descripcion": "Estamos buscando un analista de datos con experiencia en el manejo de grandes conjuntos de datos y herramientas de visualización. Se requiere conocimiento en SQL, Python y R.", "data": { "technology": ["python", "sql", "r", "pandas"], "modalidad": "cdmx", "nivel": "junior" } } ], "total": 2, "limit": 10, "offset": 0}
Identificador único (UUID) de la oferta de empleo.
Respuestas
200 OK
404 Not Found
{ "id": "7a4d1d8b-1e45-4d8c-9f1a-8c2f9a9121a4", "titulo": "Desarrollador de Software Senior", "empresa": "Tech Solutions Inc.", "ubicacion": "Remoto", "descripcion": "Buscamos un ingeniero de software con experiencia...", "data": { "technology": ["react", "node", "javascript"], "modalidad": "remoto", "nivel": "senior" }, "content": { "description": "Tech Solutions Inc. está buscando un Ingeniero de Software Senior...", "responsibilities": "- Diseñar, desarrollar y mantener aplicaciones web...", "requirements": "- Licenciatura en Informática o campo relacionado...", "about": "Tech Solutions Inc. es una empresa de tecnología innovadora..." }}
{ "error": "Invalid request", "details": [ { "code": "too_small", "minimum": 3, "message": "El título debe tener al menos 3 caracteres", "path": ["titulo"] } ]}
Actualiza parcialmente una oferta de empleo existente. Todos los campos del body son opcionales: solo se modificarán los campos que se envíen.Parámetros de ruta
Reemplaza completamente una oferta de empleo existente. A diferencia de PATCH, este método sustituye el objeto entero por los datos enviados en el body.Parámetros de ruta
Identificador único (UUID) de la oferta a reemplazar.
Parámetros del bodyEl body debe contener todos los campos obligatorios del recurso, ya que se realiza un reemplazo completo (mismos campos requeridos que POST /jobs).
200 OK
400 Bad Request
404 Not Found
Devuelve el objeto del job reemplazado.
Si los datos enviados no pasan la validación completa de Zod.
El esquema de validación usado en 04-express/schemas/jobs.js:
import * as z from 'zod'const jobSchema = z.object({ titulo: z .string({ error: 'El título es obligatorio' }) .min(3, 'El título debe tener al menos 3 caracteres') .max(100, 'El título no puede exceder los 100 caracteres'), empresa: z.string(), ubicacion: z.string(), descripcion: z.string().optional(), data: z.object({ technology: z.array(z.string()), modalidad: z.string(), nivel: z.string(), }),})export function validateJob(input) { return jobSchema.safeParse(input)}export function validatePartialJob(input) { return jobSchema.partial().safeParse(input)}
El esquema tipado de 08-sql/backend/src/schemas/job.ts añade validaciones de enum y tipos inferidos automáticamente:
import { z } from 'zod'export const jobDataSchema = z.object({ technology: z.array(z.string()), modality: z.enum(['remote', 'onsite', 'hybrid']), level: z.enum(['junior', 'mid', 'senior'])})export const jobContentSchema = z.object({ description: z.string(), responsibilities: z.string(), requirements: z.string(), about: z.string()})export const jobSchema = z.object({ title: z.string({ required_error: 'Title is required', invalid_type_error: 'Title must be a string' }).min(3, 'Title must be at least 3 characters'), company: z.string({ required_error: 'Company is required' }), location: z.string({ required_error: 'Location is required' }), description: z.string({ required_error: 'Description is required' }), data: jobDataSchema, content: jobContentSchema.optional()})// Tipos inferidos automáticamente desde Zodexport type JobInput = z.infer<typeof jobSchema>export type JobDataInput = z.infer<typeof jobDataSchema>export type JobContentInput = z.infer<typeof jobContentSchema>// Función de validaciónexport function validateJob(input: unknown) { return jobSchema.safeParse(input)}export function validatePartialJob(input: unknown) { return jobSchema.partial().safeParse(input)}
En el módulo 08, la misma API está respaldada por SQLite en lugar del array JSON en memoria. Los datos persisten entre reinicios del servidor y el esquema Zod añade validaciones de enum estrictas para modality ("remote" | "onsite" | "hybrid") y level ("junior" | "mid" | "senior"). Los nombres de campo cambian ligeramente: titulo → title, empresa → company, ubicacion → location.