Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ npm-debug.log*
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
Expand All @@ -29,9 +30,28 @@ build/Release
# Dependency directories
node_modules
jspm_packages
typings
typings.json

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz
*.zip

# Temp data
.tmp

# VS Code
.vscode
launch.json

#secrets
secret.js
21 changes: 21 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
// Use IntelliSense to learn about possible Node.js debug attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceRoot}/server.js",
"cwd": "${workspaceRoot}"
},
{
"type": "node",
"request": "attach",
"name": "Attach to Process",
"port": 5858
}
]
}
42 changes: 42 additions & 0 deletions configs/config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
'use strict'
// this is just a test

module.exports = {
goodOptions: {
ops: {
interval: 1000
},
reporters: {
myConsoleReporter: [{
module: 'good-squeeze',
name: 'Squeeze',
args: [{ log: '*', response: '*' }]
}, {
module: 'good-console'
}, 'stdout']
}
},
swaggerOptions: {
info: {
title: 'MointainServer API Documentation',
description: `Api Documentation for the Mountain Server`
},
expanded: 'full'
},
mongo: {
url: '127.0.0.1:27017',
database: 'pss-api'
},
credentials: {
'facebook': {
'AppID': 'facebookAppId',
'AppSecret': 'facebookAppSecret', //
'verificationURI': 'https://graph.facebook.com/me?access_token'
}
},
JWT: {
secret: 'neverShareYourSecret'
},
SALT_WORK_FACTOR: 10,
apiURL: 'http://localhost:8001'
}
14 changes: 14 additions & 0 deletions handlers/changeRoleHandler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
const Boom = require('boom')
const User = require('../models/user.js').User

module.exports = function (request, reply) {
const newRole = request.payload.role
User.findOneAndUpdate({_id: request.payload.userId}, { role: newRole })
.then(result => {
delete result._doc.password
return reply(result)
})
.catch(err => {
return reply(Boom.badData(err.message))
})
}
40 changes: 40 additions & 0 deletions handlers/getProfilesHandler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
'use strict'
const Boom = require('boom')
const User = require('../models/user.js').User

module.exports = function (request, reply) {
const role = request.auth.credentials.scope
switch (role) {
case 'Administrator': {
User.find({}, { password: 0 })
.then(result => {
return reply(result)
})
.catch(err => {
return reply(Boom.system(err.message))
})
}
break
case 'MointainDispatcher': {
User.find({role: 'MountainRescuer'}, { password: 0 }).select('location')
.then(result => {
return reply(result)
})
.catch(err => {
return reply(Boom.system(err.message))
})
}
break
case 'User':
case 'MountainRescuer': {
User.findOne({_id: request.auth.credentials.id}).select('location')
.then(result => {
return reply(result)
})
.catch(err => {
return reply(Boom.system(err.message))
})
}
break
}
}
13 changes: 13 additions & 0 deletions handlers/getUserProfile.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
'use strict'
const Boom = require('boom')
const User = require('../models/user.js').User

module.exports = function (request, reply) {
User.findOne({_id: request.params.userId}, { password: 0 })
.then(result => {
return reply(result)
})
.catch(err => {
return reply(Boom.badData(err.message))
})
}
22 changes: 22 additions & 0 deletions handlers/loginFbHandler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const Boom = require('boom')
const JWT = require('jsonwebtoken')
const config = require('../configs/config')
const Req = require('../lib/requests').Req
const req = new Req(config)
const User = require('../models/user.js').User

module.exports = function (request, reply) {
const fbToken = request.payload.fb_token

req.requestFbVerifyToken(fbToken).then((result) => {
User.findOne({ username: result.id })
.then((np) => {
if (!np) return reply(Boom.unauthorized(null, 'Custom'))
else {
const token = JWT.sign({ id: np._id, email: np.email }, config.JWT.secret)
return reply({ token: token })
}
})
})
.catch(err => { return reply(Boom.unauthorized(err.message)) })
}
30 changes: 30 additions & 0 deletions handlers/loginHandler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
'use strict'
const Boom = require('boom')
const JWT = require('jsonwebtoken')
const bcrypt = require('bcrypt')
const config = require('../configs/config')
const User = require('../models/user.js').User

