Learning JWT Part 3 - Setup controllers, model and signup first user
===

---
###### tags: `JWT`
### MVC - Controllers
Why do we need a controller? It Contains logic that updates the model and/or view in response to input from the users of the app and the core of receiving request/response.
Before we seperate our callback function from router, it would like code below.
```javascript=
const { Router } = require("express");
const router = Router();
// Create routes here
router.get("/signup", (req, res) => {...});
router.post("/signup", (req, res) => {...});
router.get("/login", (req, res) => {...});
router.post("/login", (req, res) => {...});
module.exports = router;
```
Let's create a folder called **controllers**, inside folder, create a file called **authControllers.js**, migrate callback functions from **authRoutes.js** to here, then we can import them in **authRoutes.js**
```javascript=
// authControllers.js
module.exports.signp_get = (req, res) => {
res.render("signup");
}
module.exports.login_get = (req, res) => {
res.render("login");
}
module.exports.signp_get = (req, res) => {
res.render("signup");
}
module.exports.signup_post = (req, res) => {
res.render("Create a user");
}
module.exports.login_post = (req, res) => {
res.render("Login a user");
}
```
Import these controllers.
```javascript=
// authRoutes.js
const { Router } = require("express");
const authController = require("../controllers/authController");
const router = Router();
// Create routes here
// Since we import authController, after typing authController with dot notation,
// you can see the controllers list out automatically we have defined earlier.
router.get("/signup", authController.signup_get);
router.post("/signup", authController.signup_post);
router.get("/login", authController.login_get);
router.post("/login", authController.login_post);
module.exports = router;
```

---
### MVC - Model
The model defines what data the app should contain. For example, in this small project, we will need to store user data in MongoDB, so let's create a **User** model.
Here we use [mongoose](https://mongoosejs.com/docs/guide.html) to connect MongoDB.
#### Mongoose core concept
- **Schema**: Each schema maps to a MongoDB collection and defines the shape of the documents within that collection.
- i.e. An **Users** collection in MongoDB.
- We need to define what kind of information (data) that we want to store in **Users** collection.
- Below we have created a schema that describe the shape of the documents **(User)** within the collection **(Users)**
```javascript=
// User.js
const mongoose = require("mongoose");
const userSchema = new mongoose.Schema({
email: {
type: String,
required: true,
unique: true,
lowercase: true,
},
password: {
type: String,
required: true,
minlength: 6
}
});
// Define an user model with this mongoose instance
const User = mongoose.model("user", userSchema);
```
> [Mongoose.prototype.model()](https://mongoosejs.com/docs/api.html#mongoose_Mongoose-model)
---
### Create first user
Here we are going to use **User** schema to simulate signing up.
First of all, we need to change code in **authController.js**
```javascript
const User = require("../models/User");
module.export.signp_post = async (req, res) => {
// The format would be application/json
const { email, password } = req.body;
try {
// Properties passed here must be matched in the User schema
const user = await User.create({ email, password });
res.status(201).json(user);
} catch(error) {
console.log(error);
res.status(400).json("Failed to create an user")
}
}
```
Let's test by using [Postman](https://www.postman.com/).
- Click **+** to create a new request.
- Select **Post**
- Enter URL: **http://localhost:3000/signup** (Replace port if you'r node is not listening to 3000).
- Select **Body**, **raw** and select **JSON**.
```json
{
"email": "test@gmail.com",
"password": "123456"
}
```
Send the request, then you should be able to see the result.

Go to MongoDB to check if user data has sent to DB.

---