Skip to content
This repository was archived by the owner on Apr 2, 2025. It is now read-only.

Commit 276e16f

Browse files
committed
add order_parameters to product and order
1 parent df6d1f0 commit 276e16f

File tree

6 files changed

+44
-8
lines changed

6 files changed

+44
-8
lines changed

src/stapi_fastapi/backends/product_backend.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from fastapi import Request
66

77
from stapi_fastapi.models.opportunity import Opportunity, OpportunityRequest
8-
from stapi_fastapi.models.order import Order
8+
from stapi_fastapi.models.order import Order, OrderRequest
99
from stapi_fastapi.routers.product_router import ProductRouter
1010

1111

@@ -27,7 +27,7 @@ async def search_opportunities(
2727
async def create_order(
2828
self,
2929
product_router: ProductRouter,
30-
search: OpportunityRequest,
30+
search: OrderRequest,
3131
request: Request,
3232
) -> Order:
3333
"""

src/stapi_fastapi/models/order.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,19 @@
66

77
from stapi_fastapi.models.shared import Link
88
from stapi_fastapi.types.datetime_interval import DatetimeInterval
9+
from stapi_fastapi.types.filter import CQL2Filter
10+
11+
12+
class OrderParametersBase(BaseModel): ...
13+
14+
15+
class OrderRequest(BaseModel):
16+
datetime: DatetimeInterval
17+
geometry: Geometry
18+
# TODO: validate the CQL2 filter?
19+
filter: CQL2Filter | None = None
20+
order_parameters: OrderParametersBase | None = None
21+
model_config = ConfigDict(strict=True)
922

1023

1124
class OrderProperties(BaseModel):

src/stapi_fastapi/models/product.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from pydantic import AnyHttpUrl, BaseModel, Field
88

99
from stapi_fastapi.models.opportunity import OpportunityPropertiesBase
10+
from stapi_fastapi.models.order import OrderParametersBase
1011
from stapi_fastapi.models.shared import Link
1112

1213
if TYPE_CHECKING:
@@ -45,18 +46,21 @@ class Product(BaseModel):
4546

4647
# we don't want to include these in the model fields
4748
_constraints: type[OpportunityPropertiesBase]
49+
_order_parameters: type[OrderParametersBase]
4850
_backend: ProductBackend
4951

5052
def __init__(
5153
self,
5254
*args,
5355
backend: ProductBackend,
5456
constraints: type[OpportunityPropertiesBase],
57+
order_parameters: type[OrderParametersBase],
5558
**kwargs,
5659
) -> None:
5760
super().__init__(*args, **kwargs)
5861
self._backend = backend
5962
self._constraints = constraints
63+
self._order_parameters = order_parameters
6064

6165
@property
6266
def backend(self: Self) -> ProductBackend:
@@ -66,6 +70,10 @@ def backend(self: Self) -> ProductBackend:
6670
def constraints(self: Self) -> type[OpportunityPropertiesBase]:
6771
return self._constraints
6872

73+
@property
74+
def order_parameters(self: Self) -> type[OrderParametersBase]:
75+
return self._order_parameters
76+
6977
def with_links(self: Self, links: list[Link] | None = None) -> Self:
7078
if not links:
7179
return self

src/stapi_fastapi/routers/product_router.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
OpportunityCollection,
1212
OpportunityRequest,
1313
)
14-
from stapi_fastapi.models.order import Order
14+
from stapi_fastapi.models.order import Order, OrderRequest
1515
from stapi_fastapi.models.product import Product
1616
from stapi_fastapi.models.shared import Link
1717
from stapi_fastapi.responses import GeoJSONResponse
@@ -59,6 +59,14 @@ def __init__(
5959
summary="Get constraints for the product",
6060
)
6161

62+
self.add_api_route(
63+
path="/order-parameters",
64+
endpoint=self.get_product_order_parameters,
65+
name=f"{self.root_router.name}:{self.product.id}:get-order-parameters",
66+
methods=["GET"],
67+
summary="Get order parameters for the product",
68+
)
69+
6270
self.add_api_route(
6371
path="/order",
6472
endpoint=self.create_order,
@@ -105,8 +113,14 @@ async def get_product_constraints(self: Self) -> JsonSchemaModel:
105113
"""
106114
return self.product.constraints
107115

116+
async def get_product_order_parameters(self: Self) -> JsonSchemaModel:
117+
"""
118+
Return supported order parameters of a specific product
119+
"""
120+
return self.product.order_parameters
121+
108122
async def create_order(
109-
self, payload: OpportunityRequest, request: Request, response: Response
123+
self, payload: OrderRequest, request: Request, response: Response
110124
) -> Order:
111125
"""
112126
Create a new order.

src/stapi_fastapi/routers/root_router.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def __init__(
5757
methods=["GET"],
5858
name=f"{self.name}:list-orders",
5959
response_class=GeoJSONResponse,
60-
tags=["Order"],
60+
tags=["Orders"],
6161
)
6262

6363
self.add_api_route(

tests/backends.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from stapi_fastapi.backends.product_backend import ProductBackend
55
from stapi_fastapi.exceptions import ConstraintsException, NotFoundException
66
from stapi_fastapi.models.opportunity import Opportunity, OpportunityRequest
7-
from stapi_fastapi.models.order import Order, OrderCollection
7+
from stapi_fastapi.models.order import Order, OrderCollection, OrderRequest
88
from stapi_fastapi.routers.product_router import ProductRouter
99

1010

@@ -35,7 +35,7 @@ async def get_order(self, order_id: str, request: Request) -> Order:
3535
class MockProductBackend(ProductBackend):
3636
def __init__(self, orders: MockOrderDB) -> None:
3737
self._opportunities: list[Opportunity] = []
38-
self._allowed_payloads: list[OpportunityRequest] = []
38+
self._allowed_payloads: list[OrderRequest] = []
3939
self._orders = orders
4040

4141
async def search_opportunities(
@@ -49,7 +49,7 @@ async def search_opportunities(
4949
async def create_order(
5050
self,
5151
product_router: ProductRouter,
52-
payload: OpportunityRequest,
52+
payload: OrderRequest,
5353
request: Request,
5454
) -> Order:
5555
"""
@@ -64,6 +64,7 @@ async def create_order(
6464
"filter": payload.filter,
6565
"datetime": payload.datetime,
6666
"product_id": product_router.product.id,
67+
# **payload.order_parameters,
6768
},
6869
links=[],
6970
)

0 commit comments

Comments
 (0)