UNPKG

respond-framework

Version:
55 lines (50 loc) 2.34 kB
"use strict"; 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];