Skip to content

Commit 0ba8cd1

Browse files
IBX-8726: Added IsBookmarked criterion (#417)
For more details see https://issues.ibexa.co/browse/IBX-8726 and #417 Key changes: * Added loadUserIdsByLocation method to bookmark gateway * Added method loadUserIdsByLocation to bookmark handler * Added IsBookmarked criterion * Added IsBookmarked criterion handler for LSE * [Tests] Added integration tests for search using IsBookmarked criterion --------- Co-Authored-By: Konrad Oboza <[email protected]>
1 parent f15e57c commit 0ba8cd1

File tree

17 files changed

+598
-2
lines changed

17 files changed

+598
-2
lines changed

phpstan.neon.dist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ parameters:
99
treatPhpDocTypesAsCertain: false
1010
ignoreErrors:
1111
-
12-
message: "#^Cannot call method (fetchOne|fetchColumn|fetchAllAssociative|fetchAssociative|fetchAllKeyValue)\\(\\) on Doctrine\\\\DBAL\\\\ForwardCompatibility\\\\Result\\|int\\|string\\.$#"
12+
message: "#^Cannot call method (fetchOne|fetchColumn|fetchAllAssociative|fetchAssociative|fetchAllKeyValue|fetchFirstColumn)\\(\\) on Doctrine\\\\DBAL\\\\ForwardCompatibility\\\\Result\\|int\\|string\\.$#"
1313
paths:
1414
- src/*
1515
- tests/*

src/contracts/Persistence/Bookmark/Handler.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
namespace Ibexa\Contracts\Core\Persistence\Bookmark;
1010

11+
use Ibexa\Contracts\Core\Persistence\Content\Location;
12+
1113
interface Handler
1214
{
1315
/**
@@ -38,6 +40,13 @@ public function delete(int $bookmarkId): void;
3840
*/
3941
public function loadByUserIdAndLocationId(int $userId, array $locationIds): array;
4042

43+
/**
44+
* Get user ids who have bookmarked given location.
45+
*
46+
* @return array<int>
47+
*/
48+
public function loadUserIdsByLocation(Location $location): array;
49+
4150
/**
4251
* Loads bookmarks owned by user.
4352
*
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
/**
4+
* @copyright Copyright (C) Ibexa AS. All rights reserved.
5+
* @license For full copyright and license information view LICENSE file distributed with this source code.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\Location;
10+
11+
use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\Location;
12+
use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\Operator;
13+
use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\Operator\Specifications;
14+
use Ibexa\Contracts\Core\Repository\Values\Filter\FilteringCriterion;
15+
16+
/**
17+
* This criterion only works for current user reference.
18+
*/
19+
final class IsBookmarked extends Location implements FilteringCriterion
20+
{
21+
public function __construct(bool $value = true)
22+
{
23+
parent::__construct(
24+
null,
25+
Operator::EQ,
26+
$value,
27+
);
28+
}
29+
30+
public function getSpecifications(): array
31+
{
32+
return [
33+
new Specifications(
34+
Operator::EQ,
35+
Specifications::FORMAT_SINGLE,
36+
Specifications::TYPE_BOOLEAN
37+
),
38+
];
39+
}
40+
}

src/contracts/Test/IbexaTestKernel.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use FOS\JsRoutingBundle\FOSJsRoutingBundle;
1414
use Ibexa\Bundle\Core\IbexaCoreBundle;
1515
use Ibexa\Bundle\LegacySearchEngine\IbexaLegacySearchEngineBundle;
16+
use Ibexa\Contracts\Core\Persistence\Handler;
1617
use Ibexa\Contracts\Core\Persistence\TransactionHandler;
1718
use Ibexa\Contracts\Core\Repository;
1819
use Ibexa\Contracts\Core\Test\Persistence\Fixture\YamlFixture;
@@ -90,6 +91,8 @@ class IbexaTestKernel extends Kernel implements IbexaTestKernelInterface
9091
Repository\UserService::class,
9192
Repository\TokenService::class,
9293
Repository\URLAliasService::class,
94+
Repository\BookmarkService::class,
95+
Handler::class,
9396
];
9497

9598
/**

src/lib/Persistence/Cache/BookmarkHandler.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Ibexa\Contracts\Core\Persistence\Bookmark\Bookmark;
1212
use Ibexa\Contracts\Core\Persistence\Bookmark\CreateStruct;
1313
use Ibexa\Contracts\Core\Persistence\Bookmark\Handler as BookmarkHandlerInterface;
14+
use Ibexa\Contracts\Core\Persistence\Content\Location;
1415

1516
class BookmarkHandler extends AbstractHandler implements BookmarkHandlerInterface
1617
{
@@ -120,6 +121,15 @@ public function locationSwapped(int $location1Id, int $location2Id): void
120121
// Cache clearing is already done by locationHandler
121122
$this->persistenceHandler->bookmarkHandler()->locationSwapped($location1Id, $location2Id);
122123
}
124+
125+
public function loadUserIdsByLocation(Location $location): array
126+
{
127+
$this->logger->logCall(__METHOD__, [
128+
'locationId' => $location->id,
129+
]);
130+
131+
return $this->persistenceHandler->bookmarkHandler()->loadUserIdsByLocation($location);
132+
}
123133
}
124134

125135
class_alias(BookmarkHandler::class, 'eZ\Publish\Core\Persistence\Cache\BookmarkHandler');

src/lib/Persistence/Legacy/Bookmark/Gateway.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
namespace Ibexa\Core\Persistence\Legacy\Bookmark;
1010

1111
use Ibexa\Contracts\Core\Persistence\Bookmark\Bookmark;
12+
use Ibexa\Contracts\Core\Persistence\Content\Location;
1213

1314
/**
1415
* Base class for bookmark gateways.
@@ -41,6 +42,13 @@ abstract public function deleteBookmark(int $id): void;
4142
*/
4243
abstract public function loadBookmarkDataByUserIdAndLocationId(int $userId, array $locationIds): array;
4344

