---
name: crud_register_routes
kind: function
lang: go
domain: infra
version: "1.0.0"
purity: impure
signature: "func CRUDRegisterRoutes(mux *http.ServeMux, basePath string, res CRUDResource, db *sql.DB)"
description: "Registra las 5 rutas REST de un CRUDResource en un http.ServeMux: GET /base, GET /base/{id}, POST /base, PUT /base/{id}, DELETE /base/{id}. Usa la sintaxis 'METHOD /path' de Go 1.22+."
tags: [crud, routes, register, http, mux, infra]
uses_functions: [crud_generate_handlers_go_infra]
uses_types: [CRUDResource_go_infra]
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [database/sql, fmt, net/http, strings]
params:
  - name: mux
    desc: "*http.ServeMux donde se registran las rutas"
  - name: basePath
    desc: "prefijo de las rutas (ej: '/api/projects')"
  - name: res
    desc: "definicion CRUDResource del recurso"
  - name: db
    desc: "conexion *sql.DB a SQLite"
output: "muta mux con las 5 rutas CRUD registradas"
tested: true
tests: ["registra las 5 rutas y responde correctamente", "soporta multiples recursos en un mismo mux"]
test_file_path: "functions/infra/crud_test.go"
file_path: "functions/infra/crud_register_routes.go"
---

## Ejemplo

```go
mux := http.NewServeMux()
CRUDRegisterRoutes(mux, "/api/projects", projectRes, db)
CRUDRegisterRoutes(mux, "/api/users", userRes, db)
http.ListenAndServe(":8080", mux)
```

## Notas

Impura — muta el mux pasado como parametro. basePath se normaliza quitando el slash final. Si la ruta colisiona con una ya registrada en el mux, Go lanzara panic al arrancar (comportamiento estandar del ServeMux). Para combinar con middleware de logging/CORS, envolver el mux con HTTPMiddlewareChain al final.
