UNPKG

orange-orm

Version:

Object Relational Mapper

120 lines (105 loc) 3.57 kB
const getTSDefinition = require('./getTSDefinition'); // let hostLocal = _hostLocal; const getMeta = require('./hostExpress/getMeta'); function hostExpress(hostLocal, client, options = {}) { if ('db' in options && (options.db ?? undefined) === undefined || !client.db) throw new Error('No db specified'); const dbOptions = { db: options.db || client.db }; let c = {}; const readonly = { readonly: options.readonly}; for (let tableName in client.tables) { c[tableName] = hostLocal({ ...dbOptions, ...readonly, ...options[tableName], table: client.tables[tableName], isHttp: true, client }); } async function handler(req, res) { if (req.method === 'POST') return post.apply(null, arguments); if (req.method === 'PATCH') return patch.apply(null, arguments); if (req.method === 'GET') return get.apply(null, arguments); if (req.method === 'OPTIONS') return handleOptions(req, res); // assuming the second argument is `response` else res.status(405).set('Allow', 'GET, POST, PATCH, OPTIONS').send('Method Not Allowed'); } handler.db = handler; handler.dts = get; function get(request, response) { try { if (request.query.table) { if (!(request.query.table in c)) { let e = new Error('Table is not exposed or does not exist'); // @ts-ignore e.status = 400; throw e; } const result = getMeta(client.tables[request.query.table]); response.setHeader('content-type', 'text/plain'); response.status(200).send(result); } else { const isNamespace = request.query.isNamespace === 'true'; let tsArg = Object.keys(c).map(x => { return { table: client.tables[x], customFilters: options?.tables?.[x].customFilters, name: x }; }); response.setHeader('content-type', 'text/plain'); response.status(200).send(getTSDefinition(tsArg, { isNamespace, isHttp: true })); } } catch (e) { if (e.status === undefined) response.status(500).send(e.message || e); else response.status(e.status).send(e.message); } } async function patch(request, response) { try { response.json(await c[request.query.table].patch(request.body, request, response)); } catch (e) { if (e.status === undefined) response.status(500).send(e.message || e); else response.status(e.status).send(e.message); } } async function post(request, response) { try { if (!request.query.table) { let e = new Error('Table not defined'); // @ts-ignore e.status = 400; throw e; } else if (!(request.query.table in c)) { let e = new Error('Table is not exposed or does not exist'); // @ts-ignore e.status = 400; throw e; } response.json(await c[request.query.table].post(request.body, request, response)); } catch (e) { if (e.status === undefined) response.status(500).send(e.message || e); else response.status(e.status).send(e.message); } } function handleOptions(req, response) { response.setHeader('Access-Control-Allow-Origin', '*'); // Adjust this as per your CORS needs response.setHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, OPTIONS'); // And any other methods you support response.setHeader('Access-Control-Allow-Headers', 'Content-Type'); // And any other headers you expect in requests response.setHeader('Access-Control-Max-Age', '86400'); // Cache preflight request for a day. Adjust as you see fit response.status(204).send(); // 204 No Content response for successful OPTIONS requests } return handler; } module.exports = hostExpress;