Skip to content

Commit

Permalink
sqlite can now be run as its own service
Browse files Browse the repository at this point in the history
  • Loading branch information
MatthewMerrill committed Mar 19, 2019
1 parent 78bfac8 commit 23cdb3b
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 4 deletions.
Empty file removed db.sq
Empty file.
5 changes: 4 additions & 1 deletion hivemind/datastore.js → db/datastore_sqlite.js
Expand Up @@ -18,7 +18,7 @@ function assignRowResult(result, into) {
return into;
}

module.exports.SqliteDataStore = class SqliteDataStore {
module.exports = class SqliteDataStore {

constructor() {
const Database = require('sqlite-async');
Expand Down Expand Up @@ -130,6 +130,9 @@ module.exports.SqliteDataStore = class SqliteDataStore {
WHERE oauth.user_id=?
`,
[userId])
if (profile === undefined) {
return undefined;
}
profile.oauth_services = [];
for (let {provider} of oauths) {
profile.oauth_services.push(provider);
Expand Down
47 changes: 47 additions & 0 deletions db/service.js
@@ -0,0 +1,47 @@
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const session = require('cookie-session');

require('dotenv').config();

const app = express();
app.use(bodyParser.json());

const SqliteDataStore = require('./datastore_sqlite');
db = new SqliteDataStore();
db.initialize(process.env.DB_FILE || './db.sqlite').then(() => {
// I love not having typechecking
const proto = Object.getPrototypeOf(db);
const props = Object.getOwnPropertyNames(proto);
console.log(props);
for (let key of props) {
let fn = db[key];
if (key !== 'constructor' && typeof key === 'string' && typeof fn === 'function') {
app.post(`/${key}`, async (req, res) => {
try {
let args = req.body;
console.log('Processing', key, args);
let ret = await db[key].apply(db, args);
if (ret === undefined) {
res.sendStatus(204);
}
else {
res.send(JSON.stringify(ret));
}
} catch (err) {
console.error(err);
res.sendStatus(500);
}
});
console.log('Routed method', key);
}
else {
console.log('Cannot route for method/property', key);
}
}
const port = process.env.DB_SERVICE_PORT || 3030;
console.log(`DB Service hosted on :${port}`);
app.listen(port);
}).catch(console.error);

File renamed without changes.
42 changes: 39 additions & 3 deletions hivemind/api.js
Expand Up @@ -27,9 +27,45 @@ app.use(session({
}
}));

const datastore = require('./datastore.js');
const db = new datastore.SqliteDataStore();
db.initialize('db.sqlite');
const SqliteDataStore = require('../db/datastore_sqlite.js');
let db;
if (process.env.DB_SERVICE_BASE && process.env.DB_SERVICE_BASE !== '') {
const DB_SERVICE_BASE = process.env.DB_SERVICE_BASE;
const props = Object.getOwnPropertyNames(SqliteDataStore.prototype);
const fetch = require('node-fetch');
db = {};
for (let key of props) {
if (key !== 'constructor' && key !== 'initialize') {
db[key] = async function() {
try {
let args = [...arguments];
console.log(key, JSON.stringify(args));
let res = await fetch(`${DB_SERVICE_BASE}/${key}`, {
method: 'post',
headers: {
'Content-type': 'application/json',
'Accept': 'application/json',
},
body: JSON.stringify(args),
});
if (res.status === 204) {
return undefined;
}
else {
return res.json();
}
} catch (err) {
console.error(err);
throw err;
}
};
}
}
}
else {
db = new SqliteDataStore();
db.initialize('db.sqlite');
}

const webhookHandler = new (require('./webhook_handler.js'))(db);

Expand Down

0 comments on commit 23cdb3b

Please sign in to comment.