45. Interfaces y UUID
Interfaces y UUID en NestJS: Mejorando la Estructura de Datos
En este post, exploraremos cómo utilizar interfaces para definir la estructura de nuestros datos y cómo implementar UUID para generar identificadores únicos en una aplicación NestJS.
Estructura del Proyecto
Nuestra aplicación tiene la siguiente estructura:
src/
│
├── cars/
│ ├── interfaces/ # Definición de interfaces
│ ├── cars.controller.ts # Controlador (maneja las rutas HTTP)
│ ├── cars.module.ts # Módulo (registra controlador y servicio)
│ └── cars.service.ts # Servicio (lógica de negocio)
│
├── app.module.ts # Módulo principal de la aplicación
└── main.ts # Punto de entrada (configuración de NestJS)Definiendo una Interfaz para los Carros
Las interfaces en TypeScript nos permiten obligar a que nuestros datos sigan una estructura específica. Creamos un archivo car.interface.ts dentro de src/cars/interfaces:
export interface Car {
id: string; // Cambiaremos de `number` a `string` para UUID
brand: string;
model: string;
}Luego, actualizamos el servicio para usar esta interfaz:
import { Injectable } from '@nestjs/common';
import { Car } from './interfaces/car.interface';
@Injectable()
export class CarsService {
private cars: Car[] = [
{ id: '1', brand: 'Toyota', model: 'Corolla' },
{ id: '2', brand: 'Honda', model: 'Civic' },
{ id: '3', brand: 'Jeep', model: 'Cherokee' },
];
findAll(): Car[] {
return this.cars;
}
findOneById(id: string): Car {
return this.cars.find(car => car.id === id);
}
}Implementando UUID para IDs Únicos
En lugar de usar números secuenciales, implementaremos UUID para generar identificadores únicos.
1. Instalar las dependencias
yarn add uuid
yarn add -D @types/uuid2. Actualizar el Servicio
import { Injectable } from '@nestjs/common';
import { v4 as uuid } from 'uuid';
import { Car } from './interfaces/car.interface';
@Injectable()
export class CarsService {
private cars: Car[] = [
{ id: uuid(), brand: 'Toyota', model: 'Corolla' },
{ id: uuid(), brand: 'Honda', model: 'Civic' },
{ id: uuid(), brand: 'Jeep', model: 'Cherokee' },
];
findAll(): Car[] {
return this.cars;
}
findOneById(id: string): Car {
return this.cars.find(car => car.id === id);
}
}3. Actualizar el Controlador
El controlador ahora debe manejar string en lugar de number para los IDs:
import { Controller, Get, Param } from '@nestjs/common';
import { CarsService } from './cars.service';
@Controller('cars')
export class CarsController {
constructor(private readonly carsService: CarsService) {}
@Get()
getAllCars() {
return this.carsService.findAll();
}
@Get(':id')
getCarById(@Param('id') id: string) {
return this.carsService.findOneById(id); // Ya no necesitamos convertir a número
} @Post()
createCar(@Body() body: any) {
return body;
}
@Patch(':id')
updateCar(
@Param('id', ParseIntPipe) id: number,
@Body() body: any
) {
return body;
}
@Delete(':id')
deleteCar(@Param('id', ParseIntPipe) id: number) {
return {
method: 'delete',
id
};
}
}Ventajas de Usar UUID
✅ Identificadores únicos globalmente (evita colisiones en sistemas distribuidos).
✅ Mayor seguridad (no son predecibles como los IDs numéricos).
✅ Independencia de la base de datos (funciona con SQL, NoSQL, etc.).
Conclusión
Con interfaces, aseguramos que nuestros datos sigan una estructura consistente, y con UUID, mejoramos la unicidad y seguridad de nuestros identificadores.
¿Qué otras mejoras podríamos implementar? ¡Déjame tu opinión en los comentarios! 🚀
📌 ¿Te gustó el post? Compártelo y sígueme para más contenido sobre NestJS y TypeScript
Comentarios
Publicar un comentario