diff options
Diffstat (limited to 'WpfTest/Model')
| -rw-r--r-- | WpfTest/Model/Actor.php | 90 | ||||
| -rw-r--r-- | WpfTest/Model/ActorEndpoints.php | 27 | ||||
| -rw-r--r-- | WpfTest/Model/FetchableModel.php | 78 | ||||
| -rw-r--r-- | WpfTest/Model/Note.php | 95 | ||||
| -rw-r--r-- | WpfTest/Model/NoteAttachment.php | 23 | ||||
| -rw-r--r-- | WpfTest/Model/NotePrivacy.php | 39 | ||||
| -rw-r--r-- | WpfTest/Model/NotePrivacyInteractors.php | 9 | ||||
| -rw-r--r-- | WpfTest/Model/NotePrivacyScope.php | 9 |
8 files changed, 0 insertions, 370 deletions
diff --git a/WpfTest/Model/Actor.php b/WpfTest/Model/Actor.php deleted file mode 100644 index a745a96..0000000 --- a/WpfTest/Model/Actor.php +++ /dev/null @@ -1,90 +0,0 @@ -<?php -namespace WpfTest\Model; - -use WpfTest\RemoteFetchable; - -class Actor extends FetchableModel implements \JsonSerializable { - public const REL_URI = "https://pawpub.entities.org.uk/rel/actor.html"; - - public ?int $id; - public string $uri; - public bool $isLocal = false; - public \DateTimeImmutable $created; - public ?\DateTimeImmutable $modified; - public ?string $homepage; - public string $handle; - public string $displayName; - public ?string $avatar; - public ?string $bio; - public ?string $pronouns; - public bool $automated = false; - public bool $requestToFollow = false; - public ActorEndpoints $endpoints; - public array $extensions = []; - - protected function getUpdateWhereClause(\PDO $db): ?string { - if (self::findWhere('uri = ?', [$this->uri]) != null) - return 'uri = ' . $db->quote($this->uri); - if (self::findWhere('id = ?', [$this->id]) != null) - return "id = $this->id"; - return null; - } - - public static function findLocalByHandle(string $handle): ?self { - return self::findWhere('is_local = true AND handle = ?', [$handle]); - } - - public static function findByWebfinger(string $acct, bool $autoSave = true, bool $forceRefetch = false): ?self { - // normalise uri - if (!str_starts_with($acct, 'acct:')) { - if (str_starts_with($acct, '@')) { - $acct = substr($acct, 1); - } - $acct = "acct:$acct"; - } - // fetch it - $domain = explode('@', $acct, 2)[1]; - $data = @file_get_contents("https://$domain/.well-known/webfinger?resource=$acct", - context: stream_context_create([ - 'http' => ['header' => 'Accept: application/jrd+json, application/json'] - ]) - ); - if ($data === false) - return null; - $data = json_decode($data); - if ($data === null) - return null; - // find the right link - if (!isset($data->links)) - return null; - $matching = array_filter($data->links, function (\stdClass $linkObj) { - return $linkObj->rel == self::REL_URI; - }); - if (count($matching) == 0) - return null; - return self::findByUri($matching[0]->href, $autoSave, $forceRefetch); - } - - 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") - ] - ]; - } - - public function hydrate() { - $this->endpoints = ActorEndpoints::findWhere('actor_id = ?', [$this->id]); - } -}
\ No newline at end of file diff --git a/WpfTest/Model/ActorEndpoints.php b/WpfTest/Model/ActorEndpoints.php deleted file mode 100644 index f6120d3..0000000 --- a/WpfTest/Model/ActorEndpoints.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -namespace WpfTest\Model; - -use WpfTest\Model; - -class ActorEndpoints extends Model { - public ?int $actorId; - public string $basicFeed; - public ?string $fullFeed; - public ?string $follow; - public ?string $unfollow; - public ?string $block; - public ?string $unblock; - public ?string $subscribe; - public ?string $unsubscribe; - - protected function setOwnerId(int $id) { - $this->actorId = $id; - } - - protected function getUpdateWhereClause($db): ?string { - if (self::findWhere('actor_id = ?', [$this->actorId]) != null) { - return "actor_id = $this->actorId"; - } - return null; - } -}
\ No newline at end of file diff --git a/WpfTest/Model/FetchableModel.php b/WpfTest/Model/FetchableModel.php deleted file mode 100644 index 5dce010..0000000 --- a/WpfTest/Model/FetchableModel.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php -namespace WpfTest\Model; - -use WpfTest\Model; -use WpfTest\RemoteFetchable; - -abstract class FetchableModel extends Model implements RemoteFetchable { - private static \JsonMapper $mapper; - - public static function __initStatic() { - self::$mapper = new \JsonMapper(); - // this is unfortunately necessary to parse DateTime(Immutable)s properly - self::$mapper->bStrictObjectTypeChecking = false; - } - - private static function fetchFromRemote(string $uri, bool $autoSave): ?static { - // fetch the object - $data = @file_get_contents($uri, context: stream_context_create(['http' => [ - 'header' => 'Accept: application/json' - ]])); - if ($data === false) - return null; - $data = json_decode($data); - if ($data === null) - return null; - // default everything nullable to null - $obj = new static(); - $reflProps = (new \ReflectionClass(static::class))->getProperties(); - foreach ($reflProps as $reflProp) { - assert($reflProp instanceof \ReflectionProperty); // for intellisense lmao - if ($reflProp->getType()->allowsNull()) { - $obj->{$reflProp->getName()} = null; - } - } - // rename 'self' to 'uri' because of reasons - if (property_exists($data, 'self')) { - $data->uri = $data->self; - unset($data->self); - } - // map all present fields - self::$mapper->map($data, $obj); - // (hopefully) recursively fetch any other fetchable models contained in this one - foreach ($reflProps as $reflProp) { - assert($reflProp instanceof \ReflectionProperty); - $reflType = $reflProp->getType(); - $propName = $reflProp->getName(); - if (!($reflType instanceof \ReflectionNamedType)) - continue; - $type = $reflType->getName(); - if (is_subclass_of($type, FetchableModel::class) && is_string($data->{$propName})) { - // try to avoid recursion - // TODO: make a better effort at avoiding recursion (e.g. when it's more than one step nested) - if ($data->{$propName} == $uri) { - $obj->{$propName} = $obj; - } else { - $obj->{$propName} = $type::findByUri($data->{$propName}, $autoSave); - } - } - } - - if ($autoSave) { - $obj->save(); - } - - return $obj; - } - - public static function findByUri(string $uri, bool $autoSave = true, bool $forceRefetch = false): ?static { - if (!$forceRefetch) { - $obj = static::findWhere('uri = ?', [$uri]); - if ($obj != null) - return $obj; - } - return static::fetchFromRemote($uri, $autoSave); - } -} - -FetchableModel::__initStatic();
\ No newline at end of file diff --git a/WpfTest/Model/Note.php b/WpfTest/Model/Note.php deleted file mode 100644 index af2d2aa..0000000 --- a/WpfTest/Model/Note.php +++ /dev/null @@ -1,95 +0,0 @@ -<?php -namespace WpfTest\Model; - -use WpfTest\Db; - -class Note extends FetchableModel implements \JsonSerializable { - public ?int $id; - public string $uri; - public \DateTimeImmutable $created; - public ?\DateTimeImmutable $modified; - public Actor $author; - public ?string $summary; - public string $plainContent; - /** - * @var array<string, string> - */ - 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 getUpdateWhereClause(\PDO $db): ?string { - if (self::findWhere('uri = ?', [$this->uri]) != null) - return 'uri = ' . $db->quote($this->uri); - if (self::findWhere('id = ?', [$this->id]) != null) - return "id = $this->id"; - return null; - } - - protected function hydrate() { - $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' => $this->privacy, - '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 deleted file mode 100644 index 16947c5..0000000 --- a/WpfTest/Model/NoteAttachment.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php -namespace WpfTest\Model; - -use WpfTest\Model; - -class NoteAttachment extends Model { - public ?int $noteId; - public int $index; - public string $type; - public string $href; - public ?string $description; - - protected function setOwnerId(int $id) { - $this->noteId = $id; - } - - protected function getUpdateWhereClause($db): ?string { - if (self::findWhere('note_id = ?', [$this->noteId]) != null) { - return "note_id = $this->noteId"; - } - return null; - } -}
\ No newline at end of file diff --git a/WpfTest/Model/NotePrivacy.php b/WpfTest/Model/NotePrivacy.php deleted file mode 100644 index b955447..0000000 --- a/WpfTest/Model/NotePrivacy.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php -namespace WpfTest\Model; - -use WpfTest\Model; - -class NotePrivacy extends Model implements \JsonSerializable { - public ?int $noteId; - public NotePrivacyScope $scope; - /** - * @var Actor[] - */ - public array $alsoVisibleTo = []; - public bool $indexable; - public NotePrivacyInteractors $canReshare = NotePrivacyInteractors::ALL; - public NotePrivacyInteractors $canReply = NotePrivacyInteractors::ALL; - public NotePrivacyInteractors $canOtherInteract = NotePrivacyInteractors::ALL; - - protected function setOwnerId(int $id) { - $this->noteId = $id; - } - - protected function getUpdateWhereClause($db): ?string { - if (self::findWhere('note_id = ?', [$this->noteId]) != null) { - return "note_id = $this->noteId"; - } - return null; - } - - public function jsonSerialize(): array { - return [ - 'scope' => $this->scope->value, - 'alsoVisibleTo' => $this->alsoVisibleTo, - 'indexable' => $this->indexable, - 'canReshare' => $this->canReshare->value, - 'canReply' => $this->canReply->value, - 'canOtherInteract' => $this->canOtherInteract->value - ]; - } -}
\ No newline at end of file diff --git a/WpfTest/Model/NotePrivacyInteractors.php b/WpfTest/Model/NotePrivacyInteractors.php deleted file mode 100644 index 917d90a..0000000 --- a/WpfTest/Model/NotePrivacyInteractors.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php -namespace WpfTest\Model; - -enum NotePrivacyInteractors: string { - case ALL = 'all'; - case FOLLOWERS = 'followers'; - case MUTUALS = 'mutuals'; - case NONE = 'none'; -}
\ No newline at end of file diff --git a/WpfTest/Model/NotePrivacyScope.php b/WpfTest/Model/NotePrivacyScope.php deleted file mode 100644 index 44c9344..0000000 --- a/WpfTest/Model/NotePrivacyScope.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php -namespace WpfTest\Model; - -enum NotePrivacyScope: string { - case PUBLIC = 'public'; - case FOLLOWERS = 'followers'; - case MUTUALS = 'mutuals'; - case NONE = 'none'; -}
\ No newline at end of file |
