diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/app/controllers/default-controller.js b/app/controllers/default-controller.js deleted file mode 100644 index 1865efb..0000000 --- a/app/controllers/default-controller.js +++ /dev/null @@ -1,7 +0,0 @@ -const signale = require('signale') -const schema = require('../models/defaultSchema.js') - - -exports.dosomething = (req,res) => { - -} diff --git a/app/controllers/user-controller.js b/app/controllers/user-controller.js new file mode 100644 index 0000000..a0b45d6 --- /dev/null +++ b/app/controllers/user-controller.js @@ -0,0 +1,46 @@ +const signale = require('signale') +const config = require('../../config/config.js'); +const schema = require('../models/defaultSchema.js') +const _USERNAME = config.auth.name +const _PASSWORD = config.auth.password +var upload = require('../../config/upload.js'); + + +exports.renderLoginForm = (req,res) => { + res.render('login'); +} + +exports.renderRegisterForm = (req,res) => { + res.render('register'); +} +//matching login credentials to create a new session +exports.validateLogin = (req, res) => { + //checking for missing inputs + if (!req.body.username || !req.body.password) { + return res.redirect('/user/login') + } + // no missing inputs, go for further validations + let username = req.body.username + let password = req.body.password + // wrong credentials + if(username !== _USERNAME || password !== _PASSWORD ){ + return res.redirect('/user/login') + } + //correct credentials, create session + req.session.user = { + name:_USERNAME, + password:_PASSWORD + } + return res.redirect(`/user/${_USERNAME}/register`) +} + +exports.registerUser = (req,res) => { + upload(req, res, (error) => { + if (error) { + console.log(error); + return res.redirect('/user/scholarship/register'); + } + console.log(req.file) + return res.send('registered') + }) +} diff --git a/app/routes/default-router.js b/app/routes/default-router.js deleted file mode 100644 index 2e0aa8f..0000000 --- a/app/routes/default-router.js +++ /dev/null @@ -1,8 +0,0 @@ -const router = require('express').Router(); - -const defaultss = require('../controllers/default-controller.js'); - -// route -router.get('/',defaultss.dosomething) - -module.exports = router diff --git a/app/routes/user-router.js b/app/routes/user-router.js new file mode 100644 index 0000000..dae6dd5 --- /dev/null +++ b/app/routes/user-router.js @@ -0,0 +1,28 @@ +const router = require('express').Router(); +const user = require('../controllers/user-controller.js'); + +//sessionChecker middlewares +let sessionChecker = (req,res,next) =>{ + if(!req.session.user){ + res.redirect('/user/login') + }else{ + next() + } +} + +// register +router.get('/:username/register',sessionChecker, user.renderRegisterForm) +router.post('/:username/register',sessionChecker, user.registerUser) + +// // register +// router.get('/:username/register', user.renderRegisterForm) +// router.post('/:username/register', user.registerUser) + + +// login +router.get('/login',user.renderLoginForm) +router.post('/login',user.validateLogin) + + + +module.exports = router diff --git a/config/config.js b/config/config.js index fa18e5c..316e287 100644 --- a/config/config.js +++ b/config/config.js @@ -2,9 +2,13 @@ module.exports = { mongodb: { - dbURI: "mongodb://localhost:27017/scholarshipportal" + dbURI: "mongodb://localhost:27017/scholarshipportal" }, session:{ - secretString:"Scholarships are goood xD" + secretString:"Scholarships are goooood xD" + }, + auth:{ + name:'scholarship', + password:'scholarship' } }; diff --git a/config/upload.js b/config/upload.js new file mode 100644 index 0000000..8ee160a --- /dev/null +++ b/config/upload.js @@ -0,0 +1,35 @@ +const multer = require('multer'); +const path = require('path'); + +/** Storage Engine */ +const storageEngine = multer.diskStorage({ + destination: './public/files/uploads/', + filename: function(req, file, fn){ + fn(null, new Date().getTime().toString()+'-'+file.fieldname+path.extname(file.originalname)); + } +}); + +//init + +const upload = multer({ + storage: storageEngine, + limits: { fileSize:1000000 }, + fileFilter: function(req, file, callback){ + validateFile(file, callback); + } +}).array('document'); + + +var validateFile = function(file, cb ){ + allowedFileTypes = /jpeg|jpg|png|gif/; + const extension = allowedFileTypes.test(path.extname(file.originalname).toLowerCase()); + const mimeType = allowedFileTypes.test(file.mimetype); + if(extension && mimeType){ + return cb(null, true); + }else{ + cb("Invalid file type. Only JPEG, PNG and GIF file are allowed.") + } +} + + +module.exports = upload; diff --git a/package-lock.json b/package-lock.json index 62976f7..4cf1f8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -91,6 +91,11 @@ "normalize-path": "2.1.1" } }, + "append-field": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz", + "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=" + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -318,6 +323,43 @@ "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.9.tgz", "integrity": "sha1-EjGfgyOxJUc5t8a++NPomuBaL1c=" }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -477,6 +519,17 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, "configstore": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", @@ -648,6 +701,38 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "requires": { + "readable-stream": "1.1.14", + "streamsearch": "0.1.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", @@ -2092,6 +2177,21 @@ } } }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, "mongodb": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.10.tgz", @@ -2160,6 +2260,28 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.1.tgz", + "integrity": "sha512-JHdEoxkA/5NgZRo91RNn4UT+HdcJV9XUo01DTkKC7vo1erNIngtuaw9Y0WI8RdTlyi+wMIbunflhghzVLuGJyw==", + "requires": { + "append-field": "0.1.0", + "busboy": "0.2.14", + "concat-stream": "1.6.2", + "mkdirp": "0.5.1", + "object-assign": "3.0.0", + "on-finished": "2.3.0", + "type-is": "1.6.16", + "xtend": "4.0.1" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + } + } + }, "nan": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", @@ -3043,6 +3165,11 @@ "duplexer": "0.1.1" } }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -3164,6 +3291,11 @@ "mime-types": "2.1.18" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", @@ -3405,6 +3537,11 @@ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", diff --git a/package.json b/package.json index 37d7329..e586cad 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "express-session": "*", "express-validator": "*", "mongoose": "*", + "multer": "^1.3.1", "nodemon": "^1.18.3", "path": "*", "pug": "*", diff --git a/public/css/home.css b/public/css/home.css old mode 100755 new mode 100644 index 91f025b..4bb9ef5 --- a/public/css/home.css +++ b/public/css/home.css @@ -2,15 +2,14 @@ html,body{ margin: 0; padding: 0; background-color: rgb(249,249,249); - font-family: 'sans-serif'; } .title{ - text-align: center; + text-align: left; + margin-left:2em; font-size: 4.5em; padding: 5px; - margin-top: 6vh; - letter-spacing: 0.2em; + margin-top: 6vh; } .jumbo-container{ @@ -27,6 +26,7 @@ html,body{ .scholarship-name{ font-size: 1.7em; + text-decoration: underline; } .scholarship-details{ @@ -36,7 +36,7 @@ html,body{ } @media only screen and (max-width: 500px) { - + .title{ font-size: 2.5em; } @@ -57,4 +57,4 @@ html,body{ font-size: 1em; } -} \ No newline at end of file +} diff --git a/public/css/login.css b/public/css/login.css old mode 100755 new mode 100644 diff --git a/public/css/register.css b/public/css/register.css old mode 100755 new mode 100644 diff --git a/public/js/home.js b/public/js/home.js new file mode 100644 index 0000000..6ffb4bb --- /dev/null +++ b/public/js/home.js @@ -0,0 +1,5 @@ +var submitBtn = document.querySelector('.redirect') + +submitBtn.addEventListener('click',(e)=>{ + window.location.href = "http://localhost:3000/user/login"; +}) diff --git a/server.js b/server.js index 7a7337a..8950d7d 100644 --- a/server.js +++ b/server.js @@ -10,11 +10,11 @@ const session = require('express-session'); //importing router -const defaultRouter = require('./app/routes/default-router.js'); +const userRouter = require('./app/routes/user-router.js'); //initialising express const app = express(); -/* + //database Connection mongoose.connect(config.mongodb.dbURI) .then(()=>{ @@ -25,7 +25,7 @@ mongoose.connect(config.mongodb.dbURI) process.exit(); }) let db = mongoose.connection -*/ + // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'pug'); @@ -54,6 +54,8 @@ app.use(expressValidator({ }; } })); +// initialize cookie-parser to allow us access the cookies stored in the browser. +app.use(cookieParser()); // initialize express-session to allow us track the logged-in user across sessions. app.use(session({ @@ -61,14 +63,14 @@ app.use(session({ resave:true, saveUninitialized:false })) -//sessionChecker middlewares -let sessionChecker = (req,res,next) =>{ - if(!req.session.user){ - res.redirect('/user/login') - }else{ - next() + //sessionChecker middlewares + let sessionChecker = (req,res,next) =>{ + if(!req.session.user){ + res.redirect('/user/login') + }else{ + next() + } } -} //global vari for all routes app.get('*',(req,res,next) => { @@ -78,18 +80,14 @@ app.get('*',(req,res,next) => { //Home Route app.get('/',(req,res)=>{ - res.render('home.pug'); -}) -//login Route -app.get('/login',(req,res)=>{ - res.render('login.pug'); -}) -//register route -app.get('/register',(req,res)=>{ - res.render('register.pug'); + res.render('home'); }) -app.use('/default', defaultRouter); +app.use('/user', userRouter); + +app.get('*',(req,res)=>{ + res.send('ERROR 404. PAGE NOT FOUND') +}) app.listen(3000,()=> { signale.success('Server Started on port: 3000'); diff --git a/views/home.pug b/views/home.pug old mode 100755 new mode 100644 index 2cf6024..00dad4d --- a/views/home.pug +++ b/views/home.pug @@ -7,6 +7,7 @@ block append head block content h1.title Scholarship Portal + hr .container.jumbo-container .jumbotron.jumbo-class h3(class="welcomehead") Welcome to NITT Scholarship Portal @@ -36,7 +37,8 @@ block content .col-md-1 .col-md-9 div(class="scholarship-name") Silver 72 - div(class="scholarship-details") Silver 72 Scholarship is Instituted by 1972 batch of Alumni. NITT Students are awarded merit / need-based scholarship every year. + div(class="scholarship-details") Silver 72 Scholarship is Instituted by 1972 batch of Alumni. NITT Students are awarded merit / need-based scholarship every year.Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eligendi non quis exercitationem culpa nesciunt nihil aut. .col-md-2 div(style="text-align: center;") - button(class="btn btn-success") Register \ No newline at end of file + button(class="btn btn-success redirect") Register + script(src="/js/home.js") diff --git a/views/login.pug b/views/login.pug old mode 100755 new mode 100644 index 2f4ccf1..2d649b4 --- a/views/login.pug +++ b/views/login.pug @@ -13,7 +13,7 @@ block content .col-md-4.col-sm-4.col-xs-2 .col-md-4.col-sm-4.col-xs-8 .text-center - form(method="post" autocomplete="off").formClass + form(method="post" autocomplete="off" action = '/user/login').formClass .form-group input(id="usernameIn" type="text" placeholder="Webmail Username" name="username" required).form-control .form-group @@ -21,4 +21,4 @@ block content .form-group input(id="submitIn" class="form-control btn btn-success" type="submit" value="Login" name="login" required) - .col-md-4.col-sm-4.col-xs-2 \ No newline at end of file + .col-md-4.col-sm-4.col-xs-2 diff --git a/views/register.pug b/views/register.pug old mode 100755 new mode 100644 index abf9b41..7d7e3f3 --- a/views/register.pug +++ b/views/register.pug @@ -20,7 +20,7 @@ block content .row.main .col-md-2 .col-md-8 - form.form-horizontal(role='form') + form.form-horizontal(role='form' method="POST" autocomplete="off" action = '/user/scholarship/register' enctype="multipart/form-data") h3.flex span(class="dropdown-head") Personal Details span.flex-left @@ -223,37 +223,37 @@ block content label.col-md-4.control-label.label-tag Achievements, aspirations and life goals: .col-md-8 textarea.form-control.input-big(rows=5 placeholder="Please mention your dreams, life goals and aspirations.") - h3.flex - span(class="dropdown-head") Document Uploads - span.flex-left - i.fas.fa-caret-down(data-id = "3") - hr - .part-3.hide - .form-group - .row.input-container - label.col-md-4.control-label.label-tag Annual Income Certificate: - .col-md-8 - input.form-control(type='file') - .form-group - .row.input-container - label.col-md-4.control-label.label-tag Transcript: - .col-md-8 - input.form-control(type='file') - .form-group - .row.input-container - label.col-md-4.control-label.label-tag 12th Marksheet: - .col-md-8 - input.form-control(type='file') - .form-group - .row.input-container - label.col-md-4.control-label.label-tag 10th Marksheet: - .col-md-8 - input.form-control(type='file') - .form-group(style="margin-top:7vh;") - .row - .col-md-4.col-sm-4.col-xs-3 - .col-md-3.col-sm-3.col-xs-6 - input.input-lg.form-control.btn.btn-success.custom-submit(type='submit' value="Submit") - .col-md-5.col-sm-5.col-xs-3 + h3.flex + span(class="dropdown-head") Document Uploads + span.flex-left + i.fas.fa-caret-down(data-id = "3") + hr + .part-3.hide + .form-group + .row.input-container + label.col-md-4.control-label.label-tag Annual Income Certificate: + .col-md-8 + input.form-control(type='file' name='document') + .form-group + .row.input-container + label.col-md-4.control-label.label-tag Transcript: + .col-md-8 + input.form-control(type='file' name='document') + .form-group + .row.input-container + label.col-md-4.control-label.label-tag 12th Marksheet: + .col-md-8 + input.form-control(type='file' name='document') + .form-group + .row.input-container + label.col-md-4.control-label.label-tag 10th Marksheet: + .col-md-8 + input.form-control(type='file' name='document') + .form-group(style="margin-top:7vh;") + .row + .col-md-4.col-sm-4.col-xs-3 + .col-md-3.col-sm-3.col-xs-6 + input.input-lg.form-control.btn.btn-success.custom-submit(type='submit' value="Submit") + .col-md-5.col-sm-5.col-xs-3 .col-md-2 - script(src="/js/register.js") \ No newline at end of file + script(src="/js/register.js")