. // }}} /** * Pinboard server API, doesn't (currently) allow importing from the * official website * * @package GNUsocial * * @author Hugo Sales * @copyright 2022 Free Software Foundation, Inc http://www.fsf.org * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ namespace Plugin\Pinboard; use App\Core\Event; use App\Core\Modules\Plugin; use App\Core\Router; use App\Entity\Actor; use App\Entity\LocalUser; use Plugin\Pinboard\Controller as C; use Plugin\Pinboard\Entity\Token; use Symfony\Component\HttpFoundation\Request; class Pinboard extends Plugin { public const controller_route = 'pinboard_settings'; public function onAddRoute(Router $r): bool { $r->connect( self::controller_route, '/pinboard/settings', C\Settings::class, options: ['method' => 'post'], ); $r->connect( 'pinboard_posts_update', '/pinboard/v1/posts/update', [C\APIv1::class, 'posts_update'], ); $r->connect( 'pinboard_posts_add', '/pinboard/v1/posts/add', [C\APIv1::class, 'posts_add'], ); $r->connect( 'pinboard_posts_delete', '/pinboard/v1/posts/delete', [C\APIv1::class, 'posts_delete'], ); $r->connect( 'pinboard_posts_get', '/pinboard/v1/posts/get', [C\APIv1::class, 'posts_get'], ); $r->connect( 'pinboard_posts_recent', '/pinboard/v1/posts/recent', [C\APIv1::class, 'posts_recent'], ); $r->connect( 'pinboard_posts_all', '/pinboard/v1/posts/all', [C\APIv1::class, 'posts_all'], ); return Event::next; } public function onPopulateSettingsTabs(Request $request, string $section, array &$tabs): bool { if ($section === 'api') { $tabs[] = [ 'title' => 'Pinboard', 'desc' => 'Pinboard API settings', 'id' => 'settings-pinboard-api', 'controller' => C\Settings::setup(), ]; } return Event::next; } public function onActorFormInvalidateRelated(Actor $actor, ?LocalUser $user) { $user ??= $actor->getLocal(); if (!$user instanceof LocalUser) { return Event::next; } Cache::delete(Token::cacheKeys($user->getNickname())['user-token']); DB::remove(DB::refetch(Token::get(nickname: null, token: null, user: $user))); DB::flush(); // TODO notify user that their token got invalidated return Event::next; } }