Skip to content

Commit 8c1577f

Browse files
authored
Merge pull request #2222 from cultuurnet/III-6957/make-test-orgs-visible-in-frontend
PPF-736 Make test orgs visible in frontend
2 parents 8cec030 + 8849b76 commit 8c1577f

File tree

8 files changed

+405
-49
lines changed

8 files changed

+405
-49
lines changed

app/Console/Commands/SearchUiTPASOrganizer.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace App\Console\Commands;
66

7+
use App\Search\SearchServiceProvider;
78
use App\Search\Sapi3\SearchService;
89
use CultuurNet\SearchV3\ValueObjects\Organizer;
910
use Illuminate\Console\Command;
@@ -14,13 +15,13 @@ final class SearchUiTPASOrganizer extends Command
1415

1516
protected $description = 'Search UiTPAS organizer by name.';
1617

17-
public function __construct(private readonly SearchService $searchService)
18-
{
19-
parent::__construct();
20-
}
18+
private SearchService $searchService;
19+
2120

2221
public function handle(): int
2322
{
23+
$this->searchService = $this->laravel->get(SearchServiceProvider::PROD_SEARCH_SERVICE);
24+
2425
$name = $this->argument('name');
2526

2627
$this->info('Searching UiTPAS organizer by name: ' . $name);

app/Domain/Integrations/GetIntegrationOrganizersWithTestOrganizer.php

Lines changed: 104 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,57 +8,61 @@
88
use App\Domain\Integrations\Exceptions\KeycloakClientNotFound;
99
use App\Domain\UdbUuid;
1010
use App\Keycloak\Client;
11+
use App\Keycloak\Repositories\KeycloakClientRepository;
1112
use App\Search\Sapi3\SearchService;
1213
use App\UiTPAS\Dto\UiTPASPermission;
1314
use App\UiTPAS\UiTPASApiInterface;
1415
use App\UiTPAS\UiTPASConfig;
1516
use CultuurNet\SearchV3\ValueObjects\Organizer as SapiOrganizer;
17+
use Illuminate\Database\Eloquent\ModelNotFoundException;
1618
use Illuminate\Support\Collection;
1719

1820
final readonly class GetIntegrationOrganizersWithTestOrganizer
1921
{
2022
public function __construct(
21-
private SearchService $searchClient,
23+
private SearchService $testSearchService,
24+
private SearchService $prodSearchService,
2225
private UiTPASApiInterface $UiTPASApi,
2326
private ClientCredentialsContext $testCredentialsContext,
2427
private ClientCredentialsContext $prodCredentialsContext,
28+
private KeycloakClientRepository $keycloakClientRepository,
2529
) {
2630
}
2731

2832
public function getAndEnrichOrganisations(Integration $integration): Collection
2933
{
30-
$organizerIds = collect($integration->udbOrganizers())->map(fn (UdbOrganizer $organizer) => $organizer->organizerId);
31-
$UiTPASOrganizers = $this->searchClient->findOrganizers(...$organizerIds)->getMember()?->getItems();
32-
$keycloakClient = $this->getClientByEnv($integration, Environment::Production);
34+
$prodOrganizers = $testOrganizers = [];
35+
$keycloakClientCache = [];
36+
foreach ($integration->udbOrganizers() as $udbOrganizer) {
37+
//@todo this can be simplified once client id can no longer be null
38+
try {
39+
if ($udbOrganizer->clientId === null) {
40+
$prodOrganizers[] = $udbOrganizer;
41+
continue;
42+
}
3343

34-
$organizers = collect($UiTPASOrganizers)->map(function (SapiOrganizer $organizer) use ($keycloakClient) {
35-
$id = explode('/', $organizer->getId() ?? '');
36-
$id = $id[count($id) - 1];
44+
$keycloakClient = $this->keycloakClientRepository->getById($udbOrganizer->clientId);
45+
$keycloakClientCache[$udbOrganizer->clientId->toString()] = $keycloakClient;
3746

38-
return [
39-
'id' => $id,
40-
'name' => $organizer->getName()?->getValues() ?? [],
41-
'status' => 'Live',
42-
'permissions' => $keycloakClient ? $this->getLabels($this->UiTPASApi->fetchPermissions(
43-
$this->prodCredentialsContext,
44-
new UdbUuid($id),
45-
$keycloakClient->clientId
46-
)) : [],
47-
];
48-
});
47+
if ($keycloakClient->environment === Environment::Production) {
48+
$prodOrganizers[] = $udbOrganizer;
49+
} else {
50+
$testOrganizers[] = $udbOrganizer;
51+
}
52+
} catch (ModelNotFoundException) {
53+
$prodOrganizers[] = $udbOrganizer;
54+
}
55+
}
4956

50-
$keycloakClient = $this->getClientByEnv($integration, Environment::Testing);
51-
$orgTestId = (string)config(UiTPASConfig::TEST_ORGANISATION->value);
52-
$organizers->push([
53-
'id' => $orgTestId,
54-
'name' => ['nl' => 'UiTPAS Organisatie (Regio Gent + Paspartoe)'],
55-
'status' => 'Test',
56-
'permissions' => $keycloakClient ? $this->getLabels($this->UiTPASApi->fetchPermissions(
57-
$this->testCredentialsContext,
58-
new UdbUuid($orgTestId),
59-
$keycloakClient->clientId
60-
)) : [],
61-
]);
57+
$organizers = collect()
58+
->merge($this->mapOrganizers($this->testSearchService, $this->testCredentialsContext, $testOrganizers, 'Test', $integration, $keycloakClientCache))
59+
->merge($this->mapOrganizers($this->prodSearchService, $this->prodCredentialsContext, $prodOrganizers, 'Live', $integration, $keycloakClientCache));
60+
61+
// Only add demo user if not already added from the database.
62+
$testOrgId = (string)config(UiTPASConfig::TEST_ORGANISATION->value);
63+
if (!$organizers->contains(fn (array $organizer) => $organizer['id'] === $testOrgId)) {
64+
$organizers = $organizers->merge($this->addTestOrganizer($integration));
65+
}
6266

6367
return $organizers;
6468
}
@@ -91,4 +95,74 @@ private function getLabels(?UiTPASPermission $permission): array
9195

9296
return $labels;
9397
}
98+
99+
public function addTestOrganizer(Integration $integration): Collection
100+
{
101+
$output = collect();
102+
$keycloakClient = $this->getClientByEnv($integration, Environment::Testing);
103+
$orgTestId = (string)config(UiTPASConfig::TEST_ORGANISATION->value);
104+
$output->push([
105+
'id' => $orgTestId,
106+
'name' => ['nl' => 'UiTPAS Organisatie (Regio Gent + Paspartoe)'],
107+
'status' => 'Test',
108+
'permissions' => $keycloakClient ? $this->getLabels($this->UiTPASApi->fetchPermissions(
109+
$this->testCredentialsContext,
110+
new UdbUuid($orgTestId),
111+
$keycloakClient->clientId
112+
)) : [],
113+
]);
114+
115+
return $output;
116+
}
117+
118+
private function mapOrganizers(
119+
SearchService $searchService,
120+
ClientCredentialsContext $context,
121+
array $udbOrganizers,
122+
string $status,
123+
Integration $integration,
124+
array $keycloakClientCache
125+
): Collection {
126+
$organizerIds = array_map(fn (UdbOrganizer $item) => $item->organizerId, $udbOrganizers);
127+
128+
// Fetch organizers from UDB and index by organizer ID
129+
$UiTPASOrganizers = collect($searchService->findOrganizers(...$organizerIds)->getMember()?->getItems() ?? [])->keyBy(function (SapiOrganizer $organizer) {
130+
$id = explode('/', $organizer->getId() ?? '');
131+
return $id[count($id) - 1];
132+
});
133+
134+
$organizers = collect();
135+
136+
foreach ($udbOrganizers as $udbOrganizer) {
137+
if (!$udbOrganizer instanceof UdbOrganizer) {
138+
continue;
139+
}
140+
141+
$organizer = $UiTPASOrganizers->get($udbOrganizer->organizerId->toString());
142+
143+
if (!$organizer) {
144+
continue;
145+
}
146+
147+
if ($udbOrganizer->clientId === null) {
148+
//@todo This if can be removed later if clientId is no longer nullable
149+
$keycloakClient = $this->getClientByEnv($integration, Environment::Production);
150+
} else {
151+
$keycloakClient = $keycloakClientCache[$udbOrganizer->clientId->toString()] ?? null;
152+
}
153+
154+
$organizers->push([
155+
'id' => $udbOrganizer->organizerId->toString(),
156+
'name' => $organizer->getName()?->getValues() ?? [],
157+
'status' => $status,
158+
'permissions' => $keycloakClient ? $this->getLabels($this->UiTPASApi->fetchPermissions(
159+
$context,
160+
$udbOrganizer->organizerId,
161+
$keycloakClient->clientId
162+
)) : [],
163+
]);
164+
}
165+
166+
return $organizers;
167+
}
94168
}

app/Search/SearchServiceProvider.php

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace App\Search;
66

77
use App\Search\Sapi3\Sapi3SearchService;
8-
use App\Search\Sapi3\SearchService;
98
use App\Search\UiTPAS\CachedUiTPASLabelProvider;
109
use App\Search\UiTPAS\HttpUiTPASLabelProvider;
1110
use App\UiTPAS\UiTPASConfig;
@@ -18,9 +17,12 @@
1817

1918
final class SearchServiceProvider extends ServiceProvider
2019
{
20+
public const TEST_SEARCH_SERVICE = 'TEST_SAPI3_SEARCH_SERVICE';
21+
public const PROD_SEARCH_SERVICE = 'PROD_SAPI3_SEARCH_SERVICE';
22+
2123
public function register(): void
2224
{
23-
$this->app->singleton(Sapi3SearchService::class, function () {
25+
$this->app->singleton(self::PROD_SEARCH_SERVICE, function () {
2426
return new Sapi3SearchService(
2527
new SearchClient(
2628
new Client([
@@ -43,6 +45,27 @@ public function register(): void
4345
);
4446
});
4547

46-
$this->app->bind(SearchService::class, Sapi3SearchService::class);
48+
$this->app->singleton(self::TEST_SEARCH_SERVICE, function () {
49+
return new Sapi3SearchService(
50+
new SearchClient(
51+
new Client([
52+
'base_uri' => config('search.base_test_uri'),
53+
'headers' => [
54+
'X-Api-Key' => config('search.api_test_key'),
55+
],
56+
]),
57+
new Serializer()
58+
),
59+
new CachedUiTPASLabelProvider(
60+
new HttpUiTPASLabelProvider(
61+
new Client([
62+
'base_uri' => config(UiTPASConfig::UDB_BASE_TEST_IO_URI->value),
63+
]),
64+
$this->app->get(LoggerInterface::class),
65+
),
66+
$this->app->make(CacheRepository::class)
67+
)
68+
);
69+
});
4770
}
4871
}

app/UiTPAS/UiTPASConfig.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ enum UiTPASConfig: string
1111
case CLIENT_PERMISSIONS_URI = 'uitpas.client_permissions_uri';
1212
case UDB_BASE_URI = 'uitpas.udb_base_uri';
1313
case UDB_BASE_IO_URI = 'uitpas.udb_base_io_uri';
14-
14+
case UDB_BASE_TEST_IO_URI = 'uitpas.udb_base_test_io_uri';
1515

1616
case TEST_ORGANISATION = 'uitpas.test.organisation';
1717
case TEST_API_ENDPOINT = 'uitpas.test.api_endpoint';

app/UiTPAS/UiTPASServiceProvider.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use App\Notifications\MessageBuilder;
1717
use App\Notifications\Slack\SlackNotifier;
1818
use App\Search\Sapi3\SearchService;
19+
use App\Search\SearchServiceProvider;
1920
use App\Search\UdbOrganizerNameResolver;
2021
use App\UiTPAS\Event\UdbOrganizerApproved;
2122
use App\UiTPAS\Event\UdbOrganizerDeleted;
@@ -65,10 +66,12 @@ public function register(): void
6566

6667
$this->app->singleton(GetIntegrationOrganizersWithTestOrganizer::class, function () {
6768
return new GetIntegrationOrganizersWithTestOrganizer(
68-
$this->app->get(SearchService::class),
69+
$this->app->get(SearchServiceProvider::TEST_SEARCH_SERVICE),
70+
$this->app->get(SearchServiceProvider::PROD_SEARCH_SERVICE),
6971
$this->app->get(UiTPASApiInterface::class),
7072
ClientCredentialsContextFactory::getUitIdTestContext(),
7173
ClientCredentialsContextFactory::getUitIdProdContext(),
74+
$this->app->get(KeycloakClientRepository::class),
7275
);
7376
});
7477

config/search.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,7 @@
55
return [
66
'base_uri' => env('SEARCH_BASE_URI'),
77
'api_key' => env('SEARCH_API_KEY'),
8+
9+
'base_test_uri' => env('SEARCH_BASE_TEST_URI'),
10+
'api_test_key' => env('SEARCH_API_TEST_KEY'),
811
];

config/uitpas.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
'client_permissions_uri' => env('UITPAS_CLIENT_PERMISSIONS_URI'),
88
'udb_base_uri' => env('UDB_BASE_URI'),
99
'udb_base_io_uri' => env('UDB_BASE_IO_URI'),
10+
'udb_base_test_io_uri' => env('UDB_BASE_TEST_IO_URI'),
1011
'test' => [
1112
'organisation' => env('UITPAS_TEST_ORG', '0ce87cbc-9299-4528-8d35-92225dc9489f'),
1213
'api_endpoint' => env('UITPAS_TEST_ENDPOINT', ''),

0 commit comments

Comments
 (0)