hulawho
Version:
hulawho api
176 lines (138 loc) • 3.7 kB
JavaScript
var async = require('async')
var mongoose = require('mongoose')
var LeagueModel = require('./models/schema').League
var User = require('./User')
var crypto = require('./modules/crypto_primitives')
function League(profile) {
var self = this
if(profile) {
self.name = profile.name
self.password = profile.password
self.admin = profile.admin
}
}
League.prototype.createLeague = function(callback) {
var self = this
// check whether a league of the same name already exists
LeagueModel.findOne({name: self.name}, function(err, res) {
if(err) {
callback(err)
return
}
if(res) {
callback({status: 400, message: 'LEAGUE EXISTS'})
return
}
var async_queue = []
async_queue.push(function(cb) {
crypto.generateKdf(self.password, cb)
})
async_queue.push(function(cb) {
crypto.generateLeagueCode(cb)
})
async.parallel(async_queue, function(err, res) {
if(err) {
callback(err)
return
}
self.kdf = res[0]
self.code = res[1]
var entry = {
name: self.name,
code: self.code,
kdf: self.kdf,
admin: self.admin,
members: [self.admin]
}
var league = new LeagueModel(entry)
league.save(function(err, res) {
if(err) {
callback(err)
return
}
var userObject = new User()
userObject.pushLeague(self.admin, res._id, function(err, res) {
if(err) {
callback(err)
return
}
callback(null, {status: 200, message: 'ADD LEAGUE OK', data: {name: self.name, code: self.code, admin: self.admin}})
})
})
})
})
}
League.prototype.pushUser = function(league, user, callback) {
var self = this
self.id = league
LeagueModel.findOneAndUpdate({_id: self.id}, {$push: {members: user}}, function(err, res) {
if(err) {
callback(err)
return
}
if(!res) {
callback({status: 428, message: 'LEAGUE NOT FOUND'})
return
}
callback(null, {status: 200, message: 'LEAGUE USER PUSH OK'})
})
}
League.prototype.getLeague = function(league, callback) {
var self = this
self.id = league
LeagueModel.findOne({_id: self.id}, function(err, res) {
if(err) {
callback(err)
return
}
if(!res) {
callback({status: 400, message: 'LEAGUE DOES NOT EXIST'})
return
}
callback(null, {status: 200, message: 'GET LEAGUE OK', data: res})
})
}
League.prototype.joinLeague = function(code, password, user, callback) {
var self = this
LeagueModel.findOne({code: code}, function(err, res) {
if(err) {
callback(err)
return
}
if(!res) {
callback({status: 400, message: 'LEAGUE DOES NOT EXIST'})
return
}
if(res.members.indexOf(user) > -1) {
callback({status: 400, message: 'ALREADY A MEMBER'})
return
}
self.id = res._id
crypto.verifyKdf(res.kdf, password, function(err, res) {
if(err) {
callback(err)
return
}
if(res != true) {
callback({status: 400, message: 'LEAGUE AUTHENTICATION FAILURE'})
return
}
var async_queue = []
async_queue.push(function(cb) {
self.pushUser(self.id, user, cb)
})
async_queue.push(function(cb) {
var userObject = new User()
userObject.pushLeague(user, self.id, cb)
})
async.parallel(async_queue, function(err, res) {
if(err) {
callback(err)
return
}
callback(null, {status: 200, message: 'JOIN LEAGUE OK'})
})
})
})
}
module.exports = League