diff --git a/backend/src/object/object.service.ts b/backend/src/object/object.service.ts index 1c95597..26fec40 100644 --- a/backend/src/object/object.service.ts +++ b/backend/src/object/object.service.ts @@ -794,4 +794,109 @@ export class ObjectService { return { success: true }; } + + async getObjectPermissions( + tenantId: string, + objectApiName: string, + roleId: string, + ) { + const resolvedTenantId = await this.tenantDbService.resolveTenantId(tenantId); + const knex = await this.tenantDbService.getTenantKnexById(resolvedTenantId); + + // Get object definition + const objectDef = await ObjectDefinition.query(knex) + .findOne({ apiName: objectApiName }); + + if (!objectDef) { + throw new NotFoundException(`Object ${objectApiName} not found`); + } + + // Get role object permissions + const permission = await knex('role_object_permissions') + .where({ roleId, objectDefinitionId: objectDef.id }) + .first(); + + if (!permission) { + // Return default permissions (all false) + return { + canCreate: false, + canRead: false, + canEdit: false, + canDelete: false, + canViewAll: false, + canModifyAll: false, + }; + } + + return { + canCreate: Boolean(permission.canCreate), + canRead: Boolean(permission.canRead), + canEdit: Boolean(permission.canEdit), + canDelete: Boolean(permission.canDelete), + canViewAll: Boolean(permission.canViewAll), + canModifyAll: Boolean(permission.canModifyAll), + }; + } + + async updateObjectPermissions( + tenantId: string, + objectApiName: string, + data: { + roleId: string; + canCreate: boolean; + canRead: boolean; + canEdit: boolean; + canDelete: boolean; + canViewAll: boolean; + canModifyAll: boolean; + }, + ) { + const resolvedTenantId = await this.tenantDbService.resolveTenantId(tenantId); + const knex = await this.tenantDbService.getTenantKnexById(resolvedTenantId); + + // Get object definition + const objectDef = await ObjectDefinition.query(knex) + .findOne({ apiName: objectApiName }); + + if (!objectDef) { + throw new NotFoundException(`Object ${objectApiName} not found`); + } + + // Check if permission already exists + const existing = await knex('role_object_permissions') + .where({ roleId: data.roleId, objectDefinitionId: objectDef.id }) + .first(); + + if (existing) { + // Update existing permission + await knex('role_object_permissions') + .where({ roleId: data.roleId, objectDefinitionId: objectDef.id }) + .update({ + canCreate: data.canCreate, + canRead: data.canRead, + canEdit: data.canEdit, + canDelete: data.canDelete, + canViewAll: data.canViewAll, + canModifyAll: data.canModifyAll, + updated_at: knex.fn.now(), + }); + } else { + // Create new permission + await knex('role_object_permissions').insert({ + id: knex.raw('(UUID())'), + roleId: data.roleId, + objectDefinitionId: objectDef.id, + canCreate: data.canCreate, + canRead: data.canRead, + canEdit: data.canEdit, + canDelete: data.canDelete, + canViewAll: data.canViewAll, + canModifyAll: data.canModifyAll, + created_at: knex.fn.now(), + updated_at: knex.fn.now(), + }); + } + + return { success: true }; + } } diff --git a/backend/src/object/setup-object.controller.ts b/backend/src/object/setup-object.controller.ts index e090769..426376c 100644 --- a/backend/src/object/setup-object.controller.ts +++ b/backend/src/object/setup-object.controller.ts @@ -97,4 +97,30 @@ export class SetupObjectController { ) { return this.objectService.updateFieldPermission(tenantId, data.roleId, data.fieldDefinitionId, data.canRead, data.canEdit); } + + @Get(':objectApiName/permissions/:roleId') + async getObjectPermissions( + @TenantId() tenantId: string, + @Param('objectApiName') objectApiName: string, + @Param('roleId') roleId: string, + ) { + return this.objectService.getObjectPermissions(tenantId, objectApiName, roleId); + } + + @Put(':objectApiName/permissions') + async updateObjectPermissions( + @TenantId() tenantId: string, + @Param('objectApiName') objectApiName: string, + @Body() data: { + roleId: string; + canCreate: boolean; + canRead: boolean; + canEdit: boolean; + canDelete: boolean; + canViewAll: boolean; + canModifyAll: boolean; + }, + ) { + return this.objectService.updateObjectPermissions(tenantId, objectApiName, data); + } } diff --git a/frontend/components/FieldLevelSecurity.vue b/frontend/components/FieldLevelSecurity.vue index 5f2f3c2..bfa6f6a 100644 --- a/frontend/components/FieldLevelSecurity.vue +++ b/frontend/components/FieldLevelSecurity.vue @@ -15,60 +15,135 @@ No roles available. Create roles first to manage field-level permissions. -
| Field | -- {{ role.name }} - | -||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| - - | Read | -Edit | - -|||||||||||||||||||
|
-
-
- {{ field.label }}
- {{ field.apiName }}
- |
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+ Object-Level Permissions+
+
+
+ Field-Level Permissions+
+
|