Skip to content

feat: add explicit exists rule operators#2671

Merged
enoch85 merged 7 commits intodevelopmentfrom
feat/rule-exists-not-exists
Apr 13, 2026
Merged

feat: add explicit exists rule operators#2671
enoch85 merged 7 commits intodevelopmentfrom
feat/rule-exists-not-exists

Conversation

@enoch85
Copy link
Copy Markdown
Collaborator

@enoch85 enoch85 commented Apr 12, 2026

Summary

  • add explicit EXISTS and NOT_EXISTS operators to the shared rule contracts and surface them for supported rule types
  • keep normal comparisons fail-closed on missing values while treating empty strings and empty lists as missing for EXISTS and NOT_EXISTS
  • omit fake second-value placeholders from unary comparison stats output and add clearer missing-value reasons in stats output
  • add direct RuleConstanstService coverage for the dynamic null-reason builder
  • update rule validation and the RuleInput editor so unary rules do not require a second value, while keeping the existing custom-value and reopen flows stable
  • add focused server and UI regression coverage, including the null BEFORE fail-closed case and unary RuleInput behavior

Example

    - id: 1
      result: true
      operator: OR
      ruleResults:
        - action: exists
          firstValueName: Jellyfin - Date added
          firstValue: 2025-12-14T00:55:08.013Z
          result: true

@enoch85 enoch85 added this to the 3.7.0 milestone Apr 12, 2026
@enoch85
Copy link
Copy Markdown
Collaborator Author

enoch85 commented Apr 12, 2026

/release-pr

@github-actions
Copy link
Copy Markdown
Contributor

Released to maintainerr/maintainerr:pr-2671 🚀

@enoch85 enoch85 added documentation Improvements or additions to documentation enhancement New feature or request labels Apr 12, 2026
@enoch85
Copy link
Copy Markdown
Collaborator Author

enoch85 commented Apr 12, 2026

/release-pr

@github-actions
Copy link
Copy Markdown
Contributor

Released to maintainerr/maintainerr:pr-2671 🚀

Restores the ability to save rules that compare a TEXT_LIST property
(e.g. Jellyfin [list] Viewed by (username)) against a numeric count.
The previous validation path only accepted TEXT_LIST + TEXT customVal
combinations; count operators send a NUMBER customVal and fell through
to "Validation failed".

Fixes #2672
@enoch85
Copy link
Copy Markdown
Collaborator Author

enoch85 commented Apr 13, 2026

/release-pr

@enoch85
Copy link
Copy Markdown
Collaborator Author

enoch85 commented Apr 13, 2026

@d-Rickyy-b Have you tried this out yet?

@github-actions
Copy link
Copy Markdown
Contributor

Released to maintainerr/maintainerr:pr-2671 🚀

@enoch85
Copy link
Copy Markdown
Collaborator Author

enoch85 commented Apr 13, 2026

Works in my testing, let's get this in development. 👍

@enoch85 enoch85 merged commit e082ee2 into development Apr 13, 2026
13 checks passed
@enoch85 enoch85 deleted the feat/rule-exists-not-exists branch April 13, 2026 19:08
maintainerr-automation Bot added a commit that referenced this pull request Apr 13, 2026
* fix: use canonical Plex collection item URI

