@@ -81,9 +81,15 @@ class StacApi:
81
81
api_version : str = attr .ib (default = "0.1" )
82
82
stac_version : str = attr .ib (default = STAC_VERSION )
83
83
description : str = attr .ib (default = "stac-fastapi" )
84
+ search_get_request_base_model : Type [BaseSearchGetRequest ] = attr .ib (
85
+ default = BaseSearchGetRequest
86
+ )
84
87
search_get_request_model : Type [BaseSearchGetRequest ] = attr .ib (
85
88
default = BaseSearchGetRequest
86
89
)
90
+ search_post_request_base_model : Type [BaseSearchPostRequest ] = attr .ib (
91
+ default = BaseSearchPostRequest
92
+ )
87
93
search_post_request_model : Type [BaseSearchPostRequest ] = attr .ib (
88
94
default = BaseSearchPostRequest
89
95
)
@@ -263,25 +269,6 @@ def register_get_collection(self):
263
269
),
264
270
)
265
271
266
- def register_get_catalog (self ):
267
- """Register get collection endpoint (GET /catalog/{catalog_path}).
268
-
269
- Returns:
270
- None
271
- """
272
- self .router .add_api_route (
273
- name = "Get Catalog" ,
274
- path = "/catalogs/{catalog_path:path}" ,
275
- response_model = Catalog if self .settings .enable_response_models else None ,
276
- response_class = self .response_class ,
277
- response_model_exclude_unset = True ,
278
- response_model_exclude_none = True ,
279
- methods = ["GET" ],
280
- endpoint = self ._create_endpoint (
281
- self .client .get_catalog , CatalogUri , self .response_class
282
- ),
283
- )
284
-
285
272
def register_get_root_children (self ):
286
273
"""Register get collection children endpoint (GET /collection/{collection_id}/children).
287
274
@@ -328,6 +315,119 @@ def register_get_item_collection(self):
328
315
),
329
316
)
330
317
318
+ def register_catalog_conformance_classes (self ):
319
+ """Register catalog conformance class endpoint (GET /catalogs/{catalog_path}/conformance).
320
+
321
+ Returns:
322
+ None
323
+ """
324
+ self .router .add_api_route (
325
+ name = "Conformance Classes" ,
326
+ path = "/catalogs/{catalog_path:path}/conformance" ,
327
+ response_model = ConformanceClasses
328
+ if self .settings .enable_response_models
329
+ else None ,
330
+ response_class = self .response_class ,
331
+ response_model_exclude_unset = True ,
332
+ response_model_exclude_none = True ,
333
+ methods = ["GET" ],
334
+ endpoint = self ._create_endpoint (
335
+ self .client .conformance , EmptyRequest , self .response_class
336
+ ),
337
+ )
338
+
339
+ def register_post_catalog_search (self ):
340
+ """Register search endpoint (POST /search).
341
+
342
+ Returns:
343
+ None
344
+ """
345
+ fields_ext = self .get_extension (FieldsExtension )
346
+ self .router .add_api_route (
347
+ name = "Search" ,
348
+ path = "/catalogs/{catalog_path:path}/search" ,
349
+ response_model = (ItemCollection if not fields_ext else None )
350
+ if self .settings .enable_response_models
351
+ else None ,
352
+ response_class = GeoJSONResponse ,
353
+ response_model_exclude_unset = True ,
354
+ response_model_exclude_none = True ,
355
+ methods = ["POST" ],
356
+ endpoint = self ._create_endpoint (
357
+ self .client .post_catalog_search ,
358
+ self .search_post_request_model ,
359
+ GeoJSONResponse ,
360
+ ),
361
+ )
362
+
363
+ def register_get_catalog_search (self ):
364
+ """Register catalog search endpoint (GET /catalogs/{catalog_path}/search).
365
+
366
+ Returns:
367
+ None
368
+ """
369
+ fields_ext = self .get_extension (FieldsExtension )
370
+ request_model = create_request_model (
371
+ "GetSearchWithCatalogUri" ,
372
+ base_model = self .search_get_request_base_model ,
373
+ extensions = self .extensions ,
374
+ mixins = [CatalogUri ],
375
+ )
376
+ self .router .add_api_route (
377
+ name = "Catalog Search" ,
378
+ path = "/catalogs/{catalog_path:path}/search" ,
379
+ response_model = (ItemCollection if not fields_ext else None )
380
+ if self .settings .enable_response_models
381
+ else None ,
382
+ response_class = GeoJSONResponse ,
383
+ response_model_exclude_unset = True ,
384
+ response_model_exclude_none = True ,
385
+ methods = ["GET" ],
386
+ endpoint = self ._create_endpoint (
387
+ self .client .get_catalog_search , request_model , GeoJSONResponse
388
+ ),
389
+ )
390
+
391
+ def register_get_catalog_collections (self ):
392
+ """Register get collections endpoint (GET /collections).
393
+
394
+ Returns:
395
+ None
396
+ """
397
+ self .router .add_api_route (
398
+ name = "Get Collections" ,
399
+ path = "/catalogs/{catalog_path:path}/collections" ,
400
+ response_model = Collections
401
+ if self .settings .enable_response_models
402
+ else None ,
403
+ response_class = self .response_class ,
404
+ response_model_exclude_unset = True ,
405
+ response_model_exclude_none = True ,
406
+ methods = ["GET" ],
407
+ endpoint = self ._create_endpoint (
408
+ self .client .get_catalog_collections , CatalogUri , self .response_class
409
+ ),
410
+ )
411
+
412
+ def register_get_catalog (self ):
413
+ """Register get collection endpoint (GET /catalog/{catalog_path}).
414
+
415
+ Returns:
416
+ None
417
+ """
418
+ self .router .add_api_route (
419
+ name = "Get Catalog" ,
420
+ path = "/catalogs/{catalog_path:path}" ,
421
+ response_model = Catalog if self .settings .enable_response_models else None ,
422
+ response_class = self .response_class ,
423
+ response_model_exclude_unset = True ,
424
+ response_model_exclude_none = True ,
425
+ methods = ["GET" ],
426
+ endpoint = self ._create_endpoint (
427
+ self .client .get_catalog , CatalogUri , self .response_class
428
+ ),
429
+ )
430
+
331
431
def register_core (self ):
332
432
"""Register core STAC endpoints.
333
433
@@ -352,9 +452,14 @@ def register_core(self):
352
452
self .register_get_search ()
353
453
self .register_get_collections ()
354
454
self .register_get_collection ()
355
- self .register_get_catalog ()
356
455
self .register_get_item_collection ()
357
456
457
+ # Browseable endpoints
458
+ self .register_catalog_conformance_classes ()
459
+ self .register_post_catalog_search ()
460
+ self .register_get_catalog_search ()
461
+ self .register_get_catalog_collections ()
462
+ self .register_get_catalog ()
358
463
if self .settings .browseable_hierarchy_definition is not None :
359
464
self .register_get_root_children ()
360
465
0 commit comments