const path = require("path"); require("dotenv").config({ path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`) }); const logger = require("../../utils/logger"); const OAuthClient = require("intuit-oauth"); const client = require("../../graphql-client/graphql-client").client; const queries = require("../../graphql-client/queries"); const { parse, stringify } = require("querystring"); const InstanceManager = require("../../utils/instanceMgr").default; const oauthClient = new OAuthClient({ clientId: process.env.QBO_CLIENT_ID, clientSecret: process.env.QBO_SECRET, environment: process.env.NODE_ENV === "production" ? "production" : "sandbox", redirectUri: process.env.QBO_REDIRECT_URI, logging: true }); let url; if (process.env.NODE_ENV === "production") { //TODO:AIO Add in QBO callbacks. url = InstanceManager({ imex: `https://imex.online`, rome: `https://romeonline.io` }); } else if (process.env.NODE_ENV === "test") { url = InstanceManager({ imex: `https://test.imex.online`, rome: `https://test.romeonline.io` }); } else { url = `http://localhost:3000`; } exports.default = async (req, res) => { const queryString = req.url.split("?").reverse()[0]; const params = parse(queryString); try { logger.log("qbo-callback-create-token", "DEBUG", params.state, null, null); const authResponse = await oauthClient.createToken(req.url); if (authResponse.json.error) { logger.log("qbo-callback-error", "ERROR", params.state, null, { error: authResponse.json }); res.redirect(`${url}/manage/accounting/qbo?error=${encodeURIComponent(JSON.stringify(authResponse.json))}`); } else { await client.request(queries.SET_QBO_AUTH_WITH_REALM, { email: params.state, qbo_auth: { ...authResponse.json, createdAt: Date.now() }, qbo_realmId: params.realmId }); logger.log("qbo-callback-create-token-success", "DEBUG", params.state, null, null); res.redirect(`${url}/manage/accounting/qbo?${stringify(params)}`); } } catch (e) { logger.log("qbo-callback-error", "ERROR", params.state, null, { error: e }); res.status(400).json(e); } }; exports.refresh = async (oauthClient, req) => { try { // logger.log("qbo-token-refresh", "DEBUG", req.user.email, null, null); const authResponse = await oauthClient.refresh(); await client.request(queries.SET_QBO_AUTH, { email: req.user.email, qbo_auth: { ...authResponse.json, createdAt: Date.now() } }); } catch (error) { logger.log("qbo-token-refresh-error", "ERROR", req.user.email, null, { error }); } }; exports.setNewRefreshToken = async (email, apiResponse) => { //logger.log("qbo-token-updated", "DEBUG", email, null, null); await client.request(queries.SET_QBO_AUTH, { email, qbo_auth: { ...apiResponse.token, createdAt: Date.now() } }); };