grant-profile
Version:
User profile plugin for Grant
103 lines (90 loc) • 3.61 kB
JavaScript
var request = require('request-compose').extend({
Request: {oauth: require('request-oauth')}
}).client
var profile = require('./config/profile')
var pkg = require('./package.json')
var before = {
arcgis: () => ({qs: {f: 'json'}}),
constantcontact: (data, provider) => ({api_key: provider.key}),
baidu: (data) => ({qs: {access_token: data.access_token}}),
deezer: (data) => ({qs: {access_token: data.access_token}}),
disqus: (data, provider) => ({qs: {api_key: provider.key}}),
dropbox: () => ({method: 'POST'}),
echosign: (data) => ({headers: {'Access-Token': data.access_token}}),
flickr: (data, provider) => ({qs: {method: 'flickr.urls.getUserProfile', api_key: provider.key, format: 'json'}}),
foursquare: (data) => ({qs: {oauth_token: data.access_token}}),
getpocket: (data, provider) => ({json: {consumer_key: provider.key, access_token: data.access_token}}),
instagram: (data, provider) =>
/^\d+$/.test(provider.key)
? {qs: {fields: 'id,account_type,username'}}
: {
url: provider.profile_url || profile.instagram.profile_url_v1,
qs: {access_token: data.access_token}
},
linkedin: (data) => ({headers: {'x-li-format': 'json'}}),
mailchimp: (data) => ({qs: {apikey: data.access_token}}),
meetup: (data) => ({qs: {member_id: 'self'}}),
mixcloud: (data) => ({qs: {access_token: data.access_token}}),
shopify: (data) => ({headers: {'X-Shopify-Access-Token': data.access_token}}),
slack: (data) => ({qs: {token: data.access_token}}),
soundcloud: (data) => ({qs: {oauth_token: data.access_token}}),
stackexchange: (data) => ({qs: {key: data.access_token}}),
stocktwits: (data) => ({qs: {access_token: data.access_token}}),
trello: (data) => ({qs: {key: data.access_token}}),
tumblr: (data) => ({qs: {api_key: data.access_token}}),
vk: (data) => ({qs: {access_token: data.access_token, v: '5.103'}}),
weibo: (data) => ({qs: {access_token: data.access_token}}),
twitter: (data) => ({qs: {user_id: data.raw.user_id}}),
}
var after = {
// incorrect content-type
arcgis: ({res, body}) => JSON.parse(body),
// JSONP
flickr: ({res, body}) => JSON.parse(/^.*\((.*)\)/.exec(body)[1]),
}
module.exports = () => async ({provider, input, output}) => {
if (provider.response && !provider.response.includes('profile')) {
return {provider, input, output}
}
if (!provider.profile_url && (
!profile[provider.name] || !profile[provider.name].profile_url
)) {
output.profile = {error: 'grant-profile: Not implemented!'}
return {provider, input, output}
}
var options = {
method: 'GET',
url: provider.profile_url || profile[provider.name].profile_url,
headers: {'user-agent': `simov/grant-profile/${pkg.version}`},
}
if (provider.subdomain) {
options.url = options.url.replace('[subdomain]', provider.subdomain)
}
if (provider.oauth === 2) {
options.headers.authorization = `Bearer ${output.access_token}`
}
else if (provider.oauth === 1) {
options.oauth = {
consumer_key: provider.key,
consumer_secret: provider.secret,
token: output.access_token,
token_secret: output.access_secret,
}
}
if (before[provider.name]) {
options = Object.assign(options, before[provider.name](output, provider))
}
try {
var body = await request(options)
.then(({res, body}) =>
after[provider.name]
? after[provider.name]({res, body})
: body
)
output.profile = body
}
catch (err) {
output.profile = {error: err.body || err.message}
}
return {provider, input, output}
}