aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorwinter2024-12-17 20:43:44 +0000
committerwinter2024-12-17 20:43:44 +0000
commit10793d22df72f12f2f14c730c09b5018b5b6e63a (patch)
treeea3cf7cf1461b5b02d989d0077a154b6408948e8
parent12d3fe4509dda610e6b7adb120dc0530081c6768 (diff)
bugfixing
-rw-r--r--Digitigrade/Model.php11
-rw-r--r--Digitigrade/Model/Actor.php3
-rw-r--r--Digitigrade/Model/FetchableModel.php20
-rw-r--r--Digitigrade/Model/Instance.php2
-rw-r--r--Digitigrade/Model/InstanceEndpoints.php1
-rw-r--r--Digitigrade/Model/PushableModel.php6
-rw-r--r--migrations/20241217_204123_add_instance_endpoints_push.php8
7 files changed, 38 insertions, 13 deletions
diff --git a/Digitigrade/Model.php b/Digitigrade/Model.php
index 40e85f4..80a6d91 100644
--- a/Digitigrade/Model.php
+++ b/Digitigrade/Model.php
@@ -54,8 +54,15 @@ abstract class Model {
$result = [];
foreach ($props as $p) {
$pName = $p->getName();
- if (!isset($this->{$pName}))
- $this->{$pName} = null;
+ // set all nullable properties to null if they aren't already
+ if (!isset($this->{$pName})) {
+ try {
+ $this->{$pName} = null;
+ } catch (\TypeError $e) {
+ // if it can't be set, just ignore it
+ continue;
+ }
+ }
// we need to determine the plain value to insert ...
$value = $this->{$pName};
$discarded = false;
diff --git a/Digitigrade/Model/Actor.php b/Digitigrade/Model/Actor.php
index 5974f40..2d5eba7 100644
--- a/Digitigrade/Model/Actor.php
+++ b/Digitigrade/Model/Actor.php
@@ -34,6 +34,9 @@ class Actor extends PushableModel {
bool $automated = false,
bool $requestToFollow = true // setting this true by default as i think it's better for privacy
): self {
+ if (self::findLocalByHandle($handle) != null) {
+ throw new \RuntimeException('an actor with that local handle already exists!');
+ }
$actor = new self();
$actor->uri = path_to_uri("/user/$handle");
$actor->isLocal = true;
diff --git a/Digitigrade/Model/FetchableModel.php b/Digitigrade/Model/FetchableModel.php
index 964ea15..07d7e32 100644
--- a/Digitigrade/Model/FetchableModel.php
+++ b/Digitigrade/Model/FetchableModel.php
@@ -13,7 +13,7 @@ abstract class FetchableModel extends Model implements RemoteFetchable {
self::$mapper->bStrictObjectTypeChecking = false;
}
- protected static function createFromJson(\stdClass $data, bool $autoSave): static {
+ protected static function createFromJson(\stdClass $data): static {
// default everything nullable to null
$obj = new static();
$reflProps = (new \ReflectionClass(static::class))->getProperties();
@@ -49,13 +49,6 @@ abstract class FetchableModel extends Model implements RemoteFetchable {
}
}
- $obj->finaliseAfterFetch($uri);
-
- if ($autoSave) {
- $obj->save();
- $obj->finaliseAfterSave();
- }
-
return $obj;
}
@@ -68,7 +61,16 @@ abstract class FetchableModel extends Model implements RemoteFetchable {
$data = json_decode($data);
if ($data === null)
return null;
- return static::createFromJson($data, $autoSave);
+
+ $obj = static::createFromJson($data);
+
+ $obj->finaliseAfterFetch($uri);
+ if ($autoSave) {
+ $obj->save();
+ $obj->finaliseAfterSave();
+ }
+
+ return $obj;
}
protected function finaliseAfterFetch(string $uri) {
diff --git a/Digitigrade/Model/Instance.php b/Digitigrade/Model/Instance.php
index 9e54a5f..2fc2f17 100644
--- a/Digitigrade/Model/Instance.php
+++ b/Digitigrade/Model/Instance.php
@@ -175,7 +175,7 @@ class Instance extends FetchableModel {
return false;
}
- public function pushObject(\JsonSerializable $obj) {
+ public function pushObject(PushableModel $obj) {
if (!isset($this->endpoints->push)) {
throw new \RuntimeException("can't push to $this->domain because it doesn't have a push endpoint");
}
diff --git a/Digitigrade/Model/InstanceEndpoints.php b/Digitigrade/Model/InstanceEndpoints.php
index d2b0b24..c7393ab 100644
--- a/Digitigrade/Model/InstanceEndpoints.php
+++ b/Digitigrade/Model/InstanceEndpoints.php
@@ -9,6 +9,7 @@ class InstanceEndpoints extends Model {
public ?string $report;
public ?string $subscribe;
public ?string $unsubscribe;
+ public ?string $push;
protected function setOwnerId(int $id) {
$this->instanceId = $id;
diff --git a/Digitigrade/Model/PushableModel.php b/Digitigrade/Model/PushableModel.php
index cfa68d3..9a31453 100644
--- a/Digitigrade/Model/PushableModel.php
+++ b/Digitigrade/Model/PushableModel.php
@@ -3,6 +3,10 @@ namespace Digitigrade\Model;
abstract class PushableModel extends FetchableModel implements \JsonSerializable {
public static function importFromReceivedObject(\stdClass $obj, bool $autoSave = true): static {
- return static::createFromJson($obj, $autoSave);
+ return static::createFromJson($obj);
+ if ($autoSave) {
+ $obj->save();
+ $obj->finaliseAfterSave();
+ }
}
} \ No newline at end of file
diff --git a/migrations/20241217_204123_add_instance_endpoints_push.php b/migrations/20241217_204123_add_instance_endpoints_push.php
new file mode 100644
index 0000000..41f5284
--- /dev/null
+++ b/migrations/20241217_204123_add_instance_endpoints_push.php
@@ -0,0 +1,8 @@
+<?php
+
+use \Digitigrade\Db\Migrator;
+
+Migrator::getInstance()->register(20241217_204123, function (PDO $db) {
+ // i'm stupid apparently?
+ $db->exec('ALTER TABLE instance_endpoints ADD COLUMN push text');
+});