Skip to content

refactor(centralServer): faster dashboard item filtering by access policy#6629

Merged
jaskfla merged 1 commit intodevfrom
perm-dash-items
Mar 30, 2026
Merged

refactor(centralServer): faster dashboard item filtering by access policy#6629
jaskfla merged 1 commit intodevfrom
perm-dash-items

Conversation

@jaskfla
Copy link
Copy Markdown
Contributor

@jaskfla jaskfla commented Feb 3, 2026

🦸 Review Hero

  • Run Review Hero
  • Auto-fix review suggestions
  • Auto-fix CI failures

@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @jaskfla, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces a significant performance enhancement to the central server's dashboard item filtering mechanism. By transitioning from an inefficient in-memory filtering approach to a highly optimized direct SQL query, the system can now retrieve permitted dashboard items much faster. This change streamlines data access and reduces processing overhead, leading to a more responsive user experience when dealing with dashboard item permissions.

Highlights

  • Performance Improvement: The in-memory filtering of dashboard items based on access policy has been replaced with a direct SQL query, significantly improving performance.
  • Database Optimization: The function now directly queries the database to retrieve only the permitted dashboard item IDs, avoiding the need to fetch all items and permission groups into memory.
  • Code Refactoring: The implementation has been refactored to use SqlQuery for database interaction and includes JSDoc type definitions for better code clarity.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • packages/central-server/src/apiV2/dashboardItems/getPermittedDashboardItems.js
    • Replaced the hasSomePermissionGroupsAccess utility and in-memory filtering logic with a direct SQL query.
    • Introduced JSDoc type definitions for AccessPolicy, ModelRegistry, and DashboardItem for improved code readability and maintainability.
    • Utilized SqlQuery.record for safe binding of permission group names into the SQL query.
    • Optimized data retrieval by directly selecting distinct dashboard item IDs based on associated permission groups and the user's access policy.
Activity
  • No human activity (comments, reviews, etc.) has been recorded on this pull request yet.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors the getPermittedDashboardItems function to improve performance by moving the filtering logic from JavaScript into a direct SQL query. This is an excellent change that should significantly speed up dashboard item filtering. The new SQL query is well-constructed. I've added one suggestion to simplify how the query parameters are bound, which will make the code a bit cleaner.

Comment thread packages/central-server/src/apiV2/dashboardItems/getPermittedDashboardItems.js Outdated
@jaskfla jaskfla force-pushed the perm-dash-items branch 2 times, most recently from 934a10e to a792179 Compare February 16, 2026 10:48
@review-hero
Copy link
Copy Markdown

review-hero Bot commented Mar 15, 2026

🦸 Review Hero Summary
3 agents reviewed this PR | 0 critical | 1 suggestion | 2 nitpicks

Nitpicks

File Line Agent Comment
packages/central-server/src/apiV2/dashboardItems/getPermittedDashboardItems.js 35 Tupaia Conventions The COALESCE(di.permission_group_ids, ARRAY[]::text[]) is redundant. In PostgreSQL, unnest(NULL::text[]) used in a CROSS JOIN LATERAL already returns zero rows, so rows with a NULL permission_group_ids are naturally excluded without the coalesce. Simplify to: CROSS JOIN LATERAL unnest(di.permissi...
packages/central-server/src/apiV2/dashboardItems/getPermittedDashboardItems.js 38 Tupaia Conventions The alias pg for the permission_group table is potentially confusing: it is the conventional name of the node-postgres driver used throughout the project and resembles the PostgreSQL system-catalog prefix pg_*. A clearer alias such as perm_group would avoid ambiguity when reading or debug...
Local fix prompt (copy to your coding agent)

Fix these issues identified on the pull request. One commit per issue fixed.


packages/central-server/src/apiV2/dashboardItems/getPermittedDashboardItems.js:18: Raw SQL with table/column references belongs in the model layer, not the API layer. Every other executeSql call in the codebase lives inside a model class (Survey.js, Entity.js, DashboardItem.js, etc.). Moving this query into a method on the DashboardItem model (e.g. models.dashboardItem.getPermittedIds(pgNames)) would keep schema details encapsulated and make the function here a thin orchestrator again — matching the established pattern.


packages/central-server/src/apiV2/dashboardItems/getPermittedDashboardItems.js:35: The COALESCE(di.permission_group_ids, ARRAY[]::text[]) is redundant. In PostgreSQL, unnest(NULL::text[]) used in a CROSS JOIN LATERAL already returns zero rows, so rows with a NULL permission_group_ids are naturally excluded without the coalesce. Simplify to: CROSS JOIN LATERAL unnest(di.permission_group_ids) AS pg_id

The alias pg for the permission_group table is potentially confusing: it is the conventional name of the node-postgres driver used throughout the project and resembles the PostgreSQL system-catalog prefix pg_*. A clearer alias such as perm_group would avoid ambiguity when reading or debugging the query.

Copy link
Copy Markdown
Contributor

@tcaiger tcaiger left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@jaskfla jaskfla merged commit 27fee20 into dev Mar 30, 2026
104 checks passed
@jaskfla jaskfla deleted the perm-dash-items branch March 30, 2026 23:12
@jaskfla jaskfla mentioned this pull request Mar 30, 2026
1 task
@avaek avaek mentioned this pull request Apr 14, 2026
1 task
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants