aboutsummaryrefslogtreecommitdiffhomepage
path: root/Digitigrade/Model/Interaction.php
diff options
context:
space:
mode:
Diffstat (limited to 'Digitigrade/Model/Interaction.php')
-rw-r--r--Digitigrade/Model/Interaction.php31
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]);
}