pollthingy/app/Http/Controllers/PollController.php

177 lines
5.3 KiB
PHP
Raw Normal View History

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Carbon\Carbon;
2018-10-16 03:23:19 +02:00
use Validator;
2018-10-17 15:12:20 +02:00
use DB;
use App\Poll;
2018-10-17 15:12:20 +02:00
use App\PollVote;
use App\PollVotingCode;
class PollController extends Controller
{
public function __invoke(Request $request)
{
return view('create_poll');
}
2018-10-17 16:56:05 +02:00
//TODO: Close polls
//TODO: Implement poll editing
public function create(Request $request)
{
2018-10-16 03:23:19 +02:00
if($request->has('options')) {
$request['options'] = array_filter($request->input('options'), function($i) { return $i !== null; });
}
$request['allow_multiple_answers'] = $request->has('allow_multiple_answers');
$request['hide_results_until_closed'] = $request->has('hide_results_until_closed');
$request['automatically_close_poll'] = $request->has('automatically_close_poll');
$request['set_admin_password'] = $request->has('set_admin_password');
2018-10-12 20:11:44 +02:00
$validatedInput = $request->validate([
'question' => 'required|string',
2018-10-16 03:23:19 +02:00
'options' => 'required|min:2|distinct',
'allow_multiple_answers' => 'required|boolean',
'hide_results_until_closed' => 'required|boolean',
'automatically_close_poll' => 'required|boolean',
'automatically_close_poll_datetime' => 'required_if:automatically_close_poll,true|date|after:now',
'set_admin_password' => 'required|boolean',
'admin_password' => 'required_if:set_admin_password,true|nullable|string',
'duplicate_vote_checking' => 'required|in:none,cookies,codes',
'number_of_codes' => 'required_if:duplicate_vote_checking,codes|integer|min:2'
2018-10-12 20:11:44 +02:00
]);
$poll = new Poll;
2018-10-16 03:23:19 +02:00
$poll->question = $validatedInput['question'];
$poll->duplicate_vote_checking = $validatedInput['duplicate_vote_checking'];
$poll->allow_multiple_answers = $validatedInput['allow_multiple_answers'];
$poll->hide_results_until_closed = $validatedInput['hide_results_until_closed'];
$poll->created_at = Carbon::now();
2018-10-16 03:23:19 +02:00
if($validatedInput['automatically_close_poll']) {
$poll->closes_at = Carbon::parse($validatedInput['automatically_close_poll_datetime']);
}
if($validatedInput['set_admin_password']) {
$poll->admin_password = $validatedInput['admin_password'];
}
$poll->save();
2018-10-12 20:11:44 +02:00
2018-10-16 03:23:19 +02:00
$poll->options()->createMany(array_map(function($i) { return ['text' => $i]; }, $validatedInput['options']));
$poll->save();
if($poll->duplicate_vote_checking == 'codes') {
$codes = $poll->createVotingCodes($validatedInput['number_of_codes']);
}
return redirect()->action('PollController@view', ['poll' => $poll])->with('new', true);
}
public function view(Request $request, Poll $poll)
{
2018-10-16 03:23:19 +02:00
$new = $request->session()->pull('new', false);
if($request->format() == 'json') {
if($new) {
} else {
}
//TODO: Implement JSON output
return null;
2018-10-16 03:23:19 +02:00
} else {
2018-10-17 15:12:20 +02:00
return view('view_poll')
->with('poll', $poll)
->with('new', $new)
->with('hasVoted', $this->hasVoted($request, $poll));
2018-10-16 03:23:19 +02:00
}
}
2018-10-17 15:12:20 +02:00
public function viewResults(Request $request, Poll $poll)
{
if($poll->results_visible) {
} else {
}
}
private static function createPieChart(Poll $poll)
{
//TODO
}
public function hasVoted(Request $request, Poll $poll)
{
if($poll->duplicate_vote_checking == 'cookies') {
if($request->session()->exists($poll->id)) {
return true;
}
} else if($poll->duplicate_vote_checking == 'codes') {
$code = PollVotingCode::find($request->query('code'));
if($code == null || $code->used) {
return true;
}
}
return false;
}
public function vote(Request $request, Poll $poll)
{
2018-10-17 15:12:20 +02:00
if($this->hasVoted($request, $poll)) {
return null;
}
if($poll->allow_multiple_answers) {
$validatedInput = $request->validate([
'options' => 'required|distinct',
]);
} else {
$validatedInput = $request->validate([
'options' => 'required|distinct|min:1|max:1',
]);
}
DB::beginTransaction();
foreach($validatedInput['options'] as $option)
{
//TODO: Properly display errors
if($poll->options()->find($option) == null) {
DB::rollBack();
return null;
}
$vote = new PollVote;
$vote->poll_option_id = $option;
$poll->votes()->save($vote);
}
DB::commit();
if($poll->duplicate_vote_checking == 'cookies') {
$request->session()->put($poll->id, null);
} else if($poll->duplicate_vote_checking == 'codes') {
$code->used = true;
$code->save();
}
//return redirect('PollController@viewResults', ['poll' => $poll]);
return view('view_poll')->with('poll', $poll)->with('new', false);
}
public function admin(Request $request, Poll $poll)
{
}
public function edit(Request $request, Poll $poll)
{
}
}