Compare commits

...
Author SHA1 Message Date
Sonarly Claude Code dfc0a4d5fc fix: make Application OneToMany relation fields nullable in GraphQL schema
https://sonarly.com/issue/29560?type=bug

The `findManyApplications` GraphQL query fails when a client requests `applicationVariables` (or any of 4 other OneToMany relation fields), because the backend no longer loads those relations but the GraphQL schema still declares them as non-nullable.

Fix: The root cause is a schema-reality mismatch introduced by commit 9a95cd02ed (PR #19892, merged 2026-04-20). That PR intentionally removed OneToMany relation loading from `findManyApplications` to fix Cartesian product timeout issues, but neglected to update the GraphQL schema. Five `@Field()` decorators on ApplicationDTO declared OneToMany relation fields (agents, frontComponents, logicFunctions, objects, applicationVariables) as non-nullable, but multiple code paths return ApplicationDTO instances without those fields populated.

      The fix adds `{ nullable: true }` to all five `@Field()` decorators, making the GraphQL schema accurately reflect that these fields are optionally loaded. This is consistent with the TypeScript type annotations (all five properties already had `?` optional markers) and with the existing pattern used by other optional fields in the same DTO (e.g., defaultLogicFunctionRole, applicationRegistration).

      This resolves the Sentry error "Cannot return null for non-nullable field Application.applicationVariables" and prevents the same class of error for the other four relation fields. The fix is safe because: (1) the standard frontend FIND_MANY_APPLICATIONS query doesn't request these fields, (2) the frontend FIND_ONE_APPLICATION query does request them but that code path (findOneApplication) properly loads all relations via Promise.all, and (3) any third-party API consumers or SDK users will now get null instead of a hard GraphQL error when these fields aren't loaded.
2026-04-21 19:17:47 +00:00
@@ -89,19 +89,19 @@ export class ApplicationDTO {
@Field(() => RoleDTO, { nullable: true })
defaultLogicFunctionRole?: RoleDTO;
@Field(() => [AgentDTO])
@Field(() => [AgentDTO], { nullable: true })
agents?: AgentDTO[];
@Field(() => [FrontComponentDTO])
@Field(() => [FrontComponentDTO], { nullable: true })
frontComponents?: FrontComponentDTO[];
@Field(() => [LogicFunctionDTO])
@Field(() => [LogicFunctionDTO], { nullable: true })
logicFunctions?: LogicFunctionDTO[];
@Field(() => [ObjectMetadataDTO])
@Field(() => [ObjectMetadataDTO], { nullable: true })
objects?: ObjectMetadataDTO[];
@Field(() => [ApplicationVariableEntityDTO])
@Field(() => [ApplicationVariableEntityDTO], { nullable: true })
applicationVariables?: ApplicationVariableEntityDTO[];
@IsOptional()