mongo2crate
Version:
Sync MongoDB to CrateDB and Convert JSON schema to SQL DDL
48 lines (47 loc) • 2.18 kB
JavaScript
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 };
};