- 📝 Requerimientos básicos
- 🛠️ Instalar dependencias
- ⚙️ Configuración
- 💻 Scripts
- 📚 Swagger
- 📤 Commits
- 😝 Mocks
- Node.js v10.15.3 or higher (Download)
- NPM v6.4.1 or higher
- Typescript
- Mock Json Server
Cuando tenemos los requisitos básicos, clonamos el repositorio, vamos a la carpeta del proyecto e instalamos sus dependencias.
npm install
Esta aplicación utiliza la dependencia de config para facilitar la configuración de las variables del entorno, lo que la hace escalable y robusta al desplegar la aplicación en diferentes entornos.
En el directorio ./config
se encuentra un archivo llamado development.json
que contiene la configuración para un
entorno local, mientras que el archivo custom-environment-variables.json
obtiene los valores por medio de los key
definidos en las variables de entorno que se configuran en el
el servidor.
Básicamente el archivo funciona como un objeto que se exporta y puede ser consumido invocándolo en el archivo que requiere utilizar la información cargada. Si se necesita añadir más datos para consumir, como la conexión a una base de datos, a una redis, la url de algún micro-servicio, API, etc. sólo hay que añadirlo en los archivos mencionados manteniendo el esquema.
{
"server": {
"port": 8080,
"context": "/api",
"origins": "http://localhost:3000,http://localhost:3001,http://localhost:8080",
"originsReadOnly": "http://localhost:3001",
"headersAllowed": "Content-Type,Authorization,Set-Cookie,Access-Control-Allow-Origin,Cache-Control,Pragma",
"methodsAllowed": "GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS",
"corsCredentials": "false",
"corsEnabled": "true",
"tz": "America/Argentina/Buenos_Aires",
"showLogInterceptor": "false",
"enabledLogs": "true"
},
"swagger": {
"path":'api-docs',
"enabled": "true"
},
"params": {
},
"services": {
}
}
🤓 Ver todas las propiedades de configuración disponibles en detalle.
port
: Es el puerto por el cual va a correr el servidor.
- Type:
Number
- Default:
8080
context
: Es el contexto el que se puede acceder a la API del servidor, de esta manera no se exponen los endpoints en
la ruta principal de la aplicación.
- Type:
String
- Default:
/api
origins
: Es una whitelist para que la aplicación sólo pueda ser consumida por urls confiables y evitar cualquier tipo
de solicitudes no deseadas y maliciosas. Debes escribir las urls separadas por una coma.
- Type:
String
- Default:
http://localhost:3000,http://localhost:3001,http://localhost:8080
originsReadOnly
: Es la configuración de las urls para CORS, lo que permite validar quién puede consumir el
servidor.
- Type:
String
- Default:
http://localhost:3001
headersAllowed
: Parámetros que va a recibir por el header en los request.
- Type:
String
Default: Content-Type,Authorization,Set-Cookie,Access-Control-Allow-Origin,Cache-Control,Pragma
methodsAllowed
: Métodos http disponibles para el cors
- Type:
String
- Default:
GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS
corsCredentials
: Habilita o deshabilita el uso de las credenciales en las peticiones CORS en el servidor.
- Type:
Boolean
- Default:
false
corsEnabled
: Habilita o deshabilita el uso de CORS en el servidor.
- Type:
Boolean
- Default:
false
tz
: Es la configuración de la zona horaria para el
servidor. Lista de zonas horarias
- Type:
String
- Default:
America/Argentina/Buenos_Aires
showLogInterceptor
: Habilita o deshabilita la visualización de los interceptors de los requests y responses por medio de logs.
- Type:
Boolean
- Default:
false
enabledLogs
: Habilita o deshabilita los logs de la aplicación.
- Type:
Boolean
- Default:
true
path
: Define la ruta de la documentación Swagger, se escribe sin el /
(slash).
- Type:
String
- Default:
api-docs
enabled
: Habilitar o deshabilitar la documentación Swagger de los endpoints del servidor.
- Type:
Boolean
- Default:
true
Configuración de parámetros a utilizar en la aplicación, manteniendo el esquema key:value
.
{
...
"params": {
"my-param": "<param-value>"
},
...
}
Es donde se va a colocar las urls de los micro-servicios a consumir, manteniendo el esquema key:value
.
{
...
"services": {
"my-microservice": "<url-my-microservice>"
},
...
}
Inicia la aplicación en modo desarrollo usando nodemon
y ts-node
para hacer hot reloading.
npm run dev
Ejecuta la aplicación mockeada.
npm run mock
Transpile la aplicación limpiando primero la carpeta de destino ./dist
.
npm run build
Inicia la aplicación de transpilada de la carpeta ./dist
, se requiere previamente haber realizado el build.
npm run start
Inicia la fake app para correr los unit test con Jest y retorna el coverage.
npm run test
El proyecto cuenta con un Swagger que tiene documentado los endpoints con sus definiciones.
Para documentar los nuevos endpoints, se debe completar con la información de los mismos con la anotación en YAML en
el archivo api-swagger.yaml
que está en el root del proyecto.
Esta documentación puede ser activada o desactivada desde el archivo de configuración o en las variables de entorno del proyecto.
// ./config/development.json
{
...
"swagger": {
"path": 'api-docs',
"enabled": "true"
},
...
}
// ENV
SWAGGER_PATH=api-docs
SWAGGER_ENABLED=true;
Acceso a la documentación y testeo de los endpoints: http://localhost:8080/api-docs
<http|https>://<server_url><:port>/<path>
Para los mensajes de commits se toma como referencia conventional commits
.
<type>[optional scope]: <description>
[optional body]
[optional footer]
- type: chore, docs, feat, fix, refactor (más comunes)
- scope: indica la página, componente, funcionalidad
- description: comienza en minúsculas y no debe superar los 72 caracteres.
Para generar el Mock del endpoint, hay que generar un archivo javascript dentro del directorio ./mock/api
correspondiente al endpoint.
El archivo del mock es un objeto json
exportado como modulo, el cual tiene que tener la definición de la ruta, el
método, el parámetro (en caso de que sea necesario), y la respuesta.
// ./mock/api/posts.js
module.exports = {
'/api/posts': {
get: [
{
userId: 1,
id: 1,
title:
'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',
body:
'quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto',
},
...{
userId: 1,
id: 2,
title: 'qui est esse',
body:
'est rerum tempore vitae sequi sint nihil reprehenderit dolor beatae ea dolores neque fugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis qui aperiam non debitis possimus qui neque nisi nulla',
},
],
post: {
userId: 1,
id: 1,
title:
'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',
body:
'quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto',
},
},
'/api/posts/:id': {
get: {
userId: 1,
id: 1,
title: 'eum et est occaecati',
body:
'ullam et saepe reiciendis voluptatem adipisci sit amet autem assumenda provident rerum culpa quis hic commodi nesciunt rem tenetur doloremque ipsam iure quis sunt voluptatem rerum illo velit',
},
},
};
Una vez generado el archivo con la definición del endpoint junto a su respuesta, hay que requerirlo en el
archivo routes.js
que se encuentra en ./mock/api
.
// ./mock/api/routes.js
const routes = {
...require('./posts'),
...
...require('./another-end-point'),
};
module.exports = routes;