aboutsummaryrefslogtreecommitdiffhomepage
path: root/routes/actor_rss.php
diff options
context:
space:
mode:
Diffstat (limited to 'routes/actor_rss.php')
-rw-r--r--routes/actor_rss.php44
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);