@agnostack/next-shopify
Version:
Please contact agnoStack via info@agnostack.com for any questions
143 lines • 8.01 kB
JavaScript
;
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