Files
DiceCloud/app/server/patreon/patreon.js

136 lines
3.7 KiB
JavaScript

import request from 'request';
const CLIENT_ID = "zv38izfGZDf8s_Z9BI5kICjGGnvs45PawHYu6cqsTqftwZ_5DZFqEGKZfdP8Q6I2";
const CLIENT_SECRET = Meteor.settings.patreon.clientSecret;
// Handle redirects from patreon
Router.map(function () {
this.route("patreon-redirect", {
path: "/patreon-redirect",
where: "server",
action: function () {
let route = this;
let userId = route.params.query.state;
let singleUseCode = route.params.query.code;
requestToken(singleUseCode, Meteor.bindEnvironment((error, response, body) => {
// Should return an access token, valid for 1 month, which needs to be
// stored and used to make requests on behalf of the user
if (error){
writePatreonError(userId, error);
return;
}
let token;
try {
token = JSON.parse(body);
writePatreonToken(userId, token);
} catch(error) {
writePatreonError(userId, error);
return;
}
getIdentity(token.access_token, Meteor.bindEnvironment((error, response, body) => {
if (error){
writePatreonError(userId, error);
return;
}
try {
let identity = JSON.parse(body);
let entitledAmount = +identity.included[0].attributes
.currently_entitled_amount_cents;
//TODO also write the patreon userId
writeEntitledCents(userId, entitledAmount);
} catch(error) {
writePatreonError(userId, error);
}
}));
}));
route.response.writeHead(302, {
'Location': Meteor.absoluteUrl() + "account",
});
route.response.end();
},
});
});
const requestToken = function(singleUseCode, callback){
request({
method: "POST",
uri: "https://www.patreon.com/api/oauth2/token",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
qs: {
code: singleUseCode,
grant_type: "authorization_code",
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
redirect_uri: Meteor.absoluteUrl() + 'patreon-redirect',
},
}, callback);
}
// Should return a new access token for the user
// callback is called with (error, response, body)
const refreshAccessToken = function(refreshToken, callback){
request({
method: "POST",
uri: "https://www.patreon.com/api/oauth2/token",
qs: {
grant_type: "refresh_token",
refresh_token: refreshToken,
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
}
}, callback);
};
const getIdentity = function(accessToken, callback){
request({
uri: "https://www.patreon.com/api/oauth2/v2/identity",
headers:{
Authorization: "Bearer " + accessToken,
},
qs: {
"include": "memberships",
"fields[member]": "currently_entitled_amount_cents",
}
}, callback);
};
const writePatreonToken = function(userId, {access_token, refresh_token}){
console.log('Writing token ')
console.log({access_token, refresh_token});
Meteor.users.update(userId, {
$set: {
"patreon.accessToken": access_token,
"patreon.refreshToken": refresh_token,
},
$unset: {
"patreon.error": 1,
},
});
console.log(Meteor.users.findOne(userId).patreon);
};
const writeEntitledCents = function(userId, amount){
console.log('Writing cents ')
console.log(arguments);
Meteor.users.update(userId, {
$set: {
"patreon.entitledCents": amount,
},
$unset: {
"patreon.error": 1,
},
});
console.log(Meteor.users.findOne(userId).patreon);
};
const writePatreonError = function(userId, error){
console.error(error);
Meteor.users.update(userId, {
$set: {
"patreon.error": error.toString(),
},
});
}