mirror of
https://code.mensbeam.com/MensBeam/Arsse.git
synced 2025-01-03 14:32:40 +00:00
Allow subscriptions to be listed non-recursively
This is used in multiple TTRSS operations (at least catchupFeed and getFeeds, and so is a useful optimization
This commit is contained in:
parent
f22fe8ba95
commit
cbe82c57cd
2 changed files with 23 additions and 4 deletions
|
@ -498,7 +498,7 @@ class Database {
|
||||||
return $this->db->prepare('INSERT INTO arsse_subscriptions(owner,feed) values(?,?)', 'str', 'int')->run($user, $feedID)->lastId();
|
return $this->db->prepare('INSERT INTO arsse_subscriptions(owner,feed) values(?,?)', 'str', 'int')->run($user, $feedID)->lastId();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function subscriptionList(string $user, $folder = null, int $id = null): Db\Result {
|
public function subscriptionList(string $user, $folder = null, bool $recursive = true, int $id = null): Db\Result {
|
||||||
if (!Arsse::$user->authorize($user, __FUNCTION__)) {
|
if (!Arsse::$user->authorize($user, __FUNCTION__)) {
|
||||||
throw new User\ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $user]);
|
throw new User\ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $user]);
|
||||||
}
|
}
|
||||||
|
@ -527,11 +527,14 @@ class Database {
|
||||||
// this condition facilitates the implementation of subscriptionPropertiesGet, which would otherwise have to duplicate the complex query; it takes precedence over a specified folder
|
// this condition facilitates the implementation of subscriptionPropertiesGet, which would otherwise have to duplicate the complex query; it takes precedence over a specified folder
|
||||||
// if an ID is specified, add a suitable WHERE condition and bindings
|
// if an ID is specified, add a suitable WHERE condition and bindings
|
||||||
$q->setWhere("arsse_subscriptions.id is ?", "int", $id);
|
$q->setWhere("arsse_subscriptions.id is ?", "int", $id);
|
||||||
} elseif ($folder) {
|
} elseif ($folder && $recursive) {
|
||||||
// if it does exist, add a common table expression to list it and its children so that we select from the entire subtree
|
// if a folder is specified and we're listing recursively, add a common table expression to list it and its children so that we select from the entire subtree
|
||||||
$q->setCTE("folders(folder)", "SELECT ? union select id from arsse_folders join folders on parent is folder", "int", $folder);
|
$q->setCTE("folders(folder)", "SELECT ? union select id from arsse_folders join folders on parent is folder", "int", $folder);
|
||||||
// add a suitable WHERE condition
|
// add a suitable WHERE condition
|
||||||
$q->setWhere("folder in (select folder from folders)");
|
$q->setWhere("folder in (select folder from folders)");
|
||||||
|
} elseif (!$recursive) {
|
||||||
|
// if we're not listing recursively, match against only the specified folder (even if it is null)
|
||||||
|
$q->setWhere("folder is ?", "int", $folder);
|
||||||
}
|
}
|
||||||
return $this->db->prepare($q->getQuery(), $q->getTypes())->run($q->getValues());
|
return $this->db->prepare($q->getQuery(), $q->getTypes())->run($q->getValues());
|
||||||
}
|
}
|
||||||
|
@ -577,7 +580,7 @@ class Database {
|
||||||
}
|
}
|
||||||
// disable authorization checks for the list call
|
// disable authorization checks for the list call
|
||||||
Arsse::$user->authorizationEnabled(false);
|
Arsse::$user->authorizationEnabled(false);
|
||||||
$sub = $this->subscriptionList($user, null, (int) $id)->getRow();
|
$sub = $this->subscriptionList($user, null, true, (int) $id)->getRow();
|
||||||
Arsse::$user->authorizationEnabled(true);
|
Arsse::$user->authorizationEnabled(true);
|
||||||
if (!$sub) {
|
if (!$sub) {
|
||||||
throw new Db\ExceptionInput("subjectMissing", ["action" => __FUNCTION__, "field" => "feed", 'id' => $id]);
|
throw new Db\ExceptionInput("subjectMissing", ["action" => __FUNCTION__, "field" => "feed", 'id' => $id]);
|
||||||
|
|
|
@ -257,6 +257,21 @@ trait SeriesSubscription {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testListSubscriptionsInAFolder() {
|
public function testListSubscriptionsInAFolder() {
|
||||||
|
$exp = [
|
||||||
|
[
|
||||||
|
'url' => "http://example.com/feed2",
|
||||||
|
'title' => "Eek",
|
||||||
|
'folder' => null,
|
||||||
|
'top_folder' => null,
|
||||||
|
'unread' => 4,
|
||||||
|
'pinned' => 1,
|
||||||
|
'order_type' => 2,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
$this->assertResult($exp, Arsse::$db->subscriptionList($this->user, null, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testListSubscriptionsWithoutRecursion() {
|
||||||
$exp = [
|
$exp = [
|
||||||
[
|
[
|
||||||
'url' => "http://example.com/feed3",
|
'url' => "http://example.com/feed3",
|
||||||
|
@ -269,6 +284,7 @@ trait SeriesSubscription {
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
$this->assertResult($exp, Arsse::$db->subscriptionList($this->user, 2));
|
$this->assertResult($exp, Arsse::$db->subscriptionList($this->user, 2));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testListSubscriptionsInAMissingFolder() {
|
public function testListSubscriptionsInAMissingFolder() {
|
||||||
|
|
Loading…
Reference in a new issue