aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBobby <[email protected]>2022-04-30 23:20:29 -0400
committerBobby <[email protected]>2022-04-30 23:20:29 -0400
commit017e8b42d953136140e0ff6d12559b86d1a330d5 (patch)
tree48289c81f37c10a329aa50886980961060145e46
parent51e7b0e5912517eb8ee78f95029e948c73d69267 (diff)
downloadWelfare-Schemes-DMQL-017e8b42d953136140e0ff6d12559b86d1a330d5.tar.xz
Welfare-Schemes-DMQL-017e8b42d953136140e0ff6d12559b86d1a330d5.zip
user login api
-rw-r--r--interface/config/db.config.js9
-rw-r--r--interface/controllers/users.controller.js18
-rw-r--r--interface/functions/index.js5
-rw-r--r--interface/models/index.js2
-rw-r--r--interface/models/users.model.js20
-rw-r--r--interface/package-lock.json223
-rw-r--r--interface/package.json3
-rw-r--r--interface/routes/api/index.js80
-rw-r--r--interface/routes/index.js8
-rw-r--r--interface/views/partials/navbar.ejs40
10 files changed, 402 insertions, 6 deletions
diff --git a/interface/config/db.config.js b/interface/config/db.config.js
index 9118d6c..ea90d0c 100644
--- a/interface/config/db.config.js
+++ b/interface/config/db.config.js
@@ -1,14 +1,15 @@
+require('dotenv').config();
module.exports = {
// The name of the database
- database: 'WelfareSchemes',
+ database: process.env.DATABASE,
// The username used to connect to the database
- username: 'postgres',
+ username: process.env.USERNAME,
// The password used to connect to the database
- password: 'lucifer',
+ password: process.env.PASSWORD,
// The dialect of the database you are connecting to
dialect: 'postgres',
// The host of the database
- host: 'localhost',
+ host: process.env.HOST,
// The port of the database
port: 5432,
// Setup pool of connections to the database
diff --git a/interface/controllers/users.controller.js b/interface/controllers/users.controller.js
new file mode 100644
index 0000000..fff4469
--- /dev/null
+++ b/interface/controllers/users.controller.js
@@ -0,0 +1,18 @@
+const { users } = require("../models");
+const db = require("../models");
+const citizens = db.citizens;
+const op = db.Sequelize.Op;
+
+// Create a new user
+exports.create = (username, password) => {
+ return users.create({ username, password });
+}
+
+// Get a user by their username
+exports.findByUsername = (username) => {
+ return users.findOne({
+ where: {
+ username: username
+ }
+ });
+}
diff --git a/interface/functions/index.js b/interface/functions/index.js
new file mode 100644
index 0000000..034dc80
--- /dev/null
+++ b/interface/functions/index.js
@@ -0,0 +1,5 @@
+const jwt = require('jsonwebtoken');
+
+exports.verifyJWT = (jwtToken) => {
+ return jwt.verify(jwtToken, process.env.JWT_SECRET);
+}
diff --git a/interface/models/index.js b/interface/models/index.js
index 852fb65..e799e1e 100644
--- a/interface/models/index.js
+++ b/interface/models/index.js
@@ -18,7 +18,9 @@ const sequelize = new Sequelize(databaseConfig.database, databaseConfig.username
const db = {};
db.Sequelize = Sequelize;
db.sequelize = sequelize;
+db.users = require('./users.model')(Sequelize, sequelize);
db.citizens = require('./citizens.model.js')(Sequelize, sequelize);
db.village_master = require('./village_master.model.js')(Sequelize, sequelize);
+db.bank_master = require('./bank_master.model.js')(Sequelize, sequelize);
module.exports = db;
diff --git a/interface/models/users.model.js b/interface/models/users.model.js
new file mode 100644
index 0000000..df8b276
--- /dev/null
+++ b/interface/models/users.model.js
@@ -0,0 +1,20 @@
+module.exports = (Sequelize, sequelize) => {
+ const Users = sequelize.define("users", {
+ user_id: {
+ type: Sequelize.INTEGER,
+ allowNull: false,
+ primaryKey: true,
+ autoIncrement: true,
+ },
+ username: {
+ type: Sequelize.STRING(155),
+ allowNull: false,
+ unique: true,
+ },
+ password: {
+ type: Sequelize.STRING(155),
+ allowNull: false,
+ }
+ });
+ return Users;
+} \ No newline at end of file
diff --git a/interface/package-lock.json b/interface/package-lock.json
index e4be03a..2613ab1 100644
--- a/interface/package-lock.json
+++ b/interface/package-lock.json
@@ -9,10 +9,13 @@
"version": "1.0.0",
"license": "GPL-3.0-or-later",
"dependencies": {
+ "bcryptjs": "^2.4.3",
"body-parser": "^1.20.0",
"cors": "^2.8.5",
+ "dotenv": "^16.0.0",
"ejs": "^3.1.7",
"express": "^4.17.3",
+ "jsonwebtoken": "^8.5.1",
"pg": "^8.7.3",
"pg-hstore": "^2.3.4",
"sequelize": "^6.19.0"
@@ -143,6 +146,11 @@
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
+ "node_modules/bcryptjs": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
+ "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
+ },
"node_modules/binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
@@ -283,6 +291,11 @@
"node": ">=8"
}
},
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
+ },
"node_modules/buffer-writer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
@@ -585,6 +598,14 @@
"node": ">=8"
}
},
+ "node_modules/dotenv": {
+ "version": "16.0.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz",
+ "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/dottie": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz",
@@ -596,6 +617,14 @@
"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
"dev": true
},
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -1174,6 +1203,59 @@
"integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
"dev": true
},
+ "node_modules/jsonwebtoken": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+ "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+ "dependencies": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=4",
+ "npm": ">=1.4.28"
+ }
+ },
+ "node_modules/jsonwebtoken/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/jsonwebtoken/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "dependencies": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
"node_modules/keyv": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
@@ -1200,6 +1282,41 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
+ },
"node_modules/lowercase-keys": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
@@ -2499,6 +2616,11 @@
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
+ "bcryptjs": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
+ "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
+ },
"binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
@@ -2603,6 +2725,11 @@
"fill-range": "^7.0.1"
}
},
+ "buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
+ },
"buffer-writer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
@@ -2824,6 +2951,11 @@
"is-obj": "^2.0.0"
}
},
+ "dotenv": {
+ "version": "16.0.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz",
+ "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q=="
+ },
"dottie": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz",
@@ -2835,6 +2967,14 @@
"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
"dev": true
},
+ "ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -3275,6 +3415,54 @@
"integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
"dev": true
},
+ "jsonwebtoken": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+ "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+ "requires": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ }
+ }
+ },
+ "jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "requires": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
"keyv": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
@@ -3298,6 +3486,41 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
+ "lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
+ },
+ "lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
+ },
+ "lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
+ },
+ "lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+ },
+ "lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
+ },
+ "lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
+ },
"lowercase-keys": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
diff --git a/interface/package.json b/interface/package.json
index 87ca23a..d421c00 100644
--- a/interface/package.json
+++ b/interface/package.json
@@ -12,10 +12,13 @@
"author": "Kumar Priyansh <[email protected]>",
"license": "GPL-3.0-or-later",
"dependencies": {
+ "bcryptjs": "^2.4.3",
"body-parser": "^1.20.0",
"cors": "^2.8.5",
+ "dotenv": "^16.0.0",
"ejs": "^3.1.7",
"express": "^4.17.3",
+ "jsonwebtoken": "^8.5.1",
"pg": "^8.7.3",
"pg-hstore": "^2.3.4",
"sequelize": "^6.19.0"
diff --git a/interface/routes/api/index.js b/interface/routes/api/index.js
new file mode 100644
index 0000000..bad2706
--- /dev/null
+++ b/interface/routes/api/index.js
@@ -0,0 +1,80 @@
+// API for logging in
+const express = require("express");
+const router = express.Router();
+const jwt = require("jsonwebtoken");
+const bcyrpt = require("bcryptjs");
+const userController = require("../../controllers/users.controller");
+const { verifyJWT } = require("../../functions");
+
+router.get("/verify", (req, res) => {
+ // get token from auth header
+ console.log(req.headers)
+ const token = req.headers.authorization;
+ // verify token
+ const decoded = verifyJWT(token.replace("Bearer ", ""));
+ if (decoded) {
+ res.status(200).json({
+ message: "Token is valid",
+ decoded: decoded,
+ });
+ } else {
+ res.status(401).json({
+ message: "Token is invalid",
+ });
+ }
+});
+
+router.post("/create", (req, res) => {
+ const { username, password } = req.body;
+ const saltRounds = 10;
+ const hash = bcyrpt.hashSync(password, saltRounds);
+ userController.create(username, hash).then((user) => {
+ const token = jwt.sign({ id: user.id }, process.env.JWT_SECRET, {
+ expiresIn: "1h",
+ });
+ res.json({
+ token,
+ user,
+ });
+ });
+});
+
+router.post("/login", (req, res) => {
+ const { username, password } = req.body;
+ // get user by username
+ userController.findByUsername(username).then((user) => {
+ if (!user) {
+ return res.status(400).json({
+ message: "User not found",
+ });
+ }
+ // check if password is correct
+ bcyrpt.compare(password, user.password).then((isMatch) => {
+ if (!isMatch) {
+ return res.status(400).json({
+ message: "Invalid credentials",
+ });
+ }
+ // generate jwt
+ const payload = {
+ id: user.id,
+ username: user.username,
+ };
+ jwt.sign(
+ payload,
+ process.env.SECRET_KEY,
+ {
+ expiresIn: 3600,
+ },
+ (err, token) => {
+ if (err) throw err;
+ res.json({
+ token,
+ });
+ }
+ );
+ });
+ });
+});
+
+module.exports = router;
diff --git a/interface/routes/index.js b/interface/routes/index.js
index 17c2021..057e1df 100644
--- a/interface/routes/index.js
+++ b/interface/routes/index.js
@@ -1,14 +1,18 @@
const express = require("express");
const router = express.Router();
const citizensController = require("../controllers/citizens.controller");
+const api = require('./api');
-// Setup Hello World route
+// Setup api routes
+router.use('/api', api);
+
+// Setup main route
router.get("/", (req, res) => {
// Get the citizens from the database
citizensController.findXCitizens().then(citizens => {
res.render("index", {
citizens: citizens,
- title: "Hello World"
+ title: "Home"
});
});
});
diff --git a/interface/views/partials/navbar.ejs b/interface/views/partials/navbar.ejs
index 6a46ff3..2939438 100644
--- a/interface/views/partials/navbar.ejs
+++ b/interface/views/partials/navbar.ejs
@@ -42,7 +42,47 @@
</div>
</div>
</div>
+ <div class="right menu">
+ <div class="item">
+ <div class="ui icon input">
+ <input type="text" placeholder="Search...">
+ <i class="search link icon"></i>
+ </div>
+ </div>
+ <a class="ui item loginButton">
+ Log in
+ </a>
+ </div>
+</div>
+<div class="ui modal login">
+ <i class="close icon"></i>
+ <div class="header">
+ Log in to continue
+ </div>
+ <div class="ui padded container segment" style="border: none; box-shadow: none;">
+ <div class="ui form ">
+ <div class="field">
+ <label>Username</label>
+ <input type="text" placeholder="Username">
+ </div>
+ <div class="field">
+ <label>Password</label>
+ <input type="password" placeholder="Password">
+ </div>
+ </div>
+ </div>
+
+ <div class="actions">
+ <div class="ui black deny button">
+ Cancel
+ </div>
+ <div class="ui positive right labeled icon button">
+ Continue
+ <i class="checkmark icon"></i>
+ </div>
+ </div>
</div>
<script>
$(".ui.dropdown").dropdown();
+ $(".login.modal").modal("attach events", ".loginButton", "show");
</script>