Merge pull request #14039 from annando/widget-features
[friendica.git/.git] / src / Module / Feed.php
1 <?php
2 /**
3  * @copyright Copyright (C) 2010-2024, the Friendica project
4  *
5  * @license GNU AGPL version 3 or any later version
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU Affero General Public License as
9  * published by the Free Software Foundation, either version 3 of the
10  * License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU Affero General Public License for more details.
16  *
17  * You should have received a copy of the GNU Affero General Public License
18  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
19  *
20  */
21
22 namespace Friendica\Module;
23
24 use Friendica\BaseModule;
25 use Friendica\Core\System;
26 use Friendica\Model\User;
27 use Friendica\Network\HTTPException;
28 use Friendica\Protocol\Feed as ProtocolFeed;
29
30 /**
31  * Provides public Atom feeds
32  *
33  * Currently supported:
34  * - /feed/[nickname]/ => posts
35  * - /feed/[nickname]/posts => posts
36  * - /feed/[nickname]/comments => comments
37  * - /feed/[nickname]/replies => comments
38  * - /feed/[nickname]/activity => activity
39  *
40  * @author Hypolite Petovan <hypolite@mrpetovan.com>
41  */
42 class Feed extends BaseModule
43 {
44         protected function rawContent(array $request = [])
45         {
46                 $nick = $this->parameters['nickname'] ?? '';
47                 $type = $this->parameters['type'] ?? null;
48                 switch ($type) {
49                         case 'posts':
50                         case 'comments':
51                         case 'activity':
52                                 // Correct type names, no change needed
53                                 break;
54                         case 'replies':
55                                 $type = 'comments';
56                                 break;
57                         default:
58                                 $type = 'posts';
59                 }
60
61                 $last_update = $this->getRequestValue($request, 'last_update', '');
62
63                 $owner = User::getOwnerDataByNick($nick);
64                 if (!$owner || $owner['account_expired'] || $owner['account_removed']) {
65                         throw new HTTPException\NotFoundException($this->t('User not found.'));
66                 }
67
68                 if ($owner['blocked']) {
69                         throw new HTTPException\UnauthorizedException($this->t('Access to this profile has been restricted.'));
70                 }
71
72                 $feed = ProtocolFeed::atom($owner, $last_update, 10, $type);
73
74                 $this->httpExit($feed, Response::TYPE_ATOM);
75         }
76 }