Esta es una API REST desarrollada en TypeScript que permite gestionar una base de datos de medidas corporales para negocios de confección de ropa. La API facilita el almacenamiento, consulta, actualización y eliminación de las medidas de los clientes, optimizando el proceso de toma de medidas y confección de prendas personalizadas.
Esta API está diseñada específicamente para sastres, modistas y profesionales de la confección que necesitan:
- Almacenar las medidas corporales completas de sus clientes
- Consultar rápidamente las medidas de cualquier cliente
- Actualizar medidas cuando sea necesario
- Mantener un registro organizado de todos sus clientes
- Gestionar información de contacto junto con las medidas
- Node.js - Entorno de ejecución
- TypeScript - Lenguaje de programación
- Express - Framework web
- MongoDB - Base de datos NoSQL
- Mongoose - ODM para MongoDB
- Zod - Validación de esquemas
- Morgan - Logger de peticiones HTTP
- CORS - Manejo de peticiones entre dominios
- Node.js (v18 o superior)
- MongoDB (local o MongoDB Atlas)
- npm o bun
- Clonar el repositorio
git clone https://github.com/programadorisgod/API-REST-TYPESCRIPT.git
cd API-REST-TYPESCRIPT- Instalar dependencias
npm install- Configurar variables de entorno
Crea un archivo .env en la raíz del proyecto basándote en .env.example:
CONEXION_STRING=mongodb://localhost:27017/medidas_confeccion
PORT=4000Para MongoDB Atlas, usa una cadena de conexión como:
CONEXION_STRING=mongodb+srv://usuario:password@cluster.mongodb.net/medidas_confeccion
PORT=4000- Ejecutar la aplicación
En modo desarrollo:
npm run devEn modo producción:
npm run build
npm startLa API estará disponible en http://localhost:4000
La API almacena las siguientes medidas corporales (todas en centímetros):
| Campo | Significado | Descripción |
|---|---|---|
| AE | Ancho de Espalda | Medida de hombro a hombro en la espalda |
| TD | Talle Delantero | Desde el hombro hasta la cintura (parte frontal) |
| TE | Talle Espalda | Desde el hombro hasta la cintura (parte trasera) |
| CP | Contorno de Pecho | Perímetro del pecho en su parte más ancha |
| ALB | Altura de Busto | Desde el hombro hasta la punta del busto |
| SB | Separación de Busto | Distancia entre ambos bustos |
| CC | Contorno de Cintura | Perímetro de la cintura |
| CK | Contorno de Cadera | Perímetro de la cadera en su parte más ancha |
| ALK | Altura de Cadera | Desde la cintura hasta la cadera |
| LT | Largo Total | Longitud total de la prenda (desde cuello hasta largo deseado) |
| LM | Largo de Manga | Desde el hombro hasta la muñeca |
| LSH | Largo de Short | Desde la cintura hasta el largo deseado del short |
http://localhost:4000/api/v1/users
Verifica que la API está funcionando.
Petición:
curl http://localhost:4000/Respuesta:
{
"msg": "Welcome to my api TS",
"data": {
"metodo": "GET",
"url": "/"
}
}Obtiene la lista completa de todos los clientes con sus medidas.
Petición:
curl http://localhost:4000/api/v1/usersRespuesta Exitosa (200):
{
"users": [
{
"_id": "507f1f77bcf86cd799439011",
"name": "María González",
"email": "maria.gonzalez@email.com",
"phoneNumber": "+52 55 1234 5678",
"measueres": {
"AE": 38,
"TD": 42,
"TE": 40,
"CP": 92,
"ALB": 28,
"SB": 20,
"CC": 70,
"CK": 98,
"ALK": 20,
"LT": 105,
"LM": 60,
"LSH": 35
},
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:30:00.000Z"
}
]
}Obtiene la información y medidas de un cliente específico.
Parámetros:
id(en URL): ID de MongoDB del cliente
Petición:
curl http://localhost:4000/api/v1/users/507f1f77bcf86cd799439011Respuesta Exitosa (200):
{
"user": {
"_id": "507f1f77bcf86cd799439011",
"name": "María González",
"email": "maria.gonzalez@email.com",
"phoneNumber": "+52 55 1234 5678",
"measueres": {
"AE": 38,
"TD": 42,
"TE": 40,
"CP": 92,
"ALB": 28,
"SB": 20,
"CC": 70,
"CK": 98,
"ALK": 20,
"LT": 105,
"LM": 60,
"LSH": 35
},
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:30:00.000Z"
}
}Respuesta de Error (404):
{
"msg": "id is malformed"
}Crea un nuevo cliente con sus medidas.
Headers:
Content-Type: application/json
Petición:
curl -X POST http://localhost:4000/api/v1/users/create \
-H "Content-Type: application/json" \
-d '{
"name": "Carlos Rodríguez",
"email": "carlos.rodriguez@email.com",
"phoneNumber": "+52 55 9876 5432",
"measueres": {
"AE": 42,
"TD": 45,
"TE": 43,
"CP": 100,
"ALB": 30,
"SB": 22,
"CC": 85,
"CK": 102,
"ALK": 22,
"LT": 110,
"LM": 65,
"LSH": 40
}
}'Cuerpo de la Petición (JSON):
{
"name": "Carlos Rodríguez",
"email": "carlos.rodriguez@email.com",
"phoneNumber": "+52 55 9876 5432",
"measueres": {
"AE": 42,
"TD": 45,
"TE": 43,
"CP": 100,
"ALB": 30,
"SB": 22,
"CC": 85,
"CK": 102,
"ALK": 22,
"LT": 110,
"LM": 65,
"LSH": 40
}
}Respuesta Exitosa (201):
{
"newUser": {
"_id": "507f1f77bcf86cd799439012",
"name": "Carlos Rodríguez",
"email": "carlos.rodriguez@email.com",
"phoneNumber": "+52 55 9876 5432",
"measueres": {
"AE": 42,
"TD": 45,
"TE": 43,
"CP": 100,
"ALB": 30,
"SB": 22,
"CC": 85,
"CK": 102,
"ALK": 22,
"LT": 110,
"LM": 65,
"LSH": 40
},
"createdAt": "2024-01-15T11:00:00.000Z",
"updatedAt": "2024-01-15T11:00:00.000Z"
}
}Respuesta de Error (400):
{
"msg": "Body is empty"
}Actualiza la información y/o medidas de un cliente existente.
Parámetros:
id(en URL): ID de MongoDB del cliente
Headers:
Content-Type: application/json
Petición:
curl -X PATCH http://localhost:4000/api/v1/users/update/507f1f77bcf86cd799439011 \
-H "Content-Type: application/json" \
-d '{
"name": "María González Pérez",
"phoneNumber": "+52 55 1234 9999",
"measueres": {
"AE": 38,
"TD": 42,
"TE": 40,
"CP": 94,
"ALB": 28,
"SB": 20,
"CC": 72,
"CK": 100,
"ALK": 20,
"LT": 105,
"LM": 60,
"LSH": 35
}
}'Cuerpo de la Petición (JSON) - Puedes enviar solo los campos a actualizar:
{
"name": "María González Pérez",
"phoneNumber": "+52 55 1234 9999",
"measueres": {
"AE": 38,
"TD": 42,
"TE": 40,
"CP": 94,
"ALB": 28,
"SB": 20,
"CC": 72,
"CK": 100,
"ALK": 20,
"LT": 105,
"LM": 60,
"LSH": 35
}
}Respuesta Exitosa (200):
{
"userUpdated": {
"_id": "507f1f77bcf86cd799439011",
"name": "María González Pérez",
"email": "maria.gonzalez@email.com",
"phoneNumber": "+52 55 1234 9999",
"measueres": {
"AE": 38,
"TD": 42,
"TE": 40,
"CP": 94,
"ALB": 28,
"SB": 20,
"CC": 72,
"CK": 100,
"ALK": 20,
"LT": 105,
"LM": 60,
"LSH": 35
},
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T12:00:00.000Z"
}
}Respuesta de Error (404):
{
"msg": "User not found"
}Elimina un cliente y todas sus medidas de la base de datos.
Parámetros:
id(en URL): ID de MongoDB del cliente
Petición:
curl -X DELETE http://localhost:4000/api/v1/users/delete/507f1f77bcf86cd799439011Respuesta Exitosa (200):
{
"userDeleted": {
"_id": "507f1f77bcf86cd799439011",
"name": "María González",
"email": "maria.gonzalez@email.com",
"phoneNumber": "+52 55 1234 5678",
"measueres": {
"AE": 38,
"TD": 42,
"TE": 40,
"CP": 92,
"ALB": 28,
"SB": 20,
"CC": 70,
"CK": 98,
"ALK": 20,
"LT": 105,
"LM": 60,
"LSH": 35
},
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:30:00.000Z"
}
}Respuesta de Error (404):
{
"msg": "User not found"
}La API utiliza los siguientes códigos de estado:
| Código | Descripción |
|---|---|
200 |
OK - Petición exitosa |
201 |
Created - Recurso creado exitosamente |
400 |
Bad Request - Petición mal formada o datos inválidos |
404 |
Not Found - Recurso no encontrado |
500 |
Internal Server Error - Error en el servidor |
// Crear un nuevo cliente
async function crearCliente() {
const response = await fetch('http://localhost:4000/api/v1/users/create', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: "Ana López",
email: "ana.lopez@email.com",
phoneNumber: "+52 55 5555 5555",
measueres: {
AE: 36,
TD: 40,
TE: 38,
CP: 88,
ALB: 26,
SB: 18,
CC: 68,
CK: 95,
ALK: 19,
LT: 100,
LM: 58,
LSH: 33
}
})
});
const data = await response.json();
console.log(data);
}
// Obtener todos los clientes
async function obtenerClientes() {
const response = await fetch('http://localhost:4000/api/v1/users');
const data = await response.json();
console.log(data.users);
}
// Actualizar cliente
async function actualizarCliente(id) {
const response = await fetch(`http://localhost:4000/api/v1/users/update/${id}`, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
phoneNumber: "+52 55 9999 9999"
})
});
const data = await response.json();
console.log(data);
}
// Eliminar cliente
async function eliminarCliente(id) {
const response = await fetch(`http://localhost:4000/api/v1/users/delete/${id}`, {
method: 'DELETE'
});
const data = await response.json();
console.log(data);
}import axios from 'axios';
const API_URL = 'http://localhost:4000/api/v1/users';
// Crear cliente
const crearCliente = async () => {
try {
const response = await axios.post(`${API_URL}/create`, {
name: "Pedro Martínez",
email: "pedro.martinez@email.com",
phoneNumber: "+52 55 7777 7777",
measueres: {
AE: 44,
TD: 48,
TE: 46,
CP: 105,
ALB: 32,
SB: 24,
CC: 90,
CK: 108,
ALK: 23,
LT: 115,
LM: 68,
LSH: 42
}
});
console.log(response.data);
} catch (error) {
console.error(error);
}
};
// Obtener todos los clientes
const obtenerClientes = async () => {
try {
const response = await axios.get(API_URL);
console.log(response.data.users);
} catch (error) {
console.error(error);
}
};
// Obtener cliente por ID
const obtenerClientePorId = async (id) => {
try {
const response = await axios.get(`${API_URL}/${id}`);
console.log(response.data.user);
} catch (error) {
console.error(error);
}
};API-REST-TYPESCRIPT/
├── src/
│ ├── config/
│ │ ├── connection.ts # Configuración de MongoDB
│ │ ├── env.ts # Validación de variables de entorno
│ │ └── port.ts # Gestión de puertos
│ ├── controllers/
│ │ └── users.ts # Controladores de usuarios
│ ├── interfaces/
│ │ └── user.interface.ts # Interfaces TypeScript
│ ├── middleware/
│ │ └── validateBody.ts # Middleware de validación
│ ├── models/
│ │ └── users.ts # Modelo de MongoDB
│ ├── routes/
│ │ └── user.ts # Rutas de la API
│ ├── services/
│ │ └── users.ts # Lógica de negocio
│ ├── utils/
│ │ └── handlerError.ts # Manejo de errores
│ └── index.ts # Punto de entrada
├── .env # Variables de entorno (no incluido en git)
├── .env.example # Ejemplo de variables de entorno
├── package.json # Dependencias del proyecto
├── tsconfig.json # Configuración de TypeScript
└── README.md # Este archivo
# Modo desarrollo con recarga automática
npm run dev
# Compilar TypeScript a JavaScript
npm run build
# Ejecutar en producción
npm start
# Ejecutar linter
npm run lintEl proyecto incluye soporte para Docker:
# Construir imagen
docker build -t api-medidas-confeccion .
# Ejecutar contenedor
docker run -p 4000:4000 --env-file .env api-medidas-confeccion- El email debe ser único en la base de datos
- Todos los campos de medidas son requeridos
- Todos los campos de medidas deben ser números
- El nombre, email y teléfono son campos obligatorios
- El body no puede estar vacío en peticiones POST y PATCH
- Fork el proyecto
- Crea tu rama de características (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la Licencia ISC.
Desarrollado por programadorisgod
Si tienes alguna pregunta o problema, por favor abre un issue en el repositorio.
¡Feliz confección! 👔✂️📏