Skip to content

Commit 58f2985

Browse files
Merge pull request #23 from developmentseed/feature/stac-custom-client
[STAC] custom pgstac client for landing page
2 parents aca78eb + d196c24 commit 58f2985

File tree

2 files changed

+95
-2
lines changed

2 files changed

+95
-2
lines changed

runtimes/eoapi/stac/eoapi/stac/app.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
from stac_fastapi.extensions.core.query import QueryConformanceClasses
3333
from stac_fastapi.extensions.core.sort import SortConformanceClasses
3434
from stac_fastapi.extensions.third_party import BulkTransactionExtension
35-
from stac_fastapi.pgstac.core import CoreCrudClient
3635
from stac_fastapi.pgstac.db import close_db_connection, connect_to_db
3736
from stac_fastapi.pgstac.extensions import QueryExtension
3837
from stac_fastapi.pgstac.extensions.filter import FiltersClient
@@ -45,6 +44,7 @@
4544
from starlette.templating import Jinja2Templates
4645
from starlette_cramjam.middleware import CompressionMiddleware
4746

47+
from .client import PgSTACClient
4848
from .config import ApiSettings
4949
from .extension import TiTilerExtension
5050
from .logs import init_logging
@@ -206,7 +206,7 @@ async def lifespan(app: FastAPI):
206206
description=api_settings.name,
207207
settings=settings,
208208
extensions=application_extensions,
209-
client=CoreCrudClient(pgstac_search_model=post_request_model),
209+
client=PgSTACClient(pgstac_search_model=post_request_model),
210210
items_get_request_model=items_get_request_model,
211211
search_get_request_model=get_request_model,
212212
search_post_request_model=post_request_model,
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
"""eoapi-devseed: Custom pgstac client."""
2+
3+
from typing import Type
4+
from urllib.parse import urljoin
5+
6+
import attr
7+
from fastapi import Request
8+
from stac_fastapi.pgstac.core import CoreCrudClient
9+
from stac_fastapi.pgstac.types.search import PgstacSearch
10+
from stac_fastapi.types.requests import get_base_url
11+
from stac_fastapi.types.stac import LandingPage
12+
from stac_pydantic.links import Relations
13+
from stac_pydantic.shared import MimeTypes
14+
15+
16+
@attr.s
17+
class PgSTACClient(CoreCrudClient):
18+
pgstac_search_model: Type[PgstacSearch] = attr.ib(default=PgstacSearch)
19+
20+
async def landing_page(
21+
self,
22+
request: Request,
23+
**kwargs,
24+
) -> LandingPage:
25+
"""Landing page.
26+
27+
Called with `GET /`.
28+
29+
Returns:
30+
API landing page, serving as an entry point to the API.
31+
32+
"""
33+
base_url = get_base_url(request)
34+
35+
landing_page = self._landing_page(
36+
base_url=base_url,
37+
conformance_classes=self.conformance_classes(),
38+
extension_schemas=[],
39+
)
40+
41+
# Add Queryables link
42+
if self.extension_is_enabled("FilterExtension") or self.extension_is_enabled(
43+
"SearchFilterExtension"
44+
):
45+
landing_page["links"].append(
46+
{
47+
"rel": Relations.queryables.value,
48+
"type": MimeTypes.jsonschema.value,
49+
"title": "Queryables",
50+
"href": urljoin(base_url, "queryables"),
51+
}
52+
)
53+
54+
# Add Aggregation links
55+
if self.extension_is_enabled("AggregationExtension"):
56+
landing_page["links"].extend(
57+
[
58+
{
59+
"rel": "aggregate",
60+
"type": "application/json",
61+
"title": "Aggregate",
62+
"href": urljoin(base_url, "aggregate"),
63+
},
64+
{
65+
"rel": "aggregations",
66+
"type": "application/json",
67+
"title": "Aggregations",
68+
"href": urljoin(base_url, "aggregations"),
69+
},
70+
]
71+
)
72+
73+
# Add OpenAPI URL
74+
landing_page["links"].append(
75+
{
76+
"rel": Relations.service_desc.value,
77+
"type": MimeTypes.openapi.value,
78+
"title": "OpenAPI service description",
79+
"href": str(request.url_for("openapi")),
80+
}
81+
)
82+
83+
# Add human readable service-doc
84+
landing_page["links"].append(
85+
{
86+
"rel": Relations.service_doc.value,
87+
"type": MimeTypes.html.value,
88+
"title": "OpenAPI service documentation",
89+
"href": str(request.url_for("swagger_ui_html")),
90+
}
91+
)
92+
93+
return LandingPage(**landing_page)

0 commit comments

Comments
 (0)