PollController.php 1.9 KB

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