Skip to content

Commit fda3ff1

Browse files
authored
fix: HTTP 503 response for gbfs_feeds endpoint (#1206)
1 parent 8bb3108 commit fda3ff1

File tree

7 files changed

+42
-5
lines changed

7 files changed

+42
-5
lines changed

api/src/shared/common/db_utils.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,9 @@ def get_gbfs_feeds_query(
448448
.options(
449449
contains_eager(Gbfsfeed.gbfsversions).contains_eager(Gbfsversion.gbfsvalidationreports),
450450
contains_eager(Gbfsfeed.gbfsversions).joinedload(Gbfsversion.gbfsendpoints),
451-
*get_joinedload_options(),
451+
joinedload(Feed.locations),
452+
joinedload(Feed.externalids),
453+
joinedload(Feed.redirectingids).joinedload(Redirectingid.target),
452454
)
453455
)
454456
return query

api/src/shared/database/database.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def with_db_session(func=None, db_url: str | None = None):
124124
def wrapper(*args, **kwargs):
125125
db_session = kwargs.get("db_session")
126126
if db_session is None:
127-
db = Database(echo_sql=get_env_logging_level() == "DEBUG", feeds_database_url=db_url)
127+
db = Database(echo_sql=get_env_logging_level() == logging.getLevelName("DEBUG"), feeds_database_url=db_url)
128128
with db.start_db_session() as session:
129129
kwargs["db_session"] = session
130130
return func(*args, **kwargs)

api/tests/integration/test_feeds_api.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,7 @@ def test_gtfs_redirect(client):
829829
{"endpoint": "/v1/gtfs_rt_feeds", "hard_limit": 1000},
830830
{"endpoint": "/v1/gtfs_feeds/mdb-1/datasets", "hard_limit": 500},
831831
{"endpoint": "/v1/search", "hard_limit": 3500},
832+
{"endpoint": "/v1/gbfs_feeds", "hard_limit": 500},
832833
],
833834
)
834835
def test_hard_limits(client, monkeypatch, values):
@@ -841,7 +842,7 @@ def test_hard_limits(client, monkeypatch, values):
841842
headers=authHeaders,
842843
params={"limit": hard_limit + 1},
843844
)
844-
assert response.status_code != 200
845+
assert response.status_code == 422
845846

846847

847848
@pytest.mark.parametrize(

docs/DatabaseCatalogAPI.yaml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ paths:
146146
- "beta"
147147
operationId: getGbfsFeeds
148148
parameters:
149-
- $ref: "#/components/parameters/limit_query_param_gtfs_feeds_endpoint"
149+
- $ref: "#/components/parameters/limit_query_param_gbfs_feeds_endpoint"
150150
- $ref: "#/components/parameters/offset"
151151
- $ref: "#/components/parameters/provider"
152152
- $ref: "#/components/parameters/producer_url"
@@ -1344,6 +1344,18 @@ components:
13441344
maximum: 3500
13451345
default: 3500
13461346
example: 10
1347+
1348+
limit_query_param_gbfs_feeds_endpoint:
1349+
name: limit
1350+
in: query
1351+
description: The number of items to be returned.
1352+
required: False
1353+
schema:
1354+
type: integer
1355+
minimum: 0
1356+
maximum: 500
1357+
default: 500
1358+
example: 10
13471359

13481360
offset:
13491361
name: offset

liquibase/changelog.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,5 @@
6060
<!-- Materialized view updated. Used Feed.created_at field as timestamp. -->
6161
<include file="changes/feat_1082.sql" relativeToChangelogFile="true"/>
6262
<include file="changes/feat_1181.sql" relativeToChangelogFile="true"/>
63+
<include file="changes/feat_1182.sql" relativeToChangelogFile="true"/>
6364
</databaseChangeLog>

liquibase/changes/feat_1182.sql

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-- This SQL script adds indexes that enhance the GBFS SQL queries
2+
3+
CREATE INDEX IF NOT EXISTS idx_gbfsversion_feed_id
4+
ON gbfsversion (feed_id);
5+
6+
CREATE INDEX IF NOT EXISTS idx_redirectingid_source_id
7+
ON redirectingid (source_id);
8+
9+
CREATE INDEX IF NOT EXISTS idx_redirectingid_target_id
10+
ON redirectingid (target_id);
11+
12+
CREATE INDEX IF NOT EXISTS idx_externalid_feed_id
13+
ON externalid (feed_id);
14+
15+
CREATE INDEX IF NOT EXISTS idx_officialstatushistory_feed_id
16+
ON officialstatushistory (feed_id);
17+
18+
CREATE INDEX IF NOT EXISTS idx_gbfsendpoint_gv_id
19+
ON gbfsendpoint (gbfs_version_id);

web-app/src/app/services/feeds/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,8 @@ export interface components {
712712
limit_query_param_datasets_endpoint?: number;
713713
/** @description The number of items to be returned. */
714714
limit_query_param_search_endpoint?: number;
715+
/** @description The number of items to be returned. */
716+
limit_query_param_gbfs_feeds_endpoint?: number;
715717
/** @description Offset of the first item to return. */
716718
offset?: number;
717719
/** @description General search query to match against transit provider, location, and feed name. */
@@ -848,7 +850,7 @@ export interface operations {
848850
getGbfsFeeds: {
849851
parameters: {
850852
query?: {
851-
limit?: components['parameters']['limit_query_param_gtfs_feeds_endpoint'];
853+
limit?: components['parameters']['limit_query_param_gbfs_feeds_endpoint'];
852854
offset?: components['parameters']['offset'];
853855
provider?: components['parameters']['provider'];
854856
producer_url?: components['parameters']['producer_url'];

0 commit comments

Comments
 (0)