From b00185ddbac9ac3de975a3954f2ede2f24458f6a Mon Sep 17 00:00:00 2001 From: winter Date: Sun, 8 Dec 2024 18:04:37 +0000 Subject: implement notes --- WpfTest/Model/Actor.php | 25 ++++++++- WpfTest/Model/Note.php | 95 ++++++++++++++++++++++++++++++++ WpfTest/Model/NoteAttachment.php | 11 ++++ WpfTest/Model/NotePrivacy.php | 16 ++++++ WpfTest/Model/NotePrivacyInteractors.php | 9 +++ WpfTest/Model/NotePrivacyScope.php | 9 +++ 6 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 WpfTest/Model/Note.php create mode 100644 WpfTest/Model/NoteAttachment.php create mode 100644 WpfTest/Model/NotePrivacy.php create mode 100644 WpfTest/Model/NotePrivacyInteractors.php create mode 100644 WpfTest/Model/NotePrivacyScope.php (limited to 'WpfTest/Model') diff --git a/WpfTest/Model/Actor.php b/WpfTest/Model/Actor.php index cf8d7ca..eaef99c 100644 --- a/WpfTest/Model/Actor.php +++ b/WpfTest/Model/Actor.php @@ -3,9 +3,9 @@ namespace WpfTest\Model; use WpfTest\Model; -class Actor extends Model { - public int $id; - public string $self; +class Actor extends Model implements \JsonSerializable { + public ?int $id; + public string $uri; public bool $isLocal = false; public \DateTimeImmutable $created; public ?\DateTimeImmutable $modified; @@ -23,4 +23,23 @@ class Actor extends Model { public static function findLocalByHandle(string $handle): ?self { return self::findWhere('is_local = true AND handle = ?', [$handle]); } + + public function jsonSerialize(): array { + return [ + 'type' => 'actor', + 'self' => path_to_uri("/user/$this->handle"), + 'created' => $this->created?->format('c'), + 'modified' => $this->modified?->format('c'), + 'homepage' => path_to_uri("/$this->handle"), + 'handle' => $this->handle, + 'displayName' => $this->displayName, + 'bio' => $this->bio, + 'pronouns' => $this->pronouns, + 'automated' => $this->automated, + 'endpoints' => [ + 'basicFeed' => path_to_uri("/user/$this->handle/basicFeed"), + 'fullFeed' => path_to_uri("/user/$this->handle/fullFeed") + ] + ]; + } } \ No newline at end of file diff --git a/WpfTest/Model/Note.php b/WpfTest/Model/Note.php new file mode 100644 index 0000000..85b3567 --- /dev/null +++ b/WpfTest/Model/Note.php @@ -0,0 +1,95 @@ + + */ + public array $formattedContent = []; + public string $language; + /** + * @var Actor[] + */ + public array $mentions = []; + public ?Note $inReplyTo; + public ?Note $threadApex; + public NotePrivacy $privacy; + /** + * @var NoteAttachment[] + */ + public array $attachments = []; + public array $extensions = []; + + protected function hydrate(array $row) { + $this->privacy = NotePrivacy::findWhere('note_id = ?', [$this->id]); + $this->formattedContent = $this->findFormattedContents(); + $this->mentions = $this->findMentions(); + $this->attachments = NoteAttachment::findAllWhere('note_id = ?', [$this->id]); + } + + private function findFormattedContents(): array { + $pdo = Db::getInstance()->getPdo(); + $stmt = $pdo->prepare('SELECT mimetype, body FROM note_formatted_content WHERE note_id = ?'); + $stmt->execute([$this->id]); + return $stmt->fetchAll(\PDO::FETCH_ASSOC); + } + + private function findMentions(): array { + $pdo = Db::getInstance()->getPdo(); + $stmt = $pdo->prepare('SELECT actor_id FROM note_mention WHERE note_id = ?'); + $stmt->execute([$this->id]); + $actors = array_map(function ($actorId) { + return Actor::find($actorId); + }, $stmt->fetchAll(\PDO::FETCH_COLUMN, 0)); + return $actors; + } + + public static function findAllWithAuthor(Actor $author): array { + return self::findAllWhere('author = ?', [$author->id]); + } + + public function jsonSerialize(): array { + return [ + 'type' => 'note', + 'self' => path_to_uri("/post/$this->id"), + 'created' => $this->created->format('c'), + 'modified' => $this->modified?->format('c'), + 'author' => $this->author->uri, + 'summary' => $this->summary, + 'plainContent' => $this->plainContent, + 'formattedContent' => $this->formattedContent, + 'language' => $this->language, + 'mentions' => array_map(function (Actor $actor) { + return $actor->uri; + }, $this->mentions), + 'inReplyTo' => $this->inReplyTo?->uri, + 'threadApex' => $this->threadApex?->uri, + 'privacy' => [ + 'scope' => $this->privacy->scope->name, + 'alsoVisibleTo' => $this->privacy->alsoVisibleTo, + 'indexable' => $this->privacy->indexable, + 'canReshare' => $this->privacy->canReshare->name, + 'canReply' => $this->privacy->canReply->name, + 'canOtherInteract' => $this->privacy->canOtherInteract->name + ], + 'attachments' => array_map(function (NoteAttachment $attachment) { + return [ + 'type' => $attachment->type, + 'href' => $attachment->href, + 'description' => $attachment->description + ]; + }, $this->attachments), + //'extensions' => [] + ]; + } +} \ No newline at end of file diff --git a/WpfTest/Model/NoteAttachment.php b/WpfTest/Model/NoteAttachment.php new file mode 100644 index 0000000..b07d595 --- /dev/null +++ b/WpfTest/Model/NoteAttachment.php @@ -0,0 +1,11 @@ +