Skip to main content

Get All Catalog Data

curl http://localhost:8000/api/v1/datos
{
  "asignaturas": [
    {
      "id": "A001",
      "nombre": "Álgebra Lineal",
      "estado": "activo",
      "duracion": "6 meses",
      "semestre": 1,
      "creditos": 4,
      "descripcion": "Introducción a álgebra lineal para ingenierías",
      "requiereRecursos": ["R003"],
      "tipo": "teorica"
    }
  ],
  "aulas": [
    {
      "id": "AU001",
      "nombre": "Aula 101",
      "estado": "activo",
      "codigo": "A101",
      "descripcion": "Aula teórica principal",
      "tipo": "teorica",
      "capacidad": 40,
      "id_sede": "S001",
      "id_recursos": ["R001", "R002"]
    }
  ],
  "docentes": [
    {
      "id": "D001",
      "nombre": "Dr. García",
      "especialidad": "Matemáticas",
      "email": "[email protected]",
      "estado": "activo"
    }
  ],
  "recursos": [
    {
      "id": "R001",
      "nombre": "Proyector",
      "tipo": "audiovisual",
      "descripcion": "Proyector multimedia"
    }
  ],
  "sedes": [
    {
      "id": "S001",
      "nombre": "Sede Principal",
      "direccion": "Av. Universidad 123",
      "ciudad": "Ciudad Universitaria"
    }
  ]
}

GET /datos

Retrieves all catalog/reference data from the system in a single request.
This endpoint returns static catalog data loaded from JSON files. It’s useful for populating dropdowns, validating IDs, and understanding system configuration.

Response Fields

asignaturas
array
List of all courses/subjects
aulas
array
List of all classrooms
docentes
array
List of all professors/instructors
recursos
array
List of all available resources
sedes
array
List of all campuses/locations

Common Use Cases

Populate Form Dropdowns

import requests

# Get all catalog data
data = requests.get('http://localhost:8000/api/v1/datos').json()

# Create dropdown options for courses
course_options = [
    {"value": a['id'], "label": f"{a['nombre']} (Sem {a['semestre']})"}
    for a in data['asignaturas']
    if a['estado'] == 'activo'
]

# Create dropdown for classrooms by type
teoria_aulas = [
    {"value": a['id'], "label": f"{a['nombre']} - Cap: {a['capacidad']}"}
    for a in data['aulas']
    if a['tipo'] == 'teorica' and a['estado'] == 'activo'
]

Validate References

import requests

def validate_reservation_data(reservation):
    """Validate that all IDs in reservation exist in catalog"""
    catalog = requests.get('http://localhost:8000/api/v1/datos').json()
    
    # Check course exists
    course_exists = any(a['id'] == reservation['asignatura_id'] 
                       for a in catalog['asignaturas'])
    
    # Check classroom exists
    aula_exists = any(a['id'] == reservation['aula_id'] 
                     for a in catalog['aulas'])
    
    # Check professor exists
    docente_exists = any(d['id'] == reservation['docente_id'] 
                        for d in catalog['docentes'])
    
    return course_exists and aula_exists and docente_exists

Find Classrooms by Resources

import requests

def find_classrooms_with_projector():
    """Find all active classrooms with projectors"""
    catalog = requests.get('http://localhost:8000/api/v1/datos').json()
    
    # Find projector resource ID
    projector = next((r for r in catalog['recursos'] 
                     if 'Proyector' in r['nombre']), None)
    
    if not projector:
        return []
    
    # Find classrooms with that resource
    classrooms = [
        aula for aula in catalog['aulas']
        if projector['id'] in aula.get('id_recursos', []) 
        and aula['estado'] == 'activo'
    ]
    
    return classrooms

Health Check

curl http://localhost:8000/api/v1/health
{
  "status": "healthy",
  "service": "Gestión de Horarios",
  "version": "1.0.0"
}

GET /health

Simple health check endpoint to verify the API is running.
Use this endpoint for monitoring, load balancer health checks, and service discovery.

Response Fields

status
string
Health status: healthy if service is operational
service
string
Service name: “Gestión de Horarios”
version
string
API version: “1.0.0”

Monitoring Example

Health Check Script

import requests
import time
from datetime import datetime

def monitor_api(interval_seconds=30):
    """Monitor API health at regular intervals"""
    while True:
        try:
            response = requests.get(
                'http://localhost:8000/api/v1/health',
                timeout=5
            )
            
            if response.status_code == 200:
                data = response.json()
                timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                print(f"[{timestamp}] ✓ {data['service']} - {data['status']}")
            else:
                print(f"[{timestamp}] ✗ HTTP {response.status_code}")
                
        except requests.exceptions.RequestException as e:
            timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            print(f"[{timestamp}] ✗ Connection failed: {e}")
        
        time.sleep(interval_seconds)

if __name__ == '__main__':
    monitor_api()

Docker Health Check

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:8000/api/v1/health || exit 1

Kubernetes Readiness Probe

apiVersion: v1
kind: Pod
metadata:
  name: horarios-backend
spec:
  containers:
  - name: api
    image: horarios-backend:latest
    readinessProbe:
      httpGet:
        path: /api/v1/health
        port: 8000
      initialDelaySeconds: 5
      periodSeconds: 10
    livenessProbe:
      httpGet:
        path: /api/v1/health
        port: 8000
      initialDelaySeconds: 15
      periodSeconds: 20

Data Files Location

The catalog data is loaded from JSON files in the /data directory:
  • asignaturas.json - Course definitions
  • aulas.json - Classroom configurations
  • docentes.json - Professor information
  • recursos.json - Available resources
  • sedes.json - Campus locations
Modifying these JSON files directly will affect the catalog data returned by /datos. Always backup before editing.

Build docs developers (and LLMs) love