Hapi + Swagger, GraphQL + JWT, MongoDB + Winston
Hapi Node server with
Swagger,
MongoDB database, and
GraphQL API with
Winston logs.
This backend application consists of 2 APIs.
- GraphQL API: JWT + Mongoose (Schemas: Painting, User)
- REST API: Express + Mongoose + Swagger (Controllers: Painting, HealthCheck)
Environment
Make sure to set the env variables. For local environment you can create a
.env file with the following environment variables:
APP_HOST=localhost
APP_PORT=4000
# dev | prod | qa
NODE_ENV=dev
# https://www.npmjs.com/package/jsonwebtoken
JWT_PRIVATE_KEY=your_own_secret_key
JWT_EXPIRY_TIME=24hAlso you may change the log level by setting the env variable LOG_LEVEL to the
available values error | warn | info | debug. By default LOG_LEVEL is set to
info.
đź’ˇ This application uses winston as
logging library with support for multiple transports. A transport is
essentially a storage device for your logs. Default transports areConsole
andDailyRotateFile
ESLint disables the use of console.* methods, use the following methods
instead:
logger.error('Message to the logger');
logger.warn('Message to the logger');
logger.info('Message to the logger');
logger.debug('Message to the logger');Prepare the app
After cloning the repository, run the following commands only once:
npm install
npm run prepareRunning the server
Just run the command
npm run mongod
npm run dev:serverSwagger
This project uses the
Hapi Swagger plugin that
generates API documentation following this approach: Document your API while
defining your routes. It adds a page on your website with the path
/documentation, where the full URL would be localhost:4000/documentation.
Alternatively, you can use
hapi-swaggered-ui which follows
the same approach, or if you want to create a custom documentation site, see
swagger-ui.
đź’ˇ Joi is recommended as a schema and
data validator for routes, and also works well together with «hapi-swaggered»
and «hapi-swagger».
Apollo GraphQL
The path that resolves Apollo queries is: /graphql. The following queries
require the Authorization header with a valid JWT token:
getPaintingsgetPaintingByIdcreatePaintingdeletePaintingeditPainting
You can generate a valid JWT token by executing the query login, and retrieve
the value from the property "jwtoken" in the response. See an example of
generating a valid token for an existing user here:
/user.auth.http
In the .http files that require Authorization you will see the @auth_token
variable which points to the environment JWT_AUTH_TOKEN, so you will need to
create that variable in your .env file in order to get those .http files
working properly.
# .env
JWT_AUTH_TOKEN=some_valid_token_generated_by_loginđź’ˇ When running in non-production environment, the /graphql and /sandbox
paths are enabled to run an
Apollo Sandbox
environment where we can now execute GraphQL queries on our own server.
- Default path: localhost:4000/sandbox
- Online Sandbox:
studio.apollographql.com/sandbox
⚠️ Running the local server requires docker, if docker has not been
configured, then follow next steps: docker 👇
Docker
MongoDB is loaded as a docker container, sou you need to make sure to create a
.env file with the following environment variables:
DB_ROOT_USERNAME=root
DB_ROOT_PASSWORD=root
DB_INIT_USERNAME=appuser
DB_INIT_PASSWORD=symfony
DB_NAME=vantage
DB_HOST=localhost
DB_PORT=27012
ME_PORT=3001In order to run MongoDB, you need to mount the docker container, and start the
mongod service. To do that just run the command:
npm run mongodAfter that, let's make sure the container is running:
docker ps -aYou should have a result like this:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db936f592d4d mongo:6.0.8 "docker-entrypoint.s…" 1 hour ago Up 2 minute 0.0.0.0:27012->27017/tcp mongodb_6
6f518f569c4b mongo-express "tini -- /docker-ent…" 1 hour ago Up 2 minutes 0.0.0.0:3001->8081/tcp mongo-expressTo open mongo-express, the
web-based MongoDB admin interface, go to the browser and navigate to
http://localhost:3001/, using credentials in the env variables
DB_INIT_USERNAME and DB_INIT_PASSWORD
If you want to open the terminal to run commands on the container, just run the
following command for the specific container:
docker exec -it mongodb_6 bash
root@mongodb_host:/#Standard-version
standard-version is a utility for versioning using semver and CHANGELOG
generation powered by Conventional Commits. You need to have a starting point to
append the CHANGELOG and other versions to. The first time simply run:
npm run release -- --first-releaseThen, for a new release, just run:
npm run release
⚠️ standard-version is deprecated. It is recommended to use an
alternative like
release-please.
For more details, please visit the Github site
standard-version
Husky
Husky supports all Git hooks. You can use
it to lint your commit messages, run tests, lint code, etc... when you commit or
push.
See more in the Github site: husky
Configure
To set up husky in a new project, follow these steps:
npm install husky -DEdit package.json > prepare script, and add as follow:
"prepare": "husky install"Then, run the command:
npm run prepareTo add a hook:
npx husky add .husky/pre-commit "eslint and prettier commands"
npx husky add .husky/post-commit "git update-index -g"
npx husky add .husky/commit-msg 'npx --no -- commitlint --edit ${1}'