Scribe.js/asr/viewer/libs/MongoDB.js
2016-01-22 08:22:11 -06:00

76 lines
No EOL
2.1 KiB
JavaScript

import minimongo from 'minimongo'
import _ from 'underscore'
import request from 'superagent'
import querystring from 'querystring'
function JQueryHttpClient(method, url, params, data, success, error) {
url = `${url}?${querystring.stringify(params)}`;
let req;
if (method === 'GET') {
req = request.get(url);
} else if (method === 'DELETE') {
req = request.delete(url);
} else if (method === 'POST') {
req = request.post(url);
} else if (method === 'PATCH') {
req = request.patch(url);
} else {
throw new Error('Method undefined');
}
req.send(JSON.stringify(data));
req.end((err, res) => {
if (err) return error(err);
return success(res.body.docs || []);
}).on('progress', e => console.log('Percentage done: ', e.percent));
}
export default class MongoDB {
constructor(url = 'rest/', namespace = 'scribe', client = 'webapp') {
this.url = url;
this.namespace = namespace;
this.client = client;
this.remoteDb = new minimongo.RemoteDb(url, client, JQueryHttpClient);
}
init() {
return new Promise((resolve, reject) => {
new minimongo.MemoryDb({namespace: this.namespace}, localDb => {
const hybridDb = new minimongo.HybridDb(localDb, this.remoteDb);
let type;
if (localDb instanceof minimongo.IndexedDb) {
type = 'IndexedDb';
} else if (localDb instanceof minimongo.LocalStorageDb) {
type = 'LocalStorageDb';
} else if (localDb instanceof minimongo.MemoryDb) {
type = 'MemoryDb';
} else if (localDb instanceof minimongo.WebSQLDb) {
type = 'WebSQLDb';
} else {
throw new Error('Can\'t identify db');
}
this.hybridDb = hybridDb;
resolve(hybridDb, type)
}, reject);
});
}
addCollection(col) {
return new Promise((resolve, reject)=> {
this.hybridDb.localDb.addCollection(col, ()=> {
this.hybridDb.remoteDb.addCollection(col, ()=> {
this.hybridDb.addCollection(col, {shortcut: true, interim: false}, err => {
if (err) return reject(err);
resolve();
});
});
});
});
}
}