dl
Version:
DreamLab Libs
106 lines (98 loc) • 3.74 kB
JavaScript
var JsonRpcMethod = require('core').jsonrpc.JsonRpcMethod,
Request = require('core').http.Request,
Response = require('core').http.Response,
Event = require('core').event.Event,
BinaryData = require('core').data.BinaryData,
OnetHeadersFilter = require('dl').utils.OnetHeadersFilter,
UidManager = require('dl').uid.UidManager;
var QueryMethod = function () {
JsonRpcMethod.apply(this, arguments);
};
QueryMethod.prototype = Object.create(JsonRpcMethod.prototype);
QueryMethod.prototype.execute = function (params) {
var request = new Request(params.request),
response = new Response({
"headers": {
"content-type": "application/json; charset=utf-8"
}
}),
manager = new UidManager(request, response).setClientId('www.onet.pl'),
error = request.getQueryParam('error');
if (error !== null) {
this._handleError(request, response, error);
} else if (request.getQueryParam('code') !== null) {
this._handleAuth(request, response, manager);
} else {
this._handleProfile(request, response, manager);
}
};
QueryMethod.prototype._handleError = function (request, response, error) {
switch (error) {
case 'invalid_request':
case 'unsupported_response_type':
response.setStatusCode(400);
break;
case 'access_denied':
response.setStatusCode(401);
break;
case 'temporarily_unavailable':
response.setStatusCode(503);
break;
default:
response.setStatusCode(500);
}
this._sendResponse(request, response, error);
};
QueryMethod.prototype._handleAuth = function (request, response, manager) {
var that = this;
try {
manager.oauthExchangeToken(function (err) {
if (err) {
response.setStatusCode(err.code == UidManager.Error.INVALID_CODE ? 400 : 503);
that._sendResponse(request, response, err.toJson());
return;
}
that._handleProfile(request, response, manager);
});
} catch (e) {
response.setStatusCode(400);
this._sendResponse(request, response, e.toString());
}
};
QueryMethod.prototype._handleProfile = function (request, response, manager) {
var that = this;
try {
manager.getProfile(request.getUrl(), function (err, data) {
if (err) {
if (err.code == UidManager.Error.INVALID_TOKEN) {
// automatic redirection to OAuth 2.0 Authorization Endpoint
that._sendResponse(request, response);
return;
}
response.setStatusCode(503);
that._sendResponse(request, response, err.toJson());
return;
}
response.setStatusCode(200);
that._sendResponse(request, response, data);
});
} catch (e) {
if (e.message == UidManager.Exception.UNAUTHORIZED) {
// automatic redirection to OAuth 2.0 Authorization Endpoint
this._sendResponse(request, response);
return;
}
response.setStatusCode(503);
this._sendResponse(request, response, e.toString());
}
};
QueryMethod.prototype._sendResponse = function (request, response, body) {
if (body) {
body = new BinaryData(JSON.stringify(body), BinaryData.Encoding.TEXT, BinaryData.CharacterEncoding.UTF8);
response.setBody(body);
response.setHeader("content-length", body.length());
}
OnetHeadersFilter.filter(request, response);
this.dispatchEvent(new Event(JsonRpcMethod.Event.OK, response.toJson()));
};
exports.QueryMethod = QueryMethod;