diff options
author | Hamza Mahjoubi <hamzamahjoubi221@gmail.com> | 2024-09-11 22:14:24 +0200 |
---|---|---|
committer | Hamza Mahjoubi <hamzamahjoubi221@gmail.com> | 2024-09-11 22:14:24 +0200 |
commit | 02418d5835e5f75cfbac856f555b251af9021e18 (patch) | |
tree | 6f5638597f3b998dc67d5d14c6f3feb80b44812e | |
parent | 897c341c5d894aa76ad1823f8f656f589515a903 (diff) | |
download | nextcloud-server-feat/pagination-cardav.tar.gz nextcloud-server-feat/pagination-cardav.zip |
feat: add pagination compatibility to cardav backendfeat/pagination-cardav
Signed-off-by: Hamza Mahjoubi <hamzamahjoubi221@gmail.com>
-rw-r--r-- | apps/dav/lib/CardDAV/AddressBook.php | 4 | ||||
-rw-r--r-- | apps/dav/lib/CardDAV/CardDavBackend.php | 21 |
2 files changed, 20 insertions, 5 deletions
diff --git a/apps/dav/lib/CardDAV/AddressBook.php b/apps/dav/lib/CardDAV/AddressBook.php index 2ec645f04d2..3deda7e38a0 100644 --- a/apps/dav/lib/CardDAV/AddressBook.php +++ b/apps/dav/lib/CardDAV/AddressBook.php @@ -157,7 +157,9 @@ class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareable, IMov } public function getChildren() { - $objs = $this->carddavBackend->getCards($this->addressBookInfo['id']); + $offset = $_SERVER['HTTP_X_NEXTCLOUD_OFFSET']; + $limit = $_SERVER['HTTP_X_NEXTCLOUD_LIMIT']; + $objs = $this->carddavBackend->getCards($this->addressBookInfo['id'], $offset, $limit); $children = []; foreach ($objs as $obj) { $obj['acl'] = $this->getChildACL(); diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php index 9dee61638a5..7c2c8423a22 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -469,13 +469,26 @@ class CardDavBackend implements BackendInterface, SyncSupport { * This may speed up certain requests, especially with large cards. * * @param mixed $addressbookId + * @param int|null $offset + * @param int|null $limit * @return array */ - public function getCards($addressbookId) { + public function getCards($addressbookId, $offset = null, $limit = null) { $query = $this->db->getQueryBuilder(); - $query->select(['id', 'uri', 'lastmodified', 'etag', 'size', 'carddata', 'uid']) - ->from($this->dbCardsTable) - ->where($query->expr()->eq('addressbookid', $query->createNamedParameter($addressbookId))); + $query->select(['c.id', 'c.uri', 'c.lastmodified', 'c.etag', 'c.size', 'c.carddata', 'c.uid']) + ->from($this->dbCardsTable, 'c') + ->join('c', $this->dbCardsPropertiesTable, 'cp', $query->expr()->eq('cp.cardid', 'c.id')) + ->where($query->expr()->eq('c.addressbookid', $query->createNamedParameter($addressbookId))) + ->andWhere($query->expr()->eq('cp.name', $query->createNamedParameter('FN'))); + + if(isset($offset)) { + $query->orderBy('cp.value'); + $query->setFirstResult($offset); + } + + if(isset($limit)) { + $query->setMaxResults($limit); + } $cards = []; |