summaryrefslogtreecommitdiff
path: root/p/api/greader.php
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2024-12-05 10:43:28 +0100
committerGravatar GitHub <noreply@github.com> 2024-12-05 10:43:28 +0100
commit72b11aac65bde7aa22423a4401cbc31dacf3dab1 (patch)
tree7374ab8b4da187740b2c5ba088324c9abf6443d8 /p/api/greader.php
parent79651b942de86e9d181ecf92cbbf12ad87b58cf2 (diff)
API support edit multiple tags (#7060)
* API support edit multiple tags fix https://github.com/FreshRSS/FreshRSS/issues/7057 * Doc typo
Diffstat (limited to 'p/api/greader.php')
-rw-r--r--p/api/greader.php125
1 files changed, 69 insertions, 56 deletions
diff --git a/p/api/greader.php b/p/api/greader.php
index 8833693c3..d4436c6bf 100644
--- a/p/api/greader.php
+++ b/p/api/greader.php
@@ -785,9 +785,11 @@ final class GReaderAPI {
}
/**
- * @param array<string> $e_ids
+ * @param array<string> $e_ids IDs of the items to edit
+ * @param array<string> $as tags to add to all the listed items
+ * @param array<string> $rs tags to remove from all the listed items
*/
- private static function editTag(array $e_ids, string $a, string $r): never {
+ private static function editTag(array $e_ids, array $as, array $rs): never {
foreach ($e_ids as $i => $e_id) {
if (!ctype_digit($e_id) || $e_id[0] === '0') {
$e_ids[$i] = hex2dec(basename($e_id)); //Strip prefix 'tag:google.com,2005:reader/item/'
@@ -798,64 +800,73 @@ final class GReaderAPI {
$entryDAO = FreshRSS_Factory::createEntryDao();
$tagDAO = FreshRSS_Factory::createTagDao();
- switch ($a) {
- case 'user/-/state/com.google/read':
- $entryDAO->markRead($e_ids, true);
- break;
- case 'user/-/state/com.google/starred':
- $entryDAO->markFavorite($e_ids, true);
- break;
- /*case 'user/-/state/com.google/tracking-kept-unread':
- break;
- case 'user/-/state/com.google/like':
- break;
- case 'user/-/state/com.google/broadcast':
- break;*/
- default:
- $tagName = '';
- if (str_starts_with($a, 'user/-/label/')) {
- $tagName = substr($a, 13);
- } else {
- $user = Minz_User::name() ?? '';
- $prefix = 'user/' . $user . '/label/';
- if (str_starts_with($a, $prefix)) {
- $tagName = substr($a, strlen($prefix));
+ foreach ($as as $a) {
+ switch ($a) {
+ case 'user/-/state/com.google/read':
+ $entryDAO->markRead($e_ids, true);
+ break;
+ case 'user/-/state/com.google/starred':
+ $entryDAO->markFavorite($e_ids, true);
+ break;
+ case 'user/-/state/com.google/broadcast':
+ case 'user/-/state/com.google/like':
+ case 'user/-/state/com.google/tracking-kept-unread':
+ // Not supported
+ break;
+ default:
+ $tagName = '';
+ if (str_starts_with($a, 'user/-/label/')) {
+ $tagName = substr($a, 13);
+ } else {
+ $user = Minz_User::name() ?? '';
+ $prefix = 'user/' . $user . '/label/';
+ if (str_starts_with($a, $prefix)) {
+ $tagName = substr($a, strlen($prefix));
+ }
}
- }
- if ($tagName != '') {
- $tagName = htmlspecialchars($tagName, ENT_COMPAT, 'UTF-8');
- $tag = $tagDAO->searchByName($tagName);
- if ($tag == null) {
- $tagDAO->addTag(['name' => $tagName]);
+ if ($tagName !== '') {
+ $tagName = htmlspecialchars($tagName, ENT_COMPAT, 'UTF-8');
$tag = $tagDAO->searchByName($tagName);
- }
- if ($tag != null) {
- foreach ($e_ids as $e_id) {
- $tagDAO->tagEntry($tag->id(), $e_id, true);
+ if ($tag === null) {
+ $tagDAO->addTag(['name' => $tagName]);
+ $tag = $tagDAO->searchByName($tagName);
+ }
+ if ($tag !== null) {
+ foreach ($e_ids as $e_id) {
+ $tagDAO->tagEntry($tag->id(), $e_id, true);
+ }
}
}
- }
- break;
+ break;
+ }
}
- switch ($r) {
- case 'user/-/state/com.google/read':
- $entryDAO->markRead($e_ids, false);
- break;
- case 'user/-/state/com.google/starred':
- $entryDAO->markFavorite($e_ids, false);
- break;
- default:
- if (str_starts_with($r, 'user/-/label/')) {
- $tagName = substr($r, 13);
- $tagName = htmlspecialchars($tagName, ENT_COMPAT, 'UTF-8');
- $tag = $tagDAO->searchByName($tagName);
- if ($tag != null) {
- foreach ($e_ids as $e_id) {
- $tagDAO->tagEntry($tag->id(), $e_id, false);
+
+ foreach ($rs as $r) {
+ switch ($r) {
+ case 'user/-/state/com.google/read':
+ $entryDAO->markRead($e_ids, false);
+ break;
+ case 'user/-/state/com.google/starred':
+ $entryDAO->markFavorite($e_ids, false);
+ break;
+ case 'user/-/state/com.google/broadcast':
+ case 'user/-/state/com.google/like':
+ case 'user/-/state/com.google/tracking-kept-unread':
+ // Not supported
+ break;
+ default:
+ if (str_starts_with($r, 'user/-/label/')) {
+ $tagName = substr($r, 13);
+ $tagName = htmlspecialchars($tagName, ENT_COMPAT, 'UTF-8');
+ $tag = $tagDAO->searchByName($tagName);
+ if ($tag !== null) {
+ foreach ($e_ids as $e_id) {
+ $tagDAO->tagEntry($tag->id(), $e_id, false);
+ }
}
}
- }
- break;
+ break;
+ }
}
exit('OK');
@@ -1153,10 +1164,12 @@ final class GReaderAPI {
case 'edit-tag': //http://blog.martindoms.com/2010/01/20/using-the-google-reader-api-part-3/
$token = isset($_POST['T']) ? trim($_POST['T']) : '';
self::checkToken(FreshRSS_Context::userConf(), $token);
- $a = $_POST['a'] ?? ''; //Add: user/-/state/com.google/read user/-/state/com.google/starred
- $r = $_POST['r'] ?? ''; //Remove: user/-/state/com.google/read user/-/state/com.google/starred
+ // Add (Can be repeated to add multiple tags at once): user/-/state/com.google/read user/-/state/com.google/starred
+ $as = multiplePosts('a');
+ // Remove (Can be repeated to remove multiple tags at once): user/-/state/com.google/read user/-/state/com.google/starred
+ $rs = multiplePosts('r');
$e_ids = multiplePosts('i'); //item IDs
- self::editTag($e_ids, $a, $r);
+ self::editTag($e_ids, $as, $rs);
// Always exits
case 'rename-tag': //https://github.com/theoldreader/api
$token = isset($_POST['T']) ? trim($_POST['T']) : '';