Skip to content

Commit d5087fd

Browse files
committed
add very basic /catalogs route
1 parent b8fb415 commit d5087fd

File tree

5 files changed

+100
-0
lines changed

5 files changed

+100
-0
lines changed

compose.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ services:
2323
- BACKEND=elasticsearch
2424
- DATABASE_REFRESH=true
2525
- ENABLE_COLLECTIONS_SEARCH_ROUTE=true
26+
- ENABLE_CATALOG_ROUTE=true
2627
- REDIS_ENABLE=true
2728
- REDIS_HOST=redis
2829
- REDIS_PORT=6379
@@ -62,6 +63,7 @@ services:
6263
- BACKEND=opensearch
6364
- STAC_FASTAPI_RATE_LIMIT=200/minute
6465
- ENABLE_COLLECTIONS_SEARCH_ROUTE=true
66+
- ENABLE_CATALOG_ROUTE=true
6567
- REDIS_ENABLE=true
6668
- REDIS_HOST=redis
6769
- REDIS_PORT=6379

stac_fastapi/core/stac_fastapi/core/extensions/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""elasticsearch extensions modifications."""
22

3+
from .catalogs import CatalogsExtension
34
from .collections_search import CollectionsSearchEndpointExtension
45
from .query import Operator, QueryableTypes, QueryExtension
56

@@ -8,4 +9,5 @@
89
"QueryableTypes",
910
"QueryExtension",
1011
"CollectionsSearchEndpointExtension",
12+
"CatalogsExtension",
1113
]
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
"""Catalogs extension."""
2+
3+
from typing import List, Type, Union
4+
5+
import attr
6+
from fastapi import APIRouter, FastAPI, Request
7+
from fastapi.responses import JSONResponse
8+
from starlette.responses import Response
9+
10+
from stac_fastapi.types.core import BaseCoreClient
11+
from stac_fastapi.types.extension import ApiExtension
12+
from stac_fastapi.types.stac import LandingPage
13+
14+
15+
@attr.s
16+
class CatalogsExtension(ApiExtension):
17+
"""Catalogs Extension.
18+
19+
The Catalogs extension adds a /catalogs endpoint that returns the root catalog.
20+
"""
21+
22+
client: BaseCoreClient = attr.ib(default=None)
23+
settings: dict = attr.ib(default=attr.Factory(dict))
24+
conformance_classes: List[str] = attr.ib(default=attr.Factory(list))
25+
router: APIRouter = attr.ib(default=attr.Factory(APIRouter))
26+
response_class: Type[Response] = attr.ib(default=JSONResponse)
27+
28+
def register(self, app: FastAPI) -> None:
29+
"""Register the extension with a FastAPI application.
30+
31+
Args:
32+
app: target FastAPI application.
33+
34+
Returns:
35+
None
36+
"""
37+
response_model = (
38+
self.settings.get("response_model")
39+
if isinstance(self.settings, dict)
40+
else getattr(self.settings, "response_model", None)
41+
)
42+
43+
self.router.add_api_route(
44+
path="/catalogs",
45+
endpoint=self.catalogs,
46+
methods=["GET"],
47+
response_model=LandingPage if response_model else None,
48+
response_class=self.response_class,
49+
summary="Get Catalogs",
50+
description="Returns the root catalog.",
51+
tags=["Catalogs"],
52+
)
53+
app.include_router(self.router, tags=["Catalogs"])
54+
55+
async def catalogs(self, request: Request) -> Union[LandingPage, Response]:
56+
"""Get catalogs.
57+
58+
Args:
59+
request: Request object.
60+
61+
Returns:
62+
The root catalog (landing page).
63+
"""
64+
return await self.client.landing_page(request=request)

stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
EsAggregationExtensionGetRequest,
2424
EsAggregationExtensionPostRequest,
2525
)
26+
from stac_fastapi.core.extensions.catalogs import CatalogsExtension
2627
from stac_fastapi.core.extensions.collections_search import (
2728
CollectionsSearchEndpointExtension,
2829
)
@@ -65,11 +66,13 @@
6566
ENABLE_COLLECTIONS_SEARCH_ROUTE = get_bool_env(
6667
"ENABLE_COLLECTIONS_SEARCH_ROUTE", default=False
6768
)
69+
ENABLE_CATALOG_ROUTE = get_bool_env("ENABLE_CATALOG_ROUTE", default=False)
6870
logger.info("TRANSACTIONS_EXTENSIONS is set to %s", TRANSACTIONS_EXTENSIONS)
6971
logger.info("ENABLE_COLLECTIONS_SEARCH is set to %s", ENABLE_COLLECTIONS_SEARCH)
7072
logger.info(
7173
"ENABLE_COLLECTIONS_SEARCH_ROUTE is set to %s", ENABLE_COLLECTIONS_SEARCH_ROUTE
7274
)
75+
logger.info("ENABLE_CATALOG_ROUTE is set to %s", ENABLE_CATALOG_ROUTE)
7376

7477
settings = ElasticsearchSettings()
7578
session = Session.create_from_settings(settings)
@@ -202,6 +205,19 @@
202205
extensions.append(collections_search_endpoint_ext)
203206

204207

208+
if ENABLE_CATALOG_ROUTE:
209+
catalogs_extension = CatalogsExtension(
210+
client=CoreClient(
211+
database=database_logic,
212+
session=session,
213+
post_request_model=collection_search_post_request_model,
214+
landing_page_id=os.getenv("STAC_FASTAPI_LANDING_PAGE_ID", "stac-fastapi"),
215+
),
216+
settings=settings,
217+
)
218+
extensions.append(catalogs_extension)
219+
220+
205221
database_logic.extensions = [type(ext).__name__ for ext in extensions]
206222

207223
post_request_model = create_post_request_model(search_extensions)

stac_fastapi/opensearch/stac_fastapi/opensearch/app.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
EsAggregationExtensionGetRequest,
2424
EsAggregationExtensionPostRequest,
2525
)
26+
from stac_fastapi.core.extensions.catalogs import CatalogsExtension
2627
from stac_fastapi.core.extensions.collections_search import (
2728
CollectionsSearchEndpointExtension,
2829
)
@@ -65,11 +66,13 @@
6566
ENABLE_COLLECTIONS_SEARCH_ROUTE = get_bool_env(
6667
"ENABLE_COLLECTIONS_SEARCH_ROUTE", default=False
6768
)
69+
ENABLE_CATALOG_ROUTE = get_bool_env("ENABLE_CATALOG_ROUTE", default=False)
6870
logger.info("TRANSACTIONS_EXTENSIONS is set to %s", TRANSACTIONS_EXTENSIONS)
6971
logger.info("ENABLE_COLLECTIONS_SEARCH is set to %s", ENABLE_COLLECTIONS_SEARCH)
7072
logger.info(
7173
"ENABLE_COLLECTIONS_SEARCH_ROUTE is set to %s", ENABLE_COLLECTIONS_SEARCH_ROUTE
7274
)
75+
logger.info("ENABLE_CATALOG_ROUTE is set to %s", ENABLE_CATALOG_ROUTE)
7376

7477
settings = OpensearchSettings()
7578
session = Session.create_from_settings(settings)
@@ -201,6 +204,19 @@
201204
extensions.append(collections_search_endpoint_ext)
202205

203206

207+
if ENABLE_CATALOG_ROUTE:
208+
catalogs_extension = CatalogsExtension(
209+
client=CoreClient(
210+
database=database_logic,
211+
session=session,
212+
post_request_model=collection_search_post_request_model,
213+
landing_page_id=os.getenv("STAC_FASTAPI_LANDING_PAGE_ID", "stac-fastapi"),
214+
),
215+
settings=settings,
216+
)
217+
extensions.append(catalogs_extension)
218+
219+
204220
database_logic.extensions = [type(ext).__name__ for ext in extensions]
205221

206222
post_request_model = create_post_request_model(search_extensions)

0 commit comments

Comments
 (0)