Montar una api postgres y graphql con strapi.

December 13, 2020 • ☕️ 6 minutos de lectura

Strapi

Instalar CLI strapi

Documentación de la CLI para obtener más información.

Instalar Strapi

Podemos hacerlo con el cli o usando npx
npx create-strapi-app nombre-de-nuestro-proyecto o create-strapi-app nombre-de-nuestro-proyecto

Si queremos una configuración rápida, podemos usar el flag --quickstart para crear un proyecto Strapi localmente, usando la base de datos SQLite.

Opciones de instalación strapi

Con esto ya tendremos nuestro proyecto strapi creado y podremos empezar a trabajar.

Iniciamos el proyecto con
yarn develop

Primeros pasos

Una vez creado nuestro proyecto, nos pedirá que crearemos usuario admin.

Nos logeamos con el usuario creado desde http://localhost:1337/admin/

Content Type

Lo primero que haremos será crear nuestro primer Content Type.

Content Type, vendría a ser una tabla de mysql o una colección de nosql.

Content type

Por defecto, vienen varios creados User, Role, Permission, ahora vamos a crear el nuestro, por ejemplo Events.

Crear nuestro content type

Ahora le añadimos los campos que creamos necesarios.
Crear nuestro content type

Gardamos los cambios y por “brujería”, nos lo creará todo, en el directorio /api/

Permisos de lectura

Ahora tendremos que darle permisos públicos para poder hacer nuestras peticiones. Vamos a darle a find y findOne.

http://localhost:1337/admin/settings/users-permissions/roles

Dar permisos

Relaciones

Como vimos en la imagen anterior, podemos crear relaciomes.

Estructura de archivos

De forma predeterminada, la estructura de su proyecto se verá así:

  • /.cache: contiene archivos usados ​​para construir su panel de administración.
  • /admin: contiene sus archivos de personalización de administrador.
  • /api: contiene la lógica empresarial de su proyecto dividida en subcarpetas por API.

    • **
    • /config: Contiene configuraciones de la API ( routes, policies, etc.).
    • /controllers: contiene los controladores personalizados de la API.
    • /models: contiene los modelos de la API.
    • /services: contiene los servicios personalizados de la API.
  • /build: contiene la compilación de la interfaz de usuario del panel de administración.
  • /config

    • /functions: contiene el ciclo de vida o funciones genéricas del proyecto.
    • /responses: contiene respuestas personalizadas.

      • 404.js: contiene una plantilla para construir su mensaje 404 personalizado.
    • bootstrap.js: contiene el código ejecutado al inicio de la aplicación.
    • cron.js: contiene las tareas cron.
    • server.js: contiene las configuraciones generales del proyecto.
    • database.js: contiene las configuraciones de la base de datos del proyecto.
  • /extensions: contiene los archivos para ampliar los complementos instalados.
  • /hooks: contiene los ganchos personalizados del proyecto.
  • /middlewares: contiene los middlewares personalizados del proyecto.
  • /plugins: contiene sus complementos locales.
  • /public: contiene los archivos accesibles al mundo exterior.

Una vez instalado nuestro proyecto nos pedirá que creemos un usuario admin.

Instalar graphql

yarn strapi install graphql
Reiniciamos el servidor y listo, ya podemos acceder a graphql desde http://localhost:1337/graphql

Consulta graphql

Deploy with docker (local)

Para desplegar postgres de manera local, usaremos docker compose.

# docker-compose.yml
version: "3"
services:
  database:
    image: "postgres"
    ports:
      - "5432:5432"
    env_file:
      - database.env 
    volumes:
      - database-data:/var/lib/postgresql/data/
volumes:
  database-data: 
# database.env
POSTGRES_USER=test
POSTGRES_PASSWORD=test123
POSTGRES_DB=test_db

Levantamos el servicio de postgres con docker compose
docker-compose up

Apagar todos los servicios que arrancó docker compose
docker-compose down

Si queremos acceder a la shell, por ejemplo para trastear un psql, podemos usar el siguiente comando
docker-compose run database bash

