From 2c6b9df97afe32b2c7047f5985c10a18bb03236b Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Thu, 29 Sep 2016 11:28:31 +0100 Subject: [PATCH 1/3] Squashed commit of the following: commit e7f1c4c84579b959fe2997ff4d2315ee53acfe9a Author: Jonny Barnes Date: Thu Sep 29 11:22:44 2016 +0100 Add latest change, fix spelling errors in rest of changelog commit 637b5107b557f1c2a56327a40b3d7b4b7297fa29 Author: Jonny Barnes Date: Wed Sep 28 21:13:06 2016 +0100 Add a test for uncertainty parameter commit 5e7504b323debf9c91e0cca428b4dca7dda0789d Author: Jonny Barnes Date: Wed Sep 28 21:11:12 2016 +0100 Format the ternaty operator correctly commit 19c978a5ac59cd7dfdceee9a8f1aaa6539d8ac66 Author: Jonny Barnes Date: Wed Sep 28 20:46:19 2016 +0100 Fix typo commit d4e5b5fc384d0ccd715ea28a51821f958f6c2caa Author: Jonny Barnes Date: Wed Sep 28 20:41:23 2016 +0100 Add paraphanalia commit a96f104894de6c06dc5e41044482de2355cb4965 Author: Jonny Barnes Date: Wed Sep 28 20:35:17 2016 +0100 Add the geolocation uncertainty to nearby places request commit 0f6d5649e2f3316040d7453f5fcc96ac1f0ac783 Author: Jonny Barnes Date: Wed Sep 28 20:34:38 2016 +0100 Use a query parameter for geolocation uncertainty commit a9147a074315fabb0d76e5991b34a70b2143761c Author: Jonny Barnes Date: Wed Sep 28 19:58:08 2016 +0100 Make use of uncertainty parameter when finding nearby places commit bad384b5d8be3ea8905d8f6ca3c20f448869853d Author: Jonny Barnes Date: Wed Sep 28 19:28:42 2016 +0100 Support sending uncertainty value to micropub endpoint --- .../Controllers/MicropubClientController.php | 6 +++- app/Http/Controllers/MicropubController.php | 12 +++++--- changelog.md | 29 ++++++++++-------- public/assets/js/maps/newnote.js.map | 2 +- public/assets/js/newnote.js | 2 +- public/assets/js/newnote.js.br | Bin 1596 -> 1600 bytes public/assets/js/newnote.js.gz | Bin 1806 -> 1815 bytes resources/assets/js/newnote.js | 6 ++-- tests/MicropubTest.php | 6 ++++ 9 files changed, 39 insertions(+), 24 deletions(-) diff --git a/app/Http/Controllers/MicropubClientController.php b/app/Http/Controllers/MicropubClientController.php index 9035bae8..39842046 100644 --- a/app/Http/Controllers/MicropubClientController.php +++ b/app/Http/Controllers/MicropubClientController.php @@ -307,9 +307,13 @@ class MicropubClientController extends Controller } try { + $query = 'geo:' . $latitude . ',' . $longitude; + if ($request->input('uncertainty') !== null) { + $query .= ';u=' . $request->input('uncertainty'); + } $response = $this->guzzleClient->get($micropubEndpoint, [ 'headers' => ['Authorization' => 'Bearer ' . $token], - 'query' => ['q' => 'geo:' . $latitude . ',' . $longitude], + 'query' => ['q' => $query], ]); } catch (\GuzzleHttp\Exception\BadResponseException $e) { return response()->json([ diff --git a/app/Http/Controllers/MicropubController.php b/app/Http/Controllers/MicropubController.php index a3dd6939..e4f5c60d 100644 --- a/app/Http/Controllers/MicropubController.php +++ b/app/Http/Controllers/MicropubController.php @@ -147,11 +147,13 @@ EOD; } //nope, how about a geo URL? if (substr($request->input('q'), 0, 4) === 'geo:') { - $geo = explode(':', $request->input('q')); - $latlng = explode(',', $geo[1]); - $latitude = $latlng[0]; - $longitude = $latlng[1]; - $places = Place::near($latitude, $longitude, 1000); + preg_match_all( + '/([0-9\.\-]+)/', + $request->input('q'), + $matches + ); + $distance = (count($matches[0]) == 3) ? 100 * $matches[0][2] : 1000; + $places = Place::near($matches[0][0], $matches[0][1], $distance); return response()->json([ 'response' => 'places', diff --git a/changelog.md b/changelog.md index e3f4e4a6..c73cd982 100644 --- a/changelog.md +++ b/changelog.md @@ -1,9 +1,12 @@ # Changelog +## Version {next} + - Add support for accuracy/uncertainty in geo URIs (issue#20,issue#9) + ## Version 0.0.13 (2016-09-26) - Better places support, particularly with micropub (issue#9) - - Uglify js for better performance (issue#19) - - Autolink spotify links (issue#18) + - Uglify javascript for better performance (issue#19) + - Auto-link Spotify links (issue#18) ## Version 0.0.12 (2016-09-21) - Better indication of number of replies to a note (issue#17) @@ -32,7 +35,7 @@ - Better handling of webmention reply HTML cache ## Version 0.0.11.2 (2016-09-19) - - Update Typekit’s js sri hash + - Update Typekit’s javascript sri hash ## Version 0.0.11.1 (2016-09-17) - Fix a syntax issue in the download webmention job @@ -40,13 +43,13 @@ ## Version 0.0.11 (2016-09-17) - update linked GPG key (issue#7) - Added `integrity` values to external assets (issue#10) - - Move mapbox links into own sub-view (issue#11) - - Updated mapbox version (issue#12) + - Move Mapbox links into own sub-view (issue#11) + - Updated Mapbox version (issue#12) - Massive refactor of webmention code, allowing for re-parse command (issue#8) - Add license file (issue#13) ## Version 0.0.10 (2016-09-10) - - Add an artisan command for sensiolab’s security check + - Add an artisan command for Sensiolab’s security check - Remove `filp/whoops`, just use Laravel’s error reporting - Better TokenMismatchException handling (issue#5) @@ -59,27 +62,27 @@ - Fix an issue with syndicating notes. ## Version 0.0.9 (2016-09-06) - - Adding jsonb column to store webmentions’ mf2. + - Adding `jsonb` column to store webmentions’ microformats. * As of L5.2 this needs a custom command to drop NOT NULL from content, L5.3 should allow a fix for this - Refactor receiving webmention code - - Refactor sending webmention code to pass webmention.rocks + - Refactor sending webmention code to pass `webmention.rocks` - Update to use Laravel 5.3 ## Version 0.0.8.5 (2016-07-18) - - Set the size of the textarea in a form better + - Set the size of the `textarea` in a form better - Update to latest Guzzle to fix CVE-2016-5385 ## Version 0.0.8.4 (2016-07-18) - Make the revised non-elixir asset links absolute ## Version 0.0.8.3 (2016-07-18) - - Dump laravel-elixir, use gulp natively. Also this means using nginx and etags for cache-busting + - Dump `laravel-elixir`, use gulp natively. Also this means using nginx and etags for cache-busting ## Version 0.0.8.2 (2016-07-15) - Improve syndication parsing to allow better name display on new note form ## Version 0.0.8.1 (2016-07-13) - - Fix anh issue in the syndication target parsing method + - Fix an issue in the syndication target parsing method ## Version 0.0.8 (2016-07-13) - Allow new notes to be made by a JSON request from a micropub client @@ -116,11 +119,11 @@ - Add a stylelint lint-staged hook ## Version 0.0.3 (2013-06-09) - - Better tag normalization code organisation + - Better tag normalisation code organisation - Remove `jonnybarnes/unicode-tools` dependency and clean up relevant code ## Version 0.0.2 (2016-05-25) - - Fix issue#1: tagged notes page needs the tag from the URL normalizing. + - Fix issue#1: tagged notes page needs the tag from the URL normalising. ## Version 0.0.1 (2016-05-25) - Initial release diff --git a/public/assets/js/maps/newnote.js.map b/public/assets/js/maps/newnote.js.map index e2027f6f..23e397b2 100644 --- a/public/assets/js/maps/newnote.js.map +++ b/public/assets/js/maps/newnote.js.map @@ -1 +1 @@ -{"version":3,"sources":["newnote.js"],"names":["getLocation","navigator","geolocation","getCurrentPosition","position","addPlacesMap","coords","latitude","longitude","fetch","credentials","method","then","response","json","j","error","alertify","reset","error_description","length","i","places","latlng","parseLocation","location","name","slug","push","addMap","catch","err","console","arguments","form","button","parentNode","div","document","createElement","setAttribute","appendChild","L","mapbox","accessToken","map","setView","addLayer","tileLayer","detectRetina","marker","draggable","addTo","on","placeFormLatitude","querySelector","value","getLatitudeFromMapboxMarker","getLatLng","placeFormLongitude","getLongitudeFromMapboxMarker","selectEl","noLocation","noLocText","createTextNode","insertBefore","forEach","item","option","text","dataset","placeMarker","icon","marker-size","marker-symbol","marker-color","bindPopup","closeButton","panTo","selectPlace","addEventListener","placeLat","selectedIndex","placeLon","newLocButton","nameLabel","classList","add","nameEl","descLabel","descEl","latLabel","latEl","lonLabel","lonEl","placeSubmit","formData","FormData","append","body","placeJson","Error","urlParts","split","pop","removeChild","labels","querySelectorAll","removeLayer","newOption","newPlaceMarker","newName","placeError","point","re","resultArray","exec","selected","replace","disabled"],"mappings":"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","file":"newnote.js","sourcesContent":["/* global L, alertify */\nif ('geolocation' in navigator) {\n var button = document.querySelector('#locate');\n if (button.addEventListener) {\n //if we have javascript, event listeners and geolocation, make the locate\n //button clickable and add event\n button.disabled = false;\n button.addEventListener('click', getLocation);\n }\n}\n\nfunction getLocation() {\n navigator.geolocation.getCurrentPosition(function (position) {\n //the locate button has been clicked so add the places/map\n addPlacesMap(position.coords.latitude, position.coords.longitude);\n });\n}\n\nfunction addPlacesMap(latitude, longitude) {\n //get the nearby places\n fetch('/places/near/' + latitude + '/' + longitude, {\n credentials: 'same-origin',\n method: 'get'\n }).then(function (response) {\n return response.json();\n }).then(function (j) {\n if (j.error == true) {\n alertify.reset();\n alertify.error(j.error_description);\n }\n if (j.length > 0) {\n var i;\n var places = [];\n for (i = 0; i < j.length; ++i) {\n var latlng = parseLocation(j[i].location);\n var name = j[i].name;\n var slug = j[i].slug;\n places.push([name, slug, latlng[0], latlng[1]]);\n }\n //add a map with the nearby places\n addMap(latitude, longitude, places);\n } else {\n //add a map with just current location\n addMap(latitude, longitude);\n }\n }).catch(function (err) {\n console.error(err);\n });\n}\n\nfunction addMap(latitude, longitude, places) {\n //make places null if not supplied\n if (arguments.length == 2) {\n places = null;\n }\n var form = button.parentNode;\n var div = document.createElement('div');\n div.setAttribute('id', 'map');\n //add the map div\n form.appendChild(div);\n L.mapbox.accessToken = 'pk.eyJ1Ijoiam9ubnliYXJuZXMiLCJhIjoiVlpndW1EYyJ9.aP9fxAqLKh7lj0LpFh5k1w';\n var map = L.mapbox.map('map', 'jonnybarnes.gnoihnim')\n .setView([latitude, longitude], 15)\n .addLayer(L.mapbox.tileLayer('jonnybarnes.gnoihnim', {\n detectRetina: true\n }));\n //add a marker for the current location\n var marker = L.marker([latitude, longitude], {\n draggable: true\n }).addTo(map);\n //when the location marker is dragged, if the new place form elements exist\n //update the lat/lng values\n marker.on('dragend', function () {\n var placeFormLatitude = document.querySelector('#place-latitude');\n if (placeFormLatitude !== null) {\n placeFormLatitude.value = getLatitudeFromMapboxMarker(marker.getLatLng());\n }\n var placeFormLongitude = document.querySelector('#place-longitude');\n if (placeFormLongitude !== null) {\n placeFormLongitude.value = getLongitudeFromMapboxMarker(marker.getLatLng());\n }\n });\n //create the \n places.forEach(function (item) {\n var option = document.createElement('option');\n option.setAttribute('value', item[1]);\n var text = document.createTextNode(item[0]);\n option.appendChild(text);\n option.dataset.latitude = item[2];\n option.dataset.longitude = item[3];\n selectEl.appendChild(option);\n var placeMarker = L.marker([item[2], item[3]], {\n icon: L.mapbox.marker.icon({\n 'marker-size': 'large',\n 'marker-symbol': 'building',\n 'marker-color': '#fa0'\n })\n }).addTo(map);\n var name = 'Name: ' + item[0];\n placeMarker.bindPopup(name, {\n closeButton: true\n });\n placeMarker.on('click', function () {\n map.panTo([item[2], item[3]]);\n selectPlace(item[1]);\n });\n });\n //add an event listener\n selectEl.addEventListener('change', function () {\n if (selectEl.value !== 'no-location') {\n var placeLat = selectEl[selectEl.selectedIndex].dataset.latitude;\n var placeLon = selectEl[selectEl.selectedIndex].dataset.longitude;\n map.panTo([placeLat, placeLon]);\n }\n });\n }\n //add a button to add a new place\n var newLocButton = document.createElement('button');\n newLocButton.setAttribute('type', 'button');\n newLocButton.setAttribute('id', 'create-new-place');\n newLocButton.appendChild(document.createTextNode('Create New Place?'));\n //the event listener\n newLocButton.addEventListener('click', function() {\n //add the form elements\n var nameLabel = document.createElement('label');\n nameLabel.setAttribute('for', 'place-name');\n nameLabel.classList.add('place-label');\n nameLabel.appendChild(document.createTextNode('Place Name:'));\n var nameEl = document.createElement('input');\n nameEl.setAttribute('placeholder', 'Name');\n nameEl.setAttribute('name', 'place-name');\n nameEl.setAttribute('id', 'place-name');\n nameEl.setAttribute('type', 'text');\n var descLabel = document.createElement('label');\n descLabel.setAttribute('for', 'place-description');\n descLabel.classList.add('place-label');\n descLabel.appendChild(document.createTextNode('Place Description:'));\n var descEl = document.createElement('input');\n descEl.setAttribute('placeholder', 'Description');\n descEl.setAttribute('name', 'place-description');\n descEl.setAttribute('id', 'place-description');\n descEl.setAttribute('type', 'text');\n var latLabel = document.createElement('label');\n latLabel.setAttribute('for', 'place-latitude');\n latLabel.classList.add('place-label');\n latLabel.appendChild(document.createTextNode('Place Latitude:'));\n var latEl = document.createElement('input');\n latEl.setAttribute('name', 'place-latitude');\n latEl.setAttribute('id', 'place-latitude');\n latEl.setAttribute('type', 'text');\n latEl.value = getLatitudeFromMapboxMarker(marker.getLatLng());\n var lonLabel = document.createElement('label');\n lonLabel.setAttribute('for', 'place-longitude');\n lonLabel.classList.add('place-label');\n lonLabel.appendChild(document.createTextNode('Place Longitude:'));\n var lonEl = document.createElement('input');\n lonEl.setAttribute('name', 'place-longitude');\n lonEl.setAttribute('id', 'place-longitude');\n lonEl.setAttribute('type', 'text');\n lonEl.value = getLongitudeFromMapboxMarker(marker.getLatLng());\n var placeSubmit = document.createElement('button');\n placeSubmit.setAttribute('id', 'place-submit');\n placeSubmit.setAttribute('value', 'Submit New Place');\n placeSubmit.setAttribute('name', 'place-submit');\n placeSubmit.setAttribute('type', 'button');\n placeSubmit.appendChild(document.createTextNode('Submit New Place'));\n form.appendChild(nameLabel);\n form.appendChild(nameEl);\n form.appendChild(descLabel);\n form.appendChild(descEl);\n form.appendChild(latLabel);\n form.appendChild(latEl);\n form.appendChild(lonLabel);\n form.appendChild(lonEl);\n form.appendChild(placeSubmit);\n //the event listener for the new place form\n placeSubmit.addEventListener('click', function () {\n //create the form data to send\n var formData = new FormData();\n formData.append('place-name', document.querySelector('#place-name').value);\n formData.append('place-description', document.querySelector('#place-description').value);\n formData.append('place-latitude', document.querySelector('#place-latitude').value);\n formData.append('place-longitude', document.querySelector('#place-longitude').value);\n //post the new place\n fetch('/places/new', {\n //send cookies with the request\n credentials: 'same-origin',\n method: 'post',\n body: formData\n })\n .then(function (response) {\n return response.json();\n })\n .then(function (placeJson) {\n if (placeJson.error == true) {\n throw new Error(placeJson.error_description);\n }\n //create the slug from the url\n var urlParts = placeJson.split('/');\n var slug = urlParts.pop();\n //remove un-needed form elements\n form.removeChild(document.querySelector('#place-name'));\n form.removeChild(document.querySelector('#place-description'));\n form.removeChild(document.querySelector('#place-latitude'));\n form.removeChild(document.querySelector('#place-longitude'));\n var labels = document.querySelectorAll('.place-label');\n for (var i = 0; i < labels.length; ++i) {\n form.removeChild(labels[i]);\n }\n form.removeChild(document.querySelector('#place-submit'));\n form.removeChild(document.querySelector('#create-new-place'));\n //remove location marker\n map.removeLayer(marker);\n //add place marker\n var newOption = document.createElement('option');\n newOption.setAttribute('value', slug);\n newOption.appendChild(document.createTextNode(placeJson['name']));\n newOption.dataset.latitude = placeJson['latitude'];\n newOption.dataset.longitude = placeJson['longitude'];\n selectEl.appendChild(newOption);\n var newPlaceMarker = L.marker([placeJson['latitude'], placeJson['longitude']], {\n icon: L.mapbox.marker.icon({\n 'marker-size': 'large',\n 'marker-symbol': 'building',\n 'marker-color': '#fa0'\n })\n }).addTo(map);\n var newName = 'Name: ' + placeJson['name'];\n newPlaceMarker.bindPopup(newName, {\n closeButton: true\n });\n newPlaceMarker.on('click', function () {\n map.panTo([placeJson['latitude'], placeJson['longitude']]);\n selectPlace(slug);\n });\n //make selected\n selectPlace(slug);\n }).catch(function (placeError) {\n alertify.reset();\n alertify.error(placeError);\n });\n });\n });\n form.insertBefore(newLocButton, div);\n}\n\nfunction parseLocation(point) {\n var re = /\\((.*)\\)/;\n var resultArray = re.exec(point);\n var location = resultArray[1].split(' ');\n\n return [location[1], location[0]];\n}\n\nfunction selectPlace(slug) {\n document.querySelector('select [value=' + slug + ']').selected = true;\n}\n\nfunction getLatitudeFromMapboxMarker(latlng) {\n var resultArray = /\\((.*)\\)/.exec(latlng);\n var location = resultArray[1].split(' ');\n\n return location[0].replace(',', '');\n}\n\nfunction getLongitudeFromMapboxMarker(latlng) {\n var resultArray = /\\((.*)\\)/.exec(latlng);\n var location = resultArray[1].split(' ');\n\n return location[1];\n}\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["newnote.js"],"names":["getLocation","navigator","geolocation","getCurrentPosition","position","addPlacesMap","coords","latitude","longitude","accuracy","uncertainty","fetch","credentials","method","then","response","json","j","error","alertify","reset","error_description","length","i","places","latlng","parseLocation","location","name","slug","push","addMap","catch","err","console","arguments","form","button","parentNode","div","document","createElement","setAttribute","appendChild","L","mapbox","accessToken","map","setView","addLayer","tileLayer","detectRetina","marker","draggable","addTo","on","placeFormLatitude","querySelector","value","getLatitudeFromMapboxMarker","getLatLng","placeFormLongitude","getLongitudeFromMapboxMarker","selectEl","noLocation","noLocText","createTextNode","insertBefore","forEach","item","option","text","dataset","placeMarker","icon","marker-size","marker-symbol","marker-color","bindPopup","closeButton","panTo","selectPlace","addEventListener","placeLat","selectedIndex","placeLon","newLocButton","nameLabel","classList","add","nameEl","descLabel","descEl","latLabel","latEl","lonLabel","lonEl","placeSubmit","formData","FormData","append","body","placeJson","Error","urlParts","split","pop","removeChild","labels","querySelectorAll","removeLayer","newOption","newPlaceMarker","newName","placeError","point","re","resultArray","exec","selected","replace","disabled"],"mappings":"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","file":"newnote.js","sourcesContent":["/* global L, alertify */\nif ('geolocation' in navigator) {\n var button = document.querySelector('#locate');\n if (button.addEventListener) {\n //if we have javascript, event listeners and geolocation, make the locate\n //button clickable and add event\n button.disabled = false;\n button.addEventListener('click', getLocation);\n }\n}\n\nfunction getLocation() {\n navigator.geolocation.getCurrentPosition(function (position) {\n //the locate button has been clicked so add the places/map\n addPlacesMap(position.coords.latitude, position.coords.longitude, position.coords.accuracy);\n });\n}\n\nfunction addPlacesMap(latitude, longitude, uncertainty) {\n //get the nearby places\n fetch('/places/near/' + latitude + '/' + longitude + '?' + uncertainty, {\n credentials: 'same-origin',\n method: 'get'\n }).then(function (response) {\n return response.json();\n }).then(function (j) {\n if (j.error == true) {\n alertify.reset();\n alertify.error(j.error_description);\n }\n if (j.length > 0) {\n var i;\n var places = [];\n for (i = 0; i < j.length; ++i) {\n var latlng = parseLocation(j[i].location);\n var name = j[i].name;\n var slug = j[i].slug;\n places.push([name, slug, latlng[0], latlng[1]]);\n }\n //add a map with the nearby places\n addMap(latitude, longitude, places);\n } else {\n //add a map with just current location\n addMap(latitude, longitude);\n }\n }).catch(function (err) {\n console.error(err);\n });\n}\n\nfunction addMap(latitude, longitude, places) {\n //make places null if not supplied\n if (arguments.length == 2) {\n places = null;\n }\n var form = button.parentNode;\n var div = document.createElement('div');\n div.setAttribute('id', 'map');\n //add the map div\n form.appendChild(div);\n L.mapbox.accessToken = 'pk.eyJ1Ijoiam9ubnliYXJuZXMiLCJhIjoiVlpndW1EYyJ9.aP9fxAqLKh7lj0LpFh5k1w';\n var map = L.mapbox.map('map', 'jonnybarnes.gnoihnim')\n .setView([latitude, longitude], 15)\n .addLayer(L.mapbox.tileLayer('jonnybarnes.gnoihnim', {\n detectRetina: true\n }));\n //add a marker for the current location\n var marker = L.marker([latitude, longitude], {\n draggable: true\n }).addTo(map);\n //when the location marker is dragged, if the new place form elements exist\n //update the lat/lng values\n marker.on('dragend', function () {\n var placeFormLatitude = document.querySelector('#place-latitude');\n if (placeFormLatitude !== null) {\n placeFormLatitude.value = getLatitudeFromMapboxMarker(marker.getLatLng());\n }\n var placeFormLongitude = document.querySelector('#place-longitude');\n if (placeFormLongitude !== null) {\n placeFormLongitude.value = getLongitudeFromMapboxMarker(marker.getLatLng());\n }\n });\n //create the \n places.forEach(function (item) {\n var option = document.createElement('option');\n option.setAttribute('value', item[1]);\n var text = document.createTextNode(item[0]);\n option.appendChild(text);\n option.dataset.latitude = item[2];\n option.dataset.longitude = item[3];\n selectEl.appendChild(option);\n var placeMarker = L.marker([item[2], item[3]], {\n icon: L.mapbox.marker.icon({\n 'marker-size': 'large',\n 'marker-symbol': 'building',\n 'marker-color': '#fa0'\n })\n }).addTo(map);\n var name = 'Name: ' + item[0];\n placeMarker.bindPopup(name, {\n closeButton: true\n });\n placeMarker.on('click', function () {\n map.panTo([item[2], item[3]]);\n selectPlace(item[1]);\n });\n });\n //add an event listener\n selectEl.addEventListener('change', function () {\n if (selectEl.value !== 'no-location') {\n var placeLat = selectEl[selectEl.selectedIndex].dataset.latitude;\n var placeLon = selectEl[selectEl.selectedIndex].dataset.longitude;\n map.panTo([placeLat, placeLon]);\n }\n });\n }\n //add a button to add a new place\n var newLocButton = document.createElement('button');\n newLocButton.setAttribute('type', 'button');\n newLocButton.setAttribute('id', 'create-new-place');\n newLocButton.appendChild(document.createTextNode('Create New Place?'));\n //the event listener\n newLocButton.addEventListener('click', function() {\n //add the form elements\n var nameLabel = document.createElement('label');\n nameLabel.setAttribute('for', 'place-name');\n nameLabel.classList.add('place-label');\n nameLabel.appendChild(document.createTextNode('Place Name:'));\n var nameEl = document.createElement('input');\n nameEl.setAttribute('placeholder', 'Name');\n nameEl.setAttribute('name', 'place-name');\n nameEl.setAttribute('id', 'place-name');\n nameEl.setAttribute('type', 'text');\n var descLabel = document.createElement('label');\n descLabel.setAttribute('for', 'place-description');\n descLabel.classList.add('place-label');\n descLabel.appendChild(document.createTextNode('Place Description:'));\n var descEl = document.createElement('input');\n descEl.setAttribute('placeholder', 'Description');\n descEl.setAttribute('name', 'place-description');\n descEl.setAttribute('id', 'place-description');\n descEl.setAttribute('type', 'text');\n var latLabel = document.createElement('label');\n latLabel.setAttribute('for', 'place-latitude');\n latLabel.classList.add('place-label');\n latLabel.appendChild(document.createTextNode('Place Latitude:'));\n var latEl = document.createElement('input');\n latEl.setAttribute('name', 'place-latitude');\n latEl.setAttribute('id', 'place-latitude');\n latEl.setAttribute('type', 'text');\n latEl.value = getLatitudeFromMapboxMarker(marker.getLatLng());\n var lonLabel = document.createElement('label');\n lonLabel.setAttribute('for', 'place-longitude');\n lonLabel.classList.add('place-label');\n lonLabel.appendChild(document.createTextNode('Place Longitude:'));\n var lonEl = document.createElement('input');\n lonEl.setAttribute('name', 'place-longitude');\n lonEl.setAttribute('id', 'place-longitude');\n lonEl.setAttribute('type', 'text');\n lonEl.value = getLongitudeFromMapboxMarker(marker.getLatLng());\n var placeSubmit = document.createElement('button');\n placeSubmit.setAttribute('id', 'place-submit');\n placeSubmit.setAttribute('value', 'Submit New Place');\n placeSubmit.setAttribute('name', 'place-submit');\n placeSubmit.setAttribute('type', 'button');\n placeSubmit.appendChild(document.createTextNode('Submit New Place'));\n form.appendChild(nameLabel);\n form.appendChild(nameEl);\n form.appendChild(descLabel);\n form.appendChild(descEl);\n form.appendChild(latLabel);\n form.appendChild(latEl);\n form.appendChild(lonLabel);\n form.appendChild(lonEl);\n form.appendChild(placeSubmit);\n //the event listener for the new place form\n placeSubmit.addEventListener('click', function () {\n //create the form data to send\n var formData = new FormData();\n formData.append('place-name', document.querySelector('#place-name').value);\n formData.append('place-description', document.querySelector('#place-description').value);\n formData.append('place-latitude', document.querySelector('#place-latitude').value);\n formData.append('place-longitude', document.querySelector('#place-longitude').value);\n //post the new place\n fetch('/places/new', {\n //send cookies with the request\n credentials: 'same-origin',\n method: 'post',\n body: formData\n })\n .then(function (response) {\n return response.json();\n })\n .then(function (placeJson) {\n if (placeJson.error == true) {\n throw new Error(placeJson.error_description);\n }\n //create the slug from the url\n var urlParts = placeJson.split('/');\n var slug = urlParts.pop();\n //remove un-needed form elements\n form.removeChild(document.querySelector('#place-name'));\n form.removeChild(document.querySelector('#place-description'));\n form.removeChild(document.querySelector('#place-latitude'));\n form.removeChild(document.querySelector('#place-longitude'));\n var labels = document.querySelectorAll('.place-label');\n for (var i = 0; i < labels.length; ++i) {\n form.removeChild(labels[i]);\n }\n form.removeChild(document.querySelector('#place-submit'));\n form.removeChild(document.querySelector('#create-new-place'));\n //remove location marker\n map.removeLayer(marker);\n //add place marker\n var newOption = document.createElement('option');\n newOption.setAttribute('value', slug);\n newOption.appendChild(document.createTextNode(placeJson['name']));\n newOption.dataset.latitude = placeJson['latitude'];\n newOption.dataset.longitude = placeJson['longitude'];\n selectEl.appendChild(newOption);\n var newPlaceMarker = L.marker([placeJson['latitude'], placeJson['longitude']], {\n icon: L.mapbox.marker.icon({\n 'marker-size': 'large',\n 'marker-symbol': 'building',\n 'marker-color': '#fa0'\n })\n }).addTo(map);\n var newName = 'Name: ' + placeJson['name'];\n newPlaceMarker.bindPopup(newName, {\n closeButton: true\n });\n newPlaceMarker.on('click', function () {\n map.panTo([placeJson['latitude'], placeJson['longitude']]);\n selectPlace(slug);\n });\n //make selected\n selectPlace(slug);\n }).catch(function (placeError) {\n alertify.reset();\n alertify.error(placeError);\n });\n });\n });\n form.insertBefore(newLocButton, div);\n}\n\nfunction parseLocation(point) {\n var re = /\\((.*)\\)/;\n var resultArray = re.exec(point);\n var location = resultArray[1].split(' ');\n\n return [location[1], location[0]];\n}\n\nfunction selectPlace(slug) {\n document.querySelector('select [value=' + slug + ']').selected = true;\n}\n\nfunction getLatitudeFromMapboxMarker(latlng) {\n var resultArray = /\\((.*)\\)/.exec(latlng);\n var location = resultArray[1].split(' ');\n\n return location[0].replace(',', '');\n}\n\nfunction getLongitudeFromMapboxMarker(latlng) {\n var resultArray = /\\((.*)\\)/.exec(latlng);\n var location = resultArray[1].split(' ');\n\n return location[1];\n}\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/public/assets/js/newnote.js b/public/assets/js/newnote.js index 80ed1088..fe1dec15 100644 --- a/public/assets/js/newnote.js +++ b/public/assets/js/newnote.js @@ -1,2 +1,2 @@ -function getLocation(){navigator.geolocation.getCurrentPosition(function(e){addPlacesMap(e.coords.latitude,e.coords.longitude)})}function addPlacesMap(e,t){fetch("/places/near/"+e+"/"+t,{credentials:"same-origin",method:"get"}).then(function(e){return e.json()}).then(function(a){if(1==a.error&&(alertify.reset(),alertify.error(a.error_description)),a.length>0){var n,r=[];for(n=0;n0){var n,r=[];for(n=0;n6m$zVN8; z3>yia=~~CRROG(j{C%zFe);rGYn;+g6 z7y0XsEIF~wFm3-9TdxU^POfP!oH@_*a{r4N1aBD5j?T~o?-|DD3kCNY=vN>l=->2UDAb&h(;^<5&anYF@s#_C^1 z884&v*2j02n4Vd`zMwz%*3=&t7cO9zH(u(>>^4um?#q;e-#4FJXE~?xOjoSw9{!So ze4~fg_q~`h&9YQV+Aijg<$||&y#zXMZ22F*<&F3D>8yWmEi+%+={wavZ?*8Ruk*Hf zUi(^{WSY?bYTmMdB}YTlLXQ}nTxGj@y6`~`Nrmv$oApz?lFE$qL{p>GqW8Mh>|jtk z{qd4wg#epRgU*fPo4y^s#Ua*qg+JeD$$j7F)7IU;ntwj&K;rT_Me_gtRfhlj`%}Ws zrha?HFXR2cj{GbC`|17H-Ll>BWzWL>|JPUSzwzq)D*l&OlOFHc*YdFQ9s9qW;O3t> z4|R;<=O?8_-Ret@D3EA4*eqJvoOR;F!mr-?U;h0%@OT=Z*Ne>3w%=Rt{W1^MzVE^G z_}vbz8~slb?3UlD;_$w>U&^aiEZ;s+)WN3vMl)Ncz(sjo^_f>q4Y%LD zxc%HpJ@o?xpU!P8F8RMtsd|@0f|HWM4fdql?rUz@_vyaVJ>n|ABUnmsh3BpmXGJf+ zPpk`LysP8?MsX^Cmfg2HDqzJ2Z~6C1reQG(`4^UO-3rTR{=e2i%k|5lRKvc@c~kfO zYF_t6EzIEm+AF8!d3m)2e=K}^O5sS3to6>9va3w{1=kkeXfC^)qJNP?;k%6H1H~P( zOP29@9Zh7_3+J6G$X>BLqQA*oX!@rqi_=VR2Pmyz$!42ledL`-?LjpLo6hai4|j%6 zT<~C*WoLdO?~y=uj(Y`fX3fo0l$YO^6|Q~nqItXj*Y{^OHZAJ;eU?w}afnfq^{JB^ zczHj1F|A1}emz&y&r$c?}dG z!vmVtm-$Q&)^6UQ>3DKkYRQ(aM^#l0x77L_ubT&5J*DQb%HmLiUQN)&zRENHDcl!% zWF0nbRQ|#~w_JlGhqc?eQp3kB`2hMkBlalGxdv?XZYqTA1cqO|Nz9;{lH z#J+WUpiiRWbSd`q$Cf=4)gC>ZeO};1V3=zKAKUgzYIj$3x38{ESeVOmZ04m6TY@yb zLef$Ls!{`&B}lA2xLD0+di6J(zf7#(=iC=~>Qgf}-XMYf;8}s$hBH04UsI{s=618f zLYF5eKEn78xAWqkEyQXg9+mpNg-}qu=ulVcn_fz2uL!ve=PM?*l*R@OgZKTWcmQ1Hz z_GdM_7M!S2e(uD(vorh*-;_=KU)}A`9A(_K=-TbhN5!yr_(R6#X4kAJnZSARoqocyPk7sK{4A8X!Gn9C{_z4P|bqqF2T f-<2HZ^9cWi6k zq?64D3sx4bad=cXfA6eWpMCy?NQ6m#oRh*V8#j%E9lFGyRQtlvT=V{V-SA!?S&-6 z{pJ3Kd2-Lf%U2)I%2llUrv0Mx_=@+}8ait|*@etG7NYd;_FQCk@QzHrykl-O*w zuEZ}IS6q2iH_hTX=b^FglggFquVp>cc-SsneY}N3vuBE|x_99Y#mS}7)^>B4C+{r% zCSb#%tmcq*|8C^(I$ai9C#N=ko=fwW8GDE4&o*Cf_+Uq{Uj;{f-G1Hr`g)G{^Y_Nu zoIi73apV81dwvvuEj#|``P`pRC;xwcUw2#Em_6?y4`4B9h$x`!lL&~ zxcZEl)3!aA5R-9R@Ogpuy+u(*MH!zjaqr!K{r!$*xk7AOdK+V(^wwLKewwOc@NV4| z*7kWhr_-mr?q}Sd@}|17y*%gj)ccFOs@S9>8IN>#*sds36ZjWsKj~A9MDhDvPw5$+ zIcz+t`f-JQ@9qYt=>KIBab;pTZv5u2!K!`ywchO9g=ebYO>JYHHAyW}wj*R>mZQe? zE7#5U_Z{}|JTAYAk45X=>*DYwrxvkZ`YF3=f$68L5BJ%Y1j)qBd4II<+L}wx@4pPn z3u4`T=UCO%$tN9EnCy3I^EjQlRx{Z!Znf3tDGzov9nKJsea))HxMZF(n@vj2?G?F3 zOEPXWtiCdN>2bz5ookC9Ogd6v^L$0@S)(T$UI%9-p830|e94{!QHFU(XGh;YvdAN# zfPc;s^8luMm%^IN=d?d-@IEo=c>b*gUHn@Pd@O!_yLin)j>lq~o1=}U`X*RC$+=Vn!X{x7|JnMXPufpNZvwny5`G;0b^)XnH(UKSaXU(FmpJ&YX6kjBD zt1HFUC4*n;eYijbx7zoM4-#!oH2iJ&l+jeT$am4w(>r)u`fI-kygm7N!=bw_AJ+TC zSky;dlhfnq?YhLjx`8?Fb=xJ+^e@+@Eq;FTeD#~T8{fP?m~ZtX-1=NLcVKfEci}q4 zE4mr^&BeL*ZYKwnT|J#{y~Or@)ZX}(^Jhg%-1SyOYhDd_6<%_8PL}t@$#2%AdzA%L z?`k=z`{c@#j2xTec9%-5>%L3MT6WFlIDPOz*c}n=(v1aY`&G7lJ!la;YZBMgMJ}mf zY)iw%Qn`+Kn?_yfdHG0VF8jR259WQGy`-me{bz2rH^+C*yp*+MR>^ALL(^AJnc5zl zmQbB`vcR85cd}(s(PeP~{YK-7??0wJiY@vz%fI-g$KUuT6^4qb_q!9CRJ|7coy^#E z=Wi}+R7p~>j~D;_-Oles_LuHh^yd7Gb?2AJ+}3%yt*i6rU5B!rYt;`gI1qJ7Y~8#K z^AEdU=h!9eZ?yfPKxcTX`n<*^+f2{aAYs2)UB>u}U)F=MY zcNSSb=~4aVo}zW@^)}h~yY%y*X@r*6e-fuGViFi-HfBsNbD` zOu#iDWzWRqg>5&EWUpdg`iA-MMgG!_Q}tGEE@qe6=F7(<(_;KwGOsd_d*|B8ubx^w zSS_+xIKwJ)FF%iczRjL5d%p8+4+@XICc5R@{NMYMN{R}aa_4sIWgc!|yx{xKe&X-x zYdjA#cUO04FD}`De3?K diff --git a/public/assets/js/newnote.js.gz b/public/assets/js/newnote.js.gz index ba05c98aebab1c11a9c6baee9c60d6bd05f61b25..a912dd735bb946825b452f8238fbee7b48b958ee 100644 GIT binary patch literal 1815 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 diff --git a/resources/assets/js/newnote.js b/resources/assets/js/newnote.js index 3e6d7792..30481af0 100644 --- a/resources/assets/js/newnote.js +++ b/resources/assets/js/newnote.js @@ -12,13 +12,13 @@ if ('geolocation' in navigator) { function getLocation() { navigator.geolocation.getCurrentPosition(function (position) { //the locate button has been clicked so add the places/map - addPlacesMap(position.coords.latitude, position.coords.longitude); + addPlacesMap(position.coords.latitude, position.coords.longitude, position.coords.accuracy); }); } -function addPlacesMap(latitude, longitude) { +function addPlacesMap(latitude, longitude, uncertainty) { //get the nearby places - fetch('/places/near/' + latitude + '/' + longitude, { + fetch('/places/near/' + latitude + '/' + longitude + '?' + uncertainty, { credentials: 'same-origin', method: 'get' }).then(function (response) { diff --git a/tests/MicropubTest.php b/tests/MicropubTest.php index 88a9838f..5462a73c 100644 --- a/tests/MicropubTest.php +++ b/tests/MicropubTest.php @@ -53,6 +53,12 @@ class MicropubTest extends TestCase $this->see('the-bridgewater-pub'); } + public function testMicropubRequestForNearbyPlacesThatExistWithUncertaintyParameter() + { + $this->call('GET', $this->appurl . '/api/post', ['q' => 'geo:53.5,-2.38;u=35'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]); + $this->see('the-bridgewater-pub'); + } + public function testMicropubRequestForNearbyPlacesThatDoNotExist() { $this->call('GET', $this->appurl . '/api/post', ['q' => 'geo:1.23,4.56'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]); From 2546a92039d7c6dd13836824b0aaabd98592dd1c Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Sat, 1 Oct 2016 14:26:07 +0100 Subject: [PATCH 2/3] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit fa51cd728fbb13ebadfc45d90dc24c284a31f4ae Author: Jonny Barnes Date: Sat Oct 1 14:25:50 2016 +0100 Update changelog commit 93e6a92c664cb42da679c5bb2e37cabec0e7fb99 Author: Jonny Barnes Date: Sat Oct 1 14:25:00 2016 +0100 test create new place with uncertainty parameter commit 3d793801b3c0e93228ce5c6bae83c74b130127c0 Author: Jonny Barnes Date: Sat Oct 1 14:24:35 2016 +0100 Parse correctly to take into account uncertainty parameter commit d9060332a484ff414ed4dac03fa39838d7b73b54 Author: Jonny Barnes Date: Sat Oct 1 11:11:56 2016 +0100 Better comments commit 298663cf7beaf4893d326aae880d64279ce4af37 Author: Jonny Barnes Date: Fri Sep 30 22:59:08 2016 +0100 Allow tagged notes to be deleted, didn’t know that wasn’t possible before :/ commit 7f5c65c6d858321526b7f0ac84c527dc2f09614a Author: Jonny Barnes Date: Fri Sep 30 22:57:57 2016 +0100 Better test for creating a new note via mircropub, the new note gets deleted --- app/Services/PlaceService.php | 13 +++++--- changelog.md | 1 + ..._09_30_214651_cascade_delete_note_tags.php | 31 +++++++++++++++++++ tests/MicropubClientTest.php | 8 +++-- tests/MicropubTest.php | 19 ++++++++++++ 5 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 database/migrations/2016_09_30_214651_cascade_delete_note_tags.php diff --git a/app/Services/PlaceService.php b/app/Services/PlaceService.php index 85a27972..602e097b 100644 --- a/app/Services/PlaceService.php +++ b/app/Services/PlaceService.php @@ -25,10 +25,15 @@ class PlaceService $description = $request->input('description'); $geo = $request->input('geo'); } - $parts = explode(':', $geo); - $latlng = explode(',', $parts[1]); - $latitude = $latlng[0]; - $longitude = $latlng[1]; + if ($geo) { + preg_match_all( + '/([0-9\.\-]+)/', + $geo, + $matches + ); + $latitude = $matches[0][0]; + $longitude = $matches[0][1]; + } if ($request->input('latitude') !== null) { $latitude = $request->input('latitude'); $longitude = $request->input('longitude'); diff --git a/changelog.md b/changelog.md index c73cd982..e6a5e269 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,7 @@ ## Version {next} - Add support for accuracy/uncertainty in geo URIs (issue#20,issue#9) + - Add some places tests ## Version 0.0.13 (2016-09-26) - Better places support, particularly with micropub (issue#9) diff --git a/database/migrations/2016_09_30_214651_cascade_delete_note_tags.php b/database/migrations/2016_09_30_214651_cascade_delete_note_tags.php new file mode 100644 index 00000000..8100b161 --- /dev/null +++ b/database/migrations/2016_09_30_214651_cascade_delete_note_tags.php @@ -0,0 +1,31 @@ +dropForeign('note_tag_note_id_foreign'); + $table->foreign('note_id')->references('id')->on('notes')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/tests/MicropubClientTest.php b/tests/MicropubClientTest.php index 14a6da5a..c948e815 100644 --- a/tests/MicropubClientTest.php +++ b/tests/MicropubClientTest.php @@ -46,9 +46,6 @@ class MicropubClientTest extends TestCase ->see('https://twitter.com/jonnybarnes'); } - /** - * This currently creates a new note that stays in the database. - */ public function testClientCreatesNewNoteWithTag() { $faker = \Faker\Factory::create(); @@ -62,6 +59,11 @@ class MicropubClientTest extends TestCase $this->seeInDatabase('notes', ['note' => $note]); $this->visit($this->appurl . '/notes/tagged/PHPUnit') ->see('PHPUnit'); + //my client has made a request to my endpoint, which then adds + //to the db, so database transaction don’t work + //so lets manually delete the new entry + $newNote = \App\Note::where('note', $note); + $newNote->forceDelete(); } diff --git a/tests/MicropubTest.php b/tests/MicropubTest.php index 5462a73c..7e5830e4 100644 --- a/tests/MicropubTest.php +++ b/tests/MicropubTest.php @@ -222,6 +222,25 @@ class MicropubTest extends TestCase ]); } + public function testMicropubJSONRequestCreateNewPlaceWithUncertaintyParam() + { + $faker = \Faker\Factory::create(); + $this->json( + 'POST', + $this->appurl . '/api/post', + [ + 'type' => ['h-card'], + 'properties' => [ + 'name' => $faker->name, + 'geo' => 'geo:' . $faker->latitude . ',' . $faker->longitude . ';u=35' + ], + ], + ['HTTP_Authorization' => 'Bearer ' . $this->getToken()] + )->seeJson([ + 'response' => 'created' + ])->assertResponseStatus(201); + } + private function getToken() { $signer = new Sha256(); From ab632636da92e1c3d48468e4fbcdff4fc91ca240 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Sat, 1 Oct 2016 14:27:05 +0100 Subject: [PATCH 3/3] Bump version number --- changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index e6a5e269..7b731b6f 100644 --- a/changelog.md +++ b/changelog.md @@ -1,6 +1,6 @@ # Changelog -## Version {next} +## Version 0.0.13.1 (2016-10-01) - Add support for accuracy/uncertainty in geo URIs (issue#20,issue#9) - Add some places tests