diff --git a/lib/Db/TimelineQueryDay.php b/lib/Db/TimelineQueryDay.php index f212c13f..6efed3ce 100644 --- a/lib/Db/TimelineQueryDay.php +++ b/lib/Db/TimelineQueryDay.php @@ -6,6 +6,7 @@ namespace OCA\Memories\Db; use OCA\Memories\Exif; use OCP\IConfig; use OCP\IDBConnection; +use OCP\ITags; use OCP\DB\QueryBuilder\IQueryBuilder; trait TimelineQueryDay { @@ -22,6 +23,11 @@ trait TimelineQueryDay { if (!$row["isvideo"]) { unset($row["isvideo"]); } + + if ($row["category"] === ITags::TAG_FAVORITE) { + $row["favorite"] = 1; + } + unset($row["category"]); } return $day; } @@ -30,10 +36,11 @@ trait TimelineQueryDay { private function makeQueryDay( IQueryBuilder &$query, int $dayid, + string $user, $whereFilecache ) { // Get all entries also present in filecache - $query->select('m.fileid', 'f.etag', 'm.isvideo') + $query->select('m.fileid', 'f.etag', 'm.isvideo', 'vc.category') ->from('memories', 'm') ->innerJoin('m', 'filecache', 'f', $query->expr()->andX( @@ -42,6 +49,9 @@ trait TimelineQueryDay { )) ->andWhere($query->expr()->eq('m.dayid', $query->createNamedParameter($dayid, IQueryBuilder::PARAM_INT))); + // Add favorite field + $this->addFavoriteTag($query, $user); + // Group and sort by date taken $query->orderBy('m.datetaken', 'DESC'); return $query; @@ -62,7 +72,7 @@ trait TimelineQueryDay { // Filter by path starting with timeline path $path = "files" . Exif::getPhotosPath($config, $user) . "%"; $query = $this->connection->getQueryBuilder(); - $this->makeQueryDay($query, $dayId, $query->expr()->like( + $this->makeQueryDay($query, $dayId, $user, $query->expr()->like( 'f.path', $query->createNamedParameter($path) )); @@ -84,11 +94,12 @@ trait TimelineQueryDay { * @param int $dayId */ public function getDayFolder( + string $user, int $folderId, int $dayId ): array { $query = $this->connection->getQueryBuilder(); - $this->makeQueryDay($query, $dayId, $query->expr()->orX( + $this->makeQueryDay($query, $dayId, $user, $query->expr()->orX( $query->expr()->eq('f.parent', $query->createNamedParameter($folderId, IQueryBuilder::PARAM_INT)), $query->expr()->eq('f.fileid', $query->createNamedParameter($folderId, IQueryBuilder::PARAM_INT)), )); diff --git a/lib/Db/TimelineQueryFavorites.php b/lib/Db/TimelineQueryFavorites.php index 56332d91..41b417b5 100644 --- a/lib/Db/TimelineQueryFavorites.php +++ b/lib/Db/TimelineQueryFavorites.php @@ -9,11 +9,25 @@ use OCP\ITags; trait TimelineQueryFavorites { public function transformFavoriteFilter(IQueryBuilder $query, string $userId) { // Inner join will filter only the favorites - $query->innerJoin('m', 'vcategory_to_object', 'vco', $query->expr()->eq('vco.objid', 'm.fileid')); + $query->innerJoin('m', 'vcategory_to_object', 'fvco', $query->expr()->eq('fvco.objid', 'm.fileid')); // Get the favorites category only - $query->innerJoin('vco', 'vcategory', 'vc', $query->expr()->andX( + $query->innerJoin('fvco', 'vcategory', 'fvc', $query->expr()->andX( + $query->expr()->eq('fvc.id', 'fvco.categoryid'), + $query->expr()->eq('fvc.type', $query->createNamedParameter("files")), + $query->expr()->eq('fvc.uid', $query->createNamedParameter($userId)), + $query->expr()->eq('fvc.category', $query->createNamedParameter(ITags::TAG_FAVORITE)), + )); + } + + public function addFavoriteTag(IQueryBuilder $query, string $userId) { + // Inner join will filter only the favorites + $query->leftJoin('m', 'vcategory_to_object', 'vco', $query->expr()->eq('vco.objid', 'm.fileid')); + + // Get the favorites category only + $query->leftJoin('vco', 'vcategory', 'vc', $query->expr()->andX( $query->expr()->eq('vc.id', 'vco.categoryid'), + $query->expr()->eq('vc.type', $query->createNamedParameter("files")), $query->expr()->eq('vc.uid', $query->createNamedParameter($userId)), $query->expr()->eq('vc.category', $query->createNamedParameter(ITags::TAG_FAVORITE)), )); diff --git a/src/components/Photo.vue b/src/components/Photo.vue index 10d3c52d..6781d469 100644 --- a/src/components/Photo.vue +++ b/src/components/Photo.vue @@ -14,6 +14,8 @@ @click="toggleSelect">
+
+