Skip to content

Commit 90f25de

Browse files
committed
reorg
1 parent 898baf6 commit 90f25de

File tree

3 files changed

+89
-122
lines changed

3 files changed

+89
-122
lines changed

stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@
7373
aggregation_extension.POST = EsAggregationExtensionPostRequest
7474
aggregation_extension.GET = EsAggregationExtensionGetRequest
7575

76+
# Base search extensions (without CollectionSearchExtension to avoid duplicates)
7677
search_extensions = [
77-
CollectionSearchExtension(),
7878
FieldsExtension(),
7979
QueryExtension(),
8080
SortExtension(),
@@ -104,37 +104,28 @@
104104
),
105105
)
106106

107+
# Initialize extensions with just the search and aggregation extensions
108+
# Initialize with base extensions
107109
extensions = [aggregation_extension] + search_extensions
108110

109-
# Define the collection search extensions map
110-
cs_extensions_map = {
111-
"query": QueryExtension(conformance_classes=[QueryConformanceClasses.COLLECTIONS]),
112-
"sort": SortExtension(conformance_classes=[SortConformanceClasses.COLLECTIONS]),
113-
"fields": FieldsExtension(
114-
conformance_classes=[FieldsConformanceClasses.COLLECTIONS]
115-
),
116-
"filter": CollectionSearchFilterExtension(
111+
# Create collection search extensions
112+
collection_search_extensions = [
113+
QueryExtension(conformance_classes=[QueryConformanceClasses.COLLECTIONS]),
114+
SortExtension(conformance_classes=[SortConformanceClasses.COLLECTIONS]),
115+
FieldsExtension(conformance_classes=[FieldsConformanceClasses.COLLECTIONS]),
116+
CollectionSearchFilterExtension(
117117
conformance_classes=[FilterConformanceClasses.COLLECTIONS]
118118
),
119-
"free_text": FreeTextExtension(
120-
conformance_classes=[FreeTextConformanceClasses.COLLECTIONS],
121-
),
122-
}
123-
124-
# Determine enabled extensions (customize as needed)
125-
enabled_extensions = set(cs_extensions_map.keys())
126-
127-
# Build the enabled collection search extensions
128-
cs_extensions = [
129-
extension
130-
for key, extension in cs_extensions_map.items()
131-
if key in enabled_extensions
119+
FreeTextExtension(conformance_classes=[FreeTextConformanceClasses.COLLECTIONS]),
132120
]
133121

134-
# Create the CollectionSearchExtension from the enabled extensions
135-
collection_search_extension = CollectionSearchExtension.from_extensions(cs_extensions)
136-
collections_get_request_model = collection_search_extension.GET
137-
extensions.append(collection_search_extension)
122+
# Initialize collection search with its extensions
123+
collection_search_ext = CollectionSearchExtension.from_extensions(
124+
collection_search_extensions
125+
)
126+
collections_get_request_model = collection_search_ext.GET
127+
128+
extensions.append(collection_search_ext)
138129

139130
database_logic.extensions = [type(ext).__name__ for ext in extensions]
140131

stac_fastapi/opensearch/stac_fastapi/opensearch/app.py

Lines changed: 48 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""FastAPI application."""
22

3+
import logging
34
import os
45
from contextlib import asynccontextmanager
56

@@ -21,6 +22,7 @@
2122
from stac_fastapi.core.rate_limit import setup_rate_limit
2223
from stac_fastapi.core.route_dependencies import get_route_dependencies
2324
from stac_fastapi.core.session import Session
25+
from stac_fastapi.core.utilities import get_bool_env
2426
from stac_fastapi.extensions.core import (
2527
AggregationExtension,
2628
CollectionSearchExtension,
@@ -46,6 +48,12 @@
4648
from stac_fastapi.sfeos_helpers.aggregation import EsAsyncBaseAggregationClient
4749
from stac_fastapi.sfeos_helpers.filter import EsAsyncBaseFiltersClient
4850

51+
logging.basicConfig(level=logging.INFO)
52+
logger = logging.getLogger(__name__)
53+
54+
TRANSACTIONS_EXTENSIONS = get_bool_env("ENABLE_TRANSACTIONS_EXTENSIONS", default=True)
55+
logger.info("TRANSACTIONS_EXTENSIONS is set to %s", TRANSACTIONS_EXTENSIONS)
56+
4957
settings = OpensearchSettings()
5058
session = Session.create_from_settings(settings)
5159

@@ -55,9 +63,8 @@
5563
client=EsAsyncBaseFiltersClient(database=database_logic)
5664
)
5765
filter_extension.conformance_classes.append(
58-
"http://www.opengis.net/spec/cql2/1.0/conf/advanced-comparison-operators"
66+
FilterConformanceClasses.ADVANCED_COMPARISON_OPERATORS
5967
)
60-
6168
aggregation_extension = AggregationExtension(
6269
client=EsAsyncBaseAggregationClient(
6370
database=database_logic, session=session, settings=settings
@@ -66,21 +73,8 @@
6673
aggregation_extension.POST = EsAggregationExtensionPostRequest
6774
aggregation_extension.GET = EsAggregationExtensionGetRequest
6875

76+
# Base search extensions (without CollectionSearchExtension to avoid duplicates)
6977
search_extensions = [
70-
TransactionExtension(
71-
client=TransactionsClient(
72-
database=database_logic, session=session, settings=settings
73-
),
74-
settings=settings,
75-
),
76-
BulkTransactionExtension(
77-
client=BulkTransactionsClient(
78-
database=database_logic,
79-
session=session,
80-
settings=settings,
81-
)
82-
),
83-
CollectionSearchExtension(),
8478
FieldsExtension(),
8579
QueryExtension(),
8680
SortExtension(),
@@ -89,39 +83,49 @@
8983
FreeTextExtension(),
9084
]
9185

92-
extensions = [aggregation_extension] + search_extensions
86+
if TRANSACTIONS_EXTENSIONS:
87+
search_extensions.insert(
88+
0,
89+
TransactionExtension(
90+
client=TransactionsClient(
91+
database=database_logic, session=session, settings=settings
92+
),
93+
settings=settings,
94+
),
95+
)
96+
search_extensions.insert(
97+
1,
98+
BulkTransactionExtension(
99+
client=BulkTransactionsClient(
100+
database=database_logic,
101+
session=session,
102+
settings=settings,
103+
)
104+
),
105+
)
93106

94-
post_request_model = create_post_request_model(search_extensions)
107+
# Initialize extensions with just the search and aggregation extensions
108+
# Initialize with base extensions
109+
extensions = [aggregation_extension] + search_extensions
95110

96-
# Define the collection search extensions map
97-
cs_extensions_map = {
98-
"query": QueryExtension(conformance_classes=[QueryConformanceClasses.COLLECTIONS]),
99-
"sort": SortExtension(conformance_classes=[SortConformanceClasses.COLLECTIONS]),
100-
"fields": FieldsExtension(
101-
conformance_classes=[FieldsConformanceClasses.COLLECTIONS]
102-
),
103-
"filter": CollectionSearchFilterExtension(
111+
# Create collection search extensions
112+
collection_search_extensions = [
113+
QueryExtension(conformance_classes=[QueryConformanceClasses.COLLECTIONS]),
114+
SortExtension(conformance_classes=[SortConformanceClasses.COLLECTIONS]),
115+
FieldsExtension(conformance_classes=[FieldsConformanceClasses.COLLECTIONS]),
116+
CollectionSearchFilterExtension(
104117
conformance_classes=[FilterConformanceClasses.COLLECTIONS]
105118
),
106-
"free_text": FreeTextExtension(
107-
conformance_classes=[FreeTextConformanceClasses.COLLECTIONS],
108-
),
109-
}
110-
111-
# Determine enabled extensions (customize as needed)
112-
enabled_extensions = set(cs_extensions_map.keys())
113-
114-
# Build the enabled collection search extensions
115-
cs_extensions = [
116-
extension
117-
for key, extension in cs_extensions_map.items()
118-
if key in enabled_extensions
119+
FreeTextExtension(conformance_classes=[FreeTextConformanceClasses.COLLECTIONS]),
119120
]
120121

121-
# Create the CollectionSearchExtension from the enabled extensions
122-
collection_search_extension = CollectionSearchExtension.from_extensions(cs_extensions)
123-
collections_get_request_model = collection_search_extension.GET
124-
extensions.append(collection_search_extension)
122+
# Initialize collection search with its extensions
123+
collection_search_ext = CollectionSearchExtension.from_extensions(
124+
collection_search_extensions
125+
)
126+
collections_get_request_model = collection_search_ext.GET
127+
128+
extensions.append(collection_search_ext)
125129

126130
database_logic.extensions = [type(ext).__name__ for ext in extensions]
127131

@@ -168,7 +172,7 @@ def run() -> None:
168172
import uvicorn
169173

170174
uvicorn.run(
171-
"stac_fastapi.elasticsearch.app:app",
175+
"stac_fastapi.opensearch.app:app",
172176
host=settings.app_host,
173177
port=settings.app_port,
174178
log_level="info",

stac_fastapi/tests/conftest.py

Lines changed: 24 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,9 @@
1818
CoreClient,
1919
TransactionsClient,
2020
)
21-
from stac_fastapi.core.extensions import QueryExtension
22-
from stac_fastapi.core.extensions.aggregation import (
23-
EsAggregationExtensionGetRequest,
24-
EsAggregationExtensionPostRequest,
25-
)
2621
from stac_fastapi.core.rate_limit import setup_rate_limit
2722
from stac_fastapi.core.utilities import get_bool_env
28-
from stac_fastapi.sfeos_helpers.aggregation import EsAsyncBaseAggregationClient
23+
from stac_fastapi.extensions.third_party import BulkTransactionExtension
2924

3025
if os.getenv("BACKEND", "elasticsearch").lower() == "opensearch":
3126
from stac_fastapi.opensearch.app import app_config
@@ -50,15 +45,7 @@
5045
create_index_templates,
5146
)
5247

53-
from stac_fastapi.extensions.core import (
54-
AggregationExtension,
55-
FieldsExtension,
56-
FilterExtension,
57-
FreeTextExtension,
58-
SortExtension,
59-
TokenPaginationExtension,
60-
TransactionExtension,
61-
)
48+
from stac_fastapi.extensions.core import TransactionExtension
6249
from stac_fastapi.types.config import Settings
6350

6451
DATA_DIR = os.path.join(os.path.dirname(__file__), "data")
@@ -340,56 +327,41 @@ async def route_dependencies_client(route_dependencies_app):
340327

341328
def build_test_app():
342329
"""Build a test app with configurable transaction extensions."""
343-
# Create a copy of the base config
330+
# Create a copy of the base config which already has all extensions configured
344331
test_config = app_config.copy()
345332

346333
# Get transaction extensions setting
347334
TRANSACTIONS_EXTENSIONS = get_bool_env(
348335
"ENABLE_TRANSACTIONS_EXTENSIONS", default=True
349336
)
350337

351-
# Configure extensions
352-
settings = AsyncSettings()
353-
aggregation_extension = AggregationExtension(
354-
client=EsAsyncBaseAggregationClient(
355-
database=database, session=None, settings=settings
356-
)
357-
)
358-
aggregation_extension.POST = EsAggregationExtensionPostRequest
359-
aggregation_extension.GET = EsAggregationExtensionGetRequest
360-
361-
search_extensions = [
362-
SortExtension(),
363-
FieldsExtension(),
364-
QueryExtension(),
365-
TokenPaginationExtension(),
366-
FilterExtension(),
367-
FreeTextExtension(),
368-
]
338+
# First remove any existing transaction extensions
339+
if "extensions" in test_config:
340+
test_config["extensions"] = [
341+
ext
342+
for ext in test_config["extensions"]
343+
if not isinstance(ext, (TransactionExtension, BulkTransactionExtension))
344+
]
369345

370346
# Add transaction extension if enabled
371347
if TRANSACTIONS_EXTENSIONS:
372-
search_extensions.append(
373-
TransactionExtension(
374-
client=TransactionsClient(
375-
database=database, session=None, settings=settings
348+
settings = AsyncSettings()
349+
test_config["extensions"].extend(
350+
[
351+
TransactionExtension(
352+
client=TransactionsClient(
353+
database=database, session=None, settings=settings
354+
),
355+
settings=settings,
356+
),
357+
BulkTransactionExtension(
358+
client=BulkTransactionsClient(
359+
database=database, session=None, settings=settings
360+
)
376361
),
377-
settings=settings,
378-
)
362+
]
379363
)
380364

381-
# Update extensions in config
382-
extensions = [aggregation_extension] + search_extensions
383-
test_config["extensions"] = extensions
384-
385-
# Update client with new extensions
386-
test_config["client"] = CoreClient(
387-
database=database,
388-
session=None,
389-
extensions=extensions,
390-
post_request_model=test_config["search_post_request_model"],
391-
)
392-
393365
# Create and return the app
394366
api = StacApi(**test_config)
395367
return api.app

0 commit comments

Comments
 (0)