mirror of
https://github.com/ad-aures/castopod.git
synced 2026-04-12 11:16:43 +02:00
feat(activitypub): add Podcast actor and PodcastEpisode object with comments
This commit is contained in:
parent
b814cfaf7c
commit
9e1e5d2e86
13 changed files with 316 additions and 17 deletions
|
|
@ -10,12 +10,18 @@ declare(strict_types=1);
|
|||
|
||||
namespace App\Controllers;
|
||||
|
||||
use ActivityPub\Objects\OrderedCollectionObject;
|
||||
use ActivityPub\Objects\OrderedCollectionPage;
|
||||
use Analytics\AnalyticsTrait;
|
||||
use App\Entities\Episode;
|
||||
use App\Entities\Podcast;
|
||||
use App\Libraries\NoteObject;
|
||||
use App\Libraries\PodcastEpisode;
|
||||
use App\Models\EpisodeModel;
|
||||
use App\Models\PodcastModel;
|
||||
use CodeIgniter\Database\BaseBuilder;
|
||||
use CodeIgniter\Exceptions\PageNotFoundException;
|
||||
use CodeIgniter\HTTP\Response;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
use Config\Services;
|
||||
use SimpleXMLElement;
|
||||
|
|
@ -191,4 +197,59 @@ class EpisodeController extends BaseController
|
|||
|
||||
return $this->response->setXML((string) $oembed);
|
||||
}
|
||||
|
||||
/**
|
||||
* @noRector ReturnTypeDeclarationRector
|
||||
*/
|
||||
public function episodeObject(): Response
|
||||
{
|
||||
$podcastObject = new PodcastEpisode($this->episode);
|
||||
|
||||
return $this->response
|
||||
->setContentType('application/json')
|
||||
->setBody($podcastObject->toJSON());
|
||||
}
|
||||
|
||||
/**
|
||||
* @noRector ReturnTypeDeclarationRector
|
||||
*/
|
||||
public function comments(): Response
|
||||
{
|
||||
/**
|
||||
* get comments: aggregated replies from posts referring to the episode
|
||||
*/
|
||||
$episodeComments = model('StatusModel')
|
||||
->whereIn('in_reply_to_id', function (BaseBuilder $builder): BaseBuilder {
|
||||
return $builder->select('id')
|
||||
->from('activitypub_statuses')
|
||||
->where('episode_id', $this->episode->id);
|
||||
})
|
||||
->where('`published_at` <= NOW()', null, false)
|
||||
->orderBy('published_at', 'ASC');
|
||||
|
||||
$pageNumber = (int) $this->request->getGet('page');
|
||||
|
||||
if ($pageNumber < 1) {
|
||||
$episodeComments->paginate(12);
|
||||
$pager = $episodeComments->pager;
|
||||
$collection = new OrderedCollectionObject(null, $pager);
|
||||
} else {
|
||||
$paginatedComments = $episodeComments->paginate(12, 'default', $pageNumber);
|
||||
$pager = $episodeComments->pager;
|
||||
|
||||
$orderedItems = [];
|
||||
if ($paginatedComments !== null) {
|
||||
foreach ($paginatedComments as $comment) {
|
||||
$orderedItems[] = (new NoteObject($comment))->toArray();
|
||||
}
|
||||
}
|
||||
|
||||
// @phpstan-ignore-next-line
|
||||
$collection = new OrderedCollectionPage($pager, $orderedItems);
|
||||
}
|
||||
|
||||
return $this->response
|
||||
->setContentType('application/activity+json')
|
||||
->setBody($collection->toJSON());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue