Skip to content

Commit 3b96d1c

Browse files
committed
CS Fixes
1 parent 2305ad8 commit 3b96d1c

9 files changed

Lines changed: 431 additions & 196 deletions

File tree

CLAUDE.md

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -558,12 +558,6 @@ $topicBuilder->onRoutesCreated(function (array $childBuilders) use ($intro) {
558558

559559
These are known open issues with enough context to resume work without re-investigation.
560560

561-
### #113 — Additional page resource tests needed
562-
563-
A community draft PR ([#156](https://github.com/components-web-app/api-components-bundle/pull/156), now closed as too stale to merge) was opened in 2022 to add page resource tests. Remaining gap: `OpenApiFactory` decorator (`src/OpenApi/OpenApiFactory.php`) has no dedicated test coverage beyond the single smoke test in `features/main/openapi_compatibility.feature`.
564-
565-
---
566-
567561
### ComponentPosition `sortValue` collision on insert — API-side normalisation needed
568562

569563
**Context (from Nuxt module):** When an admin inserts a component "before" or "after" an existing position, the module computes a `sortValue` for the new `ComponentPosition` that may equal an existing position's `sortValue`. For "add before X (sortValue=N)", the new position gets `sortValue=N` (same as X). For "add after X (sortValue=N)", the new position gets `sortValue=N+1` which may collide with the position immediately following X.
@@ -586,9 +580,9 @@ Related: Nuxt module issue `components-web-app/cwa-nuxt-module#224` Bug 2.
586580

587581
### #170 — Component group `allowedComponents` does not validate `pageDataProperty` positions on write
588582

589-
**Read side fixed** (commit `c6964304`): `ComponentGroupNormalizer` filters `componentPositions` at normalisation time to hide positions whose component class is not in `allowedComponents`.
583+
**Read side fixed** (commit `2305ad89`): `ComponentPositionNormalizer.normalizeForPageData()` now skips populating the component if the resolved type is not in `componentGroup.allowedComponents`. The position remains in `componentPositions` but with `component = null`. Direct-component write-side validation already works via `ComponentPositionValidator`.
590584

591-
**Write side still open:** When creating a `ComponentPosition` with `pageDataProperty` set (a dynamic slot resolved at render time), no validation is done against `allowedComponents`. A developer can add a `pageDataProperty` position referencing a disallowed component type and no error is raised. Validation is hard at write time because the component type of a `pageDataProperty` slot isn't known until the PageData is rendered — the property name is just a string like `'htmlContent'`.
585+
**`pageDataProperty` write-side still open:** When creating a `ComponentPosition` with `pageDataProperty` set, no validation is done against `allowedComponents`. The property name is just a string — the component type isn't known until render time.
592586

593587
**Options:**
594588
- Validate that the PageData class's property type for `pageDataProperty` is in `allowedComponents` (requires knowing the PageData class at write time)
@@ -607,14 +601,6 @@ Related Nuxt module issue: `components-web-app/cwa-nuxt-module#151`.
607601

608602
---
609603

610-
### #162 — Missing Behat tests for uploadable URL generators
611-
612-
Three URL generators exist: API gateway (default), Flysystem public URL, Flysystem temporary URL. These are configurable per field. No Behat tests cover switching between them.
613-
614-
**Where to add:** `features/main/` — needs a new `uploadable_url_generators.feature` or additions to an existing uploadable feature. Tests should cover each generator type returning the correct URL format.
615-
616-
---
617-
618604
### #159 — Manifest fetch triggers file existence checks → 500 when offline
619605

620606
Related to #163. When the route manifest is fetched and components with uploaded files are included, `MediaObjectFactory` checks file existence. In a local environment not connected to the internet (with files hosted in the cloud), this causes 500 errors.

src/DependencyInjection/CompilerPass/ApiPlatformCompilerPass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public function process(ContainerBuilder $container): void
2424
{
2525
$itemsPerPageParameterName = $container->getParameter('api_platform.collection.pagination.items_per_page_parameter_name');
2626

27-
$container->getDefinition(CollectionApiEventListener::class)->setArgument('$itemsPerPageParameterName', $itemsPerPageParameterName);
27+
$container->findDefinition(CollectionApiEventListener::class)->setArgument('$itemsPerPageParameterName', $itemsPerPageParameterName);
2828

2929
if ($container->hasAlias('api_platform.http_cache.purger')) {
3030
// we have implemented fully custom logic

src/DependencyInjection/SilverbackApiComponentsExtension.php

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,10 @@ public function load(array $configs, ContainerBuilder $container): void
7373

7474
$this->loadServiceConfig($container);
7575

76-
$definition = $container->getDefinition(TablePrefixExtension::class);
76+
$definition = $container->findDefinition(TablePrefixExtension::class);
7777
$definition->setArgument('$prefix', $config['table_prefix']);
7878

79-
$definition = $container->getDefinition(UserRepositoryInterface::class);
79+
$definition = $container->findDefinition(UserRepositoryInterface::class);
8080
$definition->setArgument('$entityClass', $config['user']['class_name']);
8181
$definition->setArgument('$passwordRequestTimeout', $config['user']['password_reset']['request_timeout_seconds']);
8282
$definition->setArgument('$newEmailConfirmTimeout', $config['user']['new_email_confirmation']['request_timeout_seconds']);
@@ -118,58 +118,58 @@ public function load(array $configs, ContainerBuilder $container): void
118118
$definition->setArgument('$userProvider', new Reference(\sprintf('security.user.provider.concrete.%s', $config['refresh_token']['database_user_provider'])));
119119
$definition->setArgument('$storage', new Reference($config['refresh_token']['handler_id']));
120120

121-
$definition = $container->getDefinition(PublishableStatusChecker::class);
121+
$definition = $container->findDefinition(PublishableStatusChecker::class);
122122
$definition->setArgument('$permission', $config['publishable']['permission']);
123123

124-
$definition = $container->getDefinition(MetadataNormalizer::class);
124+
$definition = $container->findDefinition(MetadataNormalizer::class);
125125
$definition->setArgument('$metadataKey', $config['metadata_key']);
126126

127127
$this->setEmailVerificationArguments($container, $config['user']['email_verification'], $config['user']['password_reset']['repeat_ttl_seconds']);
128128
$this->setUserClassArguments($container, $config['user']['class_name']);
129129
$this->setMailerServiceArguments($container, $config);
130130

131131
$imagineEnabled = $container->getParameter('api_components.imagine_enabled');
132-
$definition = $container->getDefinition(UploadableAttributeReader::class);
132+
$definition = $container->findDefinition(UploadableAttributeReader::class);
133133
$definition->setArgument('$imagineBundleEnabled', $imagineEnabled);
134134

135135
if ($imagineEnabled) {
136-
$definition = $container->getDefinition(UploadableFileManager::class);
136+
$definition = $container->findDefinition(UploadableFileManager::class);
137137
$definition->setArgument('$filterService', new Reference('liip_imagine.service.filter'));
138138
$definition->setArgument('$imagineCacheManager', new Reference('liip_imagine.cache.manager'));
139139

140-
$definition = $container->getDefinition(MediaObjectFactory::class);
140+
$definition = $container->findDefinition(MediaObjectFactory::class);
141141
$definition->setArgument('$filterService', new Reference('liip_imagine.service.filter'));
142142
}
143143

144-
$definition = $container->getDefinition(RouteExtension::class);
144+
$definition = $container->findDefinition(RouteExtension::class);
145145
$definition->setArgument('$config', $config['route_security']);
146146

147-
$definition = $container->getDefinition(RouteVoter::class);
147+
$definition = $container->findDefinition(RouteVoter::class);
148148
$definition->setArgument('$config', $config['route_security']);
149149

150-
$definition = $container->getDefinition(SiteConfigParameterVoter::class);
150+
$definition = $container->findDefinition(SiteConfigParameterVoter::class);
151151
$definition->setArgument('$permission', $config['publishable']['permission']);
152152

153-
$definition = $container->getDefinition(RoutableExtension::class);
153+
$definition = $container->findDefinition(RoutableExtension::class);
154154
$definition->setArgument('$securityStr', $config['routable_security']);
155155

156-
$definition = $container->getDefinition(RoutableVoter::class);
156+
$definition = $container->findDefinition(RoutableVoter::class);
157157
$definition->setArgument('$securityStr', $config['routable_security']);
158158

159-
$definition = $container->getDefinition(RoutableResourceMetadataCollectionFactory::class);
159+
$definition = $container->findDefinition(RoutableResourceMetadataCollectionFactory::class);
160160
$definition->setArgument('$securityStr', $config['routable_security']);
161161

162-
$definition = $container->getDefinition(MercureAuthorization::class);
162+
$definition = $container->findDefinition(MercureAuthorization::class);
163163
$definition->setArgument('$cookieSameSite', $config['mercure']['cookie']['samesite']);
164164
$definition->setArgument('$hubName', $config['mercure']['hub_name']);
165165
}
166166

167167
private function setEmailVerificationArguments(ContainerBuilder $container, array $emailVerificationConfig, int $passwordRepeatTtl): void
168168
{
169-
$definition = $container->getDefinition(UserChecker::class);
169+
$definition = $container->findDefinition(UserChecker::class);
170170
$definition->setArgument('$denyUnverifiedLogin', $emailVerificationConfig['deny_unverified_login']);
171171

172-
$definition = $container->getDefinition(UserDataProcessor::class);
172+
$definition = $container->findDefinition(UserDataProcessor::class);
173173
$definition->setArgument('$initialEmailVerifiedState', $emailVerificationConfig['default_value']);
174174
$definition->setArgument('$verifyEmailOnRegister', $emailVerificationConfig['verify_on_register']);
175175
$definition->setArgument('$verifyEmailOnChange', $emailVerificationConfig['verify_on_change']);
@@ -178,25 +178,25 @@ private function setEmailVerificationArguments(ContainerBuilder $container, arra
178178

179179
private function setUserClassArguments(ContainerBuilder $container, string $userClass): void
180180
{
181-
$definition = $container->getDefinition(UserFactory::class);
181+
$definition = $container->findDefinition(UserFactory::class);
182182
$definition->setArgument('$userClass', $userClass);
183183

184-
$definition = $container->getDefinition(ChangePasswordType::class);
184+
$definition = $container->findDefinition(ChangePasswordType::class);
185185
$definition->setArgument('$userClass', $userClass);
186186

187-
$definition = $container->getDefinition(NewEmailAddressType::class);
187+
$definition = $container->findDefinition(NewEmailAddressType::class);
188188
$definition->setArgument('$userClass', $userClass);
189189

190-
$definition = $container->getDefinition(UserRegisterType::class);
190+
$definition = $container->findDefinition(UserRegisterType::class);
191191
$definition->setArgument('$userClass', $userClass);
192192

193-
$definition = $container->getDefinition(PasswordUpdateType::class);
193+
$definition = $container->findDefinition(PasswordUpdateType::class);
194194
$definition->setArgument('$userClass', $userClass);
195195
}
196196

197197
private function setMailerServiceArguments(ContainerBuilder $container, array $config): void
198198
{
199-
$definition = $container->getDefinition(UserMailer::class);
199+
$definition = $container->findDefinition(UserMailer::class);
200200
$definition->setArgument(
201201
'$context',
202202
[
@@ -211,7 +211,7 @@ private function setMailerServiceArguments(ContainerBuilder $container, array $c
211211
WelcomeEmailFactory::class => 'welcome',
212212
];
213213
foreach ($mapping as $class => $key) {
214-
$definition = $container->getDefinition($class);
214+
$definition = $container->findDefinition($class);
215215
$definition->setArgument('$subject', $config['user']['emails'][$key]['subject']);
216216
$definition->setArgument('$enabled', $config['user']['emails'][$key]['enabled']);
217217
if (WelcomeEmailFactory::class === $class) {
@@ -226,7 +226,7 @@ private function setMailerServiceArguments(ContainerBuilder $container, array $c
226226
PasswordResetEmailFactory::class => 'password_reset',
227227
];
228228
foreach ($mapping as $class => $key) {
229-
$definition = $container->getDefinition($class);
229+
$definition = $container->findDefinition($class);
230230
$definition->setArgument('$subject', $config['user'][$key]['email']['subject']);
231231
$definition->setArgument('$enabled', true);
232232
$definition->setArgument('$defaultRedirectPath', $config['user'][$key]['email']['default_redirect_path']);

0 commit comments

Comments
 (0)