Skip to content

Commit

Permalink
docs: add more details to the doc
Browse files Browse the repository at this point in the history
Add more details to the doc

Signed-off-by: Hage Yaapa <hage.yaapa@in.ibm.com>
  • Loading branch information
Hage Yaapa committed Jun 28, 2019
1 parent 934894d commit 8f29afa
Showing 1 changed file with 59 additions and 0 deletions.
59 changes: 59 additions & 0 deletions README.md
Expand Up @@ -20,6 +20,65 @@ npm i
npm start
```

The main app will be running at `http://[::1]:3000`.

You will also see `Recommendation server is running at http://127.0.0.1:3001.`, it is the server to which
the `services/recommender.service` service will connect to get the recommendations for a user.

## Usage

This app is intended to be interacted with using the API Explorer located at http://[::1]:3000/explorer/.

## Models

This app has five models:

1. `User` - representing the users of the system
2. `Product` - a model which is mapped to a remote service by `services/recommender.service`
3. `ShoppingCartItem` - a model for representing purchases
4. `ShoppingCart` - a model to represent a user's shopping cart, can contain many items (`item`) of the type `ShoppingCartItem`
5. `Order` - a model to represent an order by user, can have many products (`products`) of the type `ShoppingCartItem`

`ShoppingCart` and `Order` are marked as belonging to the `User` model by the use of the `@belongsTo` model decorator. Correspondingly, the `User` model is marked as having many `Order`s using the `@hasMany` model decorator. Although possible, a `hasMany` relation for `User` to `ShoppingCart` has not be created in this particular app to limit the scope of the example.

## Controllers

Controllers expose API endpoints for interacting with the models and more.

In this app, there are four controllers:

1. `ping` - a simple controller to checking the status of the app
2. `user` - controller for creating user, fetching user info, updating user info, and logging in
3. `shopping-cart` - controller for creating, updating, deleting shopping carts, and getting the details about a shopping cart
4. `user-order` - controller for creating, updating, deleting orders, and getting the details about an order

## Services

Services are modular components that can be plugged into a LoopBack application in various locations to contribute
additional capabilities and features to the application.

This app has five services:

1. `services/hash.password.bcryptjs` - responsible for generating and comparing password hashes.
2. `services/jwt-service` - responsible for generating and verifying JSON Web Token.
3. `services/recommender.service` - responsible for connecting to a "remote" server and getting recommendations for a user. The API endpoint at `GET /users​/{userId}​/recommend`, is made possible by this service.
4. `services/user-service` - responsible for verifying if user exists and the submitted password matches that of the existing user.
5. `services/validator` - responsible for validating email and password when a new user is created.

## Login

The endpoint for logging in a user is a `POST` request to `/users/login`.

Once the credentials are extracted, the logging-in implementation at the controller level is just a four step process. This level of simplicity is made possible by the use of the `UserService` service provided by
`@loopback/authentication`.

1. `const user = await this.userService.verifyCredentials(credentials)` - verify the credentials
2. `const userProfile = this.userService.convertToUserProfile(user)` - generate user profile object
3. `const token = await this.jwtService.generateToken(userProfile)` - generate JWT based on the user profile object
4. `return {token}` - send the JWT

You can see the details in `packages/shopping/src/controllers/user.controller.ts`.

## Contributing

This project uses [DCO](https://developercertificate.org/). Be sure to sign off
Expand Down

0 comments on commit 8f29afa

Please sign in to comment.