ride-data-store
Version:
ridematching transport logistics database
124 lines (118 loc) • 3.36 kB
JavaScript
// 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);