mirror of
https://code.mensbeam.com/MensBeam/Arsse.git
synced 2024-12-22 21:22:40 +00:00
Change NCNv1 handler to use new "typical" articleList fieldset
This commit is contained in:
parent
c88b5c4f18
commit
b595815eb9
4 changed files with 31 additions and 30 deletions
|
@ -17,10 +17,10 @@ class Database {
|
||||||
const SCHEMA_VERSION = 2;
|
const SCHEMA_VERSION = 2;
|
||||||
const LIMIT_ARTICLES = 50;
|
const LIMIT_ARTICLES = 50;
|
||||||
// articleList verbosity levels
|
// articleList verbosity levels
|
||||||
const AL_MINIMAL = 0; // only that metadata which is required for context matching
|
const LIST_MINIMAL = 0; // only that metadata which is required for context matching
|
||||||
const AL_CONSERVATIVE = 1; // base metadata plus anything that is not potentially large text
|
const LIST_CONSERVATIVE = 1; // base metadata plus anything that is not potentially large text
|
||||||
const AL_TYPICAL = 2; // conservative, with the addition of content
|
const LIST_TYPICAL = 2; // conservative, with the addition of content
|
||||||
const AL_FULL = 3; // all possible fields
|
const LIST_FULL = 3; // all possible fields
|
||||||
|
|
||||||
/** @var Db\Driver */
|
/** @var Db\Driver */
|
||||||
public $db;
|
public $db;
|
||||||
|
@ -972,7 +972,7 @@ class Database {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function articleList(string $user, Context $context = null, int $fields = self::AL_FULL): Db\Result {
|
public function articleList(string $user, Context $context = null, int $fields = self::LIST_FULL): 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]);
|
||||||
}
|
}
|
||||||
|
@ -990,17 +990,17 @@ class Database {
|
||||||
$columns = [];
|
$columns = [];
|
||||||
switch ($fields) {
|
switch ($fields) {
|
||||||
// NOTE: the cases all cascade into each other: a given verbosity level is always a superset of the previous one
|
// NOTE: the cases all cascade into each other: a given verbosity level is always a superset of the previous one
|
||||||
case self::AL_FULL: // everything
|
case self::LIST_FULL: // everything
|
||||||
$columns = array_merge($columns,[
|
$columns = array_merge($columns,[
|
||||||
"(select note from arsse_marks where article is arsse_articles.id and subscription in (select sub from subscribed_feeds)) as note",
|
"(select note from arsse_marks where article is arsse_articles.id and subscription in (select sub from subscribed_feeds)) as note",
|
||||||
]);
|
]);
|
||||||
case self::AL_TYPICAL: // conservative, plus content
|
case self::LIST_TYPICAL: // conservative, plus content
|
||||||
$columns = array_merge($columns,[
|
$columns = array_merge($columns,[
|
||||||
"content",
|
"content",
|
||||||
"arsse_enclosures.url as media_url", // enclosures are potentially large due to data: URLs
|
"arsse_enclosures.url as media_url", // enclosures are potentially large due to data: URLs
|
||||||
"arsse_enclosures.type as media_type", // FIXME: enclosures should eventually have their own fetch method
|
"arsse_enclosures.type as media_type", // FIXME: enclosures should eventually have their own fetch method
|
||||||
]);
|
]);
|
||||||
case self::AL_CONSERVATIVE: // base metadata, plus anything that is not likely to be large text
|
case self::LIST_CONSERVATIVE: // base metadata, plus anything that is not likely to be large text
|
||||||
$columns = array_merge($columns,[
|
$columns = array_merge($columns,[
|
||||||
"arsse_articles.url as url",
|
"arsse_articles.url as url",
|
||||||
"arsse_articles.title as title",
|
"arsse_articles.title as title",
|
||||||
|
@ -1011,7 +1011,7 @@ class Database {
|
||||||
"edited as edited_date",
|
"edited as edited_date",
|
||||||
"url_title_hash||':'||url_content_hash||':'||title_content_hash as fingerprint",
|
"url_title_hash||':'||url_content_hash||':'||title_content_hash as fingerprint",
|
||||||
]);
|
]);
|
||||||
case self::AL_MINIMAL: // base metadata (always included: required for context matching)
|
case self::LIST_MINIMAL: // base metadata (always included: required for context matching)
|
||||||
// id, subscription, feed, modified_date, marked_date, unread, starred, edition
|
// id, subscription, feed, modified_date, marked_date, unread, starred, edition
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -7,6 +7,7 @@ declare(strict_types=1);
|
||||||
namespace JKingWeb\Arsse\REST\NextCloudNews;
|
namespace JKingWeb\Arsse\REST\NextCloudNews;
|
||||||
|
|
||||||
use JKingWeb\Arsse\Arsse;
|
use JKingWeb\Arsse\Arsse;
|
||||||
|
use JKingWeb\Arsse\Database;
|
||||||
use JKingWeb\Arsse\User;
|
use JKingWeb\Arsse\User;
|
||||||
use JKingWeb\Arsse\Service;
|
use JKingWeb\Arsse\Service;
|
||||||
use JKingWeb\Arsse\Misc\Context;
|
use JKingWeb\Arsse\Misc\Context;
|
||||||
|
@ -510,7 +511,7 @@ class V1_2 extends \JKingWeb\Arsse\REST\AbstractHandler {
|
||||||
}
|
}
|
||||||
// perform the fetch
|
// perform the fetch
|
||||||
try {
|
try {
|
||||||
$items = Arsse::$db->articleList(Arsse::$user->id, $c);
|
$items = Arsse::$db->articleList(Arsse::$user->id, $c, Database::LIST_TYPICAL);
|
||||||
} catch (ExceptionInput $e) {
|
} catch (ExceptionInput $e) {
|
||||||
// ID of subscription or folder is not valid
|
// ID of subscription or folder is not valid
|
||||||
return new Response(422);
|
return new Response(422);
|
||||||
|
|
|
@ -666,11 +666,11 @@ class TestNCNV1_2 extends Test\AbstractTest {
|
||||||
['lastModified' => $t->getTimestamp()],
|
['lastModified' => $t->getTimestamp()],
|
||||||
['oldestFirst' => false, 'batchSize' => 5, 'offset' => 0], // offset=0 should not set the latestEdition context
|
['oldestFirst' => false, 'batchSize' => 5, 'offset' => 0], // offset=0 should not set the latestEdition context
|
||||||
];
|
];
|
||||||
Phake::when(Arsse::$db)->articleList(Arsse::$user->id, $this->anything())->thenReturn($res);
|
Phake::when(Arsse::$db)->articleList(Arsse::$user->id, $this->anything(), Database::LIST_TYPICAL)->thenReturn($res);
|
||||||
Phake::when(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->subscription(42))->thenThrow(new ExceptionInput("idMissing"));
|
Phake::when(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->subscription(42), Database::LIST_TYPICAL)->thenThrow(new ExceptionInput("idMissing"));
|
||||||
Phake::when(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->folder(2112))->thenThrow(new ExceptionInput("idMissing"));
|
Phake::when(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->folder(2112), Database::LIST_TYPICAL)->thenThrow(new ExceptionInput("idMissing"));
|
||||||
Phake::when(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->subscription(-1))->thenThrow(new ExceptionInput("typeViolation"));
|
Phake::when(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->subscription(-1), Database::LIST_TYPICAL)->thenThrow(new ExceptionInput("typeViolation"));
|
||||||
Phake::when(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->folder(-1))->thenThrow(new ExceptionInput("typeViolation"));
|
Phake::when(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->folder(-1), Database::LIST_TYPICAL)->thenThrow(new ExceptionInput("typeViolation"));
|
||||||
$exp = new Response(200, ['items' => $this->articles['rest']]);
|
$exp = new Response(200, ['items' => $this->articles['rest']]);
|
||||||
// check the contents of the response
|
// check the contents of the response
|
||||||
$this->assertEquals($exp, $this->h->dispatch(new Request("GET", "/items"))); // first instance of base context
|
$this->assertEquals($exp, $this->h->dispatch(new Request("GET", "/items"))); // first instance of base context
|
||||||
|
@ -691,17 +691,17 @@ class TestNCNV1_2 extends Test\AbstractTest {
|
||||||
$this->h->dispatch(new Request("GET", "/items", json_encode($in[10]), 'application/json'));
|
$this->h->dispatch(new Request("GET", "/items", json_encode($in[10]), 'application/json'));
|
||||||
$this->h->dispatch(new Request("GET", "/items", json_encode($in[11]), 'application/json'));
|
$this->h->dispatch(new Request("GET", "/items", json_encode($in[11]), 'application/json'));
|
||||||
// perform method verifications
|
// perform method verifications
|
||||||
Phake::verify(Arsse::$db, Phake::times(4))->articleList(Arsse::$user->id, (new Context)->reverse(true));
|
Phake::verify(Arsse::$db, Phake::times(4))->articleList(Arsse::$user->id, (new Context)->reverse(true), Database::LIST_TYPICAL);
|
||||||
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->subscription(42));
|
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->subscription(42), Database::LIST_TYPICAL);
|
||||||
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->folder(2112));
|
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->folder(2112), Database::LIST_TYPICAL);
|
||||||
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->subscription(-1));
|
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->subscription(-1), Database::LIST_TYPICAL);
|
||||||
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->folder(-1));
|
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->folder(-1), Database::LIST_TYPICAL);
|
||||||
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->starred(true));
|
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->starred(true), Database::LIST_TYPICAL);
|
||||||
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(false)->limit(10)->oldestEdition(6)); // offset is one more than specified
|
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(false)->limit(10)->oldestEdition(6), Database::LIST_TYPICAL); // offset is one more than specified
|
||||||
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->limit(5)->latestEdition(4)); // offset is one less than specified
|
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->limit(5)->latestEdition(4), Database::LIST_TYPICAL); // offset is one less than specified
|
||||||
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->unread(true));
|
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->unread(true), Database::LIST_TYPICAL);
|
||||||
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->markedSince($t));
|
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->markedSince($t), Database::LIST_TYPICAL);
|
||||||
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->limit(5));
|
Phake::verify(Arsse::$db)->articleList(Arsse::$user->id, (new Context)->reverse(true)->limit(5), Database::LIST_TYPICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testMarkAFolderRead() {
|
public function testMarkAFolderRead() {
|
||||||
|
|
|
@ -350,19 +350,19 @@ trait SeriesArticle {
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
protected $fields = [
|
protected $fields = [
|
||||||
Database::AL_MINIMAL => [
|
Database::LIST_MINIMAL => [
|
||||||
"id", "subscription", "feed", "modified_date", "marked_date", "unread", "starred", "edition",
|
"id", "subscription", "feed", "modified_date", "marked_date", "unread", "starred", "edition",
|
||||||
],
|
],
|
||||||
Database::AL_CONSERVATIVE => [
|
Database::LIST_CONSERVATIVE => [
|
||||||
"id", "subscription", "feed", "modified_date", "marked_date", "unread", "starred", "edition",
|
"id", "subscription", "feed", "modified_date", "marked_date", "unread", "starred", "edition",
|
||||||
"url", "title", "subscription_title", "author", "guid", "published_date", "edited_date", "fingerprint",
|
"url", "title", "subscription_title", "author", "guid", "published_date", "edited_date", "fingerprint",
|
||||||
],
|
],
|
||||||
Database::AL_TYPICAL => [
|
Database::LIST_TYPICAL => [
|
||||||
"id", "subscription", "feed", "modified_date", "marked_date", "unread", "starred", "edition",
|
"id", "subscription", "feed", "modified_date", "marked_date", "unread", "starred", "edition",
|
||||||
"url", "title", "subscription_title", "author", "guid", "published_date", "edited_date", "fingerprint",
|
"url", "title", "subscription_title", "author", "guid", "published_date", "edited_date", "fingerprint",
|
||||||
"content", "media_url", "media_type",
|
"content", "media_url", "media_type",
|
||||||
],
|
],
|
||||||
Database::AL_FULL => [
|
Database::LIST_FULL => [
|
||||||
"id", "subscription", "feed", "modified_date", "marked_date", "unread", "starred", "edition",
|
"id", "subscription", "feed", "modified_date", "marked_date", "unread", "starred", "edition",
|
||||||
"url", "title", "subscription_title", "author", "guid", "published_date", "edited_date", "fingerprint",
|
"url", "title", "subscription_title", "author", "guid", "published_date", "edited_date", "fingerprint",
|
||||||
"content", "media_url", "media_type",
|
"content", "media_url", "media_type",
|
||||||
|
|
Loading…
Reference in a new issue