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.