extended factory and constructing from json

renaming to not mix total count with paging
This commit is contained in:
Sascha Nitsch 2025-06-11 03:15:55 +02:00
parent 207d876254
commit 474631dff2
9 changed files with 82 additions and 22 deletions

View file

@ -87,7 +87,7 @@ class Followers implements \Federator\Api\FedUsers\FedUsersInterface
// Pagination navigation
$lastPage = max(0, ceil($totalItems / $pageSize) - 1);
if ($page === "" || $followers->count() == 0) {
if ($page === "" || $followers->getCount() == 0) {
$followers->setFirst($baseUrl . '?page=0');
$followers->setLast($baseUrl . '?page=' . $lastPage);
}

View file

@ -87,7 +87,7 @@ class Following implements \Federator\Api\FedUsers\FedUsersInterface
// Pagination navigation
$lastPage = max(0, ceil($totalItems / $pageSize) - 1);
if ($page === "" || $following->count() == 0) {
if ($page === "" || $following->getCount() == 0) {
$following->setFirst($baseUrl . '?page=0');
$following->setLast($baseUrl . '?page=' . $lastPage);
}

View file

@ -48,7 +48,20 @@ class Collection extends APObject
*/
public function fromJson($json)
{
return parent::fromJson($json);
$success = parent::fromJson($json);
if (!$success) {
return false;
}
if (array_key_exists('totalItems', $json)) {
$this->totalItems = $json['totalItems'];
}
if (array_key_exists('first', $json)) {
$this->first = $json['first'];
}
if (array_key_exists('last', $json)) {
$this->last = $json['last'];
}
return true;
}
/**
@ -61,11 +74,16 @@ class Collection extends APObject
$this->totalItems = $totalItems;
}
public function count(): int
public function getTotalItems(): int
{
return $this->totalItems;
}
public function getFirst(): string
{
return $this->first;
}
public function setFirst(string $url): void
{
$this->first = $url;

View file

@ -25,7 +25,7 @@ class Followers extends OrderedCollectionPage
public function setItems(&$items)
{
// Optionally: type check that all $items are Activity objects
$this->items = $items;
$this->orderedItems = $items;
$this->totalItems = sizeof($items);
}

View file

@ -25,7 +25,7 @@ class Following extends OrderedCollectionPage
public function setItems(&$items)
{
// Optionally: type check that all $items are Activity objects
$this->items = $items;
$this->orderedItems = $items;
$this->totalItems = sizeof($items);
}

View file

@ -15,7 +15,7 @@ class OrderedCollection extends Collection
*
* @var APObject[]|string[]
*/
protected $items = [];
protected $orderedItems = [];
public function __construct()
{
@ -32,8 +32,8 @@ class OrderedCollection extends Collection
{
$return = parent::toObject();
$return['type'] = 'OrderedCollection';
if ($this->totalItems > 0) {
foreach ($this->items as $item) {
if (sizeof($this->orderedItems) > 0) {
foreach ($this->orderedItems as $item) {
if (is_string($item)) {
$return['orderedItems'][] = $item;
} elseif (is_object($item)) {
@ -52,7 +52,20 @@ class OrderedCollection extends Collection
*/
public function fromJson($json)
{
return parent::fromJson($json);
$success = parent::fromJson($json);
if (!$success) {
return false;
}
if (array_key_exists('orderedItems', $json)) {
foreach ($json['orderedItems'] as $item) {
$obj = \Federator\Data\ActivityPub\Factory::newActivityFromJson($item);
if ($obj !== false) {
$this->orderedItems[] = $obj;
}
}
}
return true;
}
/**
@ -61,8 +74,7 @@ class OrderedCollection extends Collection
*/
public function append(&$item): void
{
$this->items[] = $item;
$this->totalItems = sizeof($this->items);
$this->orderedItems[] = $item;
}
/**
@ -73,18 +85,22 @@ class OrderedCollection extends Collection
public function get(int $index)
{
if ($index >= 0) {
if ($index >= $this->totalItems) {
if ($index >= sizeof($this->orderedItems)) {
return false;
}
return $this->items[$index];
return $this->orderedItems[$index];
} else {
if ($this->totalItems + $index < 0) {
if (sizeof($this->orderedItems) + $index < 0) {
return false;
}
return $this->items[$this->totalItems + $index];
return $this->orderedItems[sizeof($this->orderedItems) + $index];
}
}
public function getCount(): int
{
return sizeof($this->orderedItems);
}
/**
* set items
*
@ -93,7 +109,6 @@ class OrderedCollection extends Collection
*/
public function setItems(&$items)
{
$this->items = $items;
$this->totalItems = sizeof($items);
$this->orderedItems = $items;
}
}

View file

@ -51,7 +51,29 @@ class OrderedCollectionPage extends OrderedCollection
*/
public function fromJson($json)
{
return parent::fromJson($json);
$success = parent::fromJson($json);
if (!$success) {
return false;
}
if (array_key_exists('next', $json)) {
$this->next = $json['next'];
}
if (array_key_exists('prev', $json)) {
$this->prev = $json['prev'];
}
if (array_key_exists('partOf', $json)) {
$this->partOf = $json['partOf'];
}
return true;
}
/**
* get next url
* @return string next URL
*/
public function getNext()
{
return $this->next;
}
/**

View file

@ -35,8 +35,7 @@ class Outbox extends OrderedCollectionPage
public function setItems(&$items)
{
// Optionally: type check that all $items are Activity objects
$this->items = $items;
$this->totalItems = sizeof($items);
$this->orderedItems = $items;
}
/**

View file

@ -16,7 +16,7 @@ class Factory
/**
* create object tree from json
* @param array<string, mixed> $json input json
* @param array<string, mixed>|mixed $json input json
* @return Common\APObject|null object or false on error
*/
public static function newFromJson($json, string $jsonstring)
@ -67,6 +67,12 @@ class Factory
case 'Inbox':
$return = new Common\Inbox();
break;
case 'OrderedCollection':
$return = new Common\OrderedCollection();
break;
case 'OrderedCollectionPage':
$return = new Common\OrderedCollectionPage();
break;
case 'Tombstone':
$return = new Common\APObject("Tombstone");
break;