respond-framework
Version:
create as fast you think
55 lines (50 loc) • 2.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createApiHandler;
var _constants = require("../helpers/constants.js");
var _fetch2 = require("../helpers/fetch.js");
var _revive = require("./helpers/revive.js");
var _flattenDatabase = require("../db/helpers/flattenDatabase.js");
function createApiHandler({
db,
log = _constants.isServer,
context = {}
}) {
// used in this file on the client + wrapped within a thin express handler on the server in createApi.js
const modelsByBranchType = (0, _flattenDatabase.flattenModels)(db);
const branches = (0, _flattenDatabase.default)(db);
return async (req, res) => {
req = revive(modelsByBranchType, req);
const {
table,
method,
focusedBranch,
branch
} = req.body;
if (log) console.log(`request.request: db.${table}.${method}`, req.body);
const Table = resolveTable(branches, focusedBranch, branch, table); // eg: branches['admin.foo'].user
if (!Table) return res.json({
error: 'table-absent',
params: req.body
});
const respo = await Table.clone().makeRequest(req, context);
if (log) console.log(`respond.response: db.${table}.${method}`, ...(_constants.isDev ? [] : [req.body, '=>']), respo); // during prod, other requests might come thru between requests, so response needs to be paired with request (even tho we already logged request)
const response = respo === undefined ? _fetch2.__undefined__ : respo;
return res.json(response);
};
}
const revive = (modelsByBranchType, req) => {
req = _constants.isServer ? req : JSON.parse(JSON.stringify(req)); // simulate passing from client to server in dev
const eventsByType = typeof window == 'undefined' ? {} : window.state?.respond.eventsByType; // todo: when ssr is ready, grab eventsByType the correct way
req.body = (0, _revive.reviveApiServer)({
modelsByBranchType,
eventsByType
})(req.body);
req.body.args = (0, _fetch2.argsOut)(req.body.args); // convert '__undefined__' to undefined
return req;
};
const resolveTable = (db, fb, branch, table) => fb === branch // may need to use original db without props
? db[branch].original[table] // use original for top focused db, as props variant is stored in branches at branches[fb][table] (absolute top w)
: db[branch][table];