Commit 3846756a authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Extract Targets class from Comments.

parent b29ad2a7
Loading
Loading
Loading
Loading
+3 −30
Original line number Diff line number Diff line
var Targets = require("./targets");

module.exports = (function(){
    /**
@@ -15,6 +16,7 @@ module.exports = (function(){
    function Comments(db, domain) {
        this.db = db;
        this.domain = domain;
        this.targets = new Targets(db, domain);
    }

    Comments.prototype = {
@@ -153,7 +155,7 @@ module.exports = (function(){
         * @param {Function} callback.id The ID of newly inserted comment.
         */
        add: function(comment, callback) {
            this.ensureTarget(comment, function(target_id) {
            this.targets.ensure(comment, function(target_id) {
                this.db.insert('comments', {
                    target_id: target_id,
                    user_id: comment.user_id,
@@ -188,35 +190,6 @@ module.exports = (function(){
                    created_at: new Date()
                }, callback);
            }.bind(this));
        },

        ensureTarget: function(target, callback) {
            this.getTarget(target, function(targetFound) {
                if (targetFound) {
                    callback(targetFound.id);
                }
                else {
                    this.addTarget(target, callback);
                }
            }.bind(this));
        },

        getTarget: function(target, callback) {
            var sql = [
                'SELECT * FROM targets',
                'WHERE domain = ? AND type = ? AND cls = ? AND member = ?'
            ];
            var params = [this.domain, target.type, target.cls, target.member];
            this.db.queryOne(sql, params, callback);
        },

        addTarget: function(target, callback) {
            this.db.insert("targets", {
                domain: this.domain,
                type: target.type,
                cls: target.cls,
                member: target.member
            }, callback);
        }
    };

comments/targets.js

0 → 100644
+56 −0
Original line number Diff line number Diff line
/**
 * Represents a Targets table.
 *
 * @constructor
 * Initializes Targets with a database connection and a target domain.
 *
 * @param {DbFacade} db Instance of DbFacade.
 * @param {String} domain The comments domain within which to work.
 */
function Targets(db, domain) {
    this.db = db;
    this.domain = domain;
}

Targets.prototype = {
    /**
     * Ensures that a target exists, then calls the callback with
     * target ID.
     * @param {Object} target A target object:
     * @param {String} target.type
     * @param {String} target.cls
     * @param {String} target.member
     * @param {Function} callback
     * @param {Number} callback.id The ID of the target
     */
    ensure: function(target, callback) {
        this.get(target, function(targetFound) {
            if (targetFound) {
                callback(targetFound.id);
            }
            else {
                this.add(target, callback);
            }
        }.bind(this));
    },

    get: function(target, callback) {
        var sql = [
            'SELECT * FROM targets',
            'WHERE domain = ? AND type = ? AND cls = ? AND member = ?'
        ];
        var params = [this.domain, target.type, target.cls, target.member];
        this.db.queryOne(sql, params, callback);
    },

    add: function(target, callback) {
        this.db.insert("targets", {
            domain: this.domain,
            type: target.type,
            cls: target.cls,
            member: target.member
        }, callback);
    }
};

module.exports = Targets;