From 4853810a54386b9cfbd441137a9ac995d707fe75 Mon Sep 17 00:00:00 2001 From: jelhan Date: Mon, 6 Jan 2014 19:56:32 +0100 Subject: [PATCH] Implemented a simple server-side api to store data --- api.php | 92 +++++++++++++++++++++++++++++++++++++++++ classes/datahandler.php | 80 +++++++++++++++++++++++++++++++++++ index.html | 16 ++++--- 3 files changed, 183 insertions(+), 5 deletions(-) create mode 100644 api.php create mode 100644 classes/datahandler.php diff --git a/api.php b/api.php new file mode 100644 index 0000000..5264978 --- /dev/null +++ b/api.php @@ -0,0 +1,92 @@ +get($requested_id); + if ($data === false) { + // there was no data with this id or it could not be readen + + // set http header + header("HTTP/1.0 404 Not Found"); + } + else { + // set http header + header("HTTP/1.0 200 OK"); + + // forbidde browser to lead javascript from an external location + header("Content-Security-Policy: script-src 'self'"); + + // set content-type and charset + header('Content-Type: application/x-json-encrypted; charset=utf-8'); + + // send data back + echo $data; + } + + break; + + // write data + case 'POST': + // get data send with request + $data = file_get_contents('php://input'); + + $newId = $datahandler->write($data); + if ($newId === false) { + header("HTTP/1.0 500 Internal Server Error"); + } + else { + // set http header + header("HTTP/1.0 200 OK"); + + // forbidde browser to lead javascript from an external location + header("Content-Security-Policy: script-src 'self'"); + + // set content-type and charset + header('Content-Type: application/x-json-encrypted; charset=utf-8'); + + // extend given data with newId + $newData = json_decode($data); + $newData->poll->id = $newId; + + // send back data + echo json_encode($newData); + } + + break; + + // request method is not supported + default: + // set http header + header("HTTP/1.0 400 Bad Request"); + + break; +} +?> diff --git a/classes/datahandler.php b/classes/datahandler.php new file mode 100644 index 0000000..efc6e66 --- /dev/null +++ b/classes/datahandler.php @@ -0,0 +1,80 @@ +generateNewId(); + } + + return $randomString; + } + + /* + * stores data + * returns new id or false on error + */ + public function write ($data) { + // get a new id + $new_id = $this->generateNewId(); + + $new_file = self::DATA_FOLDER . $new_id; + + // check if new file could be created + if (!is_writeable(self::DATA_FOLDER)) { + echo "not writeable"; + return false; + } + + // write data + if (file_put_contents($new_file, $data, LOCK_EX) === false) { + echo "error on write"; + return false; + } + + return $new_id; + } +} + +?> diff --git a/index.html b/index.html index 035bdd1..92d0f60 100644 --- a/index.html +++ b/index.html @@ -108,6 +108,8 @@ + + @@ -118,7 +120,10 @@ }); // adapter initialization - App.ApplicationAdapter = DS.LSAdapter; + App.ApplicationAdapter = DS.RESTAdapter.extend({ + // set namespace to api.php in same subdirectory + namespace: 'api.php?' + }); /* * models @@ -137,6 +142,7 @@ // option model // used by poll model App.Option = DS.Model.extend({ + poll : DS.belongsTo('poll', {async: true}), title : DS.attr('string') }); @@ -283,10 +289,10 @@ actions: { save: function(){ // save poll - this.get('model').save(); - - // redirect to new poll - this.transitionToRoute('poll', this.get('model')); + this.get('model').save().then(function(){ + // redirect to new poll + this.transitionToRoute('poll', this.get('model')); + }); } } });