UNPKG

duoshuo

Version:
105 lines (97 loc) 2.8 kB
var SDK = require('sdk'); var apis = require('./apis'); var rules = require('./rules'); module.exports = Duoshuo; function Duoshuo(config) { if (!config) return false; if (!config.short_name) return false; this.config = config; this.sdk = new SDK('https://api.duoshuo.com', apis, rules(config)); } /** * * Duoshuo#auth * 使用code换取access_token与用户ID * **/ Duoshuo.prototype.auth = function(code, callback) { if (!code) return callback(new Error('code is required')); if (typeof(code) !== 'string') return callback(new Error('code must be string')); if (!callback || typeof(callback) !== 'function') return callback(new Error('callback is required')); var query = {}; query.form = {}; query.form.code = code; query.form.client_id = this.config.short_name; return this.sdk.token(query, callback); }; /** * * Duoshuo#signin() * Signin middleware: express/connect等框架可直接使用此middleware * **/ Duoshuo.prototype.signin = function() { var self = this; return function(req, res, next) { self.auth(req.query.code, function(err, result) { if (err) return next(err); res.locals.duoshuo = result; return next(); }); } } /** * * Duoshuo#getClient * 获取一个Duoshuo.Client实例 * **/ Duoshuo.prototype.getClient = function(access_token) { if (!access_token) return false; return new Duoshuo.Client(this.sdk, access_token); }; /** * * Duoshuo#Client * 构造一个Duoshuo.Client实例, * Duoshuo.Client用于在拥有access token的情况下访问多说接口 **/ Duoshuo.Client = function(sdk, access_token) { this.access_token = access_token; this.init(sdk); }; Duoshuo.Client.prototype.init = function(sdk) { var self = this; // init build-in method ['get','post','put','delete'].forEach(function(buildInMethod){ self[buildInMethod] = function(url, params, callback) { var data = params; if (buildInMethod === 'post') { if (!data.form) data.form = {}; data.form.access_token = self.access_token; } if (buildInMethod === 'get') { if (!data.qs) data.qs = {}; data.qs.access_token = self.access_token; } return sdk[buildInMethod](url, data, callback); }; }); // init custom api and inject `access_token` Object.keys(apis).forEach(function(key) { if (key === 'token') return false; self[key] = function(params, callback) { var method = apis[key].method; var data = {}; if (method === 'post') { data.form = params.form || params; data.form.access_token = self.access_token; } if (method === 'get') { data.qs = params.qs || params; data.qs.access_token = self.access_token; } return sdk[key](data, callback); } }); };