Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions backend/app/api/routes/credentials.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ def read_credential(
org_id=_current_user.organization_id,
project_id=_current_user.project_id,
)
if not creds:
raise HTTPException(status_code=404, detail="Credentials not found")

return APIResponse.success_response([cred.to_public() for cred in creds])


Expand All @@ -88,6 +91,9 @@ def read_provider_credential(
provider=provider_enum,
project_id=_current_user.project_id,
)
if credential is None:
raise HTTPException(status_code=404, detail="Provider credentials not found")

return APIResponse.success_response(credential)


Expand Down
29 changes: 11 additions & 18 deletions backend/app/crud/credentials.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,16 +115,6 @@ def get_creds_by_org(
Credential.project_id == project_id,
)
creds = session.exec(statement).all()

if not creds:
logger.error(
f"[get_creds_by_org] No credentials found | organization_id {org_id}, project_id {project_id}"
)
raise HTTPException(
status_code=404,
detail="Credentials not found for this organization and project",
)

return creds


Expand All @@ -135,7 +125,7 @@ def get_provider_credential(
project_id: int,
provider: str,
full: bool = False,
) -> dict[str, Any] | Credential:
) -> dict[str, Any] | Credential | None:
"""
Fetch credentials for a specific provider within a project.

Expand Down Expand Up @@ -166,12 +156,7 @@ def get_provider_credential(
if creds and creds.credential:
return creds if full else decrypt_credentials(creds.credential)

logger.error(
f"[get_provider_credential] Credentials not found | organization_id {org_id}, provider {provider}, project_id {project_id}"
)
raise HTTPException(
status_code=404, detail=f"Credentials not found for provider '{provider}'"
)
return None


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

# Verify credentials exist before attempting delete
get_provider_credential(
creds = get_provider_credential(
session=session,
org_id=org_id,
project_id=project_id,
provider=provider,
)
if creds is None:
raise HTTPException(
status_code=404, detail="Credentials not found for this provider"
)

# Build delete statement
statement = delete(Credential).where(
Expand Down Expand Up @@ -279,6 +268,10 @@ def remove_creds_for_org(*, session: Session, org_id: int, project_id: int) -> N
org_id=org_id,
project_id=project_id,
)
if existing_creds is None or len(existing_creds) == 0:
raise HTTPException(
status_code=404, detail="No credentials found for this organization"
)
expected_count = len(existing_creds)
statement = delete(Credential).where(
Credential.organization_id == org_id,
Expand Down
8 changes: 0 additions & 8 deletions backend/app/tests/api/routes/test_creds.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,6 @@ def test_read_credentials_not_found(client: TestClient, user_api_key: TestAuthCo
headers={"X-API-KEY": user_api_key.key},
)
assert response.status_code == 404
assert "Credentials not found" in response.json()["error"]


def test_read_provider_credential(
Expand Down Expand Up @@ -159,7 +158,6 @@ def test_read_provider_credential_not_found(
)

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


def test_update_credentials(
Expand Down Expand Up @@ -258,7 +256,6 @@ def test_delete_provider_credential_not_found(
)

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


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


def test_delete_all_credentials_not_found(
Expand All @@ -301,10 +297,6 @@ def test_delete_all_credentials_not_found(
)

assert response.status_code == 404
assert (
"Credentials not found for this organization and project"
in response.json()["error"]
)


def test_duplicate_credential_creation(
Expand Down
26 changes: 11 additions & 15 deletions backend/app/tests/crud/test_credentials.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,15 +168,13 @@ def test_remove_provider_credential(db: Session) -> None:
project_id=project.id,
)

# Verify the credentials are no longer retrievable
with pytest.raises(HTTPException) as exc_info:
get_provider_credential(
session=db,
org_id=credential.organization_id,
provider="openai",
project_id=project.id,
)
assert exc_info.value.status_code == 404
creds = get_provider_credential(
session=db,
org_id=credential.organization_id,
provider="openai",
project_id=project.id,
)
assert creds is None


def test_remove_creds_for_org(db: Session) -> None:
Expand Down Expand Up @@ -209,12 +207,10 @@ def test_remove_creds_for_org(db: Session) -> None:
session=db, org_id=project.organization_id, project_id=project.id
)

# Verify no credentials are retrievable
with pytest.raises(HTTPException) as exc_info:
get_creds_by_org(
session=db, org_id=project.organization_id, project_id=project.id
)
assert exc_info.value.status_code == 404
creds = get_creds_by_org(
session=db, org_id=project.organization_id, project_id=project.id
)
assert creds == []


def test_invalid_provider(db: Session) -> None:
Expand Down