module.exports = function (request, reply) {
const email = request.payload.email
const username = request.payload.username
const password = request.payload.password.toString()

if (!email) var query = {username: username}
else query = {email: email}

User.findOne(query)
.then((np) => {
bcrypt.compare(password, np.password, (err, result) => {
if (!err && result) {
const token = JWT.sign({ id: np._id, email: np.email }, config.JWT.secret)
return reply({token: token, fullname: np.full_name})
} else if (!result) {
return reply(Boom.unauthorized('Wrong username/password'))
} else {
return err
}
})
})
.catch((err) => { return reply(Boom.unauthorized(err.message)) })
}
28 changes: 28 additions & 0 deletions handlers/putLocationHandler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
'use strict'
const Boom = require('boom')
const Location = require('../models/location.js').Location

module.exports = function (request, reply) {
const userId = request.auth.credentials.id
const location = request.payload
let updateValue = {
lat: location.lat,
lng: location.lng,
altitude: location.altitude
}
const options = {
upsert: true,
setDefaultsOnInsert: true
}
location.coordinateAccuracy ? (updateValue.coordinateAccuracy = location.coordinateAccuracy) : {}
Location.findOneAndUpdate({
_user: userId
}, updateValue, options)
.then((result) => {
if (result) return reply({location: location})
else return reply(Boom.badData('User has no initial location'))
})
.catch(err => {
return reply(Boom.badData(err.message))
})
}
34 changes: 34 additions & 0 deletions handlers/registerFbHandler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
const Boom = require('boom')
const JWT = require('jsonwebtoken')
const config = require('../configs/config')
const Req = require('../lib/requests').Req
const addUser = require('../lib/utils').addUser

let req = new Req(config)

module.exports = function (request, reply) {
const fbToken = request.payload.fb_token
const role = request.payload.role

req.requestFbSignUpToken(fbToken)
.then((userData) => {
let name = userData.name.split(' ')
let signUpData = {
fb_linked: userData.id,
email: userData.email,
first_name: name.shift(),
last_name: name.pop(),
password: ''
}
signUpData.location = request.payload.location
signUpData.role = role

addUser(request, signUpData)
.then((np) => {
const userToken = { token: JWT.sign({ id: np._id, email: np.email }, config.JWT.secret) }
return reply(userToken)
})
// .catch((err) => { return reply(Boom.unauthorized(err.message)) })
})
.catch((err) => { return reply(Boom.unauthorized(err.message)) })
}
21 changes: 21 additions & 0 deletions handlers/registerHandler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
'use strict'
const Boom = require('boom')
const JWT = require('jsonwebtoken')
const config = require('../configs/config')
const addUser = require('../lib/utils').addUser

module.exports = function (request, reply) {
const signUpData = request.payload.user
signUpData.location = request.payload.location

if (signUpData.password === signUpData.confirmed_password) {
addUser(request, signUpData)
.then((np) => {
const token = JWT.sign({ id: np._id, email: np.email }, config.JWT.secret)
return reply({token: token, fullname: np.full_name})
})
.catch((err) => { return reply(Boom.unauthorized(err.message)) })
} else {
return reply(Boom.unauthorized('passwords do not match'))
}
}
29 changes: 29 additions & 0 deletions handlers/updateProfileHandler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
'use strict'
const Boom = require('boom')
const JWT = require('jsonwebtoken')
const bcrypt = require('bcrypt')
const config = require('../configs/config')
const User = require('../models/user.js').User

module.exports = function (request, reply) {
let newProfileData = {}
const query = { email: request.auth.credentials.email }
for (let key of Object.keys(request.payload)) {
newProfileData[key] = request.payload[key]
}
if (newProfileData.email === query.email) { delete newProfileData.email }
if ((newProfileData.new_password) && (newProfileData.new_password === newProfileData.confirmed_password)) {
newProfileData.password = bcrypt.hashSync(newProfileData.new_password, config.SALT_WORK_FACTOR)
delete newProfileData.newPassword
delete newProfileData.confirmedPassword
}

User.findOneAndUpdate(query, newProfileData)
.then((result) => {
const token = JWT.sign({id: result.id, email: result.email}, config.JWT.secret)
return reply({token: token}).state('session', token, config.cookie_options)
})
.catch(err => {
return reply(Boom.badData(err.message))
})
}
15 changes: 15 additions & 0 deletions lib/database.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
'use strict'
const Mongoose = require('mongoose')
const db = Mongoose.connection
const config = require('../configs/config')

Mongoose.Promise = global.Promise
Mongoose.connect(`mongodb://${config.mongo.url}/${config.mongo.database}`)

db.on('error', console.error.bind(console, 'connection error'))
db.once('open', function callback () {
console.log('Connection with database succeeded.')
})

exports.Mongoose = Mongoose
exports.db = db
Loading