|
1 | 1 | """Adapters for data connectors database classes.""" |
2 | 2 |
|
3 | | -from collections.abc import Callable |
| 3 | +from collections.abc import AsyncIterator, Callable |
4 | 4 | from typing import TypeVar |
5 | 5 |
|
6 | 6 | from cryptography.hazmat.primitives.asymmetric import rsa |
@@ -477,11 +477,44 @@ def __init__( |
477 | 477 | data_connector_repo: DataConnectorRepository, |
478 | 478 | user_repo: UserRepo, |
479 | 479 | secret_service_public_key: rsa.RSAPublicKey, |
| 480 | + authz: Authz, |
480 | 481 | ) -> None: |
481 | 482 | self.session_maker = session_maker |
482 | 483 | self.data_connector_repo = data_connector_repo |
483 | 484 | self.user_repo = user_repo |
484 | 485 | self.secret_service_public_key = secret_service_public_key |
| 486 | + self.authz = authz |
| 487 | + |
| 488 | + async def get_data_connectors_with_secrets( |
| 489 | + self, |
| 490 | + user: base_models.APIUser, |
| 491 | + project_id: ULID, |
| 492 | + ) -> AsyncIterator[models.DataConnectorWithSecrets]: |
| 493 | + """Get all data connectors and their secrets for a project.""" |
| 494 | + if user.id is None: |
| 495 | + raise errors.UnauthorizedError(message="You do not have the required permissions for this operation.") |
| 496 | + |
| 497 | + can_read_project = await self.authz.has_permission(user, ResourceType.project, project_id, Scope.READ) |
| 498 | + if not can_read_project: |
| 499 | + raise errors.MissingResourceError( |
| 500 | + message=f"The project ID with {project_id} does not exist or you dont have permission to access it" |
| 501 | + ) |
| 502 | + |
| 503 | + data_connector_ids = await self.authz.resources_with_permission( |
| 504 | + user, user.id, ResourceType.data_connector, Scope.READ |
| 505 | + ) |
| 506 | + |
| 507 | + async with self.session_maker() as session: |
| 508 | + stmt = select(schemas.DataConnectorORM).where( |
| 509 | + schemas.DataConnectorORM.project_links.any( |
| 510 | + schemas.DataConnectorToProjectLinkORM.project_id == project_id |
| 511 | + ), |
| 512 | + schemas.DataConnectorORM.id.in_(data_connector_ids), |
| 513 | + ) |
| 514 | + results = await session.stream_scalars(stmt) |
| 515 | + async for dc in results: |
| 516 | + secrets = await self.get_data_connector_secrets(user, dc.id) |
| 517 | + yield models.DataConnectorWithSecrets(dc.dump(), secrets) |
485 | 518 |
|
486 | 519 | async def get_data_connector_secrets( |
487 | 520 | self, |
|
0 commit comments