UNPKG

mongo2crate

Version:

Sync MongoDB to CrateDB and Convert JSON schema to SQL DDL

48 lines (47 loc) 2.18 kB
import _debug from 'debug'; import _ from 'lodash/fp.js'; import fetch from 'node-fetch'; import { getAuthHeader, getBulkInsertSqlAndArgs, getDeleteByIdSqlAndArgs, getInsertSqlAndArgs, getUpsertSqlAndArgs, maybeShowColTypes, } from './crate/util.js'; const debug = _debug('mongo2crate:crate'); const defaultConfig = { sqlEndpoint: 'http://localhost:4200/_sql' }; export const crate = (config) => { const { sqlEndpoint, auth } = _.defaults(defaultConfig, config); const authHeader = auth && getAuthHeader(auth); debug('Auth header %O', authHeader); const query = async (sql, options) => { const { args, coltypes = false } = options || {}; debug('SQL endpoint - %s', sqlEndpoint); debug('query - sql %s args %O', sql, args); const body = JSON.stringify({ stmt: sql, ...(args && { args }) }); const headers = { 'Content-Type': 'application/json', ...authHeader }; debug('headers - %o', headers); const resp = await fetch(maybeShowColTypes(sqlEndpoint, coltypes), { method: 'post', body, headers, }); return (await resp.json()); }; const insert = (qualifiedName, record) => { const { sql, args } = getInsertSqlAndArgs(qualifiedName, record); return query(sql, { args }); }; const upsert = (qualifiedName, record, update) => { const { sql, args } = getUpsertSqlAndArgs(qualifiedName, record, update); return query(sql, { args }); }; const deleteById = (qualifiedName, id) => { const { sql, args } = getDeleteByIdSqlAndArgs(qualifiedName, id); return query(sql, { args }); }; const bulkInsert = (qualifiedName, records) => { const { sql, args } = getBulkInsertSqlAndArgs(qualifiedName, records); debug('bulkInsert - sql %s bulk_args %O', sql, args); return fetch(sqlEndpoint, { method: 'post', body: JSON.stringify({ stmt: sql, bulk_args: args }), headers: { 'Content-Type': 'application/json', ...authHeader }, }).then((res) => res.json()); }; return { query, insert, upsert, bulkInsert, deleteById }; };