UNPKG

@agnostack/next-shopify

Version:

Please contact agnoStack via info@agnostack.com for any questions

143 lines • 8.01 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.handleGraph = void 0; const shopify_api_1 = require("@shopify/shopify-api"); const verifyd_1 = require("@agnostack/verifyd"); const utils_1 = require("../../../utils"); const shared_1 = require("../../../../shared"); const handleGraph = (serverRuntimeConfig, data) => { const _getVerificationHelpers = (0, verifyd_1.getVerificationHelpers)(serverRuntimeConfig); const { returnResponse = true } = data !== null && data !== void 0 ? data : {}; return (req, res, params) => __awaiter(void 0, void 0, void 0, function* () { var _a, _b; const handleResponse = (body, statusCode = 200) => { if (returnResponse) { return res.status(statusCode).json(body); } return { statusCode, body }; }; let requestBody; let processResponse; try { ({ requestBody, processResponse } = yield _getVerificationHelpers(req)); } catch (error) { if (error instanceof verifyd_1.VerificationError) { return handleResponse(Object.assign({ message: error.message }, error.data), error.code); } return handleResponse({ message: 'Verification error' }, 403); } const _c = (_a = req.query) !== null && _a !== void 0 ? _a : {}, { shop, apiVersion } = _c, _query = __rest(_c, ["shop", "apiVersion"]); const _d = params !== null && params !== void 0 ? params : (0, shared_1.safeParse)(requestBody || '{}'), { isOnline, query: graphQuery, variables: graphVariables, transform = (_data) => _data } = _d, graphParams = __rest(_d, ["isOnline", "query", "variables", "transform"]); let query = _query; if ((0, shared_1.isType)(query, 'string')) { query = (0, shared_1.querystringToObject)(query); } if ((0, shared_1.stringEmpty)(shop) || (0, shared_1.stringEmpty)(graphQuery)) { return handleResponse({ message: 'Invalid arguments' }, 400); } let statusCode; let response; let headers; let message = 'Error handling query call'; try { const { getVerifiedClients } = yield (0, utils_1.getShopifyHelpers)(serverRuntimeConfig, { shop }); const { Graphql } = yield getVerifiedClients({ req, res, shop, apiVersion, isOnline }); response = yield Graphql.request(graphQuery, Object.assign(Object.assign(Object.assign({}, (0, shared_1.objectNotEmpty)(graphVariables) && { variables: graphVariables }), (0, shared_1.objectNotEmpty)(query) && { query }), graphParams)); statusCode = 200; } catch (error) { statusCode = 500; // TODO: clean up to share between rest and graph (pr at least keep in sync) switch (true) { case error instanceof shared_1.ShopifySessionAuthenticationError: { console.error(`${message}. Authentication Error.`, error); statusCode = 401; message = 'Unauthorized'; // HMMMM, should this be: // message = `${message}. Authentication Error - ${errroResponse.message}.` headers = { // TODO ensure this is working once upgraded to AppBridge v4 'X-Shopify-Retry-Invalid-Session-Request': '1', }; break; } case error instanceof shared_1.ShopifyAuthenticationError: { console.error(`${message}. Authentication Error.`, error); const errorResponse = (0, utils_1.getAuthErrorResponse)(serverRuntimeConfig, { error, shop }); statusCode = errorResponse.statusCode; message = errorResponse.message; // HMMMM, should this be: // message = `${message}. Authentication Error - ${errroResponse.message}.` headers = errorResponse.headers; break; } case error instanceof shopify_api_1.BillingError: { // HMMMM, should this be: // message = `${message}. Billing Error - ${error.message}.` console.error(`${message}. Billing Error - ${error.message}.`, error.errorData); statusCode = 402; if (error === null || error === void 0 ? void 0 : error.message) { message = error.message; } break; } case error instanceof shopify_api_1.GraphqlQueryError: { const errorMessages = (0, shared_1.ensureArray)((_b = error.response) === null || _b === void 0 ? void 0 : _b.errors).map(({ message }) => (0, shared_1.ensureString)(message)); console.error(`${message}. ${errorMessages.join('. ')}.`); // HMMMM, should this be: // message = `${message}. ${errorMessages.join('. ')}.` // TODO: why are these not sending back different error codes? break; } default: { console.error(`${message}. HandleGraph Error - ${error.message}.`); break; } } } try { Object.entries((0, shared_1.ensureObject)(headers)).forEach(([key, value]) => { res.setHeader(key, value); }); if (!(response === null || response === void 0 ? void 0 : response.data)) { return handleResponse({ message }, statusCode); } const responseBody = (0, shared_1.ensureObject)(response.data); const [_responseData] = Object.values(responseBody); const _e = (0, shared_1.ensureObject)(_responseData), { userErrors } = _e, responseData = __rest(_e, ["userErrors"]); if ((0, shared_1.arrayNotEmpty)(userErrors)) { const errorMessages = (0, shared_1.ensureArray)(userErrors).map(({ message }) => (0, shared_1.ensureString)(message)); return handleResponse({ message: `${message}. ${errorMessages.join('. ')}.` }, 500); } // NOTE: sending in both to transform in case someone needs the userErrors and/or multi-value query return handleResponse(yield processResponse(transform(responseData, responseBody)), statusCode); } catch (error) { console.error(`${message}. Transformation Error.`, error); return handleResponse({ message }, 500); } }); }; exports.handleGraph = handleGraph; //# sourceMappingURL=graph.js.map