|
1 | 1 | """FastAPI application.""" |
2 | 2 |
|
| 3 | +import logging |
3 | 4 | import os |
4 | 5 | from contextlib import asynccontextmanager |
5 | 6 |
|
|
21 | 22 | from stac_fastapi.core.rate_limit import setup_rate_limit |
22 | 23 | from stac_fastapi.core.route_dependencies import get_route_dependencies |
23 | 24 | from stac_fastapi.core.session import Session |
| 25 | +from stac_fastapi.core.utilities import get_bool_env |
24 | 26 | from stac_fastapi.extensions.core import ( |
25 | 27 | AggregationExtension, |
26 | 28 | CollectionSearchExtension, |
|
46 | 48 | from stac_fastapi.sfeos_helpers.aggregation import EsAsyncBaseAggregationClient |
47 | 49 | from stac_fastapi.sfeos_helpers.filter import EsAsyncBaseFiltersClient |
48 | 50 |
|
| 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 | + |
49 | 57 | settings = OpensearchSettings() |
50 | 58 | session = Session.create_from_settings(settings) |
51 | 59 |
|
|
55 | 63 | client=EsAsyncBaseFiltersClient(database=database_logic) |
56 | 64 | ) |
57 | 65 | filter_extension.conformance_classes.append( |
58 | | - "http://www.opengis.net/spec/cql2/1.0/conf/advanced-comparison-operators" |
| 66 | + FilterConformanceClasses.ADVANCED_COMPARISON_OPERATORS |
59 | 67 | ) |
60 | | - |
61 | 68 | aggregation_extension = AggregationExtension( |
62 | 69 | client=EsAsyncBaseAggregationClient( |
63 | 70 | database=database_logic, session=session, settings=settings |
|
66 | 73 | aggregation_extension.POST = EsAggregationExtensionPostRequest |
67 | 74 | aggregation_extension.GET = EsAggregationExtensionGetRequest |
68 | 75 |
|
| 76 | +# Base search extensions (without CollectionSearchExtension to avoid duplicates) |
69 | 77 | 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(), |
84 | 78 | FieldsExtension(), |
85 | 79 | QueryExtension(), |
86 | 80 | SortExtension(), |
|
89 | 83 | FreeTextExtension(), |
90 | 84 | ] |
91 | 85 |
|
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 | + ) |
93 | 106 |
|
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 |
95 | 110 |
|
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( |
104 | 117 | conformance_classes=[FilterConformanceClasses.COLLECTIONS] |
105 | 118 | ), |
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]), |
119 | 120 | ] |
120 | 121 |
|
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) |
125 | 129 |
|
126 | 130 | database_logic.extensions = [type(ext).__name__ for ext in extensions] |
127 | 131 |
|
@@ -168,7 +172,7 @@ def run() -> None: |
168 | 172 | import uvicorn |
169 | 173 |
|
170 | 174 | uvicorn.run( |
171 | | - "stac_fastapi.elasticsearch.app:app", |
| 175 | + "stac_fastapi.opensearch.app:app", |
172 | 176 | host=settings.app_host, |
173 | 177 | port=settings.app_port, |
174 | 178 | log_level="info", |
|
0 commit comments