"user strict";
const request = require("request");
const OAuth = require("oauth-1.0a");
const crypto = require("crypto");
const db = require("../database/eatMyRideDB");
let config = require("../../config.json");
// let Url = config.defaults.urlActivities;
const moment = require("moment");
/**
* Constructor
* @param {} activity
*/
var Activity = function (activity) {
//constructor
};
/**
* Receive ping from Garmin to get data
*
* @param {} req - activity data from Garmin
* @param {} res - Response
*/
Activity.receivePing = function (req, res) {
console.log("/activties post");
console.log("received activities: ", req.body.activities.length);
res.status(200);
res.send("Success!");
};
/**
* Get the activities from an account
*
* @param {} req - User access token & secret
* @param {} res - Response
*/
Activity.getAllActivities = function (req, res) {
// beiden tokens krijg je van de body
let oauth_token_body = req.query.token;
let oauth_secret_body = req.query.secret;
let start_time = req.query.start_date;
let time_end = req.query.end_date;
// function auto generate van de authorization header
const oauth = OAuth({
consumer: {
key: config.garmin.key,
secret: config.garmin.secret,
},
signature_method: "HMAC-SHA1",
hash_function(base_string, key) {
return crypto
.createHmac("sha1", key)
.update(base_string)
.digest("base64");
},
});
// Timestamp
var paramatersObject = {
uploadStartTimeInSeconds: start_time,
uploadEndTimeInSeconds: time_end,
};
// url met methode
const request_data = {
url:
config.url.activities +
"?uploadStartTimeInSeconds=" +
start_time +
"&uploadEndTimeInSeconds=" +
time_end,
method: "GET",
};
// token die we van de params krijgen
var token = {
key: oauth_token_body,
secret: oauth_secret_body,
};
return new Promise(function (resolve, reject) {
request(
{
url:
config.url.activities +
"?uploadStartTimeInSeconds=" +
start_time +
"&uploadEndTimeInSeconds=" +
time_end,
qs: paramatersObject,
method: request_data.method,
headers: oauth.toHeader(oauth.authorize(request_data, token)),
},
function (error, response, body) {
if (error) {
reject(error);
} else {
resolve(JSON.parse(body));
}
}
);
});
};
/**
* Get historic data activities
* @param {} req - User access token & secret + the timeback value (how many times 90 days back)
* @param {} res - Response (empty if successful)
*/
Activity.getHistoricData = async function (req, res) {
// beiden tokens krijg je van de body
let oauth_token_body = req.query.token;
let oauth_secret_body = "";
let start_time = moment().unix();
let time_end = moment().unix();
let time_back_value = parseInt(req.query.timeback) + 1;
await db
.getUserData(oauth_token_body)
.then((res) => {
console.log(
"User from database with token: \n ",
res.rows[0].user_key.replace(/\s+/g, "")
);
oauth_secret_body = res.rows[0].user_secret.replace(/\s+/g, "");
})
.catch((err) => {
console.log(
"No user with token $res.activities.userAccessToken found in database! \n",
err
);
});
for (i = 1; i < time_back_value; i++) {
timeBack(start_time, time_end, i, oauth_token_body, oauth_secret_body);
}
res.status(200);
res.send("Success");
};
/**
* Get historic data activities immediately after the user logins
* @param {} req - User access token & secret + the timeback value (how many times 90 days back)
* @param {} res - Response (empty if successful)
*/
Activity.getHistoricDataAfterLogin = function(token, secret, timeback) {
console.log("token: ", token);
console.log("secret: ", secret)
console.log("timeback :)")
let start_time = moment().unix();
let time_end = moment().unix();
let time_back_value = parseInt(timeback) + 1;
console.log("timeback", time_back_value);
for (i = 1; i < time_back_value; i++) {
timeBack(start_time, time_end, i, token, secret);
}
};
/**
* @param {*} start_time - Start time to retrieve activities (first day)
* @param {*} time_end - End time to retrieve activities (last day)
* @param {*} time_back_value - The number of time periods you want to go back
* @param {*} oauth_token_body - Token that you retrieve from the oAuth1 authentication
* @param {*} oauth_secret_body - Token secret that you retrieve from the oAuth1 authentication
*/
function timeBack(
start_time,
time_end,
time_back_value,
oauth_token_body,
oauth_secret_body
) {
let timeBackStart = moment
.unix(start_time)
.subtract(89 * time_back_value, "days");
let timebackEnd = 0;
if (time_back_value == 1) {
timebackEnd = moment.unix(time_end);
} else {
timebackEnd = moment
.unix(time_end)
.subtract(89 * (time_back_value - 1), "days");
}
// function auto generate van de authorization header
const oauth = OAuth({
consumer: {
key: config.garmin.key,
secret: config.garmin.secret,
},
signature_method: "HMAC-SHA1",
hash_function(base_string, key) {
return crypto
.createHmac("sha1", key)
.update(base_string)
.digest("base64");
},
});
// Timestamp
var paramatersObject = {
summaryStartTimeInSeconds: timeBackStart.unix(),
summaryEndTimeInSeconds: timebackEnd.unix(),
};
// url met methode
const request_data = {
url:
config.url.history +
"?summaryStartTimeInSeconds=" +
timeBackStart.unix() +
"&summaryEndTimeInSeconds=" +
timebackEnd.unix(),
method: "GET",
};
// token die we van de params krijgen
var token = {
key: oauth_token_body,
secret: oauth_secret_body,
};
console.log("make request to url " + request_data.url);
request(
{
url: request_data.url,
qs: paramatersObject,
method: request_data.method,
headers: oauth.toHeader(oauth.authorize(request_data, token)),
},
function (error, response, body) {
if (error) {
reject(error);
} else {
console.log("response backfill: ", body);
}
}
);
}
/**
* Activity Detail ping from Garmin
*
* @param {} req - Ping data from Garmin
* @param {} res - Response
*/
Activity.activityDetailPing = function (req, res) {
console.log("activity detail ping: ", req.body);
res.status(200);
res.send("Success!");
};
/**
* Deregistrate User
*
* @param {} req - User access token & secret
* @param {} res - Response
*/
Activity.deregistration = function (req, res) {
// beiden tokens krijg je van de body
let oauth_token_body = req.query.token;
let oauth_secret_body = req.query.secret;
// function auto generate van de authorization header
const oauth = OAuth({
consumer: {
key: config.garmin.key,
secret: config.garmin.secret,
},
signature_method: "HMAC-SHA1",
hash_function(base_string, key) {
return crypto
.createHmac("sha1", key)
.update(base_string)
.digest("base64");
},
});
// url met methode
const request_data = {
url: config.url.registration,
method: "DELETE",
};
// token die we van de params krijgen
var token = {
key: oauth_token_body,
secret: oauth_secret_body,
};
request(
{
url: config.url.registration,
method: request_data.method,
headers: oauth.toHeader(oauth.authorize(request_data, token)),
},
function (error, response, body) {
res.send(response);
db.removeUser(oauth_token_body); // Haal de user uit de database
}
);
};
/**
* Deregistration confimation ping from Garmin
*
* @param {} req - Ping data from Garmin
* @param {} res - Response
*/
Activity.deregistrationPing = function (req, res) {
console.log(req.body);
res.status(200);
res.send("Success!");
};
module.exports = Activity;