| 
									
										
										
										
											2020-11-04 18:58:20 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  | declare(strict_types = 1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-04 18:58:20 +00:00
										 |  |  | // {{{ License
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // This file is part of GNU social - https://www.gnu.org/software/social
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by
 | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or
 | 
					
						
							|  |  |  | // (at your option) any later version.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social is distributed in the hope that it will be useful,
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					
						
							|  |  |  | // GNU Affero General Public License for more details.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License
 | 
					
						
							|  |  |  | // along with GNU social.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // }}}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-09 21:25:57 +00:00
										 |  |  | namespace Plugin\Poll\Controller; | 
					
						
							| 
									
										
										
										
											2020-11-04 18:58:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-04 19:43:36 +00:00
										 |  |  | use App\Core\DB\DB; | 
					
						
							| 
									
										
										
										
											2021-09-06 19:49:03 +01:00
										 |  |  | use App\Core\Form; | 
					
						
							| 
									
										
										
										
											2020-11-04 18:58:20 +00:00
										 |  |  | use App\Util\Common; | 
					
						
							| 
									
										
										
										
											2020-11-04 19:43:36 +00:00
										 |  |  | use App\Util\Exception\InvalidFormException; | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  | use App\Util\Exception\NotFoundException; | 
					
						
							| 
									
										
										
										
											2020-11-08 16:36:06 +00:00
										 |  |  | use App\Util\Exception\RedirectException; | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  | use App\Util\Exception\ServerException; | 
					
						
							| 
									
										
										
										
											2021-09-06 19:49:03 +01:00
										 |  |  | use Plugin\Poll\Entity\Poll; | 
					
						
							|  |  |  | use Plugin\Poll\Entity\PollResponse; | 
					
						
							| 
									
										
										
										
											2020-11-09 21:25:57 +00:00
										 |  |  | use Plugin\Poll\Forms\PollResponseForm; | 
					
						
							| 
									
										
										
										
											2020-11-04 18:58:20 +00:00
										 |  |  | use Symfony\Component\HttpFoundation\Request; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-09 21:25:57 +00:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Respond to a Poll | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @package  GNUsocial | 
					
						
							|  |  |  |  * @category PollPlugin | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @author    Daniel Brandao <up201705812@fe.up.pt> | 
					
						
							|  |  |  |  * @copyright 2020 Free Software Foundation, Inc http://www.fsf.org | 
					
						
							|  |  |  |  * @license   https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class AnswerPoll | 
					
						
							| 
									
										
										
										
											2020-11-04 18:58:20 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-11-04 19:43:36 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Handle poll response | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @param string $id poll id | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @throws \App\Util\Exception\NoLoggedInUser User is not logged in | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  |      * @throws InvalidFormException               invalid form | 
					
						
							|  |  |  |      * @throws NotFoundException                  poll does not exist | 
					
						
							|  |  |  |      * @throws RedirectException | 
					
						
							|  |  |  |      * @throws ServerException                    User already responded to poll | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return array template | 
					
						
							| 
									
										
										
										
											2020-11-04 19:43:36 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |     public function answerPoll(Request $request, string $id): array | 
					
						
							| 
									
										
										
										
											2020-11-04 18:58:20 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         $user = Common::ensureLoggedIn(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-16 11:14:34 +00:00
										 |  |  |         $poll = Poll::getByPk((int) $id); | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  |         if ($poll == null) { | 
					
						
							|  |  |  |             throw new NotFoundException('Poll does not exist'); | 
					
						
							| 
									
										
										
										
											2020-11-04 18:58:20 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-09 21:25:57 +00:00
										 |  |  |         $question = $poll->getQuestion(); | 
					
						
							|  |  |  |         $opts     = $poll->getOptionsArr(); | 
					
						
							| 
									
										
										
										
											2021-09-06 19:49:03 +01:00
										 |  |  |         $form     = Form::create([]); //PollResponseForm::make($poll, $poll->getNoteId());
 | 
					
						
							| 
									
										
										
										
											2020-11-04 18:58:20 +00:00
										 |  |  |         $form->handleRequest($request); | 
					
						
							|  |  |  |         if ($form->isSubmitted()) { | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  |             if ($form->isValid()) { | 
					
						
							|  |  |  |                 $data      = $form->getData(); | 
					
						
							|  |  |  |                 $selection = array_values($data)[1]; | 
					
						
							|  |  |  |                 if (!$poll->isValidSelection($selection)) { | 
					
						
							|  |  |  |                     throw new InvalidFormException(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 if (PollResponse::exits($poll->getId(), $user->getId())) { | 
					
						
							|  |  |  |                     throw new ServerException('User already responded to poll'); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-09-18 03:22:27 +01:00
										 |  |  |                 $pollResponse = PollResponse::create(['poll_id' => $poll->getId(), 'actor_id' => $user->getId(), 'selection' => $selection]); | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  |                 DB::persist($pollResponse); | 
					
						
							|  |  |  |                 DB::flush(); | 
					
						
							| 
									
										
										
										
											2020-11-09 21:25:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  |                 throw new RedirectException('showpoll', ['id' => $poll->getId()]); | 
					
						
							|  |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2020-11-04 19:43:36 +00:00
										 |  |  |                 throw new InvalidFormException(); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-11-04 18:58:20 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-25 11:17:56 +01:00
										 |  |  |         return ['_template' => 'poll/respondpoll.html.twig', 'question' => $question, 'form' => $form->createView()]; | 
					
						
							| 
									
										
										
										
											2020-11-04 18:58:20 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } |