fix: get_or_create when crudding peer cards

This commit is contained in:
Benjamin McCormick 2026-02-05 17:36:29 -05:00
parent 031cb9f36b
commit d6e5203e41
2 changed files with 16 additions and 54 deletions

View File

@ -6,9 +6,9 @@ from typing import cast
from sqlalchemy import update
from sqlalchemy.ext.asyncio import AsyncSession
from src import exceptions, models, schemas
from src import models, schemas
from src.cache.client import cache
from src.crud.peer import get_peer, peer_cache_key
from src.crud.peer import get_or_create_peers, peer_cache_key
logger = logging.getLogger(__name__)
@ -34,16 +34,16 @@ async def get_peer_card(
Returns:
The peer's card text if present, otherwise None (also None if peer not found).
"""
try:
peer = await get_peer(db, workspace_name, schemas.PeerCreate(name=observer))
return cast(
list[str] | None,
peer.internal_metadata.get(
construct_peer_card_label(observer=observer, observed=observed)
),
)
except exceptions.ResourceNotFoundException:
return None
result = await get_or_create_peers(
db, workspace_name, [schemas.PeerCreate(name=observer)]
)
peer = result.resource[0]
return cast(
list[str] | None,
peer.internal_metadata.get(
construct_peer_card_label(observer=observer, observed=observed)
),
)
async def set_peer_card(
@ -66,9 +66,10 @@ async def set_peer_card(
observed: Peer name of the peer described in the peer card
observer: Peer name of the observer
Raises:
ResourceNotFoundException: If the peer does not exist
"""
# Ensure the peer exists (get-or-create)
await get_or_create_peers(db, workspace_name, [schemas.PeerCreate(name=observer)])
stmt = (
update(models.Peer)
.where(models.Peer.workspace_name == workspace_name)
@ -82,14 +83,8 @@ async def set_peer_card(
}
)
)
.returning(models.Peer)
)
result = await db.execute(stmt)
updated_peer = result.scalar_one_or_none()
if updated_peer is None:
raise exceptions.ResourceNotFoundException(
f"Peer {observer} not found in workspace {workspace_name}"
)
await db.execute(stmt)
await db.commit()
# Invalidate cache - read-through pattern

View File

@ -3,7 +3,6 @@ from sqlalchemy.ext.asyncio import AsyncSession
from src import models
from src.crud.peer_card import construct_peer_card_label, get_peer_card, set_peer_card
from src.exceptions import ResourceNotFoundException
@pytest.mark.asyncio
@ -50,22 +49,6 @@ async def test_peer_card_get_set_roundtrip(
)
@pytest.mark.asyncio
async def test_set_peer_card_missing_peer_raises(
db_session: AsyncSession, sample_data: tuple[models.Workspace, models.Peer]
):
"""Setting a peer card for a non-existent peer should raise ResourceNotFoundException."""
workspace, _existing_peer = sample_data
with pytest.raises(ResourceNotFoundException):
await set_peer_card(
db_session,
workspace.name,
["card"],
observer="missing-peer",
observed="missing-peer",
)
@pytest.mark.asyncio
async def test_get_peer_card_missing_peer_returns_none(
db_session: AsyncSession, sample_data: tuple[models.Workspace, models.Peer]
@ -96,22 +79,6 @@ async def test_get_peer_card_missing_workspace_returns_none(
assert result is None
@pytest.mark.asyncio
async def test_set_peer_card_missing_workspace_raises(
db_session: AsyncSession, sample_data: tuple[models.Workspace, models.Peer]
):
"""Setting a peer card for a non-existent workspace should raise ResourceNotFoundException."""
_workspace, peer = sample_data
with pytest.raises(ResourceNotFoundException):
await set_peer_card(
db_session,
"missing-workspace",
["card"],
observer=peer.name,
observed=peer.name,
)
@pytest.mark.asyncio
async def test_peer_card_empty_list(
db_session: AsyncSession, sample_data: tuple[models.Workspace, models.Peer]