2525from stac_fastapi .pgstac .config import Settings
2626from stac_fastapi .pgstac .models .links import (
2727 CollectionLinks ,
28+ CollectionSearchPagingLinks ,
2829 ItemCollectionLinks ,
2930 ItemLinks ,
3031 PagingLinks ,
@@ -46,8 +47,8 @@ async def all_collections( # noqa: C901
4647 bbox : Optional [BBox ] = None ,
4748 datetime : Optional [DateTimeType ] = None ,
4849 limit : Optional [int ] = None ,
50+ offset : Optional [int ] = None ,
4951 query : Optional [str ] = None ,
50- token : Optional [str ] = None ,
5152 fields : Optional [List [str ]] = None ,
5253 sortby : Optional [str ] = None ,
5354 filter : Optional [str ] = None ,
@@ -64,38 +65,51 @@ async def all_collections( # noqa: C901
6465 """
6566 base_url = get_base_url (request )
6667
67- # Parse request parameters
68- base_args = {
69- "bbox" : bbox ,
70- "limit" : limit ,
71- "token" : token ,
72- "query" : orjson .loads (unquote_plus (query )) if query else query ,
73- }
74-
75- clean_args = clean_search_args (
76- base_args = base_args ,
77- datetime = datetime ,
78- fields = fields ,
79- sortby = sortby ,
80- filter_query = filter ,
81- filter_lang = filter_lang ,
82- )
83-
84- async with request .app .state .get_connection (request , "r" ) as conn :
85- q , p = render (
86- """
87- SELECT * FROM collection_search(:req::text::jsonb);
88- """ ,
89- req = json .dumps (clean_args ),
68+ next_link : Optional [Dict [str , Any ]] = None
69+ prev_link : Optional [Dict [str , Any ]] = None
70+ collections_result : Collections
71+
72+ if self .extension_is_enabled ("CollectionSearchExtension" ):
73+ base_args = {
74+ "bbox" : bbox ,
75+ "limit" : limit ,
76+ "offset" : offset ,
77+ "query" : orjson .loads (unquote_plus (query )) if query else query ,
78+ }
79+
80+ clean_args = clean_search_args (
81+ base_args = base_args ,
82+ datetime = datetime ,
83+ fields = fields ,
84+ sortby = sortby ,
85+ filter_query = filter ,
86+ filter_lang = filter_lang ,
9087 )
91- collections_result : Collections = await conn .fetchval (q , * p )
9288
93- next : Optional [str ] = None
94- prev : Optional [str ] = None
89+ async with request .app .state .get_connection (request , "r" ) as conn :
90+ q , p = render (
91+ """
92+ SELECT * FROM collection_search(:req::text::jsonb);
93+ """ ,
94+ req = json .dumps (clean_args ),
95+ )
96+ collections_result = await conn .fetchval (q , * p )
9597
96- if links := collections_result .get ("links" ):
97- next = collections_result ["links" ].pop ("next" )
98- prev = collections_result ["links" ].pop ("prev" )
98+ if links := collections_result .get ("links" ):
99+ for link in links :
100+ if link ["rel" ] == "next" :
101+ next_link = link
102+ elif link ["rel" ] == "prev" :
103+ prev_link = link
104+
105+ else :
106+ async with request .app .state .get_connection (request , "r" ) as conn :
107+ cols = await conn .fetchval (
108+ """
109+ SELECT * FROM all_collections();
110+ """
111+ )
112+ collections_result = {"collections" : cols , "links" : []}
99113
100114 linked_collections : List [Collection ] = []
101115 collections = collections_result ["collections" ]
@@ -120,10 +134,10 @@ async def all_collections( # noqa: C901
120134
121135 linked_collections .append (coll )
122136
123- links = await PagingLinks (
137+ links = await CollectionSearchPagingLinks (
124138 request = request ,
125- next = next ,
126- prev = prev ,
139+ next = next_link ,
140+ prev = prev_link ,
127141 ).get_links ()
128142
129143 return Collections (
0 commit comments