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 queryString = require("query-string"); 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") { url = `https://imex.online`; } else if (process.env.NODE_ENV === "test") { url = `https://test.imex.online`; } else { url = `http://localhost:3000`; } exports.default = async (req, res) => { const params = queryString.parse(req.url.split("?").reverse()[0]); 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?${queryString.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() }, }); };