| 
									
										
										
										
											2020-09-04 15:18:58 +01:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // {{{ License
 | 
					
						
							| 
									
										
										
										
											2021-04-23 12:55:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-04 15:18:58 +01:00
										 |  |  | // 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/>.
 | 
					
						
							| 
									
										
										
										
											2021-04-23 12:55:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-04 15:18:58 +01:00
										 |  |  | // }}}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Plugin\Favourite; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use App\Core\DB\DB; | 
					
						
							|  |  |  | use App\Core\Event; | 
					
						
							|  |  |  | use App\Core\Form; | 
					
						
							| 
									
										
										
										
											2021-04-19 18:51:05 +00:00
										 |  |  | use App\Core\Modules\Plugin; | 
					
						
							| 
									
										
										
										
											2021-04-14 23:31:18 +00:00
										 |  |  | use App\Core\Router\RouteLoader; | 
					
						
							| 
									
										
										
										
											2020-09-04 15:18:58 +01:00
										 |  |  | use App\Entity\Note; | 
					
						
							|  |  |  | use App\Util\Common; | 
					
						
							| 
									
										
										
										
											2021-08-11 02:49:23 +01:00
										 |  |  | use App\Util\Exception\RedirectException; | 
					
						
							| 
									
										
										
										
											2021-04-15 00:57:29 +00:00
										 |  |  | use App\Util\Formatting; | 
					
						
							|  |  |  | use App\Util\Nickname; | 
					
						
							| 
									
										
										
										
											2020-09-04 15:18:58 +01:00
										 |  |  | use Symfony\Component\Form\Extension\Core\Type\HiddenType; | 
					
						
							|  |  |  | use Symfony\Component\Form\Extension\Core\Type\SubmitType; | 
					
						
							|  |  |  | use Symfony\Component\HttpFoundation\Request; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-19 18:51:05 +00:00
										 |  |  | class Favourite extends Plugin | 
					
						
							| 
									
										
										
										
											2020-09-04 15:18:58 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-11-06 19:47:15 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * HTML rendering event that adds the favourite form as a note | 
					
						
							|  |  |  |      * action, if a user is logged in | 
					
						
							| 
									
										
										
										
											2021-08-11 02:49:23 +01:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param Request $request | 
					
						
							|  |  |  |      * @param Note    $note | 
					
						
							|  |  |  |      * @param array   $actions | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @throws RedirectException | 
					
						
							|  |  |  |      * @throws \App\Util\Exception\InvalidFormException | 
					
						
							|  |  |  |      * @throws \App\Util\Exception\NoSuchNoteException | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return bool Event hook | 
					
						
							| 
									
										
										
										
											2020-11-06 19:47:15 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-04-30 01:51:59 +01:00
										 |  |  |     public function onAddNoteActions(Request $request, Note $note, array &$actions): bool | 
					
						
							| 
									
										
										
										
											2020-09-04 15:18:58 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-08-11 02:49:23 +01:00
										 |  |  |         if (($user = Common::user()) === null) { | 
					
						
							| 
									
										
										
										
											2020-11-06 19:47:15 +00:00
										 |  |  |             return Event::next; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-11 02:49:23 +01:00
										 |  |  |         // if note is favourited, "is_set" is 1
 | 
					
						
							| 
									
										
										
										
											2020-09-05 21:16:25 +00:00
										 |  |  |         $opts   = ['note_id' => $note->getId(), 'gsactor_id' => $user->getId()]; | 
					
						
							| 
									
										
										
										
											2020-09-04 15:18:58 +01:00
										 |  |  |         $is_set = DB::find('favourite', $opts) != null; | 
					
						
							|  |  |  |         $form   = Form::create([ | 
					
						
							| 
									
										
										
										
											2020-09-08 00:12:33 +00:00
										 |  |  |             ['is_set',    HiddenType::class, ['data' => $is_set ? '1' : '0']], | 
					
						
							|  |  |  |             ['note_id',   HiddenType::class, ['data' => $note->getId()]], | 
					
						
							| 
									
										
										
										
											2021-08-11 02:49:23 +01:00
										 |  |  |             ["favourite-{$note->getId()}", SubmitType::class, ['label' => ' ', 'attr' => ['class' => $is_set ? 'favourite-button-on' : 'favourite-button-off']]], | 
					
						
							| 
									
										
										
										
											2020-09-04 15:18:58 +01:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2020-11-06 19:47:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Form handler
 | 
					
						
							| 
									
										
										
										
											2021-08-11 02:49:23 +01:00
										 |  |  |         $ret = self::noteActionHandle( | 
					
						
							|  |  |  |          $request, $form, $note, "favourite-{$note->getId()}",          /** | 
					
						
							|  |  |  |          * Called from form handler | 
					
						
							|  |  |  |          * | 
					
						
							|  |  |  |          * @param $note Note to be favourited | 
					
						
							|  |  |  |          * @param $data Form input | 
					
						
							|  |  |  |          * | 
					
						
							|  |  |  |          * @throws RedirectException Always thrown in order to prevent accidental form re-submit from browser | 
					
						
							|  |  |  |          */ function ($note, $data) use ($opts, $request) { | 
					
						
							|  |  |  |              $fave = DB::find('favourite', $opts); | 
					
						
							|  |  |  |              if ($data['is_set'] === '0' && $fave === null) { | 
					
						
							|  |  |  |                  DB::persist(Entity\Favourite::create($opts)); | 
					
						
							|  |  |  |                  DB::flush(); | 
					
						
							|  |  |  |              } else { | 
					
						
							|  |  |  |                  if ($data['is_set'] === '1' && $fave !== null) { | 
					
						
							|  |  |  |                      DB::remove($fave); | 
					
						
							|  |  |  |                      DB::flush(); | 
					
						
							|  |  |  |                  } | 
					
						
							|  |  |  |              } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              // Prevent accidental refreshes from resubmitting the form
 | 
					
						
							|  |  |  |              throw new RedirectException(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              return Event::stop; | 
					
						
							|  |  |  |          }); | 
					
						
							| 
									
										
										
										
											2020-11-06 19:47:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-10 22:28:11 +00:00
										 |  |  |         if ($ret != null) { | 
					
						
							|  |  |  |             return $ret; | 
					
						
							| 
									
										
										
										
											2020-09-04 15:18:58 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-11-06 19:47:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-05 21:16:25 +00:00
										 |  |  |         $actions[] = $form->createView(); | 
					
						
							| 
									
										
										
										
											2020-09-04 15:18:58 +01:00
										 |  |  |         return Event::next; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-04-14 19:59:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-30 01:51:59 +01:00
										 |  |  |     public function onInsertLeftPanelLink(string $user_nickname, &$res): bool | 
					
						
							| 
									
										
										
										
											2021-04-15 00:57:29 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-04-30 22:29:42 +01:00
										 |  |  |         $res[] = Formatting::twigRenderString(<<<END | 
					
						
							| 
									
										
										
										
											2021-04-15 00:57:29 +00:00
										 |  |  | <a href="{{ path("favourites", {'nickname' : user_nickname}) }}" class='hover-effect {{ active("favourites") }}'>Favourites</a> | 
					
						
							|  |  |  | <a href="{{ path("reverse_favourites", {'nickname' : user_nickname}) }}" class='hover-effect {{ active("reverse_favourites") }}'>Reverse Favs</a> | 
					
						
							|  |  |  | END, ['user_nickname' => $user_nickname]); | 
					
						
							| 
									
										
										
										
											2021-04-30 01:51:59 +01:00
										 |  |  |         return Event::next; | 
					
						
							| 
									
										
										
										
											2021-04-15 00:57:29 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-30 01:51:59 +01:00
										 |  |  |     public function onAddRoute(RouteLoader $r): bool | 
					
						
							| 
									
										
										
										
											2021-04-14 19:59:37 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-04-15 00:57:29 +00:00
										 |  |  |         $r->connect('favourites', '/favourites/{nickname<' . Nickname::DISPLAY_FMT . '>}', [Controller\Favourite::class, 'favourites']); | 
					
						
							|  |  |  |         $r->connect('reverse_favourites', '/reverse_favourites/{nickname<' . Nickname::DISPLAY_FMT . '>}', [Controller\Favourite::class, 'reverseFavourites']); | 
					
						
							| 
									
										
										
										
											2021-04-14 19:59:37 +00:00
										 |  |  |         return Event::next; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-09-04 19:36:37 +00:00
										 |  |  | } |