Aventuras con NestJS: Construyendo una API. Parte 1
Tags: typescript, webdev, programming, devjournal
Published: 2022-08-23 00:47:56

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](https://docs.nestjs.com/) y los articulos de Marcin Wanago: [API with nestjs](https://wanago.io/courses/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:
```powershell
yarn add @nestjs/config @nestjs/graphql @nestjs/apollo @nestjs/typeorm apollo-server-express graphql typeorm pg
```

Para configurar GraphQL y TypeOrm tenemos que modificar nuestro archivo `app.module.ts` con:
```typescript
@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 {}
```

El primer modulo que importamos es [ConfigModule](https://docs.nestjs.com/techniques/configuration) 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](https://docs.nestjs.com/techniques/database) 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:
```yaml
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
```
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:
```typescript
import { Resolver, Query } from '@nestjs/graphql';

@Resolver()
export class AppResolver {
  @Query(() => String)
  hello() {
    return 'hello world';
  }
}
```

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dlgd4jw6twj2fdwlctzz.png)

Pueden ver el código en este repositorio: [nest-adventures](https://github.com/FranciscoMessina/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.