This boilerplate is meant to be used with Hapify. To get more info about Hapify setup, please refer to https://www.hapify.io/get-started.
This boilerplate provides an API built with HapiJS, MongoDB and Docker.
- Option 1: Clone and configure this boilerplate using command
hpf new --boilerplate hapijs_tractr
. - Option 2: You can clone this repository and change the project id in file
hapify.json
by running commandhpf use
.
Then you need to generate code from your Hapify project using hpf generate
.
.gitignore
. You should edit this file and remove the last lines before committing.
This API should be used with docker and docker-compose.
Run installation scripts to create MongoDB indexes, S3 bucket and insert an admin:
docker-compose run --rm api npm install
docker-compose run --rm api npm run cmd setup
docker-compose run --rm api npm run cmd insert-admin
Or run all in one command:
docker-compose run --rm api bash -c "npm install && npm run cmd setup && npm run cmd insert-admin"
The login and password of the admin user is defined in file cmd/insert-admin/admin.js
([email protected]
/ admin
).
To start the API, run this command
docker-compose up api
Now the API is available on http://localhost:3000
.
To insert randomized data into the database, run this command
docker-compose run --rm api npm run cmd populate
This boilerplate can be used with those front-end boilerplates:
If you need to update you data models and re-generate code (using Hapify, you should:
-
- Run this command
docker-compose run --rm api npm run cmd setup
to update the MongoDb indexes.
- Run this command
-
- Restart the API.
Please refer to Hapify Best Practices to learn more about Git patches within Hapify Context.
Once the API is started, you can access http://localhost:3000/docs to browse the documentation.
This boilerplate includes the following modules
- user sessions (sessions are stored in Redis)
- users accesses management
- file storage with S3 (Minio for local)
- email sender via Mailjet
- geo-coding and reverse geo-coding service
This boilerplate interprets Hapify data-models fields properties as described bellow:
- Primary: Represent the MongoDB Id.
- Unique: Creates an unique index for MongoDB and throw a 409 in case of conflict.
- Label: Creates a text index for MongoDB and allow partial match search for this field.
- Nullable: Allow null to be send for POST and PATCH endpoints.
- Multiple: Only used for entity relation for One-to-Many relation. If also searchable, it performs search using operator
$all
. - Embedded: Only used for entity relation. It joins related entities in search results. Related entities are always joined in a read response.
- Searchable: Allows this field in query params for search and count endpoints. If the field is also a
DateTime
or aNumber
, it addsmin
andmax
query params. It also creates an index for MongoDB. - Sortable: allows this field's name as value in the query param
_sort
of the endpoint search. Also create an index for MongoDB. - Hidden: Adds projection when getting the data from MongoDB to remove this field. On create route, it deletes the fields before returning the response.
- Internal: This field won't be allowed in POST and PATCH endpoints. It tries to guess a suitable value for this field. You may need to edit this default value after code generation.
- Restricted: This field is allowed in POST and PATCH endpoints only for admins. An admin is a user with the field
role='admin'
. - Ownership: This field is used to allow the request when the access of the action is made by an
owner
. The value of the field is compared to the connected user id. For search and count endpoints, if also searchable, it forces to perform the lookup in the owner's documents.