Skip to content

Commit 58cdc16

Browse files
feat: BI-6681 add connection source listing options handler (#1294)
* feat: BI-6681 add connection source listing options handler * fix * fix test * put class names in order
1 parent 626d775 commit 58cdc16

File tree

3 files changed

+57
-0
lines changed

3 files changed

+57
-0
lines changed

lib/dl_api_lib/dl_api_lib/app/control_api/resources/connections.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
ConnectionDBNamesResponseSchema,
2929
ConnectionExportResponseSchema,
3030
ConnectionImportRequestSchema,
31+
ConnectionInfoSourceListingOptionsResponseSchema,
3132
ConnectionInfoSourceSchemaQuerySchema,
3233
ConnectionInfoSourceSchemaResponseSchema,
3334
ConnectionItemQuerySchema,
@@ -56,6 +57,7 @@
5657
from dl_core.us_connection_base import (
5758
ConnectionBase,
5859
DataSourceTemplate,
60+
ListingOptions,
5961
)
6062

6163

@@ -406,6 +408,41 @@ def get(self, connection_id: str) -> dict[str, list[str]]:
406408
}
407409

408410

411+
@ns.route("/<connection_id>/info/source_listing_options")
412+
class ConnectionInfoSourceListingOptions(BIResource):
413+
@schematic_request(
414+
ns=ns,
415+
responses={
416+
200: ("Success", ConnectionInfoSourceListingOptionsResponseSchema()),
417+
400: ("Failed", BadRequestResponseSchema()),
418+
},
419+
)
420+
def get(self, connection_id: str) -> dict:
421+
connection = self.get_us_manager().get_by_id(connection_id, expected_type=ConnectionBase)
422+
423+
service_registry = self.get_service_registry()
424+
localizer = service_registry.get_localizer()
425+
426+
# It does not matter what options we provide if the user does not have sufficient permissions,
427+
# because the listing itself will not attempt to list actual DB sources, see `/info/sources`
428+
listing_options = ListingOptions(
429+
supports_source_search=False,
430+
supports_source_pagination=False,
431+
supports_db_name_listing=False,
432+
db_name_required_for_search=False,
433+
db_name_label=None,
434+
)
435+
try:
436+
need_permission_on_entry(connection, USPermissionKind.read)
437+
except USPermissionRequired:
438+
pass
439+
else:
440+
localizer = service_registry.get_localizer()
441+
listing_options = connection.get_listing_options(localizer)
442+
443+
return {"source_listing": listing_options}
444+
445+
409446
@ns.route("/<connection_id>/info/sources")
410447
class ConnectionInfoSources(BIResource):
411448
@schematic_request(

lib/dl_api_lib/dl_api_lib/schemas/connection.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
RawSchemaColumnSchema,
2020
)
2121
from dl_api_lib.schemas.main import NotificationContentSchema
22+
from dl_api_lib.schemas.options import SourceListingSchema
2223
from dl_constants.enums import ConnectionType as CT
2324
from dl_core.us_connection_base import (
2425
ConnectionBase,
@@ -45,6 +46,10 @@ class ConnectionInfoSourceSchemaQuerySchema(BaseSchema):
4546
source = ma_fields.Nested(DataSourceSchema, required=True)
4647

4748

49+
class ConnectionInfoSourceListingOptionsResponseSchema(BaseSchema):
50+
source_listing = ma_fields.Nested(SourceListingSchema)
51+
52+
4853
class ConnectionSourceTemplatesResponseSchema(BaseSchema):
4954
# # Complete:
5055
# sources = ma_fields.Nested(DataSourceTemplateResponseSchema, many=True)

lib/dl_api_lib_testing/dl_api_lib_testing/connector/connection_suite.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,21 @@ def test_connection_sources(
286286
assert "sources" in resp_data, resp_data
287287
assert isinstance(resp_data["sources"], list), resp_data
288288

289+
def test_connection_source_listing_options(
290+
self,
291+
control_api_sync_client: SyncHttpClientBase,
292+
saved_connection_id: str,
293+
bi_headers: dict[str, str] | None,
294+
) -> None:
295+
resp = control_api_sync_client.get(
296+
url=f"/api/v1/connections/{saved_connection_id}/info/source_listing_options",
297+
headers=bi_headers,
298+
)
299+
assert resp.status_code == 200, resp.json
300+
resp_data = resp.json
301+
assert "source_listing" in resp_data, resp_data
302+
assert isinstance(resp_data["source_listing"], dict), resp_data
303+
289304
def test_connection_description(
290305
self,
291306
control_api_sync_client: SyncHttpClientBase,

0 commit comments

Comments
 (0)