From 95c226305bffcf69ec1242ca1a4bcf77a1bac097 Mon Sep 17 00:00:00 2001 From: Candid Dauth Date: Fri, 10 Feb 2017 12:41:14 +0100 Subject: [PATCH] Move GPX export to separate URL (#58) --- frontend/app/map/gpx/gpx.js | 35 --------------------------- frontend/app/map/map/map.js | 3 +-- frontend/app/map/toolbox/toolbox.html | 2 +- frontend/app/map/toolbox/toolbox.js | 2 -- package.json | 1 - server/database/pad.js | 4 +++ server/socket.js | 10 -------- server/webserver.js | 19 +++++++++++++++ yarn.lock | 4 --- 9 files changed, 25 insertions(+), 55 deletions(-) delete mode 100644 frontend/app/map/gpx/gpx.js diff --git a/frontend/app/map/gpx/gpx.js b/frontend/app/map/gpx/gpx.js deleted file mode 100644 index 47f883c4..00000000 --- a/frontend/app/map/gpx/gpx.js +++ /dev/null @@ -1,35 +0,0 @@ -import 'blob'; -import {saveAs} from 'file-saver'; -import fm from '../../app'; - -function _parseBbox(bboxStr) { - if(!bboxStr) - return null; - - var bboxArr = bboxStr.split(bboxStr); - if(bboxArr.length != 4) - return null; - - var idxs = [ "left", "top", "right", "bottom" ]; - var ret = { }; - for(var i=0; i<4; i++) { - ret[idxs[i]] = +bboxArr[i]; - if(!isFinite(ret[idxs[i]])) - return null; - } - return ret; -} - -fm.app.factory("fmMapGpx", function() { - return function(map) { - return { - exportGpx : function() { - map.socket.emit("exportGpx", { useTracks: true }).then(function(gpx) { - saveAs(new Blob([ gpx ], { type: "application/gpx+xml" }), map.socket.padData.name.replace(/[\\\/:*?"<>|]+/g, '_') + '.gpx'); - }).catch(function(err) { - map.messages.showMessage("danger", err); - }); - } - }; - }; -}); diff --git a/frontend/app/map/map/map.js b/frontend/app/map/map/map.js index 4230b356..6511c082 100644 --- a/frontend/app/map/map/map.js +++ b/frontend/app/map/map/map.js @@ -13,7 +13,7 @@ fm.app.directive("facilmap", function(fmMap) { }; }); -fm.app.factory("fmMap", function(fmUtils, fmSocket, fmMapMessages, fmMapMarkers, $compile, fmMapLines, fmMapTypes, fmMapViews, $rootScope, fmMapPad, fmMapToolbox, $timeout, fmMapLegend, fmMapSearch, fmMapGpx, fmMapAbout, $sce, fmMapImport, fmMapHash, fmMapHistory) { +fm.app.factory("fmMap", function(fmUtils, fmSocket, fmMapMessages, fmMapMarkers, $compile, fmMapLines, fmMapTypes, fmMapViews, $rootScope, fmMapPad, fmMapToolbox, $timeout, fmMapLegend, fmMapSearch, fmMapAbout, $sce, fmMapImport, fmMapHash, fmMapHistory) { var maps = { }; var ret = { }; @@ -325,7 +325,6 @@ fm.app.factory("fmMap", function(fmUtils, fmSocket, fmMapMessages, fmMapMarkers, map.viewsUi = fmMapViews(map); map.typesUi = fmMapTypes(map); map.padUi = fmMapPad(map); - map.gpxUi = fmMapGpx(map); map.aboutUi = fmMapAbout(map); map.importUi = fmMapImport(map); map.searchUi = fmMapSearch(map); diff --git a/frontend/app/map/toolbox/toolbox.html b/frontend/app/map/toolbox/toolbox.html index 2268c4e4..856a6579 100644 --- a/frontend/app/map/toolbox/toolbox.html +++ b/frontend/app/map/toolbox/toolbox.html @@ -41,7 +41,7 @@
  • Import file
  • Show edit history
  • Filter
  • -
  • Export GPX
  • +
  • Export GPX
  • View as table
  • Settings
  • About FacilMap
  • diff --git a/frontend/app/map/toolbox/toolbox.js b/frontend/app/map/toolbox/toolbox.js index dcbc9601..31bac185 100644 --- a/frontend/app/map/toolbox/toolbox.js +++ b/frontend/app/map/toolbox/toolbox.js @@ -40,8 +40,6 @@ fm.app.factory("fmMapToolbox", function($compile, fmTable, fmFilter) { map.importUi.openImportDialog(); }; - scope.exportGpx = map.gpxUi.exportGpx.bind(map.gpxUi); - scope.showAbout = function() { map.aboutUi.showAbout(); }; diff --git a/package.json b/package.json index efae61df..fac738d7 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "ejs": "^2.5.5", "event-stream": "^3.3.4", "express": "^4.14.0", - "file-saver": "^1.3.3", "filtrex": "^0.5.4", "jquery": "<3.0.0", "jquery-ui": "^1.12.1", diff --git a/server/database/pad.js b/server/database/pad.js index 18e84864..4dbc1be2 100644 --- a/server/database/pad.js +++ b/server/database/pad.js @@ -34,6 +34,10 @@ module.exports = function(Database) { return this._conn.model("Pad").findOne({ where: { writeId: writeId }, include: [ { model: this._conn.model("View"), as: "defaultView" } ] }); }, + getPadDataByAnyId(padId) { + return this._conn.model("Pad").findOne({ where: { $or: { id: padId, writeId: padId } }, include: [ { model: this._conn.model("View"), as: "defaultView" } ] }); + }, + createPad(data) { return utils.promiseAuto({ validate: () => { diff --git a/server/socket.js b/server/socket.js index 2d38e6ad..0b3771c3 100644 --- a/server/socket.js +++ b/server/socket.js @@ -4,7 +4,6 @@ var domain = require("domain"); var utils = require("./utils"); var routing = require("./routing"); var search = require("./search"); -var gpx = require("./gpx"); class Socket { constructor(server, database) { @@ -400,15 +399,6 @@ utils.extend(SocketConnection.prototype, { }); }, - exportGpx : function(data) { - return Promise.resolve().then(() => { - if(this.padId == null) - throw "No pad ID set."; - - return gpx.exportGpx(this.database, this.padId, data.useTracks); - }); - }, - find: function(data) { return Promise.resolve().then(() => { if(!utils.stripObject(data, { query: "string", loadUrls: "boolean" })) diff --git a/server/webserver.js b/server/webserver.js index 3da879db..2b4ac405 100644 --- a/server/webserver.js +++ b/server/webserver.js @@ -9,6 +9,7 @@ const webpackMiddleware = require("webpack-dev-middleware"); const config = require("../config"); const database = require("./database/database"); +const gpx = require("./gpx"); const utils = require("./utils"); const webpackConfig = require("../frontend/webpack.config"); @@ -81,6 +82,24 @@ const webserver = module.exports = { // If no file with this name has been found, we render a pad app.get("/:padId", padMiddleware); + app.get("/:padId/gpx", function(req, res, next) { + utils.promiseAuto({ + padData: database.getPadDataByAnyId(req.params.padId).then((padData) => { + if(!padData) + throw new Error(`Map with ID ${req.params.padId} could not be found.`); + return padData; + }), + gpx: (padData) => { + return gpx.exportGpx(database, padData ? padData.id : req.params.padId, req.query.useTracks == "1"); + }, + response: (padData, gpx) => { + res.set("Content-type", "application/gpx+xml"); + res.attachment(padData.name.replace(/[\\\/:*?"<>|]+/g, '_') + ".gpx"); + res.send(gpx); + } + }).catch(next); + }); + let server = http.createServer(app); return Promise.denodeify(server.listen.bind(server))(config.port, config.host).then(() => server); } diff --git a/yarn.lock b/yarn.lock index 96157bf1..3ecbd784 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1827,10 +1827,6 @@ fbjs@^0.8.1, fbjs@^0.8.4: setimmediate "^1.0.5" ua-parser-js "^0.7.9" -file-saver@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-1.3.3.tgz#cdd4c44d3aa264eac2f68ec165bc791c34af1232" - filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775"