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 @@
= $poll->title ?>
-