From a00d6c78d2083b3402863ea56477189fbdfbf862 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Tue, 26 Jun 2018 15:00:37 -0600 Subject: [PATCH] Add API --- api/index.php | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++ database.mwb | Bin 10066 -> 11036 bytes machine.php | 46 +++++++++++++++ 3 files changed, 197 insertions(+) create mode 100644 api/index.php diff --git a/api/index.php b/api/index.php new file mode 100644 index 0000000..86dc528 --- /dev/null +++ b/api/index.php @@ -0,0 +1,151 @@ +has('apikeys', ['key' => $VARS['key']])) { + http_response_code(403); + die('{"status": "ERROR", "message": "Invalid API key. Access denied."}'); +} + +function sendError($type, $msg = "An error occurred.") { + $code = 404; + switch ($type) { + case "nomachineid": + $code = 400; + $msg = "No machine ID sent."; + break; + case "dberror": + $code = 500; + $msg = "The database encountered an error: $msg"; + } + http_response_code($code); + die(json_encode([ + "status" => "ERROR", + "message" => $msg + ])); +} + +switch ($VARS['action']) { + /* Get info */ + case "getmachineinfo": + if (empty($VARS['id'])) { + sendError("nomachineid"); + } + + try { + $machine = new Machine($VARS['id']); + echo json_encode($machine->getMachineInfo()); + } catch (Exception $e) { + sendError("", $e->getMessage()); + } + break; + case "getmachinehistory": + if (empty($VARS['id'])) { + sendError("nomachineid"); + } + + try { + $machine = new Machine($VARS['id']); + echo json_encode($machine->getHistory()); + } catch (Exception $e) { + sendError("", $e->getMessage()); + } + break; + case "getmachinecomponents": + if (empty($VARS['id'])) { + sendError("nomachineid"); + } + + try { + $machine = new Machine($VARS['id']); + echo json_encode($machine->getComponents()); + } catch (Exception $e) { + sendError("", $e->getMessage()); + } + break; + case "geteventtypes": + echo json_encode($database->select('event_types', ['eventid (id)', 'eventname (name)'])); + break; + case "getcomponenttypes": + echo json_encode($database->select('component_types', ['typeid (id)', 'typename (name)'])); + break; + + + /* Save info */ + case "addmachine": + if (empty($VARS['id'])) { + sendError("nomachineid"); + } + if ($database->has('machines', ['machineid' => $VARS['id']])) { + sendError("", "A machine with that ID already exists."); + } + $data = []; + $data['machineid'] = $VARS['id']; + if (empty($VARS['notes'])) { + $data['notes'] = ""; + } else { + $data['notes'] = $VARS['notes']; + } + if (!empty($VARS['model'])) { + $data['model'] = $VARS['model']; + } + if (!empty($VARS['condition'])) { + if (is_numeric($VARS['condition']) && $VARS['condition'] > 0 && $VARS['condition'] < 10) { + $data['condition'] = $VARS['condition'] * 1.0; + } else { + sendError("", "Machine condition must be a number and 0 < condition < 10."); + } + } + if (!empty($VARS['price'])) { + if (is_numeric($VARS['price']) && $VARS['price'] > 0 && $VARS['price'] < 10000.0) { + $data['price'] = $VARS['price'] * 1.0; + } else { + sendError("", "Machine price must be a number and 0 < price < 10000."); + } + } + + $database->insert('machines', $data); + if ($database->error()[1] != 0) { + sendError("dberror", $database->error()[2]); + } + exit(json_encode(["status" => "OK"])); + break; + case "addhistory": + if (empty($VARS['id'])) { + sendError("nomachineid"); + } + try { + $machine = new Machine($VARS['id']); + $machine->addHistory($VARS['date'], $VARS['event'], $VARS['notes']); + exit(json_encode(["status" => "OK"])); + } catch (Exception $e) { + sendError("", $e->getMessage()); + } + break; + case "addcomponent": + if (empty($VARS['id'])) { + sendError("nomachineid"); + } + try { + $machine = new Machine($VARS['id']); + $machine->addComponent($VARS['serial'], $VARS['type'], $VARS['tested'], $VARS['notes'], $VARS['capacity'], $VARS['model']); + exit(json_encode(["status" => "OK"])); + } catch (Exception $e) { + sendError("", $e->getMessage()); + } + break; + + default: + sendError("", "Invalid action or no action sent."); +} \ No newline at end of file diff --git a/database.mwb b/database.mwb index 8801ccf468df20959612931efaca7c1738df541d..faa20cedbc224c829f87b80e0bdcff965dcbf909 100644 GIT binary patch literal 11036 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 literal 10066 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'event_types', ['eventid' => $event])) { + throw new Exception("Invalid event type."); + } + $event = (int) $event; + if (empty($notes)) { + $notes = ""; + } + $database->insert('history', ['date' => $date, 'eventid' => $event, 'notes' => $notes, 'machineid' => $this->machineid]); + } + + public function addComponent($serial, $type, $tested = null, $notes = "", $capacity = null, $model = null) { + global $database; + if (empty($serial)) { + throw new Exception("Invalid serial number."); + } + if (!$database->has('component_types', ['typeid' => $type])) { + throw new Exception("Invalid component type."); + } + $type = (int) $type; + + if (!is_null($tested)) { + if (strtotime($tested) === false) { + throw new Exception("Invalid tested date."); + } + $tested = date("Y-m-d H:i:s", strtotime($tested)); + } + + if (empty($notes)) { + $notes = ""; + } + if (empty($capacity)) { + $capacity = null; + } + if (empty($model)) { + $model = null; + } + + $database->insert('components', ['serial' => $serial, 'typeid' => $type, 'tested' => $tested, 'notes' => $notes, 'capacity' => $capacity, 'model' => $model, 'machineid' => $this->machineid]); + } }