Source: model/activities.js

"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;