| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 | const CoreClass = require("../core.js");const config = require("config"),    async = require("async");let apiResults = {    access_token: "",    token_type: "",    expires_in: 0,    expires_at: 0,    scope: "",};class SpotifyModule extends CoreClass {    constructor() {        super("spotify");    }    initialize() {        return new Promise((resolve, reject) => {            this.cache = this.moduleManager.modules["cache"];            this.utils = this.moduleManager.modules["utils"];            const client = config.get("apis.spotify.client");            const secret = config.get("apis.spotify.secret");            const OAuth2 = require("oauth").OAuth2;            this.SpotifyOauth = new OAuth2(                client,                secret,                "https://accounts.spotify.com/",                null,                "api/token",                null            );            async.waterfall(                [                    (next) => {                        this.setStage(2);                        this.cache                            .runJob("HGET", { table: "api", key: "spotify" })                            .then((data) => {                                next(null, data);                            })                            .catch(next);                    },                    (data, next) => {                        this.setStage(3);                        if (data) apiResults = data;                        next();                    },                ],                async (err) => {                    if (err) {                        err = await this.utils.runJob("GET_ERROR", {                            error: err,                        });                        reject(new Error(err));                    } else {                        resolve();                    }                }            );        });    }    GET_TOKEN(payload) {        return new Promise((resolve, reject) => {            if (Date.now() > apiResults.expires_at) {                this.runJob("REQUEST_TOKEN").then(() => {                    resolve(apiResults.access_token);                });            } else resolve(apiResults.access_token);        });    }    REQUEST_TOKEN(payload) {        //cb        return new Promise((resolve, reject) => {            async.waterfall(                [                    (next) => {                        this.log(                            "INFO",                            "SPOTIFY_REQUEST_TOKEN",                            "Requesting new Spotify token."                        );                        this.SpotifyOauth.getOAuthAccessToken(                            "",                            { grant_type: "client_credentials" },                            next                        );                    },                    (access_token, refresh_token, results, next) => {                        apiResults = results;                        apiResults.expires_at =                            Date.now() + results.expires_in * 1000;                        this.cache                            .runJob("HSET", {                                table: "api",                                key: "spotify",                                value: apiResults,                                stringifyJson: true,                            })                            .finally(() => {                                next();                            });                    },                ],                () => {                    resolve();                }            );        });    }}module.exports = new SpotifyModule();
 |