From 982e6213622bcb78a40d17f54cda27225a1d84b3 Mon Sep 17 00:00:00 2001 From: winter Date: Tue, 31 Dec 2024 16:25:22 +0000 Subject: rework timelines. inclusion reasons supported now --- Digitigrade/Model/Note.php | 7 ++++++- Digitigrade/Timeline.php | 25 +++++++++++------------- Digitigrade/Timeline/GlobalTimeline.php | 7 +++++-- Digitigrade/Timeline/LocalTimeline.php | 7 +++++-- Digitigrade/TimelineIncludeable.php | 6 ++++++ Digitigrade/TimelineInclusionReason.php | 6 ++++++ Digitigrade/TimelineInclusionReason/Reshared.php | 17 ++++++++++++++++ Digitigrade/TimelineItem.php | 20 +++++++++++++++++++ 8 files changed, 76 insertions(+), 19 deletions(-) create mode 100644 Digitigrade/TimelineIncludeable.php create mode 100644 Digitigrade/TimelineInclusionReason.php create mode 100644 Digitigrade/TimelineInclusionReason/Reshared.php create mode 100644 Digitigrade/TimelineItem.php (limited to 'Digitigrade') diff --git a/Digitigrade/Model/Note.php b/Digitigrade/Model/Note.php index bc8b39b..7389617 100644 --- a/Digitigrade/Model/Note.php +++ b/Digitigrade/Model/Note.php @@ -3,8 +3,9 @@ namespace Digitigrade\Model; use Digitigrade\Db; use Digitigrade\Job\PushObject; +use Digitigrade\TimelineIncludeable; -class Note extends PushableModel { +class Note extends PushableModel implements TimelineIncludeable { public ?int $id; public string $uri; public \DateTimeImmutable $created; @@ -137,6 +138,10 @@ class Note extends PushableModel { return array_filter($this->formattedContent, fn($item) => $item['mimetype'] == $mimetype)[0]['body'] ?? null; } + public function renderAsHtml() { + render_template('note', ['note' => $this]); + } + public function jsonSerialize(): array { if ($this->deleted) { return [ diff --git a/Digitigrade/Timeline.php b/Digitigrade/Timeline.php index 67708ab..64aabe1 100644 --- a/Digitigrade/Timeline.php +++ b/Digitigrade/Timeline.php @@ -8,22 +8,19 @@ abstract class Timeline { private const RESULTS_PER_PAGE = 50; /** - * Gets a pageful of note IDs to be included in this timeline - * @param int $limit maximum number of results to return - * @param int $offset number of results to skip (i.e. results from previous pages) - * @return int[] + * Gets a pageful of items to be included in the timeline + * @param int $page page number to return (0-indexed) + * @return TimelineItem[] */ - protected abstract function getNoteIds(int $limit, int $offset): array; + public function getPage(int $page = 0): array { + return $this->getItems(self::RESULTS_PER_PAGE, self::RESULTS_PER_PAGE * $page); + } /** - * Gets a pageful of notes that are included in this timeline - * @param int $page page number to return (0-indexed) - * @return Note[] + * Gets a selection of items to be included in the timeline + * @param int $limit max number of items to return + * @param int $offset number of items to skip at first + * @return TimelineItem[] */ - public function getNotes(int $page = 0): array { - $ids = $this->getNoteIds(self::RESULTS_PER_PAGE, self::RESULTS_PER_PAGE * $page); - return array_map(function (int $id) { - return Note::find($id); - }, $ids); - } + abstract protected function getItems(int $limit, int $offset): array; } \ No newline at end of file diff --git a/Digitigrade/Timeline/GlobalTimeline.php b/Digitigrade/Timeline/GlobalTimeline.php index 2236ee4..278b557 100644 --- a/Digitigrade/Timeline/GlobalTimeline.php +++ b/Digitigrade/Timeline/GlobalTimeline.php @@ -2,10 +2,12 @@ namespace Digitigrade\Timeline; use Digitigrade\Db; +use Digitigrade\Model\Note; use Digitigrade\Timeline; +use Digitigrade\TimelineItem; class GlobalTimeline extends Timeline { - protected function getNoteIds(int $limit, int $offset): array { + protected function getItems(int $limit, int $offset): array { $db = Db::getInstance()->getPdo(); $stmt = $db->prepare(<<execute([$limit, $offset]); - return $stmt->fetchAll(\PDO::FETCH_COLUMN, 0); + $ids = $stmt->fetchAll(\PDO::FETCH_COLUMN, 0); + return array_map(fn($id) => new TimelineItem(Note::find($id)), $ids); } } \ No newline at end of file diff --git a/Digitigrade/Timeline/LocalTimeline.php b/Digitigrade/Timeline/LocalTimeline.php index 69b8634..c20ada6 100644 --- a/Digitigrade/Timeline/LocalTimeline.php +++ b/Digitigrade/Timeline/LocalTimeline.php @@ -2,10 +2,12 @@ namespace Digitigrade\Timeline; use Digitigrade\Db; +use Digitigrade\Model\Note; use Digitigrade\Timeline; +use Digitigrade\TimelineItem; class LocalTimeline extends Timeline { - protected function getNoteIds(int $limit, int $offset): array { + protected function getItems(int $limit, int $offset): array { $db = Db::getInstance()->getPdo(); $stmt = $db->prepare(<<execute([$limit, $offset]); - return $stmt->fetchAll(\PDO::FETCH_COLUMN, 0); + $ids = $stmt->fetchAll(\PDO::FETCH_COLUMN, 0); + return array_map(fn($id) => new TimelineItem(Note::find($id)), $ids); } } \ No newline at end of file diff --git a/Digitigrade/TimelineIncludeable.php b/Digitigrade/TimelineIncludeable.php new file mode 100644 index 0000000..44433b4 --- /dev/null +++ b/Digitigrade/TimelineIncludeable.php @@ -0,0 +1,6 @@ +resharer = $resharer; + } + + public function renderAsHtml() { + render_template('reason_reshared', ['actor' => $this->resharer]); + } +} \ No newline at end of file diff --git a/Digitigrade/TimelineItem.php b/Digitigrade/TimelineItem.php new file mode 100644 index 0000000..e59fbec --- /dev/null +++ b/Digitigrade/TimelineItem.php @@ -0,0 +1,20 @@ +reason = $reason; + $this->object = $object; + } + + public function getReason(): ?TimelineInclusionReason { + return $this->reason; + } + + public function getObject(): TimelineIncludeable { + return $this->object; + } +} \ No newline at end of file -- cgit v1.3