Repository navigation
ExtraDataService Orphan Metadata
Documentação técnica da entrega api-community#88 (hotfix de produção), lado api-platform-common.
ControleOnline\Service\ExtraDataService resolve entidades a partir de ExtraFields / ExtraData (lookup por contexto + nome de campo + código). É usado por integrações, inclusive o webhook iFood (resolveProviderByMerchantId / resolveWebhookSecrets).
Método crítico:
getEntityByExtraData(string $context, string $fieldName, string $code, object|string $entity): ?object
Após localizar o registro de extra-data, o serviço faz EntityRepository::find($entityId).
Se o ClassMetadata Doctrine da entidade alvo (ou de associação hidratada no grafo, ex.: Document ligado a People) estiver órfão — referencia propriedade que não existe mais na classe — o find() dispara ReflectionException / MappingException no wakeupReflection. O request HTTP inteiro vira 500.
Caso concreto em produção: Document::$vehicle (ver página canônica em people).
getEntityByExtraData engole exceções de mapping e devolve null:
try {
return $this->manager->getRepository($class->getName())->find($extraData->getEntityId());
} catch (\ReflectionException
| \Doctrine\Persistence\Mapping\MappingException
| \Doctrine\ORM\Mapping\MappingException $exception) {
// Stale Doctrine metadata (e.g. Document::$vehicle) must not 500 webhooks.
return null;
}Regras:
-
Fail-closed no lookup: melhor
null(caller usa fallback) do que 500. - Não loga payload de webhook nem segredo.
- Não altera o contrato de sucesso (quando a entidade existe e a metadata está ok).
- Não mascara erros de negócio distintos (argumentos vazios, extra-field inexistente) — esses já retornavam
nullantes.
Teste automatizado: ExtraDataServiceTest::testGetEntityByExtraDataReturnsNullWhenDoctrineMetadataIsOrphan.
| Contexto | Comportamento |
|---|---|
api-platform-common |
Utilitário transversal de extra-data; não conhece iFood |
| Callers (ex.: integration iFood) | Devem tratar null como “não resolvido” e seguir fallback / recusa controlada |
Entidades de domínio (Document, etc.) |
Continuam responsáveis por manter ClassMetadata alinhado à classe |
| Destino | Link |
|---|---|
| Página canônica (people / Document) | https://github.com/ControleOnline/api-platform-people/wiki/Document-Vehicle-Metadata-Compatibility |
| Issue | https://github.com/ControleOnline/api-community/issues/88 |
| Home deste módulo | https://github.com/ControleOnline/api-platform-common/wiki |
| Wiki API | https://github.com/ControleOnline/api-community/wiki |
Cópia versionada no Git (quando existir): docs/technical/ExtraDataService-Orphan-Metadata.md