45+
/**
46+
* Load user ids by the given $location.
47+
*
48+
* @return array<int>
49+
*/
50+
abstract public function loadUserIdsByLocation(Location $location): array;
51+
4452
/**
4553
* Load data for all bookmarks owned by given $userId.
4654
*

src/lib/Persistence/Legacy/Bookmark/Gateway/DoctrineDatabase.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
namespace Ibexa\Core\Persistence\Legacy\Bookmark\Gateway;
1010

1111
use Doctrine\DBAL\Connection;
12+
use Doctrine\DBAL\ParameterType;
1213
use Ibexa\Contracts\Core\Persistence\Bookmark\Bookmark;
14+
use Ibexa\Contracts\Core\Persistence\Content\Location;
1315
use Ibexa\Core\Persistence\Legacy\Bookmark\Gateway;
1416
use PDO;
1517

@@ -100,6 +102,27 @@ public function loadBookmarkDataByUserIdAndLocationId(int $userId, array $locati
100102
return $query->execute()->fetchAll(PDO::FETCH_ASSOC);
101103
}
102104

105+
public function loadUserIdsByLocation(Location $location): array
106+
{
107+
$queryBuilder = $this->connection->createQueryBuilder();
108+
$queryBuilder
109+
->select(self::COLUMN_USER_ID)
110+
->from(self::TABLE_BOOKMARKS)
111+
->andWhere(
112+
$queryBuilder
113+
->expr()
114+
->eq(
115+
self::COLUMN_LOCATION_ID,
116+
$queryBuilder->createNamedParameter(
117+
$location->id,
118+
ParameterType::INTEGER
119+
)
120+
)
121+
);
122+
123+
return $queryBuilder->execute()->fetchFirstColumn();
124+
}
125+
103126
/**
104127
* {@inheritdoc}
105128
*/

src/lib/Persistence/Legacy/Bookmark/Gateway/ExceptionConversion.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
use Doctrine\DBAL\DBALException;
1212
use Ibexa\Contracts\Core\Persistence\Bookmark\Bookmark;
13+
use Ibexa\Contracts\Core\Persistence\Content\Location;
1314
use Ibexa\Core\Base\Exceptions\DatabaseException;
1415
use Ibexa\Core\Persistence\Legacy\Bookmark\Gateway;
1516
use PDOException;
@@ -82,6 +83,15 @@ public function locationSwapped(int $location1Id, int $location2Id): void
8283
throw DatabaseException::wrap($e);
8384
}
8485
}
86+
87+
public function loadUserIdsByLocation(Location $location): array
88+
{
89+
try {
90+
return $this->innerGateway->loadUserIdsByLocation($location);
91+
} catch (DBALException | PDOException $e) {
92+
throw DatabaseException::wrap($e);
93+
}
94+
}
8595
}
8696

8797
class_alias(ExceptionConversion::class, 'eZ\Publish\Core\Persistence\Legacy\Bookmark\Gateway\ExceptionConversion');

src/lib/Persistence/Legacy/Bookmark/Handler.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Ibexa\Contracts\Core\Persistence\Bookmark\Bookmark;
1212
use Ibexa\Contracts\Core\Persistence\Bookmark\CreateStruct;
1313
use Ibexa\Contracts\Core\Persistence\Bookmark\Handler as HandlerInterface;
14+
use Ibexa\Contracts\Core\Persistence\Content\Location;
1415

1516
/**
1617
* Storage Engine handler for bookmarks.
@@ -98,6 +99,14 @@ public function locationSwapped(int $location1Id, int $location2Id): void
9899
{
99100
$this->gateway->locationSwapped($location1Id, $location2Id);
100101
}
102+
103+
public function loadUserIdsByLocation(Location $location): array
104+
{
105+
return array_map(
106+
static fn ($userId): int => (int)$userId,
107+
$this->gateway->loadUserIdsByLocation($location)
108+
);
109+
}
101110
}
102111

103112
class_alias(Handler::class, 'eZ\Publish\Core\Persistence\Legacy\Bookmark\Handler');

src/lib/Resources/settings/search_engines/common.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ services:
4949

5050
Ibexa\Core\Search\Common\EventSubscriber\:
5151
resource: '../../../Search/Common/EventSubscriber/*'
52-
exclude: '../../../Search/Common/EventSubscriber/{AbstractSearchEventSubscriber.php}'
52+
exclude: '../../../Search/Common/EventSubscriber/{AbstractSearchEventSubscriber}'
5353
autoconfigure: true
5454
autowire: true
5555
public: false

0 commit comments

Comments
 (0)