diff options
Diffstat (limited to 'routes/actor_rss.php')
| -rw-r--r-- | routes/actor_rss.php | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/routes/actor_rss.php b/routes/actor_rss.php new file mode 100644 index 0000000..67d52ad --- /dev/null +++ b/routes/actor_rss.php @@ -0,0 +1,44 @@ +<?php + +use Digitigrade\HttpResponseStatus\Forbidden; +use Digitigrade\HttpResponseStatus\NotFound; +use Digitigrade\Model\Actor; +use Digitigrade\Model\UserAccount; +use Digitigrade\Router; +use Digitigrade\Text; +use Digitigrade\UserSettings; + +$checkActorFeedEnabled = function (?Actor $actor) { + if ($actor == null || $actor->deleted) { + throw new NotFound('there is no actor with that id'); + } + if (!$actor->isLocal) { + throw new NotFound('refusing to give you an rss feed for a non-local actor go talk to their home instance'); + } + $user = UserAccount::findByLinkedActor($actor); + if ($user == null) { + throw new NotFound('im truly discombobulated'); + } + $rssEnabled = (new UserSettings($user))->getBool('profile.rssEnabled'); + if (!$rssEnabled) { + throw new Forbidden('this user has not enabled RSS/Atom feeds for their profile'); + } +}; + +Router::getInstance()->mount('/actor/:id/feed/:lang/feed.rss', function (array $args) use ($checkActorFeedEnabled) { + $actor = Actor::find($args['id']); + $checkActorFeedEnabled($actor); + header('Content-Type: application/rss+xml'); + Text::setDefaultLanguage($args['lang']); + render_template('actor_rss', ['actor' => $actor, 'lang' => $args['lang']]); +}); + +Router::getInstance()->mount('/actor/:id/feed/:lang/feed.atom', function (array $args) use ($checkActorFeedEnabled) { + $actor = Actor::find($args['id']); + $checkActorFeedEnabled($actor); + header('Content-Type: application/atom+xml'); + Text::setDefaultLanguage($args['lang']); + render_template('actor_atom', ['actor' => $actor, 'lang' => $args['lang']]); +}); + +unset($checkActorFeedEnabled); |
