1
0
Эх сурвалжийг харах

Merge pull request #20860 from nextcloud/bugfix/noid/macos_contacts_sync_prefer_personal_over_app-generated

macOS contacts: prefer personal over app generated
Georg Ehrke 4 жил өмнө
parent
commit
a45f4035e6

+ 3 - 3
apps/contactsinteraction/lib/AddressBook.php

@@ -34,7 +34,6 @@ use OCA\DAV\DAV\Sharing\Plugin;
 use OCP\AppFramework\Db\DoesNotExistException;
 use OCP\IL10N;
 use Sabre\DAV\Exception\NotFound;
-use Sabre\DAV\Exception\NotImplemented;
 use Sabre\DAV\PropPatch;
 use Sabre\DAVACL\ACLTrait;
 use Sabre\DAVACL\IACL;
@@ -130,8 +129,8 @@ class AddressBook extends ExternalAddressBook implements IACL {
 	/**
 	 * @inheritDoc
 	 */
-	public function getLastModified() {
-		throw new NotImplemented();
+	public function getLastModified(): ?int {
+		return $this->mapper->findLastUpdatedForUserId($this->getUid());
 	}
 
 	/**
@@ -149,6 +148,7 @@ class AddressBook extends ExternalAddressBook implements IACL {
 			'principaluri' => $this->principalUri,
 			'{DAV:}displayname' => $this->l10n->t('Recently contacted'),
 			'{' . Plugin::NS_OWNCLOUD . '}read-only' => true,
+			'{' . \OCA\DAV\CalDAV\Plugin::NS_CALENDARSERVER . '}getctag' => 'http://sabre.io/ns/sync/' . ($this->getLastModified() ?? 0),
 		];
 	}
 

+ 1 - 1
apps/contactsinteraction/lib/Card.php

@@ -95,7 +95,7 @@ class Card implements ICard, IACL {
 	 * @inheritDoc
 	 */
 	public function getETag(): ?string {
-		return null;
+		return '"' . md5((string) $this->getLastModified()) . '"';
 	}
 
 	/**

+ 24 - 0
apps/contactsinteraction/lib/Db/RecentContactMapper.php

@@ -104,6 +104,30 @@ class RecentContactMapper extends QBMapper {
 		return $this->findEntities($select);
 	}
 
+	/**
+	 * @param string $uid
+	 * @return int|null
+	 */
+	public function findLastUpdatedForUserId(string $uid):?int {
+		$qb = $this->db->getQueryBuilder();
+
+		$select = $qb
+			->select('last_contact')
+			->from($this->getTableName())
+			->where($qb->expr()->eq('actor_uid', $qb->createNamedParameter($uid)))
+			->orderBy('last_contact', 'DESC')
+			->setMaxResults(1);
+
+		$cursor = $select->execute();
+		$row = $cursor->fetch();
+
+		if ($row === false) {
+			return null;
+		}
+
+		return (int)$row['last_contact'];
+	}
+
 	public function cleanUp(int $olderThan): void {
 		$qb = $this->db->getQueryBuilder();
 

+ 1 - 1
apps/dav/lib/CardDAV/Integration/ExternalAddressBook.php

@@ -34,7 +34,7 @@ use Sabre\DAV;
 abstract class ExternalAddressBook implements IAddressBook, DAV\IProperties {
 
 	/** @var string */
-	private const PREFIX = 'app-generated';
+	private const PREFIX = 'z-app-generated';
 
 	/**
 	 * @var string