Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 2 additions & 33 deletions stac_fastapi/eodag/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
from stac_fastapi.extensions.core.sort import SortConformanceClasses
from starlette.middleware.cors import CORSMiddleware

from eodag.types.stac_metadata import create_stac_metadata_model
from stac_fastapi.eodag.config import get_settings
from stac_fastapi.eodag.core import EodagCoreClient
from stac_fastapi.eodag.dag import init_dag
Expand All @@ -58,26 +59,10 @@
CollectionOrderExtension,
)
from stac_fastapi.eodag.extensions.data_download import DataDownload
from stac_fastapi.eodag.extensions.ecmwf import EcmwfExtension
from stac_fastapi.eodag.extensions.filter import FiltersClient
from stac_fastapi.eodag.extensions.offset_pagination import OffsetPaginationExtension
from stac_fastapi.eodag.extensions.stac import (
ElectroOpticalExtension,
FederationExtension,
LabelExtension,
OrderExtension,
ProcessingExtension,
ProductExtension,
SarExtension,
SatelliteExtension,
ScientificCitationExtension,
StorageExtension,
TimestampExtension,
ViewGeometryExtension,
)
from stac_fastapi.eodag.logs import RequestIDMiddleware, init_logging
from stac_fastapi.eodag.middlewares import ProxyHeaderMiddleware
from stac_fastapi.eodag.models.stac_metadata import create_stac_metadata_model

if TYPE_CHECKING:
from typing import AsyncGenerator
Expand All @@ -86,23 +71,7 @@

settings = get_settings()

stac_metadata_model = create_stac_metadata_model(
extensions=[
SarExtension(),
SatelliteExtension(),
TimestampExtension(),
ProcessingExtension(),
ViewGeometryExtension(),
ElectroOpticalExtension(),
FederationExtension(),
ScientificCitationExtension(),
ProductExtension(),
StorageExtension(),
OrderExtension(),
EcmwfExtension(),
LabelExtension(),
]
)
stac_metadata_model = create_stac_metadata_model()

# search extensions
search_extensions_map = {
Expand Down
35 changes: 18 additions & 17 deletions stac_fastapi/eodag/core.py
Comment thread
sbrunato marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
from eodag.api.collection import Collection as EodagCollection
from eodag.api.collection import CollectionsList
from eodag.plugins.search.build_search_result import ECMWFSearch
from eodag.types.stac_metadata import CommonStacMetadata
from eodag.utils import deepcopy, get_geometry_from_various
from eodag.utils.exceptions import NoMatchingCollection as EodagNoMatchingCollection
from stac_fastapi.eodag.client import CustomCoreClient
Expand All @@ -59,7 +60,6 @@
ItemCollectionLinks,
PagingLinks,
)
from stac_fastapi.eodag.models.stac_metadata import CommonStacMetadata
from stac_fastapi.eodag.utils import (
check_poly_is_point,
dt_range_to_eodag,
Expand Down Expand Up @@ -87,7 +87,7 @@ class EodagCoreClient(CustomCoreClient):
""""""

post_request_model: type[BaseModel] = attr.ib(default=BaseSearchPostRequest)
stac_metadata_model: type[CommonStacMetadata] = attr.ib(default=CommonStacMetadata)
stac_metadata_model: type[BaseModel] = attr.ib(default=CommonStacMetadata)

def _get_collection(
self, collection: EodagCollection, request: Request, collections_providers: dict[str, set]
Expand Down Expand Up @@ -159,13 +159,14 @@ def has_ecmwf_search_plugin(federation_backends, request):
extended_coll_links = extended_collection.get("links", [])
extended_collection["links"] = CollectionLinks(
collection_id=extended_collection["id"],
collection_title=extended_collection["title"],
request=request,
).get_links(extensions=extension_names, extra_links=extra_links + extended_coll_links)

return Collection(**extended_collection)

async def _search_base(self, search_request: BaseSearchPostRequest, request: Request) -> ItemCollection:
eodag_args = prepare_search_base_args(search_request=search_request, model=self.stac_metadata_model)
eodag_args = prepare_search_base_args(search_request=search_request)

request.state.eodag_args = eodag_args

Expand Down Expand Up @@ -208,9 +209,7 @@ async def _search_base(self, search_request: BaseSearchPostRequest, request: Req
extension_names = [type(ext).__name__ for ext in self.extensions]

for product in search_result:
feature = create_stac_item(
product, self.stac_metadata_model, self.extension_is_enabled, request, extension_names, request_json
)
feature = create_stac_item(product, self.extension_is_enabled, request, extension_names, request_json)
features.append(feature)

feature_collection = ItemCollection(
Expand Down Expand Up @@ -421,6 +420,8 @@ async def item_collection(
:returns: An ItemCollection.
:raises NotFoundError: If the collection does not exist.
"""
# If collection does not exist, NotFoundError wil be raised
collection = await self.get_collection(collection_id, request=request)

base_args = {"collections": [collection_id], "bbox": bbox, "datetime": datetime, "limit": limit, "token": token}

Expand All @@ -431,9 +432,9 @@ async def item_collection(
search_request = self.post_request_model.model_validate(clean)
item_collection = await self._search_base(search_request, request)
extension_names = [type(ext).__name__ for ext in self.extensions]
links = ItemCollectionLinks(collection_id=collection_id, request=request).get_links(
extensions=extension_names, extra_links=item_collection["links"]
)
links = ItemCollectionLinks(
collection_id=collection_id, collection_title=collection["title"], request=request
).get_links(extensions=extension_names, extra_links=item_collection["links"])
item_collection["links"] = links
return item_collection

Expand Down Expand Up @@ -581,7 +582,7 @@ def _clean_search_args(
return clean


def prepare_search_base_args(search_request: BaseSearchPostRequest, model: type[CommonStacMetadata]) -> dict[str, Any]:
def prepare_search_base_args(search_request: BaseSearchPostRequest) -> dict[str, Any]:
"""Prepare arguments for an eodag search based on a search request

:param search_request: the search request
Expand All @@ -602,23 +603,21 @@ def prepare_search_base_args(search_request: BaseSearchPostRequest, model: type[
for param in sortby:
param_tuples.append(
(
model.to_eodag(param["field"]),
param["field"],
param["direction"],
)
)
sort_by["sort_by"] = param_tuples

eodag_query = {}
parsed_query = {}
if query_attr := base_args.pop("query", None):
parsed_query = parse_query(query_attr)
eodag_query = {model.to_eodag(k): v for k, v in parsed_query.items()}

# get the extracted CQL2 properties dictionary if the CQL2 filter exists
eodag_filter = {}
parsed_filter = {}
base_args.pop("filter_lang", None)
if f := base_args.pop("filter_expr", None):
parsed_filter = parse_cql2(f)
eodag_filter = {model.to_eodag(k): v for k, v in parsed_filter.items()}

# EODAG search support a single collection
if collections := base_args.pop("collections", search_request.collections):
Expand All @@ -628,8 +627,10 @@ def prepare_search_base_args(search_request: BaseSearchPostRequest, model: type[
base_args["ids"] = search_request.ids

# merge all eodag search arguments
base_args = base_args | sort_by | eodag_filter | eodag_query
base_args = base_args | sort_by | parsed_filter | parsed_query
base_args = {k: v for k, v in base_args.items() if v is not None} # remove parameters with value None
if "federation:backends" in base_args:
base_args["provider"] = base_args.pop("federation:backends") # change federation:backends to provider

return base_args

Expand Down Expand Up @@ -748,7 +749,7 @@ def eodag_search_next_page(dag, eodag_args):
"""
eodag_args = eodag_args.copy()
next_page_token = eodag_args.pop("token", None)
provider = eodag_args.get("provider")
provider = eodag_args.pop("provider")
if not next_page_token or not provider:
raise ValueError("Missing required token and federation backend for next page search.")
search_plugin = next(dag._plugins_manager.get_search_plugins(provider=provider))
Expand Down
6 changes: 3 additions & 3 deletions stac_fastapi/eodag/extensions/collection_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
from eodag.api.core import EODataAccessGateway
from eodag.api.product._product import EOProduct
from eodag.api.product.metadata_mapping import OFFLINE_STATUS
from eodag.types.stac_metadata import CommonStacMetadata
from fastapi import APIRouter, Depends, FastAPI, Path, Request
from pydantic import BaseModel, ConfigDict, Field
from stac_fastapi.api.errors import NotFoundError
Expand All @@ -39,7 +40,6 @@
from stac_fastapi.eodag.config import get_settings
from stac_fastapi.eodag.errors import ResponseSearchError
from stac_fastapi.eodag.models.item import create_stac_item
from stac_fastapi.eodag.models.stac_metadata import CommonStacMetadata

logger = logging.getLogger(__name__)

Expand All @@ -62,7 +62,7 @@ class CollectionOrderBody(BaseModel):
class BaseCollectionOrderClient:
"""Defines a pattern for implementing the collection order extension."""

stac_metadata_model: type[CommonStacMetadata] = attr.ib(default=CommonStacMetadata)
stac_metadata_model: type[BaseModel] = attr.ib(default=CommonStacMetadata)
extensions: list[ApiExtension] = attr.ib(default=[])

def extension_is_enabled(self, extension: str) -> bool:
Expand Down Expand Up @@ -135,7 +135,7 @@ def order_collection(
)
extension_names = [type(ext).__name__ for ext in self.extensions]

return create_stac_item(product, self.stac_metadata_model, self.extension_is_enabled, request, extension_names)
return create_stac_item(product, self.extension_is_enabled, request, extension_names)


@attr.s
Expand Down
103 changes: 0 additions & 103 deletions stac_fastapi/eodag/extensions/ecmwf.py

This file was deleted.

Loading
Loading