type === "application/json")
{
$request_json = $request->data;
$poll = Poll::create_poll($request_json);
if ($poll)
Flight::json(array_merge(Format::poll($poll), ["delete_token" => $poll->delete_token]), 201);
else
Flight::halt(403, "
403 Forbidden
Invalid data.
");
}
else
Flight::halt(403, "403 Forbidden
Invalid Content-Type.
");
});
Flight::route("HEAD|GET /polls/@id:[a-fA-F0-9]+", function ($id) {
global $VERLAINE;
$poll = Poll::load_poll($id);
if ($poll)
{
if (Flight::request()->type === "application/json")
Flight::json(Format::poll($poll));
else
{
// If unique_ip option is enabled => Only allow unregistered IPs.
if (!$poll->settings->unique_ip && isset($poll->ips[Flight::request()->ip]))
Flight::redirect("/polls/$id/results"); // A vote is already registered with this IP: redirect.
else
{
Flight::render("poll", ["app_url" => $VERLAINE["app_url"], "poll" => $poll], "body_content");
Flight::render("opengraph", ["poll" => $poll, "app_url" => $VERLAINE["app_url"]], "head");
Flight::render("layout", ["title" => $poll->title]);
}
}
}
else
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.
if ($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
Too many votes for this IP address or too many options selected.
");
}
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_array($selected_options))
{
if($poll->vote($selected_options)) // Vote for the selected option.
{
$poll->save();
Flight::redirect("/polls/$id/results", 301); // Redirect to the results.
}
else
Flight::redirect("/polls/$id", 301); // Error: Redirect to the vote page.
}
else
Flight::redirect("/polls/$id", 301); // Error: Redirect to the vote page.
}
else
Flight::redirect("/polls/$id", 301); // Error: Redirect to the vote page.
//TODO Error code in query parameters?
}
}
else
Flight::notFound();
});
Flight::route("HEAD|GET /polls/@id:[a-fA-F0-9]+/results", function ($id) {
global $VERLAINE;
$poll = Poll::load_poll($id);
if ($poll)
{
if (Flight::request()->type === "application/json")
Flight::json(array_merge(Format::poll($poll), ["image" => $VERLAINE["app_url"]."/polls/{$id}/results/svg"]));
else
{
Flight::render("svg/results", ["poll" => $poll, "colors" => $VERLAINE["chart_colors"]], "results_chart");
Flight::render("results", ["poll" => $poll, "chart_colors" => $VERLAINE["chart_colors"]], "body_content");
Flight::render("opengraph", ["poll" => $poll, "app_url" => $VERLAINE["app_url"]], "head");
Flight::render("layout", ["title" => $poll->title]);
}
}
else
Flight::notFound();
});
Flight::route("HEAD|GET /polls/@id:[a-fA-F0-9]+/results/svg", function ($id) {
global $VERLAINE;
$poll = Poll::load_poll($id);
if ($poll)
Flight::render("svg/results", ["poll" => $poll, "colors" => $VERLAINE["chart_colors"]]);
else
Flight::notFound();
});
Flight::route("GET|DELETE /polls/@id:[a-fA-F0-9]+/@token:[a-fA-F0-9]+", function ($id, $token) {
$poll = Poll::load_poll($id);
if ($poll)
{
if ($poll->delete_token === $token)
{
$poll->delete();
if (Flight::request()->type === "application/json")
Flight::json(Format::poll($poll), 204);
else
Flight::redirect('/', 308);
}
else
{
if (Flight::request()->type === "application/json")
Flight::halt(401, "401 Unauthorized
Invalid token.
");
else
Flight::redirect('/', 301);
}
}
else
Flight::notFound();
});
Flight::route("/", function () {
global $VERLAINE;
Flight::render("home", ["app_url" => $VERLAINE["app_url"]], "body_content");
Flight::render("layout");
});
Flight::start();