The frontend was added from a bootstrapped React project Create React App, then ejected and customized. The backend was added from a bootstrapped Express project Express Generator
After creation, your project should look like this:
app/
config/
migrations/
scripts/
src-client/
src-server/
package.json
README.md
.env.example
Before installing, please make sure to have global installations of
- node v8 or higher
- npm v5 or higher
- PostgreSQL (if running a local DB instance)
- Execute
npm install
to configure the local environment. - Create
.env
file and define environmental variables (see.env.example
for example) - Perform DB initialization/migration and seeding
npm run seed
- Start the development server
npm run dev
- Build the production version
npm run build
This application uses npm scripts for testing, development, and deployment. Note that the pre-commit hook runs the build script which compiles FE and lints BE code.
$ npm run start
: run the production version of the app$ npm run build
: build the production bundle of the FE app (linting is automatically executed), and perform linting of the BE code$ npm run lint
: perform linting of the BE code$ npm run seed
: perform DB initialization/migration and seeding$ npm run dev
: run the development version of the app$ npm run test:client
: run FE tests using Jest$ npm run test:server
: run BE tests using Jest
$ npm run client:dev
: run Webpack dev server for FE development$ npm run server:dev
: run the development version of BE$ npm run server:prod
: alias ofstart
$ npm run pg-migrate
: alias ofnode-pg-migrate
module$ npm run db:migrate
: run DB migration scripts$ npm run db:seed
: alias ofseed
This project uses JWT for authentication.
This endpoint authenticates a user. An example of the payload (input data) is provided below:
body: {
email : String, /* required */
password: String, /* required */
}
The output returns JWT token and user object:
let response = {
statusCode: 200,
body: {
token : String,
user : Object,
}
}
This endpoint registers a new user. An example of the payload (input data) is provided below:
body: {
email : String, /* required */
firstName: String, /* required */
lastName : String, /* required */
password : String, /* required */
}
The output is the same as from POST /auth/login
This endpoint returns the User object associated with the currently authenticated user. No input data is required The output is provided is an object with the following structure:
let response = {
statusCode: 200,
body: {
id : Number,
email : String,
firstName: String,
lastName : String,
createdAt: Date,
}
}
Email: [email protected]
Password: password
This endpoint creates a new Post with current user as author. An example of the payload (input data) is provided below:
body: {
content: Text, /* required */
title : String /* required */
}
The output echos back the provided data with the system-generated record ID:
let response = {
statusCode: 200,
body: {
id : Number,
content: Text,
title : String,
user_id: Number,
}
}
This endpoint returns the complete set of available Posts. No input data is required The output is provided in array with each object having the structure described above:
let response = {
statusCode: 200,
body: [
Post1,
Post2,
...
PostN
]
}
This endpoint returns an individual Post by ID. The ID is provided as a URI parameter.
The output is the same as from POST /api/posts
This endpoint updates an existing Post by ID. The input/output formats are the same as in POST /api/posts
This endpoint deletes an individual Post by ID. The ID is provided as a URI parameter.