From 0bc27bb4027af5be6b172aa43265c79a5e3859a8 Mon Sep 17 00:00:00 2001
From: abdullah Bin Zubair <abdullahzubair85@gmail.com>
Date: Tue, 31 Jan 2023 17:58:38 +0100
Subject: [PATCH] Create profile and fetch details

---
 config/default.json   |  3 +-
 middleware/auth.js    | 21 ++++++++++++++
 models/User.js        | 16 +++++++++++
 routes/api/auth.js    | 12 +++++++-
 routes/api/profile.js |  7 -----
 routes/api/user.js    | 66 +++++++++++++++++++++++++++++++++++++++++--
 server.js             |  5 ++--
 7 files changed, 117 insertions(+), 13 deletions(-)
 create mode 100644 middleware/auth.js
 delete mode 100644 routes/api/profile.js

diff --git a/config/default.json b/config/default.json
index 417984e..72a394d 100644
--- a/config/default.json
+++ b/config/default.json
@@ -1,3 +1,4 @@
 {
-    "mongooURI":"mongodb+srv://abz282:abz282_@devconnector.oiepthu.mongodb.net/?retryWrites=true&w=majority"
+    "mongooURI":"mongodb+srv://abz282:abz282_@devconnector.oiepthu.mongodb.net/?retryWrites=true&w=majority",
+    "jwtSecret":"mysecret"
 }
\ No newline at end of file
diff --git a/middleware/auth.js b/middleware/auth.js
new file mode 100644
index 0000000..5cfc239
--- /dev/null
+++ b/middleware/auth.js
@@ -0,0 +1,21 @@
+const jwt = require('jsonwebtoken');
+const config = require('config');
+
+module.exports = function(req, res, next){
+    
+    const token = req.header('x-auth-token');
+
+
+    if (!token){
+        return res.status(401).json({msg: 'No token, authorization denied'});
+    }
+
+    try{
+        const decoded = jwt.verify(token, config.get('jwtSecret'));
+
+        req.user = decoded.user;
+        next();
+    }catch(err) {
+        res.status(401).json({msg: 'Token is not valid '});
+    }
+}
\ No newline at end of file
diff --git a/models/User.js b/models/User.js
index 04cca20..f27d87e 100644
--- a/models/User.js
+++ b/models/User.js
@@ -9,6 +9,22 @@ const UserSchema = new mongoose.Schema({
         type: String,
         required: true
     },
+    password: {
+        type: String,
+        required: true
+    },
+    university:{
+        type: String,
+        required: true
+    },
+    highestEducation: {
+        type: String,
+        required: true
+    },
+    country: {
+        type: String,
+        required: true
+    },
     date: {
         type: Date,
         default: Date.now
diff --git a/routes/api/auth.js b/routes/api/auth.js
index 107a630..bf9065e 100644
--- a/routes/api/auth.js
+++ b/routes/api/auth.js
@@ -1,7 +1,17 @@
 const express = require('express');
 const router = express.Router();
+const auth = require('../../middleware/auth');
+const User = require('../../models/User');
 
 // route GET api/auth
-router.get('/', (req, res) => res.send('Auth route'));
+router.get('/', auth, async (req, res) => {
+    try{
+        const user = await User.findById(req.user.id).select('-password');
+        res.json(user);
+    } catch(err){
+        console.log(err);
+        res.status(500).send('Server Error');
+    }
+});
 
 module.exports = router;
\ No newline at end of file
diff --git a/routes/api/profile.js b/routes/api/profile.js
deleted file mode 100644
index e668935..0000000
--- a/routes/api/profile.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const express = require('express');
-const router = express.Router();
-
-// route GET api/profile
-router.get('/', (req, res) => res.send('Profile route'));
-
-module.exports = router;
\ No newline at end of file
diff --git a/routes/api/user.js b/routes/api/user.js
index a635736..5a7e505 100644
--- a/routes/api/user.js
+++ b/routes/api/user.js
@@ -1,8 +1,70 @@
 const express = require('express');
 const router = express.Router();
+const bcrypt = require('bcryptjs');
+const jwt = require('jsonwebtoken');
+const config = require('config')
+const {check, validationResult } = require('express-validator');
 
-// route GET api/users
-router.get('/', (req, res) => res.send('User route'));
+const User = require('../../models/User');
+
+
+// route POST api/users
+router.post('/', [
+    check('name', 'Name is required').not().isEmpty(),
+    check('email','Please enter a valid email').not().isEmpty(),
+    check('password','Enter a password with 5 or more characters').isLength({min:5}),
+    check('university', 'Enter univerity name').not().isEmpty(),
+    check('highestEducation', 'Enter highestEducation').not().isEmpty(),
+    check('country', 'Enter country').not().isEmpty(),
+
+], async (req, res) => {
+    const errors = validationResult(req);
+    if (!errors.isEmpty()){
+        return res.status(400).json({ errors: errors.array()});
+    }
+    const {name, email, password, university,
+        highestEducation,
+        country} = req.body;
+
+    try{
+
+        let user = await User.findOne({email});
+        if (user){
+            res.send(400).json({error: [{msg: 'User already exist'}]});
+        }
+
+        user = new User({
+            name,
+            email,
+            password,
+            university,
+            highestEducation,
+            country
+        });
+
+        const salt = await bcrypt.genSalt(10);
+        
+        user.password = await bcrypt.hash(password, salt);
+        await user.save();
+
+        const payload = {
+            user:{
+                id: user.id
+            }
+        }
+
+        jwt.sign(payload, config.get('jwtSecret'), {expiresIn:300000},
+            (err, token) => {
+                if (err) throw err;
+                res.json(token);
+            }
+        );
+
+    }catch(err){
+        console.error(err.message);
+        res.status(500).send('Server Error');
+    }
+});
 
 
 module.exports = router;
\ No newline at end of file
diff --git a/server.js b/server.js
index 3b4c2dc..33ce25e 100644
--- a/server.js
+++ b/server.js
@@ -7,9 +7,10 @@ connectDB();
 app.get('/', (req, res) => res.send('Api Running'));
 
 
-//Define Routes
+app.use(express.json({extended : false}));
+
+//Defined Routes
 app.use('/api/users', require('./routes/api/user'));
-app.use('/api/profile',require('./routes/api/profile'));
 app.use('/api/auth',require('./routes/api/auth'));
 
 const PORT =  5000;
-- 
GitLab