PollController.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use App\Status;
  5. use App\Models\Poll;
  6. use App\Models\PollVote;
  7. use App\Services\PollService;
  8. use App\Services\FollowerService;
  9. class PollController extends Controller
  10. {
  11. public function getPoll(Request $request, $id)
  12. {
  13. abort_if(!config_cache('instance.polls.enabled'), 404);
  14. $poll = Poll::findOrFail($id);
  15. $status = Status::findOrFail($poll->status_id);
  16. if($status->scope != 'public') {
  17. abort_if(!$request->user(), 403);
  18. if($request->user()->profile_id != $status->profile_id) {
  19. abort_if(!FollowerService::follows($request->user()->profile_id, $status->profile_id), 404);
  20. }
  21. }
  22. $pid = $request->user() ? $request->user()->profile_id : false;
  23. $poll = PollService::getById($id, $pid);
  24. return $poll;
  25. }
  26. public function vote(Request $request, $id)
  27. {
  28. abort_if(!config_cache('instance.polls.enabled'), 404);
  29. abort_unless($request->user(), 403);
  30. $this->validate($request, [
  31. 'choices' => 'required|array'
  32. ]);
  33. $pid = $request->user()->profile_id;
  34. $poll_id = $id;
  35. $choices = $request->input('choices');
  36. // todo: implement multiple choice
  37. $choice = $choices[0];
  38. $poll = Poll::findOrFail($poll_id);
  39. abort_if(now()->gt($poll->expires_at), 422, 'Poll expired.');
  40. abort_if(PollVote::wherePollId($poll_id)->whereProfileId($pid)->exists(), 400, 'Already voted.');
  41. $vote = new PollVote;
  42. $vote->status_id = $poll->status_id;
  43. $vote->profile_id = $pid;
  44. $vote->poll_id = $poll->id;
  45. $vote->choice = $choice;
  46. $vote->save();
  47. $poll->votes_count = $poll->votes_count + 1;
  48. $poll->cached_tallies = collect($poll->getTallies())->map(function($tally, $key) use($choice) {
  49. return $choice == $key ? $tally + 1 : $tally;
  50. })->toArray();
  51. $poll->save();
  52. PollService::del($poll->status_id);
  53. $res = PollService::get($poll->status_id, $pid);
  54. return $res;
  55. }
  56. }