UNPKG

ride-data-store

Version:

ridematching transport logistics database

124 lines (118 loc) 3.36 kB
// Generated by CoffeeScript 1.12.7 (function() { var crypt, generateId, stream; crypt = require('crypto'); stream = require('stream'); generateId = function() { return crypt.randomBytes(7).toString('hex') + new Date().getTime(); }; module.exports = function(placeDB, rideDB) { var find, get, prepare, resolveRoute; resolveRoute = function(ride, cb) { return placeDB.lookup(ride != null ? ride.from : void 0, function(from) { if (from.error) { return cb(from); } return placeDB.lookup(ride != null ? ride.to : void 0, function(to) { if (to.error) { return cb(to); } return cb(from.name + "/" + to.name + "/"); }); }); }; prepare = function(ride, cb) { return resolveRoute(ride, function(route) { if (route.error) { return cb(route); } ride.route = route; if (ride.id) { return get(ride.id, function(r) { rideDB.del(route + r.type + "/" + r.time + "/" + r.id); if (!ride.status) { ride.status = r.status; } if (!ride.price) { ride.price = r.price; } if (!ride.time) { ride.time = r.time; } if (!ride.type) { ride.type = r.type; } return cb(ride); }); } else { ride.id = generateId(); if (!ride.type) { ride.type = "offer"; } if (!ride.status) { ride.status = "new"; } if (!ride.time) { ride.time = new Date().getTime(); } return cb(ride); } }); }; return { save: function(ride, cb) { return prepare(ride, function(r) { var key; if (r.error) { return cb(r); } key = r.route + r.type + "/" + r.time + "/" + r.id; if (ride.status === "public") { rideDB.put(key, JSON.stringify(ride) + "\n"); } return rideDB.put("id:" + ride.id, JSON.stringify(ride), function(err) { return cb(ride); }); }); }, get: get = function(id, cb) { return rideDB.get("id:" + id, function(err, ride) { if (ride) { return cb(JSON.parse(ride)); } else { return cb(null); } }); }, find: find = function(query, cb) { return resolveRoute(query, function(route) { if (route.error) { return cb(new stream.Readable({ read: function() { return this.push(null); } })); } else { route += (query.type || "offer") + "/"; if (query.time) { return cb(rideDB.createValueStream({ gte: route + query.time, lt: route + "~", reverse: true })); } else { return cb(rideDB.createValueStream({ gte: route, lt: route + "~" })); } } }); }, close: function() { rideDB.close(); return placeDB.close(); } }; }; }).call(this);