This is the monorepo for all recipe.report packages.
Written using Node.js/Express.js/Inversify.js/TypeScript, following the Domain-Driven Design approach.
The API server is broken up into a multilayered architechture that implements a service/repository pattern. The API layer, the service layer, the business/domain layer, and the data access layer (repositories implemented through the unit-of-work pattern).
Data is persisted using PostgreSQL, without an ORM. Connection to the database is made through the pg library, and all access to data happens via parameterized stored functions. The database owner and the database app user are separate, with proper access levels.
The following environment variables (showing development values here) provide an example of the environment variables required in production. Environment variables may be set in the /etc/environment
file on a Linux host system:
export NODE_ENV="development"
export RR_PORT="1138"
export RR_CRYPTO_KEY="MqSm0P5dMgFSZhEBKpCv4dVKgDrsgrmT"
export RR_CRYPTO_ALGO="aes-256-cbc"
export RR_CRYPTO_IV_LENGTH="16"
export RR_JWT_SECRET="devTestEnvironment"
export RRDB_USER="dbuser"
export RRDB_OWNER="dbowner"
export RRDB_HOST="localhost"
export RRDB_DATABASE="recipedb"
export RRDB_PASSWORD="dbpass"
export RRDB_PORT="15432"
export RRDB_URL="jdbc:postgresql:https://localhost:15432/recipedb"
export RRDB_MIGRATIONS="filesystem:./migrations"
export RR_LOG_TARGETS="trace.log+%json,stdout:warn%simple"
Prepare the development database, install dependencies, and then start the API server.
Prepare a development copy of the Recipe.Report database.
HashiCorp Vagrant is used to make setting up a development database quick and easy. Download and install Vagrant. Vagrant relies on "providers" such as VirtualBox, VMware, or HyperV, so install one of those.
From the data package directory (recipe-report/packages/data/), run the vagrant up
command to create and configure a Vagrant VM running PostgreSQL. Once the development database is running, run the npm run flyway
command to download Flyway. Next, run the npm run migrate
command to apply database migrations.
cd ~/recipe-report/packages/data
vagrant up
npm run flyway
npm run migrate
The Recipe.Report packages are organized into a monorepo. Install dependencies from the root directory (~/recipe-report/). Node.js and npm must be installed installed before running this command.
cd ~/recipe-report
npm install
Run these commands from the api package directory (~/recipe-report/packages/api/).
Run the npm run prettier
command to format the source code using the Prettier opinionated styling. Run the npm run linter
command to identify and report ESLint code pattern findings. These can also be run automatically as IDE extensions.
Run the npm run updates
command to check for dependency updates.
cd ~/recipe-report/packages/api
npm run prettier
npm run linter
npm run updates
Run these commands from the api package directory (~/recipe-report/packages/api/).
When you're ready to see it in action, run the npm run develop
command to start the Recipe.Report API Server in development mode. This will run both the npm run build
command to compile the TypeScript into plain JavaScript, and the npm run start
command to run that compiled JavaScript.
npm run develop
Users can register, activate, and then access the application. Users are linked to accounts with roles.
In the rr.users_to_roles
table, a record links a user, a role, and an account.
User passwords must pass minimum complexity according to zxcvbn.
Accounts have a primary user contact, in addition to users who are linked to accounts with roles.
Most data, such as Recipes, belong to accounts.
Roles establish a level of access to an account.
Example roles:
Name | Description | Level |
---|---|---|
Kitchen Porter | Basic food preparation (newbie) | 1 |
Commis Chef | Absorbing food knowledge (beginner) | 2 |
Chef de Partie | Cooking the food (intermediate) | 3 |
Sous Chef | In charge of the food (experienced) | 4 |
Chef de Cuisine | Control all aspects of the food (expert) | 5 |
Executive Chef | Manage the kitchen and staff (admin) | 6 |
Features are accessible to users based on account roles. For example, all users with any role/level for an account can access the recipe list feature for that account. Other features might only be accessible by users with a role/level 3 and above for an account, or only by level 6, etc.
Instructions for setting up a production environment for the Recipe.Report API are outside of the scope of this readme document. Currently the production API instance runs Debian Linux, uses Uncomplicated Firewall, uses Nginx as a reverse proxy, and manages the Node.js process for the API using the PM2 process manager. Domain DNS is pointed to Cloudflare and Nginx is configured to require authenticated origin pulls. Deployments happen through GitHub Actions.
Written using Node.js/React/Redux/Thunk/TypeScript, using React Hooks.
You can find information on how to use TypeScript with Redux Toolkit.
Install dependencies, and then start the React development server.
The Recipe.Report packages are organized into a monorepo. Install dependencies from the root directory (~/recipe-report/).
cd ~/recipe-report
npm install
Run these commands from the react-app package directory (~/recipe-report/packages/react-app/).
Run the npm run prettier
command to format the source code using the Prettier opinionated styling. Run the npm run linter
command to identify and report ESLint code pattern findings. These can also be run automatically as IDE extensions.
Run the npm run updates
command to check for dependency updates.
cd ~/recipe-report/packages/react-app
npm run prettier
npm run linter
npm run updates
Run these commands from the react-app package directory (~/recipe-report/packages/react-app/).
When you're ready to see it in action, run the npm run develop
command to start the Recipe.Report React app in development mode. This will run the npm run build
command which runs both the less-watch-compiler
command and the react-scripts start
command,
cd ~/recipe-report/packages/react-app
npm run develop
In the browser, install the React Developer Tools extension. Firefox. Chrome. Edge.
Once that is installed, you can view the Redux store while debugging in the browser inspector.
First, select a component in the React developer tools Components tab, and then go to the browser console and type $r
to access the instance of that React component. To see that component's Redux store try $r.props.store.getState()
.
There is also Profiler tab to assist with optimizing performance.
Instructions for setting up a production environment for the Recipe.Report React app are outside of the scope of this readme document. Currently the production React app instance runs Debian Linux, uses Uncomplicated Firewall, and uses Nginx as a web server. DNS is pointed to Cloudflare and Nginx is configured to require authenticated origin pulls. Deployments happen through GitHub Actions.
Run the npm t
command to run Jest unit tests and create test coverage reports.