DEV Community

Fran Messina
Fran Messina

Posted on

Aventuras con NestJS: Construyendo una API. Parte 1

Este artículo no va a ser exactamente un tutorial, ya que no estoy seguro de saber lo suficiente como para enseñar a otros, pero queria intentar de documentar mi proceso al construir una aplicación y me pareció que escribir algunos articulos al respecto podría ayudarme y tal vez también ayude a alguien que los lea. No voy a estar explicando las cosas detalladamente y paso por paso, va a ser más una idea general de lo que hago, en caso de que te quede alguna duda o pienses que me olvide de algo importante por favor coméntalo. Para aprender sobre Nest es muy recomendable leer su pagina de documentación y los articulos de Marcin Wanago: API with nestjs

La aplicación final va a evolucionar con el tiempo, pero como minimo va a incluir:

  • Autenticación y Autorización
  • Productos con variantes y diferentes ubicaciones para stock(depositos, locales)
  • Integración con Mercado Libre
  • Procesamiento de pagos con Mercado Pago

La aplicación va a ser un sistema de gestion para una libreria que vende libros usados, ofertas y nuevos, algunas de las tecnologias que voy a utilizar:

  • NestJs
  • PostgreSQL
  • Redis
  • Typescript
  • GraphQL

También tengo planeado crear el frontend para manejo administrativo.

En este artículo vamos a empezar configurando el proyecto:

Empezamos creando una nueva aplicación: nest new {app_name} si no tienen instalado el CLI de nest pueden instalarlo con: npm i -g @nestjs/cli Es una gran herramienta para facilitar el desarrollo, cuenta con generadores para evitar escribir código repetitivo. Al correr el comando para crear una nueva aplicació nos va a preguntar que package manager queremos usar, yo voy a elegir yarn.

Instalemos los primero paquetes que vamos a usar:

yarn add @nestjs/config @nestjs/graphql @nestjs/apollo @nestjs/typeorm apollo-server-express graphql typeorm pg
Enter fullscreen mode Exit fullscreen mode

Para configurar GraphQL y TypeOrm tenemos que modificar nuestro archivo app.module.ts con:

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
    TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => ({
        url: configService.get('POSTGRES_URL'),
        // acá vamos a ir agregando las entidades que creemos-
        entities: [],
        type: 'postgres',
        synchronize: true,
      }),
    }),
    GraphQLModule.forRootAsync<ApolloDriverConfig>({
      driver: ApolloDriver,
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => ({
        playground: true,
        debug: true,
        autoSchemaFile: path.join(process.cwd(), 'src/graphql/schema.gql'),
      }),
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
Enter fullscreen mode Exit fullscreen mode

El primer modulo que importamos es ConfigModule para poder acceder à la información de archivos .env, y lo ponemos como global para poder usarlo sin tener que importarlo en otros modulos. Después vamos con TypeOrmModule para trabajar con la base de datos, syncronize: true es para que TypeOrm mantenga sincronizada la base de datos con las entidades que definimos en nuestro código, en producción esto no es recomendado y habría que utilizar migraciones.

Para trabajar con GraphQL vamos a usar el "Code-first approach", para eso configuramos la opción autoSchemaFile . Esto hace que nest genere el esquema de GraphQL automáticamente basándose en los decoradores que utilizamos en nuestras clases y sus propiedades.

Antes de poder correr nuestra aplicación tenemos que tener una base de datos a la cual acceder, para eso yo voy a usar Docker Compose, voy a agregar un archivo docker-compose.yml en el directorio base, y adentro de ese archivo:

version: '3'

services:
  postgres:
    image: postgres:14
    container_name: postgres_db
    restart: unless-stopped
    volumes:
      - ./postgres:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: postgres
      POSTGRES_PASSWORD: postgres
Enter fullscreen mode Exit fullscreen mode

En caso de que no sepan usar Docker Compose, pueden usar una instalación local de la base de datos.

Para crear nuestro primer Resolver usamos nest g resolver app --flat y agregamos:

import { Resolver, Query } from '@nestjs/graphql';

@Resolver()
export class AppResolver {
  @Query(() => String)
  hello() {
    return 'hello world';
  }
}
Enter fullscreen mode Exit fullscreen mode

Con todo esto ya podemos correr la aplicación con yarn start:dev y navegar a localhost:3000/graphql para ver el playground de GraphQL y probar nuestra query.

Graphql Playground

Pueden ver el código en este repositorio: nest-adventures

Eso es todo por ahora, en la siguiente parte vamos a agregar los productos y funcionalidades relacionadas a ellos.

Muchas gracias por leer. Este es el primer artículo que escribo, asi que cualquier comentario sobre como mejorar o si les gusto el contenido es altamente apreciado.

Top comments (0)