Bloom Backend Services
This package is a NestJS application that provides a core set of backend services via REST API endpoints to apps using the Bloom Housing framework. Information is stored in a Postgres database, accessed via TypeORM.
OpenAPI Documentation
OpenAPI (fka Swagger) documentation is automatically generated by the server at http://localhost:3100/docs/
for a standard local development environment. A raw JSON version of the schema is also available at /docs-json/
, suitable for API client code generation or other code-based consumers.
Getting Started
- Install Node.js 14.x
brew install node@14.
- Install Postgres 12
brew install postgresql
- Install Redis
brew install redis
- Copy the
.env.template
within backend/core
to .env
and edit variables appropriate to your local environment. Ensure sure the Database URL and Test Database URL match your Postgres configuration. - Install dependencies
yarn install
within backend/core
Redis
To start Redis:
redis-server
.
To launch Redis as background service and restart at login:
brew services start redis
.
Test if Redis is working:
redis-cli ping
Seeding the Database
There are two databases used in this project: bloom
and bloom_test
. The first is used every time you are starting a project with yarn dev
and second one is only used in end-to-end tests. Corresponding TypeORM configs are defined in ormconfig.ts
and ormconfig.test.ts
.
If you are just starting to work with the projects it's best to simply run:
yarn && yarn db:reseed
which will create the bloom
DB for you, migrate it to the latest schema, and seed with appropriate dev data. If running the reseed command requires that you input a password for Postgres, set the following environment variables: PGUSER
to postgres and PGPASSWORD
to the default password you inputted for the postgres user during Postgres installation. If you get the FATAL: database "<user>" does not exist
error please run: createdb <user>
first.
Dropping the DB:
yarn db:drop
Creating the DB:
yarn db:create
Seeding the DB:
yarn db:seed
Generating a new migration:
yarn db:migration:generate
Applying migrations:
yarn db:migration:run
Running Tests
End-to-end tests:
yarn test:e2e:local
Unit tests:
yarn test
Translations
The backend keeps translations for email related content in the DB in the translations
table.
The /translations
endpoint exposes CRUD operations on this table (admin only).
Translations are defined for each county code and language pair e.g. (Alameda, en). To modify a particular
translation pair:
- Fetch
GET /translations
and list all the translations - Find an ID of a pair that interest you
- Use
PUT /translations/:translationId
to modify it's content
Environment Variables
Name | Description | Default | Type |
---|
PORT | Port number the server will listen to for incoming connections | 3100 | number |
NODE_ENV | Controls build optimization and enables some additional logging when set to development | development | "development" | "production" |
DATABASE_URL | Database connection | postgres://localhost/bloom | string |
TEST_DATABASE_URL | Test database connection | postgres://localhost/bloom_test | string |
REDIS_TLS_URL | Secure Redis connection | rediss://127.0.0.1:6379/ | string |
REDIS_URL | TCP Redis connection string | redis://127.0.0.1:6379/0 | string |
REDIS_USE_TLS | Flag controlling the use of TLS or unsecure transport for Redis | 0 | 0 | 1 |
THROTTLE_TTL | Rate limit TTL in seconds (currently used only for application submission endpoint) | 60 | number |
THROTTLE_LIMIT | Max number of operations in given time window THROTTLE_TTL after which HTTP 429 Too Many Requests will be returned by the server | 2 | number |
EMAIL_API_KEY | Sendgrid API key (see sendgrid docs for creating API keys | Available internally | string |
EMAIL_FROM_ADDRESS | Controls "from" field of all the emails sent by the process | 'Bloom Dev Housing Portal bloom-no-reply@exygy.dev' | string |
APP_SECRET | Secret used for signing JWT tokens (generate it with e.g. openssl rand -hex 48 ) | Available internally | string |
PARTNERS_PORTAL_URL | URL for partners site | http://localhost:3001 | string |