Use traversal_ids confidentiality filter in notes
## Summary The notes advanced search query currently uses legacy `project_id` authorization for issue confidentiality filtering. This should be migrated to use the modern `traversal_ids`-based confidential filters available in the `Elastic::Filters` class. ## Current Implementation In `ee/lib/elastic/latest/note_class_proxy.rb`, the `confidentiality_filter` method (lines 68-145) implements custom confidentiality logic that relies on: - Direct `project_id` terms queries for authorization - Manual construction of boolean filters for confidential issues - Separate handling for issue and non-issue confidentiality **Key problematic code:** ```ruby filter[:bool][:should] << { bool: { must: [ # ... confidential issue checks ... { bool: { _name: context.name(:user, :issue_author, :issue_assignee, :project_membership), should: [ { term: { "issue.author_id" => current_user.id } }, { term: { "issue.assignee_id" => current_user.id } }, { terms: { project_id: project_ids } } # ← Legacy project_id authorization ] } } ] } } ``` ## Proposed Solution Migrate to use the standardized confidentiality filters in `ee/lib/search/elastic/filters/confidentiality_filters.rb`, which provides: - **Traversal IDs support**: Uses `traversal_ids` for efficient ancestry-based authorization - **Unified filtering**: Handles both project and group-level confidentiality - **Better performance**: Optimized queries with proper trie-based traversal ID filtering - **Consistent authorization**: Aligns with other search entities (issues, merge requests, etc.) The `ConfidentialityFilters` module provides: - `by_project_confidentiality` - Project-level confidentiality with traversal_ids - `by_group_level_confidentiality` - Group-level confidentiality - `by_combined_confidentiality` - Combined project and group filtering ## Benefits 1. **Performance**: Traversal IDs enable more efficient group-level searches 2. **Consistency**: Aligns notes search with other entity types 3. **Maintainability**: Removes duplicate confidentiality logic 4. **Scalability**: Better support for deeply nested group hierarchies ## Implementation Notes The refactor should: 1. Replace the custom `confidentiality_filter` method in `NoteClassProxy` 2. Use `Search::Elastic::Filters.by_combined_confidentiality` or `by_project_confidentiality` 3. Ensure proper handling of note-specific fields (`issue.confidential`, `issue.author_id`, `issue.assignee_id`) 4. Maintain backward compatibility with existing search behavior 5. Add appropriate tests for group-level note searches with confidential issues
issue