Skip to content

Commit ee89fac

Browse files
authored
Fix: Restore get_provider_credential behavior to return None when Langfuse credentials are missing (#415)
* Revert to old version when creds return none * fix return type * fix test
1 parent 3b7b640 commit ee89fac

File tree

4 files changed

+28
-41
lines changed

4 files changed

+28
-41
lines changed

backend/app/api/routes/credentials.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ def read_credential(
6666
org_id=_current_user.organization_id,
6767
project_id=_current_user.project_id,
6868
)
69+
if not creds:
70+
raise HTTPException(status_code=404, detail="Credentials not found")
71+
6972
return APIResponse.success_response([cred.to_public() for cred in creds])
7073

7174

@@ -88,6 +91,9 @@ def read_provider_credential(
8891
provider=provider_enum,
8992
project_id=_current_user.project_id,
9093
)
94+
if credential is None:
95+
raise HTTPException(status_code=404, detail="Provider credentials not found")
96+
9197
return APIResponse.success_response(credential)
9298

9399

backend/app/crud/credentials.py

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -115,16 +115,6 @@ def get_creds_by_org(
115115
Credential.project_id == project_id,
116116
)
117117
creds = session.exec(statement).all()
118-
119-
if not creds:
120-
logger.error(
121-
f"[get_creds_by_org] No credentials found | organization_id {org_id}, project_id {project_id}"
122-
)
123-
raise HTTPException(
124-
status_code=404,
125-
detail="Credentials not found for this organization and project",
126-
)
127-
128118
return creds
129119

130120

@@ -135,7 +125,7 @@ def get_provider_credential(
135125
project_id: int,
136126
provider: str,
137127
full: bool = False,
138-
) -> dict[str, Any] | Credential:
128+
) -> dict[str, Any] | Credential | None:
139129
"""
140130
Fetch credentials for a specific provider within a project.
141131
@@ -166,12 +156,7 @@ def get_provider_credential(
166156
if creds and creds.credential:
167157
return creds if full else decrypt_credentials(creds.credential)
168158

169-
logger.error(
170-
f"[get_provider_credential] Credentials not found | organization_id {org_id}, provider {provider}, project_id {project_id}"
171-
)
172-
raise HTTPException(
173-
status_code=404, detail=f"Credentials not found for provider '{provider}'"
174-
)
159+
return None
175160

176161

177162
def get_providers(*, session: Session, org_id: int, project_id: int) -> list[str]:
@@ -234,12 +219,16 @@ def remove_provider_credential(
234219
validate_provider(provider)
235220

236221
# Verify credentials exist before attempting delete
237-
get_provider_credential(
222+
creds = get_provider_credential(
238223
session=session,
239224
org_id=org_id,
240225
project_id=project_id,
241226
provider=provider,
242227
)
228+
if creds is None:
229+
raise HTTPException(
230+
status_code=404, detail="Credentials not found for this provider"
231+
)
243232

244233
# Build delete statement
245234
statement = delete(Credential).where(
@@ -279,6 +268,10 @@ def remove_creds_for_org(*, session: Session, org_id: int, project_id: int) -> N
279268
org_id=org_id,
280269
project_id=project_id,
281270
)
271+
if existing_creds is None or len(existing_creds) == 0:
272+
raise HTTPException(
273+
status_code=404, detail="No credentials found for this organization"
274+
)
282275
expected_count = len(existing_creds)
283276
statement = delete(Credential).where(
284277
Credential.organization_id == org_id,

backend/app/tests/api/routes/test_creds.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ def test_read_credentials_not_found(client: TestClient, user_api_key: TestAuthCo
126126
headers={"X-API-KEY": user_api_key.key},
127127
)
128128
assert response.status_code == 404
129-
assert "Credentials not found" in response.json()["error"]
130129

131130

132131
def test_read_provider_credential(
@@ -159,7 +158,6 @@ def test_read_provider_credential_not_found(
159158
)
160159

161160
assert response.status_code == 404
162-
assert "Credentials not found for provider" in response.json()["error"]
163161

164162

165163
def test_update_credentials(
@@ -258,7 +256,6 @@ def test_delete_provider_credential_not_found(
258256
)
259257

260258
assert response.status_code == 404
261-
assert "Credentials not found for provider" in response.json()["error"]
262259

263260

264261
def test_delete_all_credentials(
@@ -285,7 +282,6 @@ def test_delete_all_credentials(
285282
headers={"X-API-KEY": user_api_key.key},
286283
)
287284
assert response.status_code == 404 # Expect 404 as credentials are deleted
288-
assert "Credentials not found" in response.json()["error"]
289285

290286

291287
def test_delete_all_credentials_not_found(
@@ -301,10 +297,6 @@ def test_delete_all_credentials_not_found(
301297
)
302298

303299
assert response.status_code == 404
304-
assert (
305-
"Credentials not found for this organization and project"
306-
in response.json()["error"]
307-
)
308300

309301

310302
def test_duplicate_credential_creation(

backend/app/tests/crud/test_credentials.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -168,15 +168,13 @@ def test_remove_provider_credential(db: Session) -> None:
168168
project_id=project.id,
169169
)
170170

171-
# Verify the credentials are no longer retrievable
172-
with pytest.raises(HTTPException) as exc_info:
173-
get_provider_credential(
174-
session=db,
175-
org_id=credential.organization_id,
176-
provider="openai",
177-
project_id=project.id,
178-
)
179-
assert exc_info.value.status_code == 404
171+
creds = get_provider_credential(
172+
session=db,
173+
org_id=credential.organization_id,
174+
provider="openai",
175+
project_id=project.id,
176+
)
177+
assert creds is None
180178

181179

182180
def test_remove_creds_for_org(db: Session) -> None:
@@ -209,12 +207,10 @@ def test_remove_creds_for_org(db: Session) -> None:
209207
session=db, org_id=project.organization_id, project_id=project.id
210208
)
211209

212-
# Verify no credentials are retrievable
213-
with pytest.raises(HTTPException) as exc_info:
214-
get_creds_by_org(
215-
session=db, org_id=project.organization_id, project_id=project.id
216-
)
217-
assert exc_info.value.status_code == 404
210+
creds = get_creds_by_org(
211+
session=db, org_id=project.organization_id, project_id=project.id
212+
)
213+
assert creds == []
218214

219215

220216
def test_invalid_provider(db: Session) -> None:

0 commit comments

Comments
 (0)