Commit bf969da2 authored by Ben Hayward's avatar Ben Hayward

Updated subscription endpoint to use pagination tokens

1 merge request!347[Sprint/OldfashionedOwl](fix): Subscription feed upgrade #435
Pipeline #84823770 passed with stages
in 10 minutes and 12 seconds
......@@ -26,79 +26,33 @@ class subscribe implements Interfaces\Api
*/
public function get($pages)
{
$manager = new Subscriptions\Manager();
$response = [];
switch ($pages[0]) {
case 'subscriptions':
$db = new \Minds\Core\Data\Call('friends');
$subscribers= $db->getRow($pages[1], ['limit'=>get_input('limit', 12), 'offset'=>get_input('offset', '')]);
if (!$subscribers) {
return Factory::response([]);
}
$users = [];
foreach ($subscribers as $guid => $subscriber) {
if ($guid == get_input('offset')) {
continue;
}
if (is_numeric($subscriber)) {
//this is a local, old style subscription
$users[] = new \Minds\Entities\User($guid);
continue;
}
$users[] = new \Minds\Entities\User(json_decode($subscriber, true));
}
$users = array_values(array_filter($users, function ($user) {
return ($user->enabled != 'no' && $user->banned != 'yes');
}));
$response['users'] = factory::exportable($users);
$response['load-next'] = (string) end($users)->guid;
$response['load-previous'] = (string) key($users)->guid;
break;
case 'subscribers':
if ($pages[1] == "100000000000000519") {
break;
}
$db = new \Minds\Core\Data\Call('friendsof');
$subscribers= $db->getRow($pages[1], ['limit'=>get_input('limit', 12), 'offset'=>get_input('offset', '')]);
if (!$subscribers) {
return Factory::response([]);
}
$users = [];
if (get_input('offset') && key($subscribers) != get_input('offset')) {
$response['load-previous'] = (string) get_input('offset');
} else {
foreach ($subscribers as $guid => $subscriber) {
if ($guid == get_input('offset')) {
unset($subscribers[$guid]);
continue;
}
if (is_numeric($subscriber)) {
//this is a local, old style subscription
$users[] = new \Minds\Entities\User($guid);
continue;
}
//var_dump(print_r($users,true));die();
$users[] = new \Minds\Entities\User(json_decode($subscriber, true));
}
$users = array_values(array_filter($users, function ($user) {
return ($user->enabled != 'no' && $user->banned != 'yes')
&& $user->guid && $user->username;
}));
$response['users'] = factory::exportable($users);
$response['load-next'] = (string) end($users)->guid;
$response['load-previous'] = (string) key($users)->guid;
}
break;
$guid = $pages[1] ?? Core\Session::getLoggedInUser()->guid;
$type = $pages[0] ?? "subscribers";
$limit = $_GET['limit'] ?? 12;
$offset = $_GET['offset'] ?? "";
$opts = [
'guid'=>$guid,
'type'=>$type,
'limit'=>$limit,
'offset'=>$offset,
];
$users = $manager->getList($opts);
if (!$users) {
return Factory::response([
'status' => 'error',
'message' => 'Unable to find '.$type,
]);
}
$response['users'] = Factory::exportable(array_values($users->toArray()));
$response['load-next'] = (string) $users->getPagingToken();
return Factory::response($response);
}
......
......@@ -61,6 +61,31 @@ class Manager
$this->checkRateLimitDelegate = $checkRateLimitDelegate ?: new CheckRateLimit();
}
/**
* Gets a subscription or subscribers list from the repository.
*
* @param array $opts -
* guid - required!
* type - either 'subscribers' or 'subscriptions'.
* limit - limit.
* offset - offset.
* @return Response response objet
*/
public function getList($opts)
{
$opts = array_merge([
'limit' => 12,
'offset' => '',
'guid' => '',
'type' => 'subscribers',
], $opts);
if (!$opts['guid']) {
return [];
}
return $this->repository->getList($opts);
}
public function setSubscriber($user)
{
$this->subscriber = $user;
......
......@@ -5,9 +5,9 @@ namespace Minds\Core\Subscriptions;
use Cassandra;
use Minds\Common\Repository\Response;
use Minds\Core\Data\Cassandra\Client;
use Minds\Core\Data\Cassandra\Prepared\Custom;
use Minds\Core\Di\Di;
use Minds\Core\Util\UUIDGenerator;
use Minds\Core\Data\Cassandra\Prepared;
use Minds\Entities\User;
class Repository
{
......@@ -20,17 +20,67 @@ class Repository
}
/**
* @param array $opts
* @return Response
* Gets a subscription or subscribers list from cassandra.
*
* @param array $opts -
* guid - required!
* type - either 'subscribers' or 'subscriptions'.
* limit - limit.
* offset - offset.
* @return Response response object.
*/
public function getList(array $opts = [])
{
$opts = array_merge([
'limit' => 10,
'offset' => 0,
'uuid' => '',
'recursive' => false,
'limit' => 12,
'offset' => '',
'guid' => null,
'type' => null,
], $opts);
if (!$opts['guid']) {
throw new \Exception('GUID is required');
}
$response = new Response;
if ($opts['type'] === 'subscibers') {
$statement = "SELECT * FROM friends";
} else {
$statement = "SELECT * FROM friendsof";
}
$where = ["column1 = ?"];
$values = [$opts['guid']];
$statement .= " WHERE " . implode(' AND ', $where);
$statement .= " ALLOW FILTERING";
$cqlOpts = [];
if ($opts['limit']) {
$cqlOpts['page_size'] = (int) $opts['limit'];
}
if ($opts['offset']) {
$cqlOpts['paging_state_token'] = base64_decode($opts['offset'], true);
}
$query = new Prepared\Custom();
$query->query($statement, $values);
$query->setOpts($cqlOpts);
try {
$rows = $this->client->request($query);
foreach ($rows as $row) {
$user = new User($row['key']);
$response[] = $user;
}
$response->setPagingToken(base64_encode($rows->pagingStateToken()));
$response->setLastPage($rows->isLastPage());
} catch (\Exception $e) {
return $response;
}
return $response;
}
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment