Skip to content

Commit 5848980

Browse files
authored
Merge pull request #1759 from rocket-admin/backend_ai_insights_permission
Backend ai insights permission
2 parents 1f20243 + ba79830 commit 5848980

49 files changed

Lines changed: 508 additions & 43 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { Timeout, TimeoutDefaults } from '../../decorators/timeout.decorator.js'
2020
import { UserId } from '../../decorators/user-id.decorator.js';
2121
import { InTransactionEnum } from '../../enums/in-transaction.enum.js';
2222
import { ConnectionEditGuard } from '../../guards/connection-edit.guard.js';
23-
import { TableReadGuard } from '../../guards/table-read.guard.js';
23+
import { TableAiRequestGuard } from '../../guards/table-ai-request.guard.js';
2424
import { ValidationHelper } from '../../helpers/validators/validation-helper.js';
2525
import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js';
2626
import { IAISettingsAndWidgetsCreation, IRequestInfoFromTableV2 } from './ai-use-cases.interface.js';
@@ -47,7 +47,7 @@ export class UserAIRequestsControllerV2 {
4747
status: 201,
4848
description: 'Returned info with conversation history saved.',
4949
})
50-
@UseGuards(TableReadGuard)
50+
@UseGuards(TableAiRequestGuard)
5151
@ApiBody({ type: RequestInfoFromTableBodyDTO })
5252
@ApiQuery({ name: 'tableName', required: true, type: String })
5353
@ApiQuery({ name: 'threadId', required: false, type: String })

backend/src/entities/cedar-authorization/cedar-action-map.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export enum CedarAction {
88
TableAdd = 'table:add',
99
TableEdit = 'table:edit',
1010
TableDelete = 'table:delete',
11+
TableAiRequest = 'table:ai-request',
1112
DashboardRead = 'dashboard:read',
1213
DashboardCreate = 'dashboard:create',
1314
DashboardEdit = 'dashboard:edit',

backend/src/entities/cedar-authorization/cedar-permissions.service.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,17 @@ export class CedarPermissionsService implements IUserAccessRepository {
213213
): Promise<ITablePermissionData> {
214214
const ctx = await this.loadContext(connectionId, cognitoUserName);
215215
if (!ctx) {
216-
return { tableName, accessLevel: { visibility: false, readonly: false, add: false, delete: false, edit: false } };
216+
return {
217+
tableName,
218+
accessLevel: {
219+
visibility: false,
220+
readonly: false,
221+
add: false,
222+
delete: false,
223+
edit: false,
224+
aiRequest: false,
225+
},
226+
};
217227
}
218228

219229
return this.evaluateTablePermissions(cognitoUserName, connectionId, tableName, ctx);
@@ -386,6 +396,14 @@ export class CedarPermissionsService implements IUserAccessRepository {
386396
ctx.policies,
387397
entities,
388398
);
399+
const canAiRequest = this.evaluatePolicies(
400+
userId,
401+
CedarAction.TableAiRequest,
402+
CedarResourceType.Table,
403+
resourceId,
404+
ctx.policies,
405+
entities,
406+
);
389407

390408
return {
391409
tableName,
@@ -395,6 +413,7 @@ export class CedarPermissionsService implements IUserAccessRepository {
395413
add: canAdd,
396414
delete: canDelete,
397415
edit: canEdit,
416+
aiRequest: canAiRequest,
398417
},
399418
};
400419
}

backend/src/entities/cedar-authorization/cedar-policy-generator.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ export function generateCedarPolicyForGroup(
153153
`permit(\n principal,\n action == RocketAdmin::Action::"table:delete",\n resource == ${tableRef}\n);`,
154154
);
155155
}
156+
if (access.aiRequest) {
157+
policies.push(
158+
`permit(\n principal,\n action == RocketAdmin::Action::"table:ai-request",\n resource == ${tableRef}\n);`,
159+
);
160+
}
156161
}
157162

158163
return policies.join('\n\n');

backend/src/entities/cedar-authorization/cedar-policy-parser.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ export function parseCedarPolicyToClassicalPermissions(
6666
case 'table:read':
6767
case 'table:add':
6868
case 'table:edit':
69-
case 'table:delete': {
69+
case 'table:delete':
70+
case 'table:ai-request': {
7071
const tableName = extractTableName(permit.resourceId, connectionId);
7172
if (!tableName) break;
7273
const tableEntry = getOrCreateTableEntry(tableMap, tableName);
@@ -227,6 +228,7 @@ function getOrCreateTableEntry(map: Map<string, ITablePermissionData>, tableName
227228
add: false,
228229
delete: false,
229230
edit: false,
231+
aiRequest: false,
230232
},
231233
};
232234
map.set(tableName, entry);
@@ -248,6 +250,9 @@ function applyTableAction(entry: ITablePermissionData, action: string): void {
248250
case 'table:delete':
249251
entry.accessLevel.delete = true;
250252
break;
253+
case 'table:ai-request':
254+
entry.accessLevel.aiRequest = true;
255+
break;
251256
}
252257
}
253258

backend/src/entities/cedar-authorization/cedar-schema.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,12 @@
101101
"resourceTypes": ["Table"]
102102
}
103103
},
104+
"table:ai-request": {
105+
"appliesTo": {
106+
"principalTypes": ["User"],
107+
"resourceTypes": ["Table"]
108+
}
109+
},
104110
"dashboard:read": {
105111
"appliesTo": {
106112
"principalTypes": ["User"],

backend/src/entities/cedar-authorization/cedar-schema.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ export const CEDAR_SCHEMA = {
110110
resourceTypes: ['Table'],
111111
},
112112
},
113+
'table:ai-request': {
114+
appliesTo: {
115+
principalTypes: ['User'],
116+
resourceTypes: ['Table'],
117+
},
118+
},
113119
'dashboard:read': {
114120
appliesTo: {
115121
principalTypes: ['User'],

backend/src/entities/connection/use-cases/get-permissions-for-group-in-connection.use.case.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import AbstractUseCase from '../../../common/abstract-use.case.js';
44
import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js';
55
import { BaseType } from '../../../common/data-injection.tokens.js';
66
import { AccessLevelEnum } from '../../../enums/access-level.enum.js';
7-
import { TablePermissionDs } from '../../permission/application/data-structures/create-permissions.ds.js';
87
import { parseCedarPolicyToClassicalPermissions } from '../../cedar-authorization/cedar-policy-parser.js';
8+
import { TablePermissionDs } from '../../permission/application/data-structures/create-permissions.ds.js';
99
import { FoundPermissionsInConnectionDs } from '../application/data-structures/found-permissions-in-connection.ds.js';
1010
import { GetPermissionsInConnectionDs } from '../application/data-structures/get-permissions-in-connection.ds.js';
1111
import { IGetPermissionsForGroupInConnection } from './use-cases.interfaces.js';
@@ -62,6 +62,7 @@ export class GetPermissionsForGroupInConnectionUseCase
6262
edit: false,
6363
readonly: false,
6464
visibility: false,
65+
aiRequest: false,
6566
},
6667
};
6768
});

backend/src/entities/permission/application/data-structures/create-permissions.ds.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ApiProperty } from '@nestjs/swagger';
2-
import { IsArray, IsBoolean, IsEnum, IsString, IsUUID, ValidateNested } from 'class-validator';
2+
import { IsArray, IsBoolean, IsEnum, IsOptional, IsString, IsUUID, ValidateNested } from 'class-validator';
33
import { AccessLevelEnum } from '../../../../enums/access-level.enum.js';
44

55
export class CreatePermissionsDs {
@@ -41,6 +41,11 @@ export class TableAccessLevelsDs {
4141
@ApiProperty()
4242
@IsBoolean()
4343
visibility: boolean;
44+
45+
@ApiProperty({ required: false })
46+
@IsOptional()
47+
@IsBoolean()
48+
aiRequest?: boolean;
4449
}
4550

4651
export class TablePermissionDs {

backend/src/entities/permission/permission.interface.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export interface ITableAccessLevel {
2424
add: boolean;
2525
delete: boolean;
2626
edit: boolean;
27+
aiRequest?: boolean;
2728
}
2829

2930
export interface ITablePermissionData {

0 commit comments

Comments
 (0)