* build(deps): bump the nestjs group with 4 updates (#2673)

Bumps the nestjs group with 4 updates: [@nestjs/common](https://github.com/nestjs/nest/tree/HEAD/packages/common), [@nestjs/core](https://github.com/nestjs/nest/tree/HEAD/packages/core), [@nestjs/platform-express](https://github.com/nestjs/nest/tree/HEAD/packages/platform-express) and [@nestjs/testing](https://github.com/nestjs/nest/tree/HEAD/packages/testing).


Updates `@nestjs/common` from 11.1.18 to 11.1.19
- [Release notes](https://github.com/nestjs/nest/releases)
- [Commits](https://github.com/nestjs/nest/commits/v11.1.19/packages/common)

Updates `@nestjs/core` from 11.1.18 to 11.1.19
- [Release notes](https://github.com/nestjs/nest/releases)
- [Commits](https://github.com/nestjs/nest/commits/v11.1.19/packages/core)

Updates `@nestjs/platform-express` from 11.1.18 to 11.1.19
- [Release notes](https://github.com/nestjs/nest/releases)
- [Commits](https://github.com/nestjs/nest/commits/v11.1.19/packages/platform-express)

Updates `@nestjs/testing` from 11.1.18 to 11.1.19
- [Release notes](https://github.com/nestjs/nest/releases)
- [Commits](https://github.com/nestjs/nest/commits/v11.1.19/packages/testing)

---
updated-dependencies:
- dependency-name: "@nestjs/common"
  dependency-version: 11.1.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: nestjs
- dependency-name: "@nestjs/core"
  dependency-version: 11.1.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: nestjs
- dependency-name: "@nestjs/platform-express"
  dependency-version: 11.1.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: nestjs
- dependency-name: "@nestjs/testing"
  dependency-version: 11.1.19
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: nestjs
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump turbo from 2.9.4 to 2.9.6 (#2675)

Bumps [turbo](https://github.com/vercel/turborepo) from 2.9.4 to 2.9.6.
- [Release notes](https://github.com/vercel/turborepo/releases)
- [Changelog](https://github.com/vercel/turborepo/blob/main/RELEASE.md)
- [Commits](vercel/turborepo@v2.9.4...v2.9.6)

---
updated-dependencies:
- dependency-name: turbo
  dependency-version: 2.9.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump vite from 8.0.5 to 8.0.8 (#2676)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.5 to 8.0.8.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.8/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump eslint-plugin-jest from 29.15.1 to 29.15.2 (#2677)

Bumps [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest) from 29.15.1 to 29.15.2.
- [Release notes](https://github.com/jest-community/eslint-plugin-jest/releases)
- [Changelog](https://github.com/jest-community/eslint-plugin-jest/blob/main/CHANGELOG.md)
- [Commits](jest-community/eslint-plugin-jest@v29.15.1...v29.15.2)

---
updated-dependencies:
- dependency-name: eslint-plugin-jest
  dependency-version: 29.15.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump jsdom from 29.0.1 to 29.0.2 (#2678)

Bumps [jsdom](https://github.com/jsdom/jsdom) from 29.0.1 to 29.0.2.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Commits](jsdom/jsdom@v29.0.1...v29.0.2)

---
updated-dependencies:
- dependency-name: jsdom
  dependency-version: 29.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @tanstack/eslint-plugin-query (#2682)

Bumps [@tanstack/eslint-plugin-query](https://github.com/TanStack/query/tree/HEAD/packages/eslint-plugin-query) from 5.97.0 to 5.99.0.
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/eslint-plugin-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/[email protected]/packages/eslint-plugin-query)

---
updated-dependencies:
- dependency-name: "@tanstack/eslint-plugin-query"
  dependency-version: 5.99.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump better-sqlite3 from 12.8.0 to 12.9.0 (#2680)

Bumps [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) from 12.8.0 to 12.9.0.
- [Release notes](https://github.com/WiseLibs/better-sqlite3/releases)
- [Commits](WiseLibs/better-sqlite3@v12.8.0...v12.9.0)

---
updated-dependencies:
- dependency-name: better-sqlite3
  dependency-version: 12.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump @headlessui/react from 2.2.9 to 2.2.10 (#2681)

Bumps [@headlessui/react](https://github.com/tailwindlabs/headlessui/tree/HEAD/packages/@headlessui-react) from 2.2.9 to 2.2.10.
- [Release notes](https://github.com/tailwindlabs/headlessui/releases)
- [Changelog](https://github.com/tailwindlabs/headlessui/blob/main/packages/@headlessui-react/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/headlessui/commits/@headlessui/[email protected]/packages/@headlessui-react)

---
updated-dependencies:
- dependency-name: "@headlessui/react"
  dependency-version: 2.2.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump actions/github-script from 8 to 9 (#2679)

Bumps [actions/github-script](https://github.com/actions/github-script) from 8 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](actions/github-script@v8...v9)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: '9'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: enoch85 <[email protected]>

* feat: add explicit exists rule operators (#2671)

* feat: add explicit exists rule operators

* fix: tighten rule input lint cleanup

* fix: treat empty rule values as missing

* chore: apply formatter to rule constant spec

* fix: omit unary second value output

* fix: allow count comparisons on text list rules to save

Restores the ability to save rules that compare a TEXT_LIST property
(e.g. Jellyfin [list] Viewed by (username)) against a numeric count.
The previous validation path only accepted TEXT_LIST + TEXT customVal
combinations; count operators send a NUMBER customVal and fell through
to "Validation failed".

Fixes #2672

* fix: scope rule/collection pre-flight to media server only (#2581) (#2683)

Rule execution was gating every rule on a global testConnections()
probe that fanned out to every configured backend (media server, all
*arrs, Seerr, Tautulli) with a hard 5s timeout. A transient blip in any
one backend skipped the rule — even when the rule didn't use that
backend. Same anti-pattern in CollectionWorkerService.

Replace with a narrow verifyConnection() check against the only hard
dependency (media server, with Plex auto re-discovery). Ancillary
services are handled at their call sites. Add a typed
'media-server-unreachable' failure reason so the job manager can drop
the rest of the queue silently on a mid-queue outage, keeping "one
notification per outage" semantics while preserving per-rule resilience
for flakiness between rules.

* fix: count Sonarr monitored episodes accurately (#2684)

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: maintainerr-automation[bot] <261505141+maintainerr-automation[bot]@users.noreply.github.com>
Co-authored-by: enoch85 <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
@maintainerr-automation
Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.7.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

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

Labels

documentation Improvements or additions to documentation enhancement New feature or request released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant