diff --git a/index.php b/index.php index 55cb0a2..f755020 100644 --- a/index.php +++ b/index.php @@ -43,6 +43,48 @@ Flight::route("GET /polls/@id:[a-fA-F0-9]+", function ($id) { Flight::notFound(); }); +// POST /polls/:id/vote +// Take an array of options and add a vote for each given option. +Flight::route("POST /polls/@id:[a-fA-F0-9]+/vote", function ($id) { + $poll = Poll::load_poll($id); + if ($poll) + { + if (Flight::request()->type === "application/json") + { + if (isset(Flight::request()->data["options"]) && is_array(Flight::request()->data["options"])) + { // Check that an options id array exists. + //TODO Check that only the authorized number of options are selected. + $poll->vote(Flight::request()->data["options"]); // Vote for the given options. + // Then save and show poll data. + $poll->save(); + Flight::json(format_poll($poll)); + } + else + Flight::halt(403, "

403 Forbidden

Invalid data.

"); + } + else + { + if (isset(Flight::request()->data["options"])) + { // Check that any data has been sent. + $selected_options = Flight::request()->data["options"]; + if (is_string($selected_options)) + { // If it is a string, input[type="radio"] were used so only one option is selected. + $poll->vote([intval($selected_options)]); // Vote for the selected option. + $poll->save(); + Flight::redirect("/polls/$id/results"); // Redirect to the results. + } //TODO: Multiple options case. + else + Flight::redirect("/polls/$id"); // Error: Redirect to the vote page. + } + else + Flight::redirect("/polls/$id"); // Error: Redirect to the vote page. + //TODO Error code in query parameters? + } + } + else + Flight::notFound(); +}); + Flight::route("/", function () { global $VERLAINE; Flight::render("home", ["app_url" => $VERLAINE["app_url"]], "body_content"); diff --git a/models/Poll.php b/models/Poll.php index f2ae80b..55d7690 100644 --- a/models/Poll.php +++ b/models/Poll.php @@ -14,15 +14,12 @@ class Poll $poll = new Poll(); $poll->title = $request_data->title; $poll->creation_date = (new DateTime())->getTimestamp(); - $id = 0; foreach ($request_data->options as $option) { $poll->options[] = [ - "id" => $id, "label" => $option, "votes" => 0, ]; - $id++; } $poll->gen_new_id(); $poll->save(); @@ -80,6 +77,18 @@ class Poll $this->id = $new_id; } + /** + * Vote for a list of options. + * @param array $options - Array of integers containing voted options. + */ + public function vote(array $options) + { + // For each option in the list, add 1 to the vote number in the poll data. + foreach ($options as $option) + if (isset($this->options[intval($option)])) // Check invalid options id. + $this->options[intval($option)]->votes++; + } + public function save() { $db = dba_open(SAVE_PATH . "/polls.db", "wd"); diff --git a/views/poll.php b/views/poll.php index 7fa4cb5..bf8e8f6 100644 --- a/views/poll.php +++ b/views/poll.php @@ -1,11 +1,11 @@

title ?>

-
- options as $option): ?> + + options as $id => $option): ?>
- - - + + +