Commit 52d1d889 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Ensure users table entry when logging in.

Created Users class, which uses the ForumAuth to first log in through
Sencha Forum and then when needed creates entry to users table in
comments database.

The main thing is that now the user object stored into session contains
an `id` field which we can use in further queries to add/update/delete
comments.
parent f24922d1
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -63,7 +63,6 @@ app.get('/auth/session', function(req, res) {
    if (req.session && req.session.user) {
        res.json({
            userName: req.session.user.username,
            external_id: req.session.user.external_id,
            mod: req.session.user.moderator
        });
    }
@@ -72,8 +71,8 @@ app.get('/auth/session', function(req, res) {
    }
});

app.post('/auth/login', services.forumAuth, function(req, res) {
    req.forumAuth.login(req.body.username, req.body.password, function(err, user) {
app.post('/auth/login', services.users, function(req, res) {
    req.users.login(req.body.username, req.body.password, function(err, user) {
        if (err) {
            res.json({ success: false, reason: err });
            return;
+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ ForumAuth.prototype = {
            callback(null, {
                username: user.username,
                external_id: user.userid,
                email: user.email,
                moderator: this.isModerator(user)
            });
        }.bind(this));
+5 −4
Original line number Diff line number Diff line
var DbFacade = require('./db_facade');
var Comments = require('./comments');
var Users = require('./users');
var ForumAuth = require('./forum_auth');
var config = require('./config');

@@ -18,11 +19,11 @@ module.exports = {
    },

    /**
     * Adds forumAuth service to request.
     * Adds users service to request.
     */
    forumAuth: function(req, res, next) {
        var db = new DbFacade(config.forumDb);
        req.forumAuth = new ForumAuth(db);
    users: function(req, res, next) {
        var forumAuth = new ForumAuth(new DbFacade(config.forumDb));
        req.users = new Users(new DbFacade(config.mysql), forumAuth);
        next();
    }
};

comments/users.js

0 → 100644
+61 −0
Original line number Diff line number Diff line
/**
 * Manages users table, logging in users and adding new users.
 */
function Users(db, forumAuth) {
    this.db = db;
    this.forumAuth = forumAuth;
}

Users.prototype = {
    /**
     * Authenticates against forum database and when successful
     * ensures the user is also listed in comments database. Returns
     * the comments database user record.
     *
     * @param {String} username
     * @param {String} password
     * @param {Function} callback Called when done.
     * @param {String} callback.err Error message when login failed.
     * @param {Object} callback.user The user that was logged in.
     */
    login: function(username, password, callback) {
        this.forumAuth.login(username, password, function(err, user) {
            if (err) {
                callback(err);
                return;
            }

            this.ensure(user, function(err, user_id) {
                user.id = user_id;
                callback(err, user);
            });
        }.bind(this));
    },

    ensure: function(user, callback) {
        // first try to insert. If that fails, the user already
        // exists and we can instead look it up. If insert succeeds,
        // great also.
        this.add(user, function(err, user_id) {
            if (err) {
                this.get(user, function(err, u) {
                    callback(err, u.id);
                });
            }
            else {
                callback(err, user_id);
            }
        }.bind(this));
    },

    add: function(user, callback) {
        this.db.insert("users", user, callback);
    },

    get: function(user, callback) {
        this.db.queryOne('SELECT * FROM users WHERE external_id = ?', [user.external_id], callback);
    }

};

module.exports = Users;