| 
									
										
										
										
											2020-10-22 23:13:39 +01:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  | declare(strict_types = 1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-22 23:13:39 +01: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-10-22 23:13:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | use App\Core\DB\DB; | 
					
						
							| 
									
										
										
										
											2020-11-22 02:36:01 +00:00
										 |  |  | use App\Core\Form; | 
					
						
							|  |  |  | use function App\Core\I18n\_m; | 
					
						
							| 
									
										
										
										
											2020-11-09 21:25:57 +00:00
										 |  |  | use App\Core\Security; | 
					
						
							| 
									
										
										
										
											2020-11-22 02:36:01 +00:00
										 |  |  | use App\Entity\Note; | 
					
						
							| 
									
										
										
										
											2020-11-04 18:58:20 +00:00
										 |  |  | use App\Util\Common; | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  | use App\Util\Exception\InvalidFormException; | 
					
						
							| 
									
										
										
										
											2020-11-08 16:36:06 +00:00
										 |  |  | use App\Util\Exception\RedirectException; | 
					
						
							| 
									
										
										
										
											2021-09-06 19:49:03 +01:00
										 |  |  | use Plugin\Poll\Entity\Poll; | 
					
						
							| 
									
										
										
										
											2020-11-22 02:36:01 +00:00
										 |  |  | use Symfony\Component\Form\Extension\Core\Type\ChoiceType; | 
					
						
							|  |  |  | use Symfony\Component\Form\Extension\Core\Type\SubmitType; | 
					
						
							|  |  |  | use Symfony\Component\Form\Extension\Core\Type\TextType; | 
					
						
							| 
									
										
										
										
											2020-10-22 23:13:39 +01:00
										 |  |  | use Symfony\Component\HttpFoundation\Request; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-10 02:01:31 +00:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Create 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 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  | const MAX_OPTS = 5; | 
					
						
							|  |  |  | const MIN_OPTS = 2; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-22 23:13:39 +01:00
										 |  |  | class NewPoll | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Create poll | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @param int $num num of options | 
					
						
							| 
									
										
										
										
											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 RedirectException | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return array template | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |     public function newPoll(Request $request, int $num): array | 
					
						
							| 
									
										
										
										
											2020-10-22 23:13:39 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  |         $user       = Common::ensureLoggedIn(); | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $numOptions = Common::clamp($num, MIN_OPTS, MAX_OPTS); | 
					
						
							| 
									
										
										
										
											2020-11-23 15:06:23 +00:00
										 |  |  |         $opts[]     = ['visibility',  ChoiceType::class,   ['label' => _m('Visibility:'), 'expanded' => true, 'choices' => [_m('Public') => 'public', _m('Instance') => 'instance', _m('Private') => 'private']]]; | 
					
						
							|  |  |  |         $opts[]     = ['Question', TextType::class, ['label' => _m(('Question'))]]; | 
					
						
							| 
									
										
										
										
											2020-11-22 02:36:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for ($i = 1; $i <= $numOptions; ++$i) { | 
					
						
							|  |  |  |             //['Option_i',   TextType::class,   ['label' => _m('Option i')]],
 | 
					
						
							|  |  |  |             $opts[] = ['Option_' . $i, TextType::class, ['label' => _m(('Option ' . $i))]]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         $opts[] = ['post_poll',        SubmitType::class,   ['label' => _m('Post')]]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $form = Form::create($opts); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-22 23:13:39 +01:00
										 |  |  |         $form->handleRequest($request); | 
					
						
							| 
									
										
										
										
											2020-11-08 16:36:06 +00:00
										 |  |  |         $opt = []; | 
					
						
							| 
									
										
										
										
											2020-10-22 23:13:39 +01:00
										 |  |  |         if ($form->isSubmitted()) { | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  |             if ($form->isValid()) { | 
					
						
							|  |  |  |                 $data = $form->getData(); | 
					
						
							| 
									
										
										
										
											2020-11-22 02:36:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-18 03:22:27 +01:00
										 |  |  |                 $note = Note::create(['actor_id' => $user->getId(), $is_local = true]); | 
					
						
							| 
									
										
										
										
											2020-11-22 02:36:01 +00:00
										 |  |  |                 DB::persist($note); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-09 21:25:57 +00:00
										 |  |  |                 Security::sanitize($question = $data['Question']); | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  |                 for ($i = 1; $i <= $numOptions; ++$i) { | 
					
						
							| 
									
										
										
										
											2020-11-09 21:25:57 +00:00
										 |  |  |                     Security::sanitize($opt[$i - 1] = $data['Option_' . $i]); | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2020-11-09 21:25:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                 $options = implode("\n", $opt); | 
					
						
							| 
									
										
										
										
											2021-09-18 03:22:27 +01:00
										 |  |  |                 $poll    = Poll::create(['actor_id' => $user->getId(), 'question' => $question, 'options' => $options, 'note_id' => $note->getId()]); | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  |                 DB::persist($poll); | 
					
						
							|  |  |  |                 DB::flush(); | 
					
						
							| 
									
										
										
										
											2020-11-23 15:06:23 +00:00
										 |  |  |                 throw new RedirectException('root'); | 
					
						
							| 
									
										
										
										
											2020-11-09 17:43:10 +00:00
										 |  |  |             } else { | 
					
						
							|  |  |  |                 throw new InvalidFormException(); | 
					
						
							| 
									
										
										
										
											2020-11-04 18:58:20 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-10-22 23:13:39 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-25 11:17:56 +01:00
										 |  |  |         return ['_template' => 'poll/newpoll.html.twig', 'form' => $form->createView()]; | 
					
						
							| 
									
										
										
										
											2020-11-08 16:36:06 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-22 23:13:39 +01:00
										 |  |  | } |