Files
twenty/packages
Sonarly Claude Code 6510b514db fix(server): default viewFilter value for operands that don't expect one
https://sonarly.com/issue/33956?type=bug

Installing a marketplace app that defines a view filter with an `IS_NOT_EMPTY` operand fails because the app manifest omits the `value` field (which is semantically unnecessary for that operand), but the database column `core.viewFilter.value` is NOT NULL with no default.

Fix: Three changes across 3 files to fix the NOT NULL constraint violation when installing marketplace apps with emptiness-operand view filters:

1. **`packages/twenty-shared/src/application/viewManifestType.ts`**: Made `value` optional on `ViewFilterManifest` (`value?: ViewManifestFilterValue`). Operands like `IS_NOT_EMPTY`, `IS_EMPTY`, `IS_NOT_NULL`, `IS_IN_PAST`, `IS_IN_FUTURE`, and `IS_TODAY` don't require a value, so the manifest type should reflect this. This is backwards-compatible — existing manifests that provide a value are unaffected.

2. **`packages/twenty-server/src/engine/core-modules/application/application-manifest/converters/from-view-filter-manifest-to-universal-flat-view-filter.util.ts`**: Changed `value: viewFilterManifest.value` to `value: viewFilterManifest.value ?? ''` — provides an empty string default when the manifest omits the value. This follows the same `?? null` / `?? default` pattern already used for `viewFilterGroupUniversalIdentifier`, `subFieldName`, and `positionInViewFilterGroup` in the same function. Empty string satisfies the database NOT NULL constraint and is semantically correct (the value is ignored for emptiness operands).

3. **`packages/twenty-server/src/engine/core-modules/application/application-manifest/converters/__tests__/from-view-filter-manifest-to-universal-flat-view-filter.util.spec.ts`**: Added a test case that creates a view filter with `IS_NOT_EMPTY` operand and no `value`, verifying the converter defaults to empty string.
2026-05-04 11:31:05 +00:00
..
2026-05-04 11:09:34 +02:00