diff options
Diffstat (limited to 'Digitigrade/Model/Interaction.php')
| -rw-r--r-- | Digitigrade/Model/Interaction.php | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/Digitigrade/Model/Interaction.php b/Digitigrade/Model/Interaction.php index 902dbc0..e651f45 100644 --- a/Digitigrade/Model/Interaction.php +++ b/Digitigrade/Model/Interaction.php @@ -1,6 +1,7 @@ <?php namespace Digitigrade\Model; +use Digitigrade\Db; use Digitigrade\Model\HomeTimelineItem; use Digitigrade\Notification\Notifyable; use Digitigrade\Timeline\ReasonReshared; @@ -44,6 +45,36 @@ class Interaction extends PushableModel implements Notifyable { return hostname_from_uri($this->author->uri) == hostname_from_uri($this->uri); } + protected function hydrate() { + $this->extensions = $this->findExtensions(); + } + + protected function dehydrate() { + $this->saveExtensions(); + } + + private function findExtensions() { + $pdo = Db::getInstance()->getPdo(); + $stmt = $pdo->prepare('SELECT uri, data FROM interaction_extension WHERE interaction_id = ?'); + $stmt->execute([$this->id]); + $items = []; + while ($row = $stmt->fetch()) { + $items[$row['uri']] = json_decode($row['data']); + } + return $items; + } + + private function saveExtensions() { + $pdo = Db::getInstance()->getPdo(); + foreach ($this->extensions as $uri => $obj) { + $stmt = $pdo->prepare( + 'INSERT INTO interaction_extension(interaction_id, uri, data) VALUES (?, ?, ?) ' . + 'ON CONFLICT (interaction_id, uri) DO UPDATE SET data = EXCLUDED.data' + ); + $stmt->execute([$this->id, $uri, json_encode($obj)]); + } + } + public static function findAllWithAuthor(Actor $author): array { return self::findAllWhere('author = ?', [$author->id]); } |
