tender
Version:
Tender API client
283 lines (262 loc) • 8.6 kB
JavaScript
// Generated by CoffeeScript 1.4.0
var Discussions, actions, async, morph, states, tenderQuery, tenderUpdate,
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
async = require('async');
morph = require('morph');
tenderQuery = require('../tender_query');
tenderUpdate = require('../tender_update');
states = ['new', 'open', 'assigned', 'resolved', 'pending', 'deleted'];
actions = ['toggle', 'resolve', 'unresolve', 'queue', 'unqueue', 'acknowledge', 'restore', 'changeCategory'];
module.exports = Discussions = (function() {
function Discussions(client) {
this.client = client;
}
Discussions.prototype.get = function(options, callback) {
var _this = this;
this.options = options;
this.buildGetQueryString();
return this.buildGetURI(function(err) {
if (err) {
return callback(err);
}
return tenderQuery(_this.client, _this.options, function(err, data) {
return callback(err, data);
});
});
};
Discussions.prototype.show = function(options, callback) {
this.options = options;
if (!this.options.id) {
return callback(new Error("No discussion Id specified"));
}
this.options.uri = "" + this.client.baseURI + "/discussions/" + this.options.id;
return tenderQuery(this.client, this.options, function(err, data) {
if (err) {
return callback(err);
}
if (!data.length) {
return callback(new Error("Discussion not found"));
}
return callback(null, data[0]);
});
};
Discussions.prototype.post = function(options, callback) {
var _base, _base1, _ref, _ref1,
_this = this;
if (!options.title) {
return callback(new Error("No title specified"));
}
if (!options.body) {
return callback(new Error("No body specified"));
}
this.options = {};
this.options.data = options;
if ((_ref = (_base = this.options.data)["public"]) == null) {
_base["public"] = true;
}
if ((_ref1 = (_base1 = this.options.data).skipSpam) == null) {
_base1.skipSpam = true;
}
return this.buildCreateURI(function(err) {
if (err) {
return callback(err);
}
return tenderUpdate(_this.client, _this.options, function(err, data) {
if (err) {
return callback(err);
}
if (!data) {
return callback(new Error("Error creating discussion"));
}
return callback(null, data);
});
});
};
Discussions.prototype.reply = function(options, callback) {
var _base, _base1, _ref, _ref1;
if (!options.id) {
return callback(new Error("No discussion specified"));
}
if (!options.body) {
return callback(new Error("No body specified"));
}
this.options = {};
this.options.data = options;
this.options.uri = "https://api.tenderapp.com/" + this.client.subdomain + "/discussions/" + options.id + "/comments";
if ((_ref = (_base = this.options.data)["public"]) == null) {
_base["public"] = true;
}
if ((_ref1 = (_base1 = this.options.data).skipSpam) == null) {
_base1.skipSpam = true;
}
return tenderUpdate(this.client, this.options, function(err, data) {
if (err) {
return callback(err);
}
if (!data) {
return callback(new Error("Error commenting discussion"));
}
return callback(null, data);
});
};
Discussions.prototype["delete"] = function(options, callback) {
if (!options.id) {
return callback(new Error("No discussion specified"));
}
this.options = {};
this.options.uri = "https://api.tenderapp.com/" + this.client.subdomain + "/discussions/" + options.id;
this.options.method = "DELETE";
return tenderUpdate(this.client, this.options, function(err, data) {
if (err) {
return callback(err);
}
if (!data) {
return callback(new Error("Error deleting discussion"));
}
return callback(null, data);
});
};
Discussions.prototype.action = function(options, callback) {
var _ref,
_this = this;
if (!options.action) {
return callback(new Error("No action specified"));
}
if (_ref = options.action, __indexOf.call(actions, _ref) < 0) {
return callback(new Error("Invalid action"));
}
if (!options.id) {
return callback(new Error("No discussion specified"));
}
this.options = options;
this.options.qs = {};
return this.buildActionURI(function(err) {
if (err) {
return callback(err);
}
return tenderUpdate(_this.client, _this.options, function(err, data) {
if (err) {
return callback(err);
}
return callback(null, data);
});
});
};
Discussions.prototype.buildActionURI = function(callback) {
var action,
_this = this;
action = morph.toSnake(this.options.action);
this.options.uri = "" + this.client.baseURI + "/discussions/" + this.options.id + "/" + action;
if (action === 'queue' || action === 'unqueue') {
if (!this.options.queue) {
return callback(new Error("No queue specified"));
}
return this.client.getQueues({
name: this.options.queue
}, function(err, data) {
if (err) {
return callback(err);
}
if (!data.length) {
return callback(new Error("Queue not found"));
}
_this.options.qs.queue = data[0].id;
return callback(null);
});
} else if (action === 'change_category') {
if (!this.options.category) {
return callback(new Error("No category specified"));
}
return this.client.getCategories({
name: this.options.category
}, function(err, data) {
if (err) {
return callback(err);
}
if (!data.length) {
return callback(new Error("Category not found"));
}
_this.options.qs.to = data[0].id;
return callback(null);
});
} else {
return callback(null);
}
};
Discussions.prototype.buildCreateURI = function(callback) {
var _this = this;
if (!this.options.data.category) {
return callback(new Error("No category specified"));
}
return this.client.getCategories({
name: this.options.data.category
}, function(err, data) {
if (err) {
return callback(err);
}
if (!data.length) {
return callback(new Error("Category not found"));
}
_this.options.uri = "https://api.tenderapp.com/" + _this.client.subdomain + "/categories/" + data[0].id + "/discussions";
return callback(null);
});
};
Discussions.prototype.buildGetQueryString = function() {
var qs;
qs = {};
if (this.options.userId) {
qs.user_id = this.options.userId;
}
if (this.options.userEmail) {
qs.user_email = this.options.userEmail;
}
if (this.options.sinceDiscussionId) {
qs.since = this.options.sinceDiscussionId;
}
return this.options.qs = qs;
};
Discussions.prototype.buildGetURI = function(callback) {
var postURI, uri, _ref,
_this = this;
uri = this.client.baseURI;
postURI = "";
if (this.options.state && (_ref = this.options.state, __indexOf.call(states, _ref) < 0)) {
return callback(new Error('Invalid discussion state'));
} else if (this.options.state) {
if (this.options.state) {
postURI = "" + this.options.state;
}
}
if (this.options.queue) {
return this.client.getQueues({
pattern: this.options.queue
}, function(err, data) {
if (err) {
return callback(err);
}
if (!data.length) {
return callback(new Error("Queue not found"));
}
_this.options.uri = "" + uri + "/queues/" + data[0].id + "/discussions/" + postURI;
return callback(null);
});
} else if (this.options.category) {
return this.client.getCategories({
name: this.options.category
}, function(err, data) {
if (err) {
return callback(err);
}
if (!data.length) {
return callback(new Error("Category not found"));
}
_this.options.uri = "" + uri + "/categories/" + data[0].id + "/discussions/" + postURI;
return callback(null);
});
} else {
this.options.uri = "" + uri + "/discussions/" + postURI;
return callback(null);
}
};
return Discussions;
})();