Commit 84fae751 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Implement subscribe/unsubscribe requests.

parent 2b86109a
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -168,5 +168,12 @@ app.get('/auth/:sdk/:version/subscriptions', function(req, res) {
    });
});

// Subscibe / unsubscribe to a comment thread
app.post('/auth/:sdk/:version/subscribe', validator.isLoggedIn, function(req, res) {
    new Request(req).changeSubscription(req.body.target, req.body.subscribed === 'true', function() {
        res.send({ success: true });
    });
});

app.listen(config.port);
console.log("Server started at port "+config.port+"...");
+25 −11
Original line number Diff line number Diff line
@@ -68,17 +68,6 @@ Request.prototype = {
        });
    },

    getSubscriptions: function(callback) {
        if (!this.isLoggedIn()) {
            callback([]);
            return;
        }

        this.db.subscriptions().findTargetsByUser(this.getUserId(), function(err, targets) {
            callback(targets.map(ApiAdapter.targetToJson));
        });
    },

    updateComment: function(comment_id, content, callback) {
        var update = {
            id: comment_id,
@@ -106,6 +95,31 @@ Request.prototype = {
        });
    },

    getSubscriptions: function(callback) {
        if (!this.isLoggedIn()) {
            callback([]);
            return;
        }

        this.db.subscriptions().findTargetsByUser(this.getUserId(), function(err, targets) {
            callback(targets.map(ApiAdapter.targetToJson));
        });
    },

    changeSubscription: function(target, subscribe, callback) {
        var sub = {
            user_id: this.getUserId(),
            target: ApiAdapter.targetFromJson(JSON.parse(target))
        };

        if (subscribe) {
            this.db.subscriptions().add(sub, callback);
        }
        else {
            this.db.subscriptions().remove(sub, callback);
        }
    },

    getUser: function(callback) {
        callback(this.req.session && this.req.session.user);
    },
+41 −0
Original line number Diff line number Diff line
var Targets = require("./targets");

/**
 * Represents a Subscriptions table.
 *
@@ -10,6 +12,7 @@
function Subscriptions(db, domain) {
    this.db = db;
    this.domain = domain;
    this.targets = new Targets(db, domain);
}

Subscriptions.prototype = {
@@ -47,6 +50,44 @@ Subscriptions.prototype = {
        ];

        this.db.query(sql, [target_id], callback);
    },

    /**
     * Adds new subscription.
     * @param {Object} subscription
     * @param {Number} subscription.user_id
     * @param {Object} subscription.target
     * @param {Function} callback
     * @param {Error} callback.err The error object.
     * @param {Number} callback.subscriptionId ID of the new subscription.
     */
    add: function(subscription, callback) {
        // First remove any existing subscriptions, then continue with
        // adding the new one.
        this.remove(subscription, function(err) {
            this.targets.ensure(subscription.target, function(err, target_id) {
                this.db.insert("subscriptions", {
                    user_id: subscription.user_id,
                    target_id: target_id,
                    created_at: new Date()
                }, callback);
            }.bind(this));
        }.bind(this));
    },

    /**
     * Removes an existing subscription.
     * @param {Object} subscription
     * @param {Number} subscription.user_id
     * @param {Object} subscription.target
     * @param {Function} callback
     * @param {Error} callback.err The error object.
     */
    remove: function(subscription, callback) {
        this.targets.ensure(subscription.target, function(err, target_id) {
            var sql = "DELETE FROM subscriptions WHERE user_id = ? AND target_id = ?";
            this.db.query(sql, [subscription.user_id, target_id], callback);
        }.bind(this));
    }
};

+35 −0
Original line number Diff line number Diff line
@@ -64,4 +64,39 @@ describe("Subscriptions", function() {
        });
    });

    it("#add adds new subscription", function(done) {
        subscriptions.add({user_id: 1, target: {type: "guide", cls: "testing", member: ""}}, function(err, id) {
            subscriptions.findTargetsByUser(1, function(err, subs) {
                expect(subs.length).toEqual(3);
                done();
            });
        });
    });

    it("#add does nothing when subscription already exists", function(done) {
        subscriptions.add({user_id: 1, target: {type: "guide", cls: "testing", member: ""}}, function(err, id) {
            subscriptions.findTargetsByUser(1, function(err, subs) {
                expect(subs.length).toEqual(3);
                done();
            });
        });
    });

    it("#remove removes existing subscription", function(done) {
        subscriptions.remove({user_id: 1, target: {type: "guide", cls: "testing", member: ""}}, function(err, id) {
            subscriptions.findTargetsByUser(1, function(err, subs) {
                expect(subs.length).toEqual(2);
                done();
            });
        });
    });

    it("#remove does nothing when subscription doesn't exist", function(done) {
        subscriptions.remove({user_id: 1, target: {type: "guide", cls: "testing", member: ""}}, function(err, id) {
            subscriptions.findTargetsByUser(1, function(err, subs) {
                expect(subs.length).toEqual(2);
                done();
            });
        });
    });
});