1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- <?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;
- }
- }
|