From 47bc5874cc05aeba774789cc58b6a1b2836758f8 Mon Sep 17 00:00:00 2001 From: Starbeamrainbowlabs Date: Sun, 24 Feb 2019 17:17:11 +0000 Subject: [PATCH] API: Add format parameter to fetch-data action. --- Changelog.md | 1 + README.md | 1 + logic/Actions/DeviceData.php | 3 +-- logic/Actions/FetchData.php | 35 +++++++++++++++++++++++++----- logic/Actions/ListDevices.php | 2 ++ logic/Actions/ListReadingTypes.php | 2 ++ 6 files changed, 36 insertions(+), 8 deletions(-) diff --git a/Changelog.md b/Changelog.md index c573a85..347828d 100644 --- a/Changelog.md +++ b/Changelog.md @@ -5,6 +5,7 @@ - `device-data` - `list-devices` - `list-reading-types` + - `fetch-data` ## v0.3.3 - 20th February 2019 - Updated to use new database structure diff --git a/README.md b/README.md index e1836aa..10c451e 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,7 @@ Parameter | Type | Meaning --------------------|-----------|--------------------- `datetime` | date/time | Required. Specifies the date and time for which readings are desired. `reading_type` | string | Required. Specifies the type of reading desired. +`format` | string | Optional. Specifies the format that the response will be returned in. Valid values: `json`, `csv`. Default: `json`. Examples: diff --git a/logic/Actions/DeviceData.php b/logic/Actions/DeviceData.php index e029a3a..640d65d 100644 --- a/logic/Actions/DeviceData.php +++ b/logic/Actions/DeviceData.php @@ -119,9 +119,8 @@ class DeviceData implements IAction { break; case "csv": $response_type = "text/csv"; - $response_suggested_filename .= ".json"; + $response_suggested_filename .= ".csv"; $response = ResponseEncoder::encode_csv($data); - break; } diff --git a/logic/Actions/FetchData.php b/logic/Actions/FetchData.php index 6c5418e..53daba2 100644 --- a/logic/Actions/FetchData.php +++ b/logic/Actions/FetchData.php @@ -3,6 +3,7 @@ namespace AirQuality\Actions; use \SBRL\TomlConfig; +use \SBRL\ResponseEncoder; use \AirQuality\Repositories\IMeasurementDataRepository; use \AirQuality\Repositories\IMeasurementTypeRepository; use \AirQuality\ApiResponseSender; @@ -47,8 +48,11 @@ class FetchData implements IAction { $this->validator->is_datetime("datetime"); $this->validator->exists("reading_type"); $this->validator->is_max_length("reading_type", 256); + if(!empty($_GET["format"])) + $this->validator->is_preset_value("format", ["json", "csv"], 406); $this->validator->run(); + $format = $_GET["format"] ?? "json"; $measurement_type_id = $this->type_repo->get_id($_GET["reading_type"]); if($measurement_type_id == null) { @@ -60,24 +64,42 @@ class FetchData implements IAction { return false; } + // 2: Pull data from database $data = $this->measurement_repo->get_readings_by_date( new \DateTime($_GET["datetime"]), $measurement_type_id ); + // 2.5: Validate data from database if(empty($data)) { - http_response_code(404); - header("content-type: text/plain"); - header("x-time-taken: " . PerfFormatter::format_perf_data($start_time, $start_handle, null)); - echo("Error: No data could be found for that timestamp."); + $this->sender->send_error_plain(404, + "Error: No data could be found for that timestamp.", + [ PerfFormatter::format_perf_data($start_time, $start_handle, null) ] + ); return false; } + // 3: Serialise data $start_encode = microtime(true); - $response = json_encode($data); + $response_type = "application/octet-stream"; + $response_suggested_filename = "data-" . date(\DateTime::ATOM) . ""; + $response = null; + switch($format) { + case "json": + $response_type = "application/json"; + $response_suggested_filename .= ".json"; + $response = json_encode($data); + break; + case "csv": + $response_type = "text/csv"; + $response_suggested_filename .= ".csv"; + $response = ResponseEncoder::encode_csv($data); + break; + } + // 4: Send response @@ -86,8 +108,9 @@ class FetchData implements IAction { header("cache-control: public, max-age=" . $this->settings->get("cache.max-age")); } + header("content-type: $response_type"); header("content-length: " . strlen($response)); - header("content-type: application/json"); + header("content-disposition: inline; filename=$response_suggested_filename"); header("x-time-taken: " . PerfFormatter::format_perf_data($start_time, $start_handle, $start_encode)); echo($response); return true; diff --git a/logic/Actions/ListDevices.php b/logic/Actions/ListDevices.php index baccb55..bb6cc4c 100644 --- a/logic/Actions/ListDevices.php +++ b/logic/Actions/ListDevices.php @@ -66,10 +66,12 @@ class ListDevices implements IAction { switch($format) { case "json": $response_type = "application/json"; + $response_suggested_filename .= ".json"; $response = json_encode($data); break; case "csv": $response_type = "text/csv"; + $response_suggested_filename .= ".csv"; $response = ResponseEncoder::encode_csv($data); break; } diff --git a/logic/Actions/ListReadingTypes.php b/logic/Actions/ListReadingTypes.php index 45e39eb..af21628 100644 --- a/logic/Actions/ListReadingTypes.php +++ b/logic/Actions/ListReadingTypes.php @@ -67,10 +67,12 @@ class ListReadingTypes implements IAction { switch($format) { case "json": $response_type = "application/json"; + $response_suggested_filename .= ".json"; $response = json_encode($data); break; case "csv": $response_type = "text/csv"; + $response_suggested_filename .= ".csv"; $response = ResponseEncoder::encode_csv($data); break; }