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:

Copy
Download
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:

typescript
Copy
Download
export interface Car {
  id: string;  // Cambiaremos de `number` a `string` para UUID
  brand: string;
  model: string;
}

Luego, actualizamos el servicio para usar esta interfaz:

typescript
Copy
Download
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

bash
Copy
Download
yarn add uuid
yarn add -D @types/uuid

2. Actualizar el Servicio

typescript
Copy
Download
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:

typescript
Copy
Download
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

Entradas más populares de este blog

48. ValidationPipe - Class Validator y Class Transformer

32-Modulos

49. Pipes Globales - A nivel de Aplicación