Para decirle a Docker-Compose que destruya el volumen y sus datos, debemos ejecutar
docker-compose down --volumes

Si queremos que la información se guarde en un directorio específico, podemos definier los volumenes en un directorio local. Así será más fácil acceder a ella.

# docker-compose.yml 
servicios: 
  base de datos: 
    ... 
    volúmenes: 
      - ./directorio-local/:/var/lib/postgresql/data/

Deploy en Heroku

Primero instalamos Heroku
brew tap heroku/brew && brew install heroku

Ahora iniciamos sesión en Heroku
heroku login

Creamos nuestro proyecto en heroku
heroku create your-heroku-app-name

Esto nos devolverá
https://your-heroku-app-name.herokuapp.com/ | https://git.heroku.com/your-heroku-app-name.git

NOTA
Si ya ha creado una aplicación de proyecto Heroku. Utilizaría el siguiente paso para inicializar su carpeta de proyecto local: heroku git:remote -a your-heroku-app-name

Heroku Postgres
Para usar Postgres en Heroku, debemos instalar el siguiente complemento
heroku addons:create heroku-postgresql:hobby-dev

Acceder a las credenciales
heroku config

Que nos devolverá

DATABASE_URL: postgres://nmfpcmmagngavg:98ec4edcfdbd7bc629b6e2d1758ce951ed383bdcc55625485b37ea6c124bdc49@ec2-3-216-89-250.compute-1.amazonaws.com:5432/d7isuq5bebp0bf

Ahora utilizaremos pg-connection-string para deconstruir las variables de entorno.
yarn add pg-connection-string

Creamos el fichero de configuración ./config/env/production/database.js

const parse = require('pg-connection-string').parse;
const config = parse(process.env.DATABASE_URL);

module.exports = ({ env }) => ({
  defaultConnection: 'default',
  connections: {
    default: {
      connector: 'bookshelf',
      settings: {
        client: 'postgres',
        host: config.host,
        port: config.port,
        database: config.database,
        username: config.user,
        password: config.password,
      },
      options: {
        ssl: false,
      },
    },
  },
});

Modo producción:
heroku config:set NODE_ENV=production

NOTA
Si no hubiésemos instalado heroku con Postgres en la instalación, debemos instalar el siguiente paquete:
npm install pg --save

Deploy
git push heroku master

Abrir
heroku open

Si ya tuviésemos un proyecto git, debemos añadir
heroku git:remote -a your-heroku-app-name

Si queremos descargar nuestro proyecto podemos usar:
strapi-test-postgres

Configuración avanzada

Controladores

https://strapi.io/documentation/3.0.0-beta.x/concepts/controllers.html
Cada vez que creamos un Content Type, por defecto strapi nos crea un Controller, aunque nosotros podemos crear nuestros propios controller e incluso darle una nueva funcionalidad a los que ya existen. ./api/**/controllers/nombre-controlador.js

Servicios

https://strapi.io/documentation/v3.x/concepts/services.html#custom-services

Rutas

Podemos crear rutas personalizadas desde el fichero ./api/hello/config/routes.json

Si queremos añadir una ruta personalizada, podemos añadir esto…

{
  "routes": [
    {
      "method": "GET",
      "path": "/hello",
      "handler": "Hello.index",
      "config": {
        "policies": []
      }
    }
  ]
}

./api/hello/controllers/Hello.js

module.exports = {
  // GET /hello
  async index(ctx) {
    return 'Hello World!';
  },
};

NOTA
Un controlador de ruta solo puede acceder a los controladores definidos en las ./api/**/controllerscarpetas.

Queries

https://strapi.io/documentation/v3.x/concepts/queries.html

Tareras Programadas

module.exports = {
  '*/1 * * * *': () => {
    console.log('1 minute later');
  },
};

Bootstrap

Si queremos que al iniciar el servidor se ejecute algún código, el sitio para hacerlo es ./config/functions/bootstrap.js

Alguno de los usos más comunes suelen ser:

  • Cree un usuario administrador si no hay uno.
  • Llene la base de datos con algunos datos necesarios.
  • Cargue algunas variables de entorno.