99import com .dbaagent .service .QueryExecutorService ;
1010import com .dbaagent .service .SqlExecutionAuditService ;
1111import com .dbaagent .service .UserDataAccessPolicyException ;
12+ import com .dbaagent .service .UserDataAccessPolicyService ;
1213import com .dbaagent .service .SchemaScannerService ;
1314import com .dbaagent .service .VisualizationService ;
1415import com .dbaagent .service .security .AccessControlService ;
@@ -36,6 +37,7 @@ public class SchemaController {
3637 private final QueryExecutorService queryExecutorService ;
3738 private final AccessControlService accessControlService ;
3839 private final SqlExecutionAuditService sqlExecutionAuditService ;
40+ private final UserDataAccessPolicyService userDataAccessPolicyService ;
3941
4042 @ PostMapping ("/scan" )
4143 public ResponseEntity <Map <String , Object >> scanSchema (@ PathVariable String connectionId ) {
@@ -48,7 +50,7 @@ public ResponseEntity<Map<String, Object>> scanSchema(@PathVariable String conne
4850 }
4951 accessControlService .assertCanUseChatEditor (connectionId );
5052
51- SchemaMetadata schema = schemaScannerService .scanSchema (connectionId );
53+ SchemaMetadata schema = scopedSchema ( connectionId , schemaScannerService .scanSchema (connectionId ) );
5254 response .put ("success" , true );
5355 response .put ("schema" , schema );
5456 return ResponseEntity .ok (response );
@@ -78,7 +80,7 @@ public ResponseEntity<Map<String, Object>> getSchema(@PathVariable String connec
7880 }
7981 accessControlService .assertCanUseChatEditor (connectionId );
8082
81- SchemaMetadata schema = schemaScannerService .scanSchema (connectionId );
83+ SchemaMetadata schema = scopedSchema ( connectionId , schemaScannerService .scanSchema (connectionId ) );
8284 response .put ("success" , true );
8385 response .put ("schema" , schema );
8486 return ResponseEntity .ok (response );
@@ -108,7 +110,7 @@ public ResponseEntity<Map<String, Object>> getVisualization(@PathVariable String
108110 }
109111 accessControlService .assertCanUseChatEditor (connectionId );
110112
111- SchemaMetadata schema = schemaScannerService .scanSchema (connectionId );
113+ SchemaMetadata schema = scopedSchema ( connectionId , schemaScannerService .scanSchema (connectionId ) );
112114 ErDiagramData erDiagram = visualizationService .generateErDiagram (schema , connectionId );
113115 DependencyGraphData dependencyGraph = visualizationService .generateDependencyGraph (schema , connectionId );
114116
@@ -143,7 +145,10 @@ public ResponseEntity<Map<String, Object>> getDatabaseObjects(@PathVariable Stri
143145 }
144146 accessControlService .assertCanUseChatEditor (connectionId );
145147
146- List <DatabaseObject > objects = queryExecutorService .getDatabaseObjects (connectionId );
148+ List <DatabaseObject > objects = scopedObjects (
149+ connectionId ,
150+ queryExecutorService .getDatabaseObjects (connectionId )
151+ );
147152 log .info ("Successfully fetched {} database objects for connection: {}" , objects .size (), connectionId );
148153 response .put ("success" , true );
149154 response .put ("objects" , objects );
@@ -273,6 +278,12 @@ public ResponseEntity<Map<String, Object>> getTableIndexes(
273278 return ResponseEntity .status (HttpStatus .NOT_FOUND ).body (response );
274279 }
275280 accessControlService .assertCanUseChatEditor (connectionId );
281+ userDataAccessPolicyService .assertTableSchemaAllowed (
282+ connectionId ,
283+ accessControlService .getCurrentUsername (),
284+ accessControlService .isCurrentUserAdmin (),
285+ tableName
286+ );
276287
277288 List <TableIndex > indexes = queryExecutorService .getTableIndexes (connectionId , tableName );
278289 response .put ("success" , true );
@@ -282,6 +293,11 @@ public ResponseEntity<Map<String, Object>> getTableIndexes(
282293 response .put ("success" , false );
283294 response .put ("message" , "Failed to fetch table indexes: " + e .getMessage ());
284295 return ResponseEntity .status (HttpStatus .INTERNAL_SERVER_ERROR ).body (response );
296+ } catch (UserDataAccessPolicyException e ) {
297+ response .put ("success" , false );
298+ response .put ("message" , e .getMessage ());
299+ response .put ("errorCode" , e .getErrorCode ());
300+ return ResponseEntity .status (HttpStatus .FORBIDDEN ).body (response );
285301 } catch (ResponseStatusException e ) {
286302 response .put ("success" , false );
287303 response .put ("message" , e .getReason ());
@@ -305,6 +321,12 @@ public ResponseEntity<Map<String, Object>> getTableStats(
305321 return ResponseEntity .status (HttpStatus .NOT_FOUND ).body (response );
306322 }
307323 accessControlService .assertCanUseChatEditor (connectionId );
324+ userDataAccessPolicyService .assertTableSchemaAllowed (
325+ connectionId ,
326+ accessControlService .getCurrentUsername (),
327+ accessControlService .isCurrentUserAdmin (),
328+ tableName
329+ );
308330
309331 TableStats stats = queryExecutorService .getTableStats (connectionId , tableName );
310332 response .put ("success" , true );
@@ -314,6 +336,11 @@ public ResponseEntity<Map<String, Object>> getTableStats(
314336 response .put ("success" , false );
315337 response .put ("message" , "Failed to fetch table stats: " + e .getMessage ());
316338 return ResponseEntity .status (HttpStatus .INTERNAL_SERVER_ERROR ).body (response );
339+ } catch (UserDataAccessPolicyException e ) {
340+ response .put ("success" , false );
341+ response .put ("message" , e .getMessage ());
342+ response .put ("errorCode" , e .getErrorCode ());
343+ return ResponseEntity .status (HttpStatus .FORBIDDEN ).body (response );
317344 } catch (ResponseStatusException e ) {
318345 response .put ("success" , false );
319346 response .put ("message" , e .getReason ());
@@ -324,4 +351,22 @@ public ResponseEntity<Map<String, Object>> getTableStats(
324351 return ResponseEntity .status (HttpStatus .INTERNAL_SERVER_ERROR ).body (response );
325352 }
326353 }
354+
355+ private SchemaMetadata scopedSchema (String connectionId , SchemaMetadata schema ) {
356+ return userDataAccessPolicyService .filterSchemaMetadata (
357+ connectionId ,
358+ accessControlService .getCurrentUsername (),
359+ accessControlService .isCurrentUserAdmin (),
360+ schema
361+ );
362+ }
363+
364+ private List <DatabaseObject > scopedObjects (String connectionId , List <DatabaseObject > objects ) {
365+ return userDataAccessPolicyService .filterDatabaseObjects (
366+ connectionId ,
367+ accessControlService .getCurrentUsername (),
368+ accessControlService .isCurrentUserAdmin (),
369+ objects
370+ );
371+ }
327372}
0 commit comments