diff options
| author | winter | 2024-12-31 16:25:22 +0000 |
|---|---|---|
| committer | winter | 2024-12-31 16:25:22 +0000 |
| commit | 982e6213622bcb78a40d17f54cda27225a1d84b3 (patch) | |
| tree | 0a81d8fc183238dca959a4ab848c9cd1d241ef27 /Digitigrade | |
| parent | ad554b48e7dc355d9b33eede98f4e3e829fd867e (diff) | |
rework timelines. inclusion reasons supported now
Diffstat (limited to 'Digitigrade')
| -rw-r--r-- | Digitigrade/Model/Note.php | 7 | ||||
| -rw-r--r-- | Digitigrade/Timeline.php | 25 | ||||
| -rw-r--r-- | Digitigrade/Timeline/GlobalTimeline.php | 7 | ||||
| -rw-r--r-- | Digitigrade/Timeline/LocalTimeline.php | 7 | ||||
| -rw-r--r-- | Digitigrade/TimelineIncludeable.php | 6 | ||||
| -rw-r--r-- | Digitigrade/TimelineInclusionReason.php | 6 | ||||
| -rw-r--r-- | Digitigrade/TimelineInclusionReason/Reshared.php | 17 | ||||
| -rw-r--r-- | Digitigrade/TimelineItem.php | 20 |
8 files changed, 76 insertions, 19 deletions
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(<<<END SELECT note.id FROM note LEFT JOIN note_privacy ON note_privacy.note_id = note.id @@ -13,6 +15,7 @@ class GlobalTimeline extends Timeline { ORDER BY note.created DESC LIMIT ? OFFSET ? END); $stmt->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(<<<END SELECT note.id FROM note @@ -15,6 +17,7 @@ class LocalTimeline extends Timeline { ORDER BY note.created DESC LIMIT ? OFFSET ? END); $stmt->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 @@ +<?php +namespace Digitigrade; + +interface TimelineIncludeable { + public function renderAsHtml(); +}
\ No newline at end of file diff --git a/Digitigrade/TimelineInclusionReason.php b/Digitigrade/TimelineInclusionReason.php new file mode 100644 index 0000000..e9840d1 --- /dev/null +++ b/Digitigrade/TimelineInclusionReason.php @@ -0,0 +1,6 @@ +<?php +namespace Digitigrade; + +abstract class TimelineInclusionReason { + abstract public function renderAsHtml(); +}
\ No newline at end of file diff --git a/Digitigrade/TimelineInclusionReason/Reshared.php b/Digitigrade/TimelineInclusionReason/Reshared.php new file mode 100644 index 0000000..f185149 --- /dev/null +++ b/Digitigrade/TimelineInclusionReason/Reshared.php @@ -0,0 +1,17 @@ +<?php +namespace Digitigrade\TimelineInclusionReason; + +use Digitigrade\Model\Actor; +use Digitigrade\TimelineInclusionReason; + +class Reshared extends TimelineInclusionReason { + private Actor $resharer; + + public function __construct(Actor $resharer) { + $this->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 @@ +<?php +namespace Digitigrade; + +class TimelineItem { + private ?TimelineInclusionReason $reason; + private TimelineIncludeable $object; + + public function __construct(TimelineIncludeable $object, ?TimelineInclusionReason $reason = null) { + $this->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 |
