kopia lustrzana https://github.com/FacilMap/facilmap
Migrating from mongoose to sequelize, introducing types
rodzic
07d1859154
commit
954be66c7f
|
@ -171,6 +171,7 @@
|
|||
$scope.markers = { };
|
||||
$scope.lines = { };
|
||||
$scope.views = { };
|
||||
$scope.types = { };
|
||||
$scope.dialog = null;
|
||||
$scope.dialogError = null;
|
||||
$scope.saveViewName = null;
|
||||
|
@ -192,7 +193,7 @@
|
|||
|
||||
$scope.onMove = function() {
|
||||
if($scope.currentMarker)
|
||||
$scope.currentMarker.xy = fp.posToXy($scope.currentMarker.position);
|
||||
$scope.currentMarker.xy = fp.posToXy($scope.currentMarker);
|
||||
if($scope.currentLine && $scope.currentLine.clickPos)
|
||||
$scope.currentLine.clickXy = fp.posToXy($scope.currentLine.clickPos);
|
||||
};
|
||||
|
@ -297,7 +298,14 @@
|
|||
$scope.onMove();
|
||||
}.fpWrapApply($scope));
|
||||
|
||||
$scope.addMarker = function() {
|
||||
$scope.addObject = function(type) {
|
||||
if(type.type == "marker")
|
||||
$scope.addMarker(type);
|
||||
else if(type.type == "line")
|
||||
$scope.addLine(type);
|
||||
};
|
||||
|
||||
$scope.addMarker = function(type) {
|
||||
var message = $scope.showMessage("info", "Please click on the map to add a marker.", [
|
||||
{ label: "Cancel", click: function() {
|
||||
$scope.closeMessage(message);
|
||||
|
@ -307,7 +315,7 @@
|
|||
var listener = fp.addClickListener(function(pos) {
|
||||
$scope.closeMessage(message);
|
||||
|
||||
socket.emit("addMarker", { position: { lon: pos.lon, lat: pos.lat } }, function(err, marker) {
|
||||
socket.emit("addMarker", { lon: pos.lon, lat: pos.lat, typeId: type.id }, function(err, marker) {
|
||||
if(err)
|
||||
return $scope.showMessage("error", err);
|
||||
|
||||
|
@ -339,7 +347,7 @@
|
|||
var listener = fp.addClickListener(function(pos) {
|
||||
$scope.closeMessage(message);
|
||||
|
||||
socket.emit("editMarker", { id: marker.id, position: pos }, function(err) {
|
||||
socket.emit("editMarker", { id: marker.id, lat: pos.lat, lon: pos.lon }, function(err) {
|
||||
if(err)
|
||||
return $scope.showMessage("error", err);
|
||||
|
||||
|
@ -355,8 +363,11 @@
|
|||
});
|
||||
};
|
||||
|
||||
$scope.addLine = function() {
|
||||
socket.emit("addLine", { points: [ ] }, function(err, line) {
|
||||
$scope.addLine = function(type) {
|
||||
socket.emit("addLine", { points: [ ], typeId: type.id }, function(err, line) {
|
||||
if(err)
|
||||
return $scope.showMessage("error", err);
|
||||
|
||||
line.actualPoints = [ ];
|
||||
$scope.currentLine = line;
|
||||
var message = $scope.showMessage("info", "Please click on the map to draw a line. Double-click to finish it.", [
|
||||
|
@ -474,7 +485,7 @@
|
|||
return $scope.dialogError = err;
|
||||
|
||||
if(makeDefault) {
|
||||
socket.emit("editPad", { defaultView: view.id }, function(err) {
|
||||
socket.emit("editPad", { defaultViewId: view.id }, function(err) {
|
||||
if(err)
|
||||
return $scope.dialogError = err;
|
||||
|
||||
|
@ -489,7 +500,7 @@
|
|||
};
|
||||
|
||||
$scope.setDefaultView = function(view) {
|
||||
socket.emit("editPad", { defaultView: view.id }, function(err) {
|
||||
socket.emit("editPad", { defaultViewId: view.id }, function(err) {
|
||||
if(err)
|
||||
$scope.dialogError = err;
|
||||
});
|
||||
|
@ -502,6 +513,14 @@
|
|||
});
|
||||
};
|
||||
|
||||
$scope.editType = function(type) {
|
||||
// TODO
|
||||
};
|
||||
|
||||
$scope.removeType = function(type) {
|
||||
// TODO
|
||||
};
|
||||
|
||||
$scope.copyPad = function() {
|
||||
socket.emit("copyPad", { toId: $scope.copyPadId }, function(err) {
|
||||
if(err) {
|
||||
|
@ -670,6 +689,14 @@
|
|||
$scope.padData.defaultViewId = null;
|
||||
});
|
||||
|
||||
socket.on("type", function(data) {
|
||||
$scope.types[data.id] = data;
|
||||
});
|
||||
|
||||
socket.on("deleteType", function(data) {
|
||||
delete $scope.types[data.id];
|
||||
});
|
||||
|
||||
socket.on("disconnect", function() {
|
||||
$scope.error = $scope.showMessage("error", "The connection to the server was lost.");
|
||||
$scope.markers = { };
|
||||
|
|
|
@ -164,15 +164,16 @@ var FacilPad = {
|
|||
}
|
||||
|
||||
fp.getCurrentView = function() {
|
||||
var ret = {
|
||||
view: fp.map.getExtent().clone().transform(fp.map.getProjectionObject(), _p()),
|
||||
baseLayer: fp.map.baseLayer.permalinkName,
|
||||
layers: [ ]
|
||||
};
|
||||
var ret = fp.map.getExtent().clone().transform(fp.map.getProjectionObject(), _p());
|
||||
|
||||
ret.baseLayer = fp.map.baseLayer.permalinkName;
|
||||
ret.layers = [ ];
|
||||
|
||||
for(var i=0; i<fp.map.layers.length; i++) {
|
||||
if(!fp.map.layers[i].isBaseLayer && fp.map.layers[i].displayInLayerSwitcher && fp.map.layers[i].visibility)
|
||||
ret.layers.push(fp.map.layers[i].permalinkName || fp.map.layers[i].name);
|
||||
}
|
||||
|
||||
return ret;
|
||||
};
|
||||
|
||||
|
@ -180,7 +181,7 @@ var FacilPad = {
|
|||
if(view == null) {
|
||||
fp.map.zoomToMaxExtent();
|
||||
} else {
|
||||
var bbox = OpenLayers.Bounds.prototype.clone.apply(view.view).transform(_p(), fp.map.getProjectionObject());
|
||||
var bbox = OpenLayers.Bounds.prototype.clone.apply(view).transform(_p(), fp.map.getProjectionObject());
|
||||
fp.map.zoomToExtent(bbox);
|
||||
|
||||
var matching_layers = fp.map.getLayersBy("permalinkName", view.baseLayer);
|
||||
|
@ -206,7 +207,7 @@ var FacilPad = {
|
|||
graphicXOffset: -9,
|
||||
graphicYOffset: -25
|
||||
};
|
||||
var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(marker.position.lon, marker.position.lat).transform(_p(), fp.map.getProjectionObject()), null, style);
|
||||
var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(marker.lon, marker.lat).transform(_p(), fp.map.getProjectionObject()), null, style);
|
||||
feature.fpMarker = marker;
|
||||
feature.fpOnClick = function() {
|
||||
fp.mapEvents.trigger("clickMarker", [ marker ]);
|
||||
|
@ -352,7 +353,7 @@ var FacilPad = {
|
|||
|
||||
if(!end) {
|
||||
for(var i=0; i<line.points.length; i++) {
|
||||
var marker = { id: "linePoint"+i, position: line.points[i], colour: "ffd700", i: i };
|
||||
var marker = { id: "linePoint"+i, lat: line.points[i].lat, lon: line.points[i].lon, colour: "ffd700", i: i };
|
||||
markers.push(marker);
|
||||
fp.addMarker(marker);
|
||||
}
|
||||
|
|
|
@ -17,8 +17,7 @@
|
|||
<div id="map-disabled-cover" ng-show="!loaded || error"></div>
|
||||
|
||||
<ul id="toolbox">
|
||||
<li><a href="javascript:" ng-click="addMarker()" ng-hide="readonly">Add marker</a></li>
|
||||
<li><a href="javascript:" ng-click="addLine()" ng-hide="readonly">Add line</a></li>
|
||||
<li ng-repeat="type in types" fp-variable-menu-item><a href="javascript:" ng-click="addObject(type)" ng-hide="readonly">Add {{type.name}}</a></li>
|
||||
<li><a href="javascript:">Views</a><ul>
|
||||
<li ng-repeat="(id, view) in views" fp-variable-menu-item><a href="javascript:" ng-click="displayView(view)">{{view.name}}</a></li>
|
||||
<li><a href="javascript:" ng-click="openDialog('save-view-dialog')" ng-hide="readonly">Save current view</a></li>
|
||||
|
@ -33,8 +32,9 @@
|
|||
</li>
|
||||
</ul></li>
|
||||
<li><a href="javascript:">Tools</a><ul>
|
||||
<li><a href="javascript:" ng-click="openDialog('copy-pad-dialog')" ng-hide="readonly">Copy pad</a></li>
|
||||
<!--<li><a href="javascript:" ng-click="openDialog('copy-pad-dialog')" ng-hide="readonly">Copy pad</a></li>-->
|
||||
<li><a href="javascript:" ng-click="openDialog('pad-settings-dialog')" ng-hide="readonly">Pad settings</a></li>
|
||||
<!--<li><a href="javascript:" ng-click="openDialog('object-types-dialog')" ng-hide="readonly">Object types</a></li>-->
|
||||
</ul></li>
|
||||
</ul>
|
||||
|
||||
|
@ -76,7 +76,7 @@
|
|||
<div id="view-marker-popup" fp-popup="currentMarker.xy">
|
||||
<div class="content">
|
||||
<h2>{{currentMarker.name}}</h2>
|
||||
<p class="pos">Coordinates: {{round(currentMarker.position.lat, 5)}}, {{round(currentMarker.position.lon, 5)}}</p>
|
||||
<p class="pos">Coordinates: {{round(currentMarker.lat, 5)}}, {{round(currentMarker.lon, 5)}}</p>
|
||||
<div ng-bind-html="currentMarker.descriptionHtml"></div>
|
||||
</div>
|
||||
<div class="buttons">
|
||||
|
@ -170,6 +170,34 @@
|
|||
</form>
|
||||
</div>
|
||||
|
||||
<div id="object-types-dialog" title="Object types" fp-dialog fp-preserve="padData">
|
||||
<form>
|
||||
<p class="error" ng-show="dialogError">{{dialogError}}</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Type</th>
|
||||
<th colspan="2">Edit</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-repeat="type in types">
|
||||
<td>{{type.name}}</td>
|
||||
<td>{{type.type}}</td>
|
||||
<td class="button"><button ng-click="editType(type)">Edit</button></td>
|
||||
<td class="button"><button ng-click="removeType(type)">Remove</button></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="3"><button ng-click="createType()">Create</button></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="copy-pad-dialog" title="Copy pad" fp-dialog>
|
||||
<form>
|
||||
<p class="error" ng-show="dialogError">{{dialogError}}</p>
|
||||
|
|
|
@ -2,11 +2,11 @@ module.exports = {
|
|||
host : null,
|
||||
port : 40829,
|
||||
db : {
|
||||
type: "mongodb", // mongodb, mysql, postgres, mariadb, sqlite
|
||||
type: "mysql", // mysql, postgres, mariadb, sqlite
|
||||
host: "localhost",
|
||||
port: null,
|
||||
database: "facilpad",
|
||||
user: null,
|
||||
password: null
|
||||
user: "facilpad",
|
||||
password: "password"
|
||||
}
|
||||
};
|
|
@ -1,21 +1,33 @@
|
|||
var backend = require("./databaseBackendMongodb");
|
||||
var backend = require("./databaseBackendSequelize");
|
||||
var listeners = require("./listeners");
|
||||
var routing = require("./routing");
|
||||
var utils = require("./utils");
|
||||
var async = require("async");
|
||||
var underscore = require("underscore");
|
||||
|
||||
var DEFAULT_TYPES = [
|
||||
{ name: "marker", type: "marker", fields: { description: { type: "textarea" } } },
|
||||
{ name: "line", type: "line", fields: { description: { type: "textarea" } } }
|
||||
];
|
||||
|
||||
function getPadData(padId, callback) {
|
||||
backend.getPadDataByWriteId(padId, function(err, data) {
|
||||
if(err || data != null)
|
||||
return callback(err, utils.extend(data, { writable: true }));
|
||||
return callback(err, utils.extend(JSON.parse(JSON.stringify(data)), { writable: true, writeId: null }));
|
||||
|
||||
backend.getPadData(padId, function(err, data) {
|
||||
if(err || data != null)
|
||||
return callback(err, utils.extend(data, { writable: false }));
|
||||
return callback(err, utils.extend(JSON.parse(JSON.stringify(data)), { writable: false, writeId: null }));
|
||||
|
||||
backend.createPad(utils.generateRandomId(10), padId, function(err, data) {
|
||||
callback(err, utils.extend(data, { writable: true }));
|
||||
if(err)
|
||||
return callback(err);
|
||||
|
||||
async.each(DEFAULT_TYPES, function(it, next) {
|
||||
backend.createType(data.id, it, next);
|
||||
}, function(err) {
|
||||
callback(err, utils.extend(JSON.parse(JSON.stringify(data)), { writable: true, writeId: null }));
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -43,7 +55,7 @@ function createView(padId, data, callback) {
|
|||
if(err)
|
||||
return callback(err);
|
||||
|
||||
listeners.notifyPadListeners(data._pad, "view", data);
|
||||
listeners.notifyPadListeners(data.PadId, "view", data);
|
||||
callback(null, data);
|
||||
});
|
||||
}
|
||||
|
@ -56,7 +68,7 @@ function updateView(viewId, data, callback) {
|
|||
if(err)
|
||||
return callback(err);
|
||||
|
||||
listeners.notifyPadListeners(data._pad, "view", data);
|
||||
listeners.notifyPadListeners(data.PadId, "view", data);
|
||||
callback(null, data);
|
||||
});
|
||||
}
|
||||
|
@ -66,7 +78,47 @@ function deleteView(viewId, callback) {
|
|||
if(err)
|
||||
return callback(err);
|
||||
|
||||
listeners.notifyPadListeners(data._pad, "deleteView", { id: data.id });
|
||||
listeners.notifyPadListeners(data.PadId, "deleteView", { id: data.id });
|
||||
callback(null, data);
|
||||
});
|
||||
}
|
||||
|
||||
function getTypes(padId) {
|
||||
return backend.getTypes(padId);
|
||||
}
|
||||
|
||||
function createType(padId, data, callback) {
|
||||
if(data.name == null || data.name.trim().length == 0)
|
||||
return callback("No name provided.");
|
||||
|
||||
backend.createType(padId, data, function(err, data) {
|
||||
if(err)
|
||||
return callback(err);
|
||||
|
||||
listeners.notifyPadListeners(data.PadId, "type", data);
|
||||
callback(null, data);
|
||||
});
|
||||
}
|
||||
|
||||
function updateType(typeId, data, callback) {
|
||||
if(data.name == null || data.name.trim().length == 0)
|
||||
return callback("No name provided.");
|
||||
|
||||
backend.updateType(typeId, data, function(err, data) {
|
||||
if(err)
|
||||
return callback(err);
|
||||
|
||||
listeners.notifyPadListeners(data.PadId, "type", data);
|
||||
callback(null, data);
|
||||
});
|
||||
}
|
||||
|
||||
function deleteType(typeId, callback) {
|
||||
backend.deleteView(typeId, function(err, data) {
|
||||
if(err)
|
||||
return callback(err);
|
||||
|
||||
listeners.notifyPadListeners(data.PadId, "deleteType", { id: data.id });
|
||||
callback(null, data);
|
||||
});
|
||||
}
|
||||
|
@ -90,7 +142,7 @@ function updateMarker(markerId, data, callback) {
|
|||
if(err)
|
||||
return callback(err);
|
||||
|
||||
listeners.notifyPadListeners(data._pad, "marker", _getMarkerDataFunc(data));
|
||||
listeners.notifyPadListeners(data.PadId, "marker", _getMarkerDataFunc(data));
|
||||
callback(null, data);
|
||||
});
|
||||
}
|
||||
|
@ -100,7 +152,7 @@ function deleteMarker(markerId, callback) {
|
|||
if(err)
|
||||
return callback(err);
|
||||
|
||||
listeners.notifyPadListeners(data._pad, "deleteMarker", { id: data.id });
|
||||
listeners.notifyPadListeners(data.PadId, "deleteMarker", { id: data.id });
|
||||
callback(null, data);
|
||||
});
|
||||
}
|
||||
|
@ -147,7 +199,7 @@ function updateLine(lineId, data, callback) {
|
|||
if(!res.calculateRouting)
|
||||
return next();
|
||||
|
||||
_setLinePoints(res.originalLine._pad, lineId, res.calculateRouting, next);
|
||||
_setLinePoints(res.originalLine.PadId, lineId, res.calculateRouting, next);
|
||||
} ]
|
||||
}, function(err, res) {
|
||||
callback(err, res.updateLine);
|
||||
|
@ -159,7 +211,7 @@ function _createLine(padId, data, callback) {
|
|||
if(err)
|
||||
return callback(err);
|
||||
|
||||
listeners.notifyPadListeners(data._pad, "line", data);
|
||||
listeners.notifyPadListeners(data.PadId, "line", data);
|
||||
callback(null, data);
|
||||
});
|
||||
}
|
||||
|
@ -169,7 +221,7 @@ function _updateLine(lineId, data, callback) {
|
|||
if(err)
|
||||
return callback(err);
|
||||
|
||||
listeners.notifyPadListeners(data._pad, "line", data);
|
||||
listeners.notifyPadListeners(data.PadId, "line", data);
|
||||
callback(null, data);
|
||||
});
|
||||
}
|
||||
|
@ -196,7 +248,7 @@ function deleteLine(lineId, callback) {
|
|||
if(err)
|
||||
return callback;
|
||||
|
||||
listeners.notifyPadListeners(data._pad, "deleteLine", { id: data.id });
|
||||
listeners.notifyPadListeners(data.PadId, "deleteLine", { id: data.id });
|
||||
callback(null, data);
|
||||
});
|
||||
});
|
||||
|
@ -216,7 +268,7 @@ function getLinePoints(padId, bboxWithZoom) {
|
|||
});
|
||||
}
|
||||
|
||||
function copyPad(fromPadId, toPadId, callback) {
|
||||
/*function copyPad(fromPadId, toPadId, callback) {
|
||||
function _handleStream(stream, next, cb) {
|
||||
stream.on("data", function(data) {
|
||||
stream.pause();
|
||||
|
@ -280,7 +332,7 @@ function copyPad(fromPadId, toPadId, callback) {
|
|||
});
|
||||
}]
|
||||
}, callback);
|
||||
}
|
||||
}*/
|
||||
|
||||
function _calculateRouting(line, callback) {
|
||||
if(line.points && line.points.length >= 2 && line.mode) {
|
||||
|
@ -308,7 +360,7 @@ function _calculateRouting(line, callback) {
|
|||
|
||||
function _getMarkerDataFunc(marker) {
|
||||
return function(bbox) {
|
||||
if(!utils.isInBbox(marker.position, bbox))
|
||||
if(!utils.isInBbox(marker, bbox))
|
||||
return null;
|
||||
|
||||
return marker;
|
||||
|
@ -347,6 +399,10 @@ module.exports = {
|
|||
createView : createView,
|
||||
updateView : updateView,
|
||||
deleteView : deleteView,
|
||||
getTypes : getTypes,
|
||||
createType : createType,
|
||||
updateType : updateType,
|
||||
deleteType : deleteType,
|
||||
getPadMarkers : getPadMarkers,
|
||||
createMarker : createMarker,
|
||||
updateMarker : updateMarker,
|
||||
|
@ -356,5 +412,6 @@ module.exports = {
|
|||
updateLine : updateLine,
|
||||
deleteLine : deleteLine,
|
||||
getLinePoints : getLinePoints,
|
||||
copyPad : copyPad
|
||||
//copyPad : copyPad,
|
||||
_defaultTypes : DEFAULT_TYPES
|
||||
};
|
|
@ -1,305 +0,0 @@
|
|||
var mongoose = require("mongoose");
|
||||
var config = require("../config");
|
||||
var utils = require("./utils");
|
||||
|
||||
var OLD_MARKER_COLOURS = { blue: "8da8f6", green: "90ee90", gold: "ffd700", red: "ff0000" };
|
||||
|
||||
function connect(callback) {
|
||||
var connectionString = "mongodb://"
|
||||
+ (config.db.user ? encodeURIComponent(config.db.user) + ":" + encodeURIComponent(config.db.password) + "@" : "")
|
||||
+ config.db.host
|
||||
+ (config.db.port ? ":" + config.db.port : "")
|
||||
+ "/" + config.db.database;
|
||||
mongoose.connect(connectionString);
|
||||
callback();
|
||||
}
|
||||
|
||||
var ObjectId = mongoose.Schema.Types.ObjectId;
|
||||
|
||||
var positionType = {
|
||||
lon: Number,
|
||||
lat: Number
|
||||
};
|
||||
|
||||
var bboxType = {
|
||||
top: Number,
|
||||
right: Number,
|
||||
bottom: Number,
|
||||
left: Number
|
||||
};
|
||||
|
||||
var markerSchema = mongoose.Schema({
|
||||
_pad : { type: String, ref: "Pad" },
|
||||
position : positionType,
|
||||
name : { type: String, default: "Untitled marker" },
|
||||
description : String,
|
||||
colour : { type: String, default: "ff0000" }
|
||||
});
|
||||
|
||||
var lineSchema = mongoose.Schema({
|
||||
_pad : { type: String, ref: "Pad" },
|
||||
points : [positionType],
|
||||
mode : { type: String, default: "" },
|
||||
colour : { type: String, default: "0000ff" },
|
||||
width : { type: Number, default: 4 },
|
||||
description : String,
|
||||
name : { type: String, default: "Untitled line" },
|
||||
distance : Number,
|
||||
time : Number
|
||||
});
|
||||
|
||||
var linePointsSchema = mongoose.Schema(utils.extend({ }, positionType, {
|
||||
zoom : Number,
|
||||
idx : Number,
|
||||
_line : { type: ObjectId, ref: "Line" }
|
||||
}));
|
||||
|
||||
linePointsSchema.index({ _id: 1, idx: 1 });
|
||||
|
||||
var viewSchema = mongoose.Schema({
|
||||
_pad : { type: String, ref: "Pad" },
|
||||
name : String,
|
||||
baseLayer : String,
|
||||
layers : [String],
|
||||
view : bboxType
|
||||
});
|
||||
|
||||
var padSchema = mongoose.Schema({
|
||||
_id : String,
|
||||
defaultView : { type: ObjectId, ref: "View" },
|
||||
name: { type: String, default: "New FacilPad" },
|
||||
writeId : String
|
||||
});
|
||||
|
||||
padSchema.index({ writeId: 1 });
|
||||
|
||||
var Marker = mongoose.model("Marker", markerSchema);
|
||||
var Line = mongoose.model("Line", lineSchema);
|
||||
var LinePoints = mongoose.model("LinePoints", linePointsSchema);
|
||||
var View = mongoose.model("View", viewSchema);
|
||||
var Pad = mongoose.model("Pad", padSchema);
|
||||
|
||||
function getPadData(padId, callback) {
|
||||
Pad.findById(padId).populate("defaultView").exec(_fixIdCallback(callback));
|
||||
}
|
||||
|
||||
function getPadDataByWriteId(writeId, callback) {
|
||||
Pad.findOne({ writeId: writeId }).populate("defaultView").exec(_fixIdCallback(callback));
|
||||
}
|
||||
|
||||
function createPad(padId, writeId, callback) {
|
||||
Pad.create({ _id: padId, writeId: writeId }, _fixIdCallback(callback));
|
||||
}
|
||||
|
||||
function updatePadData(padId, data, callback) {
|
||||
Pad.findByIdAndUpdate(padId, data).populate("defaultView").exec(_fixIdCallback(callback));
|
||||
}
|
||||
|
||||
function getViews(padId) {
|
||||
return _fixIdStream(View.find({ "_pad" : padId }).stream());
|
||||
}
|
||||
|
||||
function createView(padId, data, callback) {
|
||||
data._pad = padId;
|
||||
View.create(data, _fixIdCallback(callback));
|
||||
}
|
||||
|
||||
function updateView(viewId, data, callback) {
|
||||
View.findByIdAndUpdate(viewId, data, _fixIdCallback(callback));
|
||||
}
|
||||
|
||||
function deleteView(viewId, callback) {
|
||||
View.findByIdAndRemove(viewId, _fixIdCallback(callback));
|
||||
}
|
||||
|
||||
function getPadMarkers(padId, bbox) {
|
||||
var condition = { $and: [ _makeBboxCondition(bbox, "position."), {
|
||||
"_pad" : padId
|
||||
} ] };
|
||||
|
||||
return _fixIdStream(Marker.find(condition).stream());
|
||||
}
|
||||
|
||||
function createMarker(padId, data, callback) {
|
||||
data._pad = padId;
|
||||
Marker.create(data, _fixIdCallback(callback));
|
||||
}
|
||||
|
||||
function updateMarker(markerId, data, callback) {
|
||||
Marker.findByIdAndUpdate(markerId, data, _fixIdCallback(callback));
|
||||
}
|
||||
|
||||
function deleteMarker(markerId, callback) {
|
||||
Marker.findByIdAndRemove(markerId, _fixIdCallback(callback));
|
||||
}
|
||||
|
||||
function getPadLines(padId, fields) {
|
||||
var condition = {
|
||||
"_pad" : padId
|
||||
};
|
||||
|
||||
return _fixIdStream(Line.find(condition, fields).stream());
|
||||
}
|
||||
|
||||
function getLine(lineId, callback) {
|
||||
Line.findById(lineId, _fixIdCallback(callback));
|
||||
}
|
||||
|
||||
function createLine(padId, data, callback) {
|
||||
data = utils.extend({ }, data, { _pad: padId });
|
||||
Line.create(data, _fixIdCallback(callback));
|
||||
}
|
||||
|
||||
function updateLine(lineId, data, callback) {
|
||||
Line.findByIdAndUpdate(lineId, data, _fixIdCallback(callback));
|
||||
}
|
||||
|
||||
function deleteLine(lineId, callback) {
|
||||
Line.findByIdAndRemove(lineId, _fixIdCallback(callback));
|
||||
}
|
||||
|
||||
function getLinePoints(lineId, callback) {
|
||||
LinePoints.find({ _line: lineId }).sort("idx").exec(_linePointsCallback(callback));
|
||||
}
|
||||
|
||||
function getLinePointsByBbox(lineId, bboxWithZoom, callback) {
|
||||
var condition = { $and: [ _makeBboxCondition(bboxWithZoom), {
|
||||
"_line" : lineId,
|
||||
"zoom" : { $lte: bboxWithZoom.zoom }
|
||||
} ] };
|
||||
|
||||
LinePoints.find(condition, "idx zoom", { sort: "idx" }).exec(_linePointsCallback(callback));
|
||||
}
|
||||
|
||||
function getLinePointsByIdx(lineId, indexes, callback) {
|
||||
LinePoints.find({ _line: lineId, idx: { $in: indexes } }).select("lon lat idx").sort("idx").exec(_linePointsCallback(callback));
|
||||
}
|
||||
|
||||
function setLinePoints(lineId, points, callback) {
|
||||
LinePoints.remove({ _line: lineId }, function(err) {
|
||||
if(err)
|
||||
return callback(err);
|
||||
|
||||
var create = [ ];
|
||||
for(var i=0; i<points.length; i++) {
|
||||
create.push(utils.extend({ }, points[i], { _line: lineId }));
|
||||
}
|
||||
|
||||
if(create.length > 0)
|
||||
LinePoints.create(create, callback);
|
||||
else
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
function _fixId(data) {
|
||||
if(data != null) {
|
||||
data = JSON.parse(JSON.stringify(data));
|
||||
data.id = data._id;
|
||||
delete data._id;
|
||||
|
||||
if(data.writeId)
|
||||
delete data.writeId;
|
||||
|
||||
if(data.defaultView) {
|
||||
data.defaultView.id = data.defaultView._id;
|
||||
delete data.defaultView._id;
|
||||
}
|
||||
|
||||
if(data.points) {
|
||||
for(var i=0; i<data.points.length; i++)
|
||||
delete data.points[i]._id;
|
||||
}
|
||||
|
||||
// Backwards compatibility for markers
|
||||
if(data.style) {
|
||||
data.colour = OLD_MARKER_COLOURS[data.style];
|
||||
delete data.style;
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
function _fixIdCallback(callback) {
|
||||
return function(err, data) {
|
||||
callback(err, _fixId(data));
|
||||
}
|
||||
}
|
||||
|
||||
function _fixIdStream(stream) {
|
||||
return utils.filterStream(stream, _fixId);
|
||||
}
|
||||
|
||||
function _linePointsCallback(callback) {
|
||||
return function(err, linePoints) {
|
||||
if(err)
|
||||
return callback(err);
|
||||
|
||||
var ret = [ ];
|
||||
for(var i=0; i<linePoints.length; i++) {
|
||||
var c = JSON.parse(JSON.stringify(linePoints[i]));
|
||||
delete c._id;
|
||||
ret.push(c);
|
||||
}
|
||||
callback(null, ret);
|
||||
};
|
||||
}
|
||||
|
||||
function _makeBboxCondition(bbox, prefix) {
|
||||
if(!bbox)
|
||||
return { };
|
||||
|
||||
prefix = prefix || "";
|
||||
|
||||
function cond(key, value) {
|
||||
var ret = { };
|
||||
ret[prefix+key] = value;
|
||||
return ret;
|
||||
}
|
||||
|
||||
var conditions = [ ];
|
||||
conditions.push(cond("lat", { $lte: bbox.top, $gte: bbox.bottom }));
|
||||
|
||||
if(bbox.right < bbox.left) // Bbox spans over lon=180
|
||||
conditions.push({ $or: [ cond("lon", { $gte: bbox.left }), cond("lon", { $lte: bbox.right }) ] });
|
||||
else
|
||||
conditions.push(cond("lon", { $gte: bbox.left, $lte: bbox.right }));
|
||||
|
||||
if(bbox.except) {
|
||||
var exceptConditions = [ ];
|
||||
exceptConditions.push({ $or: [ cond("lat", { $gt: bbox.except.top }), cond("lat", { $lt: bbox.except.bottom }) ] });
|
||||
|
||||
if(bbox.except.right < bbox.except.left)
|
||||
exceptConditions.push(cond("lon", { $lt: bbox.except.left, $gt: bbox.except.right }));
|
||||
else
|
||||
exceptConditions.push({ $or: [ cond("lon", { $lt: bbox.except.left }), cond("lon", { $gt: bbox.except.right }) ] });
|
||||
conditions.push({ $or: exceptConditions });
|
||||
}
|
||||
|
||||
return { $and : conditions };
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
connect : connect,
|
||||
getPadData : getPadData,
|
||||
getPadDataByWriteId : getPadDataByWriteId,
|
||||
createPad : createPad,
|
||||
updatePadData : updatePadData,
|
||||
getViews : getViews,
|
||||
createView : createView,
|
||||
updateView : updateView,
|
||||
deleteView : deleteView,
|
||||
getPadMarkers : getPadMarkers,
|
||||
createMarker : createMarker,
|
||||
updateMarker : updateMarker,
|
||||
deleteMarker : deleteMarker,
|
||||
getPadLines : getPadLines,
|
||||
getLine : getLine,
|
||||
createLine : createLine,
|
||||
updateLine : updateLine,
|
||||
deleteLine : deleteLine,
|
||||
getLinePoints : getLinePoints,
|
||||
getLinePointsByBbox : getLinePointsByBbox,
|
||||
getLinePointsByIdx : getLinePointsByIdx,
|
||||
setLinePoints : setLinePoints
|
||||
};
|
|
@ -27,9 +27,8 @@ database.connect(function(err) {
|
|||
},
|
||||
|
||||
setPadId : function(padId) {
|
||||
if(socket.padId != null) {
|
||||
if(typeof padId != "string" || socket.padId != null)
|
||||
return;
|
||||
}
|
||||
|
||||
socket.padId = true;
|
||||
|
||||
|
@ -43,6 +42,7 @@ database.connect(function(err) {
|
|||
|
||||
_sendData(socket, "padData", null, data);
|
||||
_sendStreamData(socket, "view", database.getViews(socket.padId));
|
||||
_sendStreamData(socket, "type", database.getTypes(socket.padId));
|
||||
_sendStreamData(socket, "line", database.getPadLines(socket.padId));
|
||||
|
||||
if(socket.bbox) { // In case bbox is set while fetching pad data
|
||||
|
@ -53,6 +53,9 @@ database.connect(function(err) {
|
|||
},
|
||||
|
||||
updateBbox : function(bbox) {
|
||||
if(!utils.stripObject(bbox, { top: "number", left: "number", bottom: "number", right: "number", zoom: "number" }))
|
||||
return;
|
||||
|
||||
var bboxWithExcept = utils.extend({ }, bbox);
|
||||
if(socket.bbox && bbox.zoom == socket.bbox.zoom)
|
||||
bboxWithExcept.except = socket.bbox;
|
||||
|
@ -71,78 +74,139 @@ database.connect(function(err) {
|
|||
},
|
||||
|
||||
editPad : function(data, callback) {
|
||||
if(!utils.stripObject(data, { name: "string", defaultViewId: "number" }))
|
||||
return callback("Invalid parameters.");
|
||||
|
||||
if(!socket.writable)
|
||||
return callback(new Error("In read-only mode."));
|
||||
return callback("In read-only mode.");
|
||||
|
||||
database.updatePadData(socket.padId, data, callback);
|
||||
},
|
||||
|
||||
addMarker : function(data, callback) {
|
||||
if(!utils.stripObject(data, { lat: "number", lon: "number", name: "string", colour: "string", typeId: "number" } ))
|
||||
return callback("Invalid parameters.");
|
||||
|
||||
if(!socket.writable)
|
||||
return callback(new Error("In read-only mode."));
|
||||
return callback("In read-only mode.");
|
||||
|
||||
database.createMarker(socket.padId, data, callback);
|
||||
},
|
||||
|
||||
editMarker : function(data, callback) {
|
||||
if(!utils.stripObject(data, { id: "number", lat: "number", lon: "number", name: "string", colour: "string" }))
|
||||
return callback("Invalid parameters.");
|
||||
|
||||
if(!socket.writable)
|
||||
return callback(new Error("In read-only mode."));
|
||||
return callback("In read-only mode.");
|
||||
|
||||
database.updateMarker(data.id, data, callback);
|
||||
},
|
||||
|
||||
deleteMarker : function(data, callback) {
|
||||
if(!utils.stripObject(data, { id: "number" }))
|
||||
return callback("Invalid parameters.");
|
||||
|
||||
if(!socket.writable)
|
||||
return callback(new Error("In read-only mode."));
|
||||
return callback("In read-only mode.");
|
||||
|
||||
database.deleteMarker(data.id, callback);
|
||||
},
|
||||
|
||||
addLine : function(data, callback) {
|
||||
if(!utils.stripObject(data, { points: [ { lat: "number", lon: "number" } ], mode: "string", colour: "string", width: "number", name: "string", typeId: "number" }))
|
||||
return callback("Invalid parameters.");
|
||||
|
||||
if(!socket.writable)
|
||||
return callback(new Error("In read-only mode."));
|
||||
return callback("In read-only mode.");
|
||||
|
||||
database.createLine(socket.padId, data, callback);
|
||||
},
|
||||
|
||||
editLine : function(data, callback) {
|
||||
if(!utils.stripObject(data, { id: "number", points: [ { lat: "number", lon: "number" } ], mode: "string", colour: "string", width: "number", name: "string" }))
|
||||
return callback("Invalid parameters.");
|
||||
|
||||
if(!socket.writable)
|
||||
return callback(new Error("In read-only mode."));
|
||||
return callback("In read-only mode.");
|
||||
|
||||
database.updateLine(data.id, data, callback);
|
||||
},
|
||||
|
||||
deleteLine : function(data, callback) {
|
||||
if(!utils.stripObject(data, { id: "number" }))
|
||||
return callback("Invalid parameters.");
|
||||
|
||||
if(!socket.writable)
|
||||
return callback(new Error("In read-only mode."));
|
||||
return callback("In read-only mode.");
|
||||
|
||||
database.deleteLine(data.id, callback);
|
||||
},
|
||||
|
||||
addView : function(data, callback) {
|
||||
if(!utils.stripObject(data, { name: "string", baseLayer: "string", layers: [ "string" ], top: "number", left: "number", right: "number", bottom: "number" }))
|
||||
return callback("Invalid parameters.");
|
||||
|
||||
if(!socket.writable)
|
||||
return callback(new Error("In read-only mode."));
|
||||
return callback("In read-only mode.");
|
||||
|
||||
database.createView(socket.padId, data, callback);
|
||||
},
|
||||
|
||||
editView : function(data, callback) {
|
||||
if(!utils.stripObject(data, { id: "number", baseLayer: "string", layers: [ "string" ], top: "number", left: "number", right: "number", bottom: "number" }))
|
||||
return callback("Invalid parameters.");
|
||||
|
||||
if(!socket.writable)
|
||||
return callback(new Error("In read-only mode."));
|
||||
return callback("In read-only mode.");
|
||||
|
||||
database.updateView(data.id, data, callback);
|
||||
},
|
||||
|
||||
deleteView : function(data, callback) {
|
||||
if(!utils.stripObject(data, { id: "number" }))
|
||||
return callback("Invalid parameters.");
|
||||
|
||||
if(!socket.writable)
|
||||
return callback(new Error("In read-only mode."));
|
||||
return callback("In read-only mode.");
|
||||
|
||||
database.deleteView(data.id, callback);
|
||||
},
|
||||
|
||||
addType : function(data, callback) {
|
||||
// TODO: Strip object
|
||||
|
||||
if(!socket.writable)
|
||||
return callback("In read-only mode.");
|
||||
|
||||
database.createType(socket.padId, data, callback);
|
||||
},
|
||||
|
||||
editType : function(data, callback) {
|
||||
// TODO: Strip object
|
||||
|
||||
if(!socket.writable)
|
||||
return callback("In read-only mode.");
|
||||
|
||||
database.updateType(data.id, data, callback);
|
||||
},
|
||||
|
||||
deleteType : function(data, callback) {
|
||||
if(!utils.stripObject(data, { id: "number" }))
|
||||
return callback("Invalid parameters.");
|
||||
|
||||
if(!socket.writable)
|
||||
return callback("In read-only mode.");
|
||||
|
||||
database.deleteType(data.id, callback);
|
||||
}/*,
|
||||
|
||||
copyPad : function(data, callback) {
|
||||
if(!utils.stripObject(data, { toId: "string" }))
|
||||
return callback("Invalid parameters.");
|
||||
|
||||
database.copyPad(socket.padId, data.toId, callback);
|
||||
}
|
||||
}*/
|
||||
};
|
||||
|
||||
for(var i in handlers)
|
||||
|
|
|
@ -129,11 +129,57 @@ function generateRandomId(length) {
|
|||
return randomPadId;
|
||||
}
|
||||
|
||||
var FAILURE = { };
|
||||
|
||||
function stripObject(obj, structure) {
|
||||
return _stripObject(obj, structure) !== FAILURE;
|
||||
}
|
||||
|
||||
function _stripObject(obj, type) {
|
||||
if(obj === undefined)
|
||||
return obj;
|
||||
else if(obj === null)
|
||||
return obj;
|
||||
else if(type instanceof Array) {
|
||||
if(!(obj instanceof Array))
|
||||
return FAILURE;
|
||||
|
||||
for(var i=0; i<obj.length; i++) {
|
||||
if((obj[i] = _stripObject(obj[i], type[0])) === FAILURE)
|
||||
return FAILURE;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
else if(typeof type == "function")
|
||||
return (obj instanceof type) ? obj : FAILURE;
|
||||
else if(type instanceof Object) {
|
||||
if(!(obj instanceof Object))
|
||||
return FAILURE;
|
||||
|
||||
for(var i in obj) {
|
||||
if(type[i] == null || obj[i] === undefined)
|
||||
delete obj[i];
|
||||
else if((obj[i] = _stripObject(obj[i], type[i])) === FAILURE)
|
||||
return FAILURE;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
else if(type == "number" && typeof obj == "string")
|
||||
return isNaN(obj = 1*obj) ? FAILURE : obj;
|
||||
else if(type == "string" && typeof obj == "number")
|
||||
return ""+obj;
|
||||
else if(typeof type == "string")
|
||||
return (typeof obj == type) ? obj : FAILURE;
|
||||
else
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
isInBbox : isInBbox,
|
||||
filterStream : filterStream,
|
||||
filterStreamAsync : filterStreamAsync,
|
||||
extend : extend,
|
||||
calculateDistance : calculateDistance,
|
||||
generateRandomId : generateRandomId
|
||||
generateRandomId : generateRandomId,
|
||||
stripObject : stripObject
|
||||
};
|
|
@ -4,7 +4,7 @@
|
|||
"author": "Candid Dauth <cdauth@cdauth.eu>",
|
||||
"version": "0.0.1",
|
||||
"dependencies": {
|
||||
"mongoose": "x.x.x",
|
||||
"sequelize": "x.x.x",
|
||||
"socket.io": "x.x.x",
|
||||
"async" : "x.x.x",
|
||||
"request" : "x.x.x",
|
||||
|
|
Ładowanie…
Reference in New Issue