Source: model/activity_files.js

"user strict";

const request = require("request");
const OAuth = require("oauth-1.0a");
const crypto = require("crypto");
const fs = require("fs-extra");
let config = require("../../config.json");
const db = require("../database/eatMyRideDB");

/**
 * Receive activity files from Garmin
 *
 * @param  {} req - Request data from Garmin contains FIT file callback
 * @param  {} res
 */
exports.getActivityFiles = async function (req, res) {
  console.log("/activity_files post");
  console.log("Received " + req.body.activityFiles.length + "activity files");
  let activityFiles = req.body.activityFiles;

  const waitFor = (ms) => new Promise((r) => setTimeout(r, ms)); // wat is dit

  activityFiles.forEach(async (file) => {
    await waitFor(50); // wait 50ms before executing
    let oauth_token_body = file.userAccessToken;
    let oauth_secret_body = "";

    // get the user information needed for request
    await db
      .getUserData(oauth_token_body)
      .then((res) => {
        oauth_secret_body = res.rows[0].user_secret;
      })
      .catch((err) => {
        console.log(
          "No user with token $res.activities.userAccessToken found in database! \n",
          err
        );
      });

    // function auto generate van de authorization header. for getting the fitfile
    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: file.callbackURL,
      method: "GET",
    };

    // token die we van de params krijgen
    var token = {
      key: oauth_token_body,
      secret: oauth_secret_body,
    };

    request(
      {
        url: file.callbackURL,
        method: request_data.method,
        headers: oauth.toHeader(oauth.authorize(request_data, token)),
      },
      function (error, response, body) {
        if (error) {
          reject(error);
        } else {
          fs.outputFile(
            "./data/" + file.userAccessToken + "/" + file.summaryId + ".FIT",
            {},
            (err) => {
              if (err) throw err;
              db.saveLog(file.summaryId, file.userId, file.fileType); // save log to database
            }
          );
          console.log("New File created");
        }
      }
    );
  });

  res.status(200);
  res.send("Success");
};