aboutsummaryrefslogtreecommitdiffhomepage
path: root/routes/actor_rss.php
blob: 67d52adcd9c8facfdae4291a40ff401968753818 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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);