This application, developed by Code for Charlotte, helps automate the CMPD Explorers Christmas Project.
Node 8 is required. We recommend at least Node 8.9.4. We also recommend using nvm to install and use the appropriate version of Node on a per-project basis but we do have it as a devDependency
to ease that burden.
You'll also need to use yarn instead of npm. Install it using npm install -g yarn
from the project directory (so it
gets installed for the appropriate Node version).
See Dependencies Documentation below for more information on the dependencies we use.
git clone https://github.com/CodeForCharlotte/cmpd-holiday-gift.git && cd cmpd-holiday-gift
nvm use
to ensure you're using the appropriate Node version for the project.yarn global add lerna
yarn bootstrap
to install the dependencies. This will take a few minutes and it may look like the command has locked up.env.example.js
to env.js
. You don't need to make any changes just yet.yarn start-client
to start the front-end in development mode. Access the application at http://localhost:3000.nvm use
if needed) run yarn start
to start the back-end in development mode. The back end runs on port 3001 and the development mode front-end server will act as a reverse proxy for it. If you get an error
saying you need to install sqlite3 manually, run yarn add sqlite3
.yarn seed
to generate sample data.
SEED_FIREBASE=true yarn seed
Read Front end development notes here.
Read Back end development notes here.
To access the PHP version of the project from 2016 you can run git checkout 1.3.2
. It's recommended to clone a separate copy of the repository for when you need to access the original application to research and port features.
When you pull changes to the database schema or sample data the application may stop working. When this occurs you need
to delete the SQLite database in run/
and restart your server instance. After restarting the server be sure to
seed the database using yarn run seed
. You should now be good to keep going!
To prepare the server for production, run yarn run build
.
Optionally run yarn prune --production
.
Start the production-mode server with NODE_ENV=production yarn run start-server
Static assets are in public/
. The react app is in src/
.
All front-end dependencies should be added using yarn install --save-dev
. They will be bundled into build/
in production mode.
The entire backend source is in server/
. The dependencies and
scripts are in package.json
. The logs, database and temporary test
files are placed in run/
.
Optionally, set up a mailtrap.io account if you are working on
emails. Put your account info in env.js
(see env.example.js
for an
example).
Seed database: yarn seed
Run tests: yarn test-server
Why we chose Node.js over PHP: https://medium.com/fuzz/php-a0d0b1d365d8
The default configuration is stored in server/config/env.default.js
.
The values can be overridden in server/env.js
. See server/env.example.js
for examples.
The tests ignore server/env.js
and use the values from server/config/env.default.js
instead.
Each file in server/models/
describes a different table.
The private: true
property prevents a field from being output as JSON in API responses.
The encrypt: true
property causes the field to be encrypted before storing it into the database.
Before pushing your code or sending a pull request, make sure the tests pass and let ESLint clean up your code.
yarn run test-client
yarn run test-server
yarn run lint
.The backend is an Express application running in Node. Some newer ES6 features are used.
Authentication is provided by express-jwt and node-jsonwebtoken. Passwords are encrypted using bcrypt.
Data is stored in an Sqlite database using the Sequelize ORM. Some of the fields are encrypted using sequelize-encrpyted.
Email is sent using nodemailer. Email templates are rendered with Mustache. For development, we use mailtrap.io to test sending emails.
The frontend is written with React. It is scaffolded using create-react-app. The theme is AdminLTE, based on Bootstrap 3. To use bootstrap components, use react-bootstrap. We're using styled-components for custom styles (in place of LESS / SCSS).
Back end tests are run using Jasmine.
Coding style is enforced by eslint.