<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Status; use App\Models\Poll; use App\Models\PollVote; use App\Services\PollService; use App\Services\FollowerService; class PollController extends Controller { public function getPoll(Request $request, $id) { abort_if(!config_cache('instance.polls.enabled'), 404); $poll = Poll::findOrFail($id); $status = Status::findOrFail($poll->status_id); if($status->scope != 'public') { abort_if(!$request->user(), 403); if($request->user()->profile_id != $status->profile_id) { abort_if(!FollowerService::follows($request->user()->profile_id, $status->profile_id), 404); } } $pid = $request->user() ? $request->user()->profile_id : false; $poll = PollService::getById($id, $pid); return $poll; } public function vote(Request $request, $id) { abort_if(!config_cache('instance.polls.enabled'), 404); abort_unless($request->user(), 403); $this->validate($request, [ 'choices' => 'required|array' ]); $pid = $request->user()->profile_id; $poll_id = $id; $choices = $request->input('choices'); // todo: implement multiple choice $choice = $choices[0]; $poll = Poll::findOrFail($poll_id); abort_if(now()->gt($poll->expires_at), 422, 'Poll expired.'); abort_if(PollVote::wherePollId($poll_id)->whereProfileId($pid)->exists(), 400, 'Already voted.'); $vote = new PollVote; $vote->status_id = $poll->status_id; $vote->profile_id = $pid; $vote->poll_id = $poll->id; $vote->choice = $choice; $vote->save(); $poll->votes_count = $poll->votes_count + 1; $poll->cached_tallies = collect($poll->getTallies())->map(function($tally, $key) use($choice) { return $choice == $key ? $tally + 1 : $tally; })->toArray(); $poll->save(); PollService::del($poll->status_id); $res = PollService::get($poll->status_id, $pid); return $res; } }