Skip to content

Fix enum OpenAPI option handling when options are missing - #3651

Open
traien wants to merge 1 commit into
espocrm:fixfrom
traien:patch-6
Open

Fix enum OpenAPI option handling when options are missing#3651
traien wants to merge 1 commit into
espocrm:fixfrom
traien:patch-6

Conversation

@traien

@traien traien commented Apr 22, 2026

Copy link
Copy Markdown
Contributor

This PR fixes an error in EnumOptionsProvider::get() when a field has type: "enum" but does not define options, optionsPath, or a resolvable optionsReference.

In this case causes the code to fail with an error and /OpenApi not load.

Example

"electronicAddressScheme": {
    "type": "enum",
    "maxLength": 4,
    "view": "sales:views/fields/electronic-address-scheme",
    "validatorClassNameList": [
        "Espo\\Modules\\Sales\\FieldValidators\\Account\\ElectronicAddressScheme\\Valid"
    ],
    "audited": true
}

What changed

EnumOptionsProvider::get() now validates the resolved value before returning it:

if (!is_array($optionList)) {
    return null;
}

This PR fixes an error in EnumOptionsProvider::get() when a field has type: "enum" but does not define options, optionsPath, or a resolvable optionsReference.
@yurikuzn

Copy link
Copy Markdown
Contributor

Where exactly code fails? With what error?

@traien

traien commented Apr 22, 2026

Copy link
Copy Markdown
Contributor Author

When try to open /OpenApi you got Slim Application Error

And in the logs:

[2026-04-22 12:51:24] ERROR: Field definitions: Espo\ORM\Defs\FieldDefs Object
(
    [data:Espo\ORM\Defs\FieldDefs:private] => Array
        (
            [type] => enum
            [maxLength] => 50
            [default] => Asterisk
            [view] => voip:views/user/fields/connector
            [tooltip] => 1
        )

    [name:Espo\ORM\Defs\FieldDefs:private] => voipConnector
)
[2026-04-22 13:44:45] ERROR: Slim Application Error
Type: TypeError
Code: 0
Message: Espo\Tools\OpenApi\Util\EnumOptionsProvider::get(): Return value must be of type ?array, false returned
File: /var/www/crm.columbia.je/espocrm/application/Espo/Tools/OpenApi/Util/EnumOptionsProvider.php
Line: 68
Trace: #0 /var/www/crm.columbia.je/espocrm/application/Espo/Tools/OpenApi/FieldSchemaBuilders/MultiEnumType.php(54): Espo\Tools\OpenApi\Util\EnumOptionsProvider->get()
#1 /var/www/crm.columbia.je/espocrm/application/Espo/Tools/OpenApi/Provider.php(335): Espo\Tools\OpenApi\FieldSchemaBuilders\MultiEnumType->build()
#2 /var/www/crm.columbia.je/espocrm/application/Espo/Tools/OpenApi/Provider.php(302): Espo\Tools\OpenApi\Provider->buildEntityTypeObjectFieldSchema()
#3 /var/www/crm.columbia.je/espocrm/application/Espo/Tools/OpenApi/Provider.php(180): Espo\Tools\OpenApi\Provider->buildEntityTypeObjectSchema()
#4 /var/www/crm.columbia.je/espocrm/application/Espo/Tools/OpenApi/Provider.php(123): Espo\Tools\OpenApi\Provider->buildSchemas()
#5 /var/www/crm.columbia.je/espocrm/application/Espo/Tools/OpenApi/Provider.php(100): Espo\Tools\OpenApi\Provider->buildData()
#6 /var/www/crm.columbia.je/espocrm/application/Espo/Tools/OpenApi/Provider.php(81): Espo\Tools\OpenApi\Provider->getData()
#7 /var/www/crm.columbia.je/espocrm/application/Espo/Tools/OpenApi/Api/GetSpec.php(67): Espo\Tools\OpenApi\Provider->get()
#8 /var/www/crm.columbia.je/espocrm/application/Espo/Core/Api/ActionHandler.php(73): Espo\Tools\OpenApi\Api\GetSpec->process()
#9 /var/www/crm.columbia.je/espocrm/vendor/slim/slim/Slim/MiddlewareDispatcher.php(73): Espo\Core\Api\ActionHandler->handle()
#10 /var/www/crm.columbia.je/espocrm/application/Espo/Core/Api/RouteProcessor.php(176): Slim\MiddlewareDispatcher->handle()
#11 /var/www/crm.columbia.je/espocrm/application/Espo/Core/Api/RouteProcessor.php(145): Espo\Core\Api\RouteProcessor->processAction()
#12 /var/www/crm.columbia.je/espocrm/application/Espo/Core/Api/RouteProcessor.php(126): Espo\Core\Api\RouteProcessor->processAfterAuth()
#13 /var/www/crm.columbia.je/espocrm/application/Espo/Core/Api/RouteProcessor.php(78): Espo\Core\Api\RouteProcessor->processInternal()
#14 /var/www/crm.columbia.je/espocrm/application/Espo/Core/Api/Starter.php(126): Espo\Core\Api\RouteProcessor->process()
#15 /var/www/crm.columbia.je/espocrm/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php(39): Espo\Core\Api\Starter->Espo\Core\Api\{closure}()
#16 /var/www/crm.columbia.je/espocrm/vendor/slim/slim/Slim/Routing/Route.php(362): Slim\Handlers\Strategies\RequestResponse->__invoke()
#17 /var/www/crm.columbia.je/espocrm/vendor/slim/slim/Slim/MiddlewareDispatcher.php(73): Slim\Routing\Route->handle()
#18 /var/www/crm.columbia.je/espocrm/vendor/slim/slim/Slim/MiddlewareDispatcher.php(73): Slim\MiddlewareDispatcher->handle()
#19 /var/www/crm.columbia.je/espocrm/vendor/slim/slim/Slim/Routing/Route.php(321): Slim\MiddlewareDispatcher->handle()
#20 /var/www/crm.columbia.je/espocrm/vendor/slim/slim/Slim/Routing/RouteRunner.php(74): Slim\Routing\Route->run()
#21 /var/www/crm.columbia.je/espocrm/vendor/slim/slim/Slim/Middleware/RoutingMiddleware.php(45): Slim\Routing\RouteRunner->handle()
#22 /var/www/crm.columbia.je/espocrm/vendor/slim/slim/Slim/MiddlewareDispatcher.php(129): Slim\Middleware\RoutingMiddleware->process()
#23 /var/www/crm.columbia.je/espocrm/vendor/slim/slim/Slim/Middleware/ErrorMiddleware.php(77): Psr\Http\Server\RequestHandlerInterface@anonymous->handle()
#24 /var/www/crm.columbia.je/espocrm/vendor/slim/slim/Slim/MiddlewareDispatcher.php(129): Slim\Middleware\ErrorMiddleware->process()
#25 /var/www/crm.columbia.je/espocrm/vendor/slim/slim/Slim/MiddlewareDispatcher.php(73): Psr\Http\Server\RequestHandlerInterface@anonymous->handle()
#26 /var/www/crm.columbia.je/espocrm/vendor/slim/slim/Slim/App.php(209): Slim\MiddlewareDispatcher->handle()
#27 /var/www/crm.columbia.je/espocrm/vendor/slim/slim/Slim/App.php(193): Slim\App->handle()
#28 /var/www/crm.columbia.je/espocrm/application/Espo/Core/Api/Starter.php(84): Slim\App->run()
#29 /var/www/crm.columbia.je/espocrm/application/Espo/Core/ApplicationRunners/Api.php(45): Espo\Core\Api\Starter->start()
#30 /var/www/crm.columbia.je/espocrm/application/Espo/Core/Application/RunnerRunner.php(84): Espo\Core\ApplicationRunners\Api->run()
#31 /var/www/crm.columbia.je/espocrm/application/Espo/Core/Application.php(86): Espo\Core\Application\RunnerRunner->run()
#32 /var/www/crm.columbia.je/espocrm/public/api/v1/index.php(35): Espo\Core\Application->run()
#33 {main}

@yurikuzn

Copy link
Copy Markdown
Contributor

OK. Thanks for information. I still don't understand why error occurs. I prefer to know everything about the problem before fixing it.

@yurikuzn

yurikuzn commented Apr 22, 2026

Copy link
Copy Markdown
Contributor

You have a false value retrieved. Is it explicitly set to false in other place in metadata? We don't fallback to false anywhere.


I tried to generate API schema with Sales Pack, it worked for me. It exported the field with the string type.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants