hasura-node-types
Version:
Add Hasura types, event trigger and action wrapper for common web frameworks
137 lines • 5.89 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateScheduledTriggerPayload = exports.validateEventPayload = exports.validateActionPayload = exports.printLog = exports.getEventUserRole = exports.getEventUserID = exports.getActionUserRole = exports.getActionUserID = exports.defaultLogger = void 0;
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
const types_1 = require("./types");
const LEVEL_INFO = "info";
const LEVEL_DEBUG = "debug";
const LEVEL_WARN = "warn";
const LEVEL_ERROR = "error";
exports.defaultLogger = {
log: console.log,
debug: console.debug,
info: console.log,
warn: console.warn,
error: console.error,
};
// common getters for actions
function getActionUserID(payload) {
return payload.session_variables
? payload.session_variables[types_1.XHasuraUserID]
: null;
}
exports.getActionUserID = getActionUserID;
function getActionUserRole(payload) {
return payload.session_variables
? payload.session_variables[types_1.XHasuraRole]
: null;
}
exports.getActionUserRole = getActionUserRole;
// common getters for event trigger
function getEventUserID(payload) {
return payload.event && payload.event.session_variables
? payload.event.session_variables[types_1.XHasuraUserID]
: null;
}
exports.getEventUserID = getEventUserID;
function getEventUserRole(payload) {
return payload.event && payload.event.session_variables
? payload.event.session_variables[types_1.XHasuraRole]
: null;
}
exports.getEventUserRole = getEventUserRole;
function printLog(logger, payload) {
if (logger.log && typeof logger.log === "function") {
// print general log, support bunyan and console.log
return logger.log(payload);
}
const level = !payload.level
? "info"
: [LEVEL_INFO, LEVEL_DEBUG, LEVEL_WARN, LEVEL_ERROR].includes(payload.level)
? payload.level
: "info";
return logger[level](payload);
}
exports.printLog = printLog;
function assert(isPassed, message) {
if (!isPassed) {
throw new types_1.HasuraActionError({
message,
extensions: {
code: types_1.VALIDATION_ERROR,
},
});
}
}
function preValidateBody(payload) {
assert(payload && typeof payload === "object" && !Array.isArray(payload), "empty or invalid body. Did you use `body-parser` json middleware?");
return payload;
}
function assertObject(input, message) {
assert(input && typeof input === "object" && !Array.isArray(input), message);
}
function isValidDate(d) {
if (!d) {
return false;
}
switch (typeof d) {
case "string":
case "number":
return !isNaN(new Date(d).getTime());
case "object":
return d instanceof Date && !isNaN(new Date(d).getTime());
default:
return false;
}
}
function validateActionPayload(input) {
var _a;
const payload = preValidateBody(input);
assert(!!((_a = payload.action) === null || _a === void 0 ? void 0 : _a.name), "empty hasura action name");
assert(!!(payload.session_variables && payload.session_variables[types_1.XHasuraRole]), "invalid session_variables; user role property exists by default");
assertObject(payload.input, "invalid action input");
return payload;
}
exports.validateActionPayload = validateActionPayload;
function validateEventPayload(input) {
var _a, _b, _c, _d;
const payload = preValidateBody(input);
assert(!!payload.id, "empty hasura event trigger id");
assert(!!((_a = payload.trigger) === null || _a === void 0 ? void 0 : _a.name), "empty hasura event trigger name");
assert(!!(((_b = payload.table) === null || _b === void 0 ? void 0 : _b.name) && ((_c = payload.table) === null || _c === void 0 ? void 0 : _c.schema)), "empty hasura event trigger table");
assert(isValidDate(payload.created_at), "created_at is invalid date");
assert(!!(((_d = payload.event) === null || _d === void 0 ? void 0 : _d.session_variables) &&
payload.event.session_variables[types_1.XHasuraRole]), "invalid session_variables; user role exists by default");
assertObject(payload.event.data, "invalid event data");
switch (payload.event.op) {
case types_1.INSERT:
assert(!payload.event.data.old, "old data of INSERT event must be null");
assertObject(payload.event.data.new, "new data of INSERT event must be an object");
break;
case types_1.UPDATE:
assertObject(payload.event.data.old, "old data of UPDATE event must be an object");
assertObject(payload.event.data.new, "new data of UPDATE event must be an object");
break;
case types_1.DELETE:
assertObject(payload.event.data.old, "old data of DELETE event must be an object");
assert(!payload.event.data.new, "new data of DELETE event must be null");
break;
case types_1.MANUAL:
assert(!payload.event.data.old, "old data of MANUAL event must be null");
assertObject(payload.event.data.new, "new data of MANUAL event must be an object");
break;
default:
assert(false, `invalid Hasura event trigger operation: ${payload.event.op}`);
}
return payload;
}
exports.validateEventPayload = validateEventPayload;
function validateScheduledTriggerPayload(input) {
const payload = preValidateBody(input);
assert(!!payload.id, "empty hasura scheduled trigger id");
assert(!!payload.name, "empty hasura scheduled trigger name");
assert(isValidDate(payload.scheduled_time), `scheduled_time is invalid: ${payload.scheduled_time}`);
return payload;
}
exports.validateScheduledTriggerPayload = validateScheduledTriggerPayload;
//# sourceMappingURL=utils.js.map