From 33e375299c9da46b44afe74e51ca2dc29d514627 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Sun, 7 Apr 2019 13:50:26 -0600 Subject: [PATCH] Add nearby merchant feature --- api/actions/merchants.php | 105 ++++++++++++++++++++++++++++++++++++++ api/apisettings.php | 10 ++++ database.mwb | Bin 11225 -> 13549 bytes 3 files changed, 115 insertions(+) create mode 100644 api/actions/merchants.php diff --git a/api/actions/merchants.php b/api/actions/merchants.php new file mode 100644 index 0000000..e52aa15 --- /dev/null +++ b/api/actions/merchants.php @@ -0,0 +1,105 @@ +boundingCoordinates($radius, "miles"); + +ob_flush(); +$people = $database->debug()->select("merchants", [ + "merchantid", + "name", + "address", + "latitude", + "longitude" + ], [ + "AND" => [ + 'latitude[<>]' => [$searchbounds[0]->getLatitudeInDegrees(), $searchbounds[1]->getLatitudeInDegrees()], + 'longitude[<>]' => [$searchbounds[0]->getLongitudeInDegrees(), $searchbounds[1]->getLongitudeInDegrees()] + ], + "LIMIT" => 100 + ] +); +$query = ob_get_contents(); +ob_clean(); +$merchants = $database->query($query)->fetchAll(); + +// Get a list of the merchant types +for ($i = 0; $i < count($merchants); $i++) { + $types = $database->select( + "merchant_type", + ["[>]merchant_types" => "typeid"], + ["merchant_type.typeid (id)", "type (name)", "icon"], + ["merchantid" => $merchants[$i]["merchantid"]] + ); + $merchants[$i]["types"] = $types; +} + +if (!empty($VARS["format"]) && $VARS["format"] == "geojson") { + $geojson = [ + "name" => "Nearby Merchants", + "type" => "FeatureCollection", + "features" => [] + ]; + + foreach ($merchants as $merchant) { + $geojson["features"][] = [ + "type" => "Feature", + "geometry" => [ + "type" => "Point", + "coordinates" => [ + $merchant["longitude"] * 1.0, + $merchant["latitude"] * 1.0 + ] + ], + "properties" => [ + "id" => $merchant["merchantid"], + "name" => utf8_encode($merchant["name"]), + "address" => utf8_encode($merchant["address"]), + "types" => $merchant["types"] + ] + ]; + } + + exitWithJson($geojson); +} + +$nearby = []; + +foreach ($merchants as $merchant) { + $nearby[] = [ + "name" => utf8_encode($merchant["name"]), + "merchantid" => $merchant["merchantid"], + "address" => utf8_encode($merchant["address"]), + "types" => $merchant["types"], + "latitude" => $merchant["latitude"] * 1.0, + "longitude" => $merchant["longitude"] * 1.0 + ]; +} + +exitWithJson([ + "status" => "OK", + "radius" => $radius, + "bounds" => [ + 0 => [ + "latitude" => $searchbounds[0]->getLatitudeInDegrees(), + "longitude" => $searchbounds[0]->getLongitudeInDegrees() + ], + 1 => [ + "latitude" => $searchbounds[1]->getLatitudeInDegrees(), + "longitude" => $searchbounds[1]->getLongitudeInDegrees() + ], + ], + "nearby" => $nearby +]); diff --git a/api/apisettings.php b/api/apisettings.php index d4db106..34cde83 100644 --- a/api/apisettings.php +++ b/api/apisettings.php @@ -84,6 +84,16 @@ $APIS = [ "format (optional)" => "/(geojson)/" ] ], + "getmerchants" => [ + "load" => "merchants.php", + "vars" => [ + "key" => $keyregex, + "latitude" => "/-?[0-9]{2}\.[0-9]+/", + "longitude" => "/-?[0-9]{2,3}\.[0-9]+/", + "radius (optional)" => "/[0-9]*\.?[0-9]+/", + "format (optional)" => "/(geojson)/" + ] + ], "broadcast" => [ "load" => "broadcast.php", "vars" => [ diff --git a/database.mwb b/database.mwb index 393a5e664a2210bf6558843570abb63382469414..d48e909dc9946a409db84003b94bc25f8115a901 100644 GIT binary patch literal 13549 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 literal 11225 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