-
Notifications
You must be signed in to change notification settings - Fork 74
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
unfiled items api calls #152
base: master
Are you sure you want to change the base?
Conversation
/users/XXX/items/unfiled lists all items without collection /users/XXX/items/unfiled/tags lists all tags or items without collection Fixes: zotero#11
controllers/ItemsController.php
Outdated
@@ -424,6 +424,15 @@ public function items() { | |||
$this->permissions | |||
); | |||
} | |||
// Unfiled items | |||
else if ($this->subset == 'unfiled') { | |||
$this->allowMethods(array('GET')); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can always use […]
instead of array(…)
for new code
controllers/ItemsController.php
Outdated
|
||
$title = "Unfiled items"; | ||
$itemIDs = Zotero_Items::getItemsWithoutCollection( | ||
$this->objectLibraryID |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This will need to use Zotero_Items::search()
like trash
above, since otherwise other query parameters don't work. (E.g., people still need to be able to use the search bar, which uses q
.) Zotero_Items::search()
is quite convoluted, for complicated reasons, so let me know if something is unclear.
/unfiled
also implies /top
, but I think just setting $onlyTopLevel = true
(the second parameter to search()
) won't work, since that matches parent items of matching items, and all child items are technically unfiled, so it would match all items with children. So instead of that, the actual unfiled JOIN condition in search()
should probably include a negative match on itemTopLevel.itemID
, which contains child items mapped to top-level items, so that the actual matches are only top-level items. You can test, but I think this would be the unincorporated version of the SQL:
SELECT * FROM items I
LEFT JOIN itemTopLevel ITL USING (itemID)
LEFT JOIN collectionItems CI USING (itemID)
WHERE libraryID=?
AND ITL.itemID IS NULL
AND CI.collectionID IS NULL
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Makes sense. I added another parameter to search
function to tell if it's an unfiled
request, and a few conditionals to construct the query above. It seems to give us exactly what we want. I added a small commit with a few tests to check
include/config/routes.inc.php
Outdated
@@ -107,6 +107,10 @@ | |||
$router->map('/users/i:objectUserID/publications/items/:objectKey/children', ['controller' => 'Items', 'extra' => ['publications' => true, 'subset' => 'children']]); | |||
$router->map('/users/i:objectUserID/publications/items/:objectKey', ['controller' => 'Items', 'extra' => ['publications' => true]]); | |||
|
|||
// Unfiled items | |||
$router->map('/users/i:objectUserID/items/unfiled', array('controller' => 'Items', 'extra' => array('subset' => 'unfiled'))); | |||
$router->map('/users/i:objectUserID/items/unfiled/tags', array('controller' => 'Tags', 'extra' => array('subset' => 'unfiled'))); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
array()
=> []
/users/XXX/items/unfiled lists all items without collection
/users/XXX/items/unfiled/tags lists all tags or items without collection
Fixes #11