API Docs for:
Show:

File: models/server/User.js

"use strict";

require("../../db");
var Base = require("./Base");
var Cocktail = require("backbone.cocktail");
var Bookshelf = require("bookshelf");
var UserMixin = require("../UserMixin");
var Puavo = require("../../utils/Puavo");
var config = require("../../config");

/**
 * Server User model
 *
 * @namespace models.server
 * @extends models.server.Base
 * @class User
 * @uses models.UserMixin
 */
var User = Base.extend({

    tableName: "users",

    defaults: function() {
        return {
            createdAt: new Date(),
            updatedAt: new Date()
        };
    },

    /**
     * Same as models.server.Follower#getSocketIORoom()
     *
     * @method getSocketIORoom
     * @return {String}
     */
    getSocketIORoom: function() {
        return "user:" + this.get("id");
    },

    /**
     * Return true if the user a manager
     *
     * @method isManager
     * @return {Boolean}
     */
    isManager: function(){
        if (!config.managerOrganisationDomain) {
            throw new Error("'managerOrganisationDomain is not configured!");
        }

        return this.getOrganisationDomain() === config.managerOrganisationDomain;
    },

    toJSON: function() {
        var json = Base.prototype.toJSON.apply(this, arguments);
        json.isManager = this.isManager();
        return json;
    }

}, {

    /**
     * Ensure that user from a Opinsys JWT token Object exists and is up to
     * date
     *
     * @method ensureUserFromJWTToken
     * @param {Object} JWT token object from Opinsys SSO
     * @static
     * @return {Bluebird.Promise} models.server.User
     */
    ensureUserFromJWTToken: function(token) {
        return User.byExternalId(token.id).fetch()
            .then(function(user) {
                if (!user) user = User.forge({});

                user.set({
                    externalId: token.id,
                    externalData: token
                });

                return user.save();

            });
    },

    /**
     * Shortcut for getting user models by the externalId
     *
     * @static
     * @method byExternalId
     * @return {models.server.User}
     */
    byExternalId: function(id) {
        return this.forge({ externalId: id });
    },

    /**
     * Shortcut for getting user models by the email address
     *
     * @static
     * @method byEmailAddress
     * @param {String} emailAddress
     * @return {models.server.User}
     */
    byEmailAddress: function(emailAddress) {
        return this.forge()
            .query(function(qb) {
                qb.where( Bookshelf.DB.knex.raw( "\"externalData\"->>'email' = ?",  [emailAddress] ) );
            });
    },

    /**
     * Fetch user from puavo-rest, save it to the local SQL DB and return it in
     * a Promise.
     *
     * @static
     * @method ensureUserByUsername
     * @param {String} username
     * @param {String} puavoDomain
     * @return {Bluebird.Promise} with models.server.User
     */
    ensureUserByUsername: function(username, puavoDomain) {
        if (!username) throw new Error("Invalid arguments: username is missing");
        if (!puavoDomain) throw new Error("Invalid arguments: puavoDomain is missing");
        var puavo = new Puavo({ domain: puavoDomain });
        return puavo.fetchUserByUsername(username)
            .then(function(userdata) {
                return User.ensureUserFromJWTToken(userdata);
            });
    },

    /**
     * Ensure that user exists for this email address
     *
     * @method ensureUserByEmail
     * @param {String} emailAddress
     * @param {String} first_name
     * @param {String} last_name
     * @return {Bluebird.Promise} models.server.User
     */
    ensureUserByEmail: function(emailAddress, first_name, last_name) {
        return User.byEmailAddress(emailAddress).fetch()
            .then(function(user) {
                if (user) return user;
                return User.forge({
                    externalData: {
                        first_name: first_name,
                        last_name: last_name,
                        email: emailAddress
                    }
                }).save();
            });
    },

    /**
     * Shortcut for getting user model by the username (externalData)
     *
     * @static
     * @method byUsername
     * @return {models.server.User}
     */
    byUsername: function(username) {
        return User.forge()
            .query(function(qb) {
                qb.where( Bookshelf.DB.knex.raw( "externalData->>'username' = ?",  [username] ) );
            });
    }

});

Cocktail.mixin(User, UserMixin);
module.exports = User;