Skip to content

Backend ai insights permission#1759

Merged
Artuomka merged 2 commits into
mainfrom
backend_ai_insights_permission
May 7, 2026
Merged

Backend ai insights permission#1759
Artuomka merged 2 commits into
mainfrom
backend_ai_insights_permission

Conversation

@Artuomka
Copy link
Copy Markdown
Collaborator

@Artuomka Artuomka commented May 7, 2026

Summary by CodeRabbit

Release Notes

  • New Features

    • Added aiRequest permission flag to table-level access controls, enabling granular control over who can make AI requests on specific tables.
  • Updates

    • Extended authorization system with new table:ai-request action for Cedar-based permission evaluation.
    • Updated permission schema across the system to reflect the new permission field.

Copilot AI review requested due to automatic review settings May 7, 2026 11:02
@Artuomka Artuomka enabled auto-merge May 7, 2026 11:02
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 7, 2026

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 51e1f96a-8815-4bf7-ae60-bc3dc1c9ca3f

📥 Commits

Reviewing files that changed from the base of the PR and between 1f20243 and ba79830.

📒 Files selected for processing (49)
  • backend/src/entities/ai/user-ai-requests-v2.controller.ts
  • backend/src/entities/cedar-authorization/cedar-action-map.ts
  • backend/src/entities/cedar-authorization/cedar-permissions.service.ts
  • backend/src/entities/cedar-authorization/cedar-policy-generator.ts
  • backend/src/entities/cedar-authorization/cedar-policy-parser.ts
  • backend/src/entities/cedar-authorization/cedar-schema.json
  • backend/src/entities/cedar-authorization/cedar-schema.ts
  • backend/src/entities/connection/use-cases/get-permissions-for-group-in-connection.use.case.ts
  • backend/src/entities/permission/application/data-structures/create-permissions.ds.ts
  • backend/src/entities/permission/permission.interface.ts
  • backend/src/guards/table-ai-request.guard.ts
  • backend/test/ava-tests/non-saas-tests/non-saas-ai-request-permission-e2e.test.ts
  • backend/test/ava-tests/non-saas-tests/non-saas-table-cassandra.e2e.test.ts
  • backend/test/ava-tests/non-saas-tests/non-saas-table-ibmdb2-e2e.test.ts
  • backend/test/ava-tests/non-saas-tests/non-saas-table-mongodb-e2e.test.ts
  • backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-e2e.test.ts
  • backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-schema-e2e.test.ts
  • backend/test/ava-tests/non-saas-tests/non-saas-table-mysql-e2e.test.ts
  • backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-e2e.test.ts
  • backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-schema-e2e.test.ts
  • backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-encrypted-e2e.test.ts
  • backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-schema-e2e.test.ts
  • backend/test/ava-tests/non-saas-tests/non-saas-table-redis-e2e.test.ts
  • backend/test/ava-tests/saas-tests/api-key-e2e.test.ts
  • backend/test/ava-tests/saas-tests/connection-properties-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-cassandra-agent.e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-cassandra.e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-clickhouse-agent-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-clickhouse-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-dynamodb-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-elasticsearch-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-ibmdb2-agent-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-ibmdb2-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-mongodb-agent-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-mongodb-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-mssql-agent-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-mssql-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-mssql-schema-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-mysql-agent-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-mysql-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-oracle-agent-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-oracledb-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-oracledb-schema-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-postgres-agent-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-postgres-encrypted-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-postgres-schema-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-redis-agent-e2e.test.ts
  • backend/test/ava-tests/saas-tests/table-redis-e2e.test.ts

📝 Walkthrough

Walkthrough

This PR adds a new aiRequest table-level permission to the Cedar authorization system. The change includes Cedar action definitions, permission type updates, policy generation/parsing logic, a dedicated guard, and comprehensive e2e test coverage across multiple database platforms.

Changes

Table AI Request Permission

Layer / File(s) Summary
Permission Type Contracts
backend/src/entities/permission/permission.interface.ts, backend/src/entities/permission/application/data-structures/create-permissions.ds.ts, backend/src/entities/connection/use-cases/get-permissions-for-group-in-connection.use.case.ts
ITableAccessLevel interface and TableAccessLevelsDs data structure each add an optional aiRequest: boolean field. The use case now includes aiRequest: false in default access level objects for tables lacking Cedar-derived permissions.
Cedar Action & Schema Definitions
backend/src/entities/cedar-authorization/cedar-action-map.ts, backend/src/entities/cedar-authorization/cedar-schema.json, backend/src/entities/cedar-authorization/cedar-schema.ts
CedarAction enum gains TableAiRequest = 'table:ai-request' member. Cedar schema extended with table:ai-request action applicable to User principals on Table resources in both JSON and TypeScript schema definitions.
Cedar Policy Generation & Parsing
backend/src/entities/cedar-authorization/cedar-policy-generator.ts, backend/src/entities/cedar-authorization/cedar-policy-parser.ts
Policy generator emits additional permit rules for table:ai-request when group permissions enable access.aiRequest. Parser recognizes the action and applies it to table permission entries, initializing and setting the aiRequest flag.
Authorization Service Evaluation
backend/src/entities/cedar-authorization/cedar-permissions.service.ts, backend/src/entities/connection/use-cases/get-permissions-for-group-in-connection.use.case.ts
Service evaluates CedarAction.TableAiRequest alongside existing table actions; returns computed aiRequest boolean in access level response. Use case includes import reordering and default aiRequest: false for tables without Cedar-derived permissions.
Guard Implementation & Endpoint Wiring
backend/src/guards/table-ai-request.guard.ts, backend/src/entities/ai/user-ai-requests-v2.controller.ts
New TableAiRequestGuard validates tableName query parameter and connectionId route parameter, then calls Cedar authorization service with TableAiRequest action. Controller switches POST /ai/v4/request/:connectionId endpoint from TableReadGuard to TableAiRequestGuard.
E2E Tests & Fixture Updates
backend/test/ava-tests/non-saas-tests/non-saas-ai-request-permission-e2e.test.ts, backend/test/ava-tests/*/table-*-e2e.test.ts (41 files)
New comprehensive test suite verifies AI request authorization across scenarios: admin users allowed, invited users rejected with 403 when lacking table:ai-request, invited users allowed when permission granted, and users with no table permissions rejected. All existing table permission assertions updated from 5 to 6 expected keys to reflect the new field in API responses.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • lyubov-voloshko

Poem

🐰 A new permission hops into sight,
aiRequest grants tables their right,
Cedar now checks if AI can play,
Guards stand firm at the gate today,
Tests bloom wide across the bay!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch backend_ai_insights_permission

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces a new Cedar-backed, table-level permission (table:ai-request) intended to gate access to the AI “request info from table” endpoint, and updates permission serialization/tests to account for the additional permission flag.

Changes:

  • Adds table:ai-request to the Cedar schema/action map, and extends Cedar policy generation/parsing + permission evaluation to include aiRequest.
  • Adds a new Nest guard (TableAiRequestGuard) and switches POST /ai/v4/request/:connectionId to use it.
  • Updates many e2e tests to expect the additional table permission field, and adds a new non-SaaS e2e suite covering the new permission behavior.

Reviewed changes

Copilot reviewed 49 out of 49 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
backend/src/entities/ai/user-ai-requests-v2.controller.ts Switches AI v4 request endpoint authorization to the new table AI-request guard.
backend/src/guards/table-ai-request.guard.ts New guard validating table:ai-request via Cedar authorization.
backend/src/entities/cedar-authorization/cedar-action-map.ts Adds TableAiRequest action enum value.
backend/src/entities/cedar-authorization/cedar-schema.ts Adds table:ai-request action definition to TS Cedar schema.
backend/src/entities/cedar-authorization/cedar-schema.json Adds table:ai-request action definition to JSON Cedar schema.
backend/src/entities/cedar-authorization/cedar-policy-generator.ts Emits Cedar policies for table:ai-request when enabled in table access.
backend/src/entities/cedar-authorization/cedar-policy-parser.ts Parses table:ai-request permits into classical permissions (aiRequest).
backend/src/entities/cedar-authorization/cedar-permissions.service.ts Evaluates table:ai-request and exposes it in table permissions.
backend/src/entities/permission/permission.interface.ts Extends table access level interface with aiRequest.
backend/src/entities/permission/application/data-structures/create-permissions.ds.ts Allows aiRequest in table access level DTO validation.
backend/src/entities/connection/use-cases/get-permissions-for-group-in-connection.use.case.ts Ensures returned table permissions include an aiRequest flag (default false).
backend/test/ava-tests/non-saas-tests/non-saas-ai-request-permission-e2e.test.ts New e2e tests validating allow/deny behavior for the AI request endpoint based on aiRequest.
backend/test/ava-tests/saas-tests/table-redis-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-redis-agent-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-postgres-schema-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-postgres-encrypted-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-postgres-agent-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-oracledb-schema-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-oracledb-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-oracle-agent-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-mysql-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-mysql-agent-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-mssql-schema-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-mssql-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-mssql-agent-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-mongodb-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-mongodb-agent-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-ibmdb2-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-ibmdb2-agent-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-elasticsearch-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-dynamodb-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-clickhouse-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-clickhouse-agent-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-cassandra.e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/table-cassandra-agent.e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/saas-tests/connection-properties-e2e.test.ts Updates expected table permission key count from 5 → 6 in connection-properties table list assertions.
backend/test/ava-tests/saas-tests/api-key-e2e.test.ts Updates expected table permission key count from 5 → 6 in API key flow table list assertions.
backend/test/ava-tests/non-saas-tests/non-saas-table-redis-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-schema-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-encrypted-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-schema-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/non-saas-tests/non-saas-table-mysql-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-schema-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/non-saas-tests/non-saas-table-mongodb-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/non-saas-tests/non-saas-table-ibmdb2-e2e.test.ts Updates expected table permission key count from 5 → 6.
backend/test/ava-tests/non-saas-tests/non-saas-table-cassandra.e2e.test.ts Updates expected table permission key count from 5 → 6.
Comments suppressed due to low confidence (2)

backend/src/entities/ai/user-ai-requests-v2.controller.ts:55

  • Switching this endpoint from TableReadGuard to TableAiRequestGuard removes the enforcement of table:read. The AI request use case (RequestInfoFromTableWithAIUseCaseV7) reads table structure (and can query data) and does not appear to perform an additional table-read authorization check, so granting only table:ai-request would allow access to table information without table:read.

Consider requiring BOTH permissions (e.g., apply both guards, or update TableAiRequestGuard to validate CedarAction.TableRead AND CedarAction.TableAiRequest). Also add an e2e test for the case where aiRequest: true but visibility/read is not granted, and ensure it is rejected.

		status: 201,
		description: 'Returned info with conversation history saved.',
	})
	@UseGuards(TableAiRequestGuard)
	@ApiBody({ type: RequestInfoFromTableBodyDTO })
	@ApiQuery({ name: 'tableName', required: true, type: String })
	@ApiQuery({ name: 'threadId', required: false, type: String })
	@Timeout(process.env.NODE_ENV !== 'test' ? TimeoutDefaults.AI : TimeoutDefaults.AI_TEST)
	@Post('/ai/v4/request/:connectionId')

backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts:112

  • Asserting an exact Object.keys(...).length makes this test brittle when new table permissions are added/removed. Since this PR introduces a new permission, it would be more stable to assert the presence/type/value of the new aiRequest flag (and/or explicitly check the expected keys) rather than a hard-coded key count.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +137 to +176
await request(app.getHttpServer())
.post(`/connection/properties/${connectionId}`)
.send({ allow_ai_requests: true })
.set('Cookie', adminToken)
.set('Content-Type', 'application/json')
.set('Accept', 'application/json');

const newGroup = mockFactory.generateCreateGroupDto1();
const createGroupResponse = await request(app.getHttpServer())
.post(`/connection/group/${connectionId}`)
.set('Cookie', adminToken)
.send(newGroup)
.set('Content-Type', 'application/json')
.set('Accept', 'application/json');
const createdGroupId = JSON.parse(createGroupResponse.text).id;

const permissions = {
connection: {
connectionId,
accessLevel: AccessLevelEnum.readonly,
},
group: {
groupId: createdGroupId,
accessLevel: AccessLevelEnum.none,
},
tables: [
{
tableName: testTableName,
accessLevel: tableAccessLevel,
},
],
};

await request(app.getHttpServer())
.put(`/permissions/${createdGroupId}?connectionId=${connectionId}`)
.send({ permissions })
.set('Cookie', adminToken)
.set('Content-Type', 'application/json')
.set('Accept', 'application/json');

@Artuomka Artuomka merged commit 5848980 into main May 7, 2026
21 of 23 checks passed
@Artuomka Artuomka deleted the backend_ai_insights_permission branch May 7, 2026 11:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants