diff --git a/lib/Controller/findMementos.php b/lib/Controller/findMementos.php index fcdef39..c71aee0 100644 --- a/lib/Controller/findMementos.php +++ b/lib/Controller/findMementos.php @@ -25,13 +25,10 @@ trait MementoFinder { if ($this->loggedInUserId === $userId) { $userFolder = $this->serverContainer->getUserFolder($this->loggedInUserId); $moreMementos = findPrivateMementos($userFolder); - $foundMementos = mergeMementos($foundMementos, $moreMementos); + $foundMementos = array_merge($foundMementos, $moreMementos); } - // Filter those that match the requested URL, and sort them. - $matchingMementos = filterMementosByUrl($foundMementos, $url); - sortMementos($matchingMementos); - return $matchingMementos; + return listMementosMatchingUrl($foundMementos, $url); } function findAllUsersMementosForUrl($url) { @@ -45,20 +42,17 @@ trait MementoFinder { $shareManager = $this->serverContainer->getShareManager(); foreach ($allUserIds as $userId) { $moreMementos = findPublicMementos($shareManager, $userId); - $foundMementos = mergeMementos($foundMementos, $moreMementos); + $foundMementos = array_merge($foundMementos, $moreMementos); } // If logged in, get current user's private mementos too. if ($this->loggedInUserId) { $userFolder = $this->serverContainer->getUserFolder($this->loggedInUserId); $moreMementos = findPrivateMementos($userFolder); - $foundMementos = mergeMementos($foundMementos, $moreMementos); + $foundMementos = array_merge($foundMementos, $moreMementos); } - // Filter those that match the requested URL, and sort them. - $matchingMementos = filterMementosByUrl($foundMementos, $url); - $matchingMementos = sortMementos($matchingMementos); - return $matchingMementos; + return listMementosMatchingUrl($foundMementos, $url); } } @@ -127,9 +121,14 @@ function findPublicMementos($shareManager, $userId) { return $foundMementos; } -function mergeMementos($mementos1, $mementos2) { - // TODO deduplicate (we'll get public & private URLs for the same files) - return array_merge($mementos1, $mementos2); +function listMementosMatchingUrl($foundMementos, $url) { + // Filter those that match the requested URL + $matchingMementos = filterMementosByUrl($foundMementos, $url); + // Deduplicate (as a file may be accessible both through a public and a private URL) + $matchingMementos = deduplicateMementos($matchingMementos); + // Sort them by date. + $matchingMementos = sortMementos($matchingMementos); + return $matchingMementos; } function filterMementosByUrl($mementos, $url) { @@ -155,6 +154,18 @@ function normaliseUrl($url) { return $url; } +function deduplicateMementos($mementos) { + $deduped = []; + $seenIds = []; + foreach ($mementos as $memento) { + if (!array_key_exists($memento['id'], $seenIds)) { + $deduped[] = $memento; + $seenIds[$memento['id']] = null; + } + } + return $deduped; +} + // Sort an array of mementos by their datetime. Oldest first. function sortMementos($mementos) { usort($mementos, function ($m1, $m2) { return $m1['datetime'] <=> $m2['datetime']; }); @@ -177,7 +188,8 @@ function extractMementoInfo($file) { $datetime = getDatetime($headElement); return [ 'originalUrls' => $originalUrls, - 'datetime' => $datetime + 'datetime' => $datetime, + 'id' => $file->getFileInfo()->getId() // for deduplication ]; }