blob: d43a3d2d44acc5572a11255a8ddb43cc850a2b7b [file] [log] [blame]
'use strict'
var UsergridEntity = require('./entity'),
UsergridUserAuth = require('./userAuth'),
UsergridResponseError = require('./responseError'),
request = require('request'),
helpers = require('../helpers'),
ok = require('objectkit'),
util = require('util'),
_ = require('lodash')
var UsergridUser = function(obj) {
if (!ok(obj).has('email') && !ok(obj).has('username')) {
// This is not a user entity
throw new Error('"email" or "username" property is required when initializing a UsergridUser object')
}
var self = this
self.type = "user"
_.assign(self, UsergridEntity.call(self, obj))
helpers.setWritable(self, 'name')
return self
}
UsergridUser.prototype = {
create: function() {
var self = this
var args = Array.prototype.slice.call(arguments)
var client = helpers.client.validate(args)
var callback = helpers.cb(_.last(args.filter(_.isFunction)))
client.POST(self, function(err, usergridResponse) {
delete self.password
_.assign(self, usergridResponse.entity)
callback(err || usergridResponse.error, usergridResponse, usergridResponse.user)
}.bind(self))
},
login: function() {
var self = this
var args = Array.prototype.slice.call(arguments)
var client = helpers.client.validate(args)
var callback = helpers.cb(_.last(args.filter(_.isFunction)))
client.POST('token', helpers.build.userLoginBody(self), function(error, response) {
delete self.password
if (response.statusCode === 200) {
self.auth = new UsergridUserAuth(response.body.user)
self.auth.token = response.body.access_token
self.auth.expiry = helpers.time.expiry(response.body.expires_in)
self.auth.tokenTtl = response.body.expires_in
} else {
error = new UsergridResponseError(response.body)
}
callback(error || response.error, response, response.body.access_token)
}.bind(self))
},
logout: function() {
var self = this
var args = _.flatten(Array.prototype.slice.call(arguments), true)
var callback = helpers.cb(_.last(args.filter(_.isFunction)))
if (!self.auth || !self.auth.isValid) {
return callback({
name: 'no_valid_token',
description: 'this user does not have a valid token'
})
}
var client = helpers.client.validate(args)
var revokeAll = _.first(args.filter(_.isBoolean)) || false
var userId = _.first([self.uuid, self.username, self.email].filter(_.isString))
var url = util.format("%s%s/revoketoken%s", helpers.build.url(client, {
type: 'user'
}), userId, (revokeAll) ? "s" : "")
request(url, {
headers: helpers.userAgent,
json: true,
method: 'PUT',
qs: (!revokeAll) ? {
token: self.auth.token
} : undefined
}, function(error, response) {
var UsergridResponse = require('./response'),
usergridResponse = new UsergridResponse(response)
if (usergridResponse.statusCode === 200) {
self.auth.destroy()
} else {
error = new UsergridResponseError(response.body)
}
callback(error || usergridResponse.error, usergridResponse, (usergridResponse.statusCode === 200))
})
},
logoutAllSessions: function() {
var args = Array.prototype.slice.call(arguments)
args.unshift(true)
return this.logout.apply(this, args)
},
resetPassword: function() {
var self = this
var args = _.flatten(Array.prototype.slice.call(arguments), true)
var callback = helpers.cb(_.last(args.filter(_.isFunction)))
var client = helpers.client.validate(args)
var body = {
oldpassword: _.isPlainObject(args[0]) ? args[0].oldPassword : _.isString(args[0]) ? args[0] : undefined,
newpassword: _.isPlainObject(args[0]) ? args[0].newPassword : _.isString(args[1]) ? args[1] : undefined,
}
if (!body.oldpassword || !body.newpassword) {
throw new Error('"oldPassword" and "newPassword" properties are required when resetting a user password')
}
var userId = _.first([self.uuid, self.username, self.email].filter(_.isString))
var url = util.format("%s%s/password", helpers.build.url(client, {
type: 'user'
}), userId)
request(url, {
headers: helpers.userAgent,
json: true,
method: 'PUT',
body: body
}, function(error, response) {
var UsergridResponse = require('./response'),
usergridResponse = new UsergridResponse(response)
if (usergridResponse.statusCode >= 400) {
error = new UsergridResponseError(response.body)
}
callback(error || usergridResponse.error, usergridResponse, (usergridResponse.statusCode < 400))
})
},
}
util.inherits(UsergridUser, UsergridEntity)
module.exports = UsergridUser