From 5eea34ce52965544588933a1e8833c8e3bd78616 Mon Sep 17 00:00:00 2001 From: Adamskiee Date: Sat, 15 Aug 2026 20:23:39 +0800 Subject: [PATCH] fix(server-activity): ignore writes for deleted users --- server/app/db_operations/activity.py | 3 +++ server/app/tests/test_activity.py | 33 +++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/server/app/db_operations/activity.py b/server/app/db_operations/activity.py index 4f11be6c..4e2de955 100644 --- a/server/app/db_operations/activity.py +++ b/server/app/db_operations/activity.py @@ -4,6 +4,7 @@ from uuid import UUID from fastapi import HTTPException, Request import jwt +from sqlalchemy.exc import IntegrityError from sqlmodel import Session, select from app.db_operations.token import ALGORITHM, SECRET_KEY from app.models.activity import UserActivity @@ -48,6 +49,8 @@ def _write_user_activity_sync(user_id: UUID, ip: str, user_agent: str) -> None: activity.ip_address = ip session.add(activity) session.commit() + except IntegrityError: + pass except Exception as e: print(f"[activity] write failed: {e}") diff --git a/server/app/tests/test_activity.py b/server/app/tests/test_activity.py index febee30b..efa8fc92 100644 --- a/server/app/tests/test_activity.py +++ b/server/app/tests/test_activity.py @@ -1,7 +1,12 @@ """Regression coverage for concurrent user-presence updates.""" from uuid import uuid4 -from app.db_operations.activity import _get_user_activity_for_update +from sqlalchemy.exc import IntegrityError + +from app.db_operations.activity import ( + _get_user_activity_for_update, + _write_user_activity_sync, +) class _Result: @@ -24,3 +29,29 @@ def test_presence_lookup_locks_the_user_activity_row(): assert _get_user_activity_for_update(session, uuid4()) is None assert session.statement._for_update_arg is not None + + +def test_activity_write_ignores_missing_user_foreign_key(monkeypatch, capsys): + class FailingSession: + def __enter__(self): + return self + + def __exit__(self, *_): + return False + + def exec(self, _): + return _Result() + + def add(self, _): + pass + + def commit(self): + raise IntegrityError("INSERT", {}, Exception("foreign key constraint")) + + monkeypatch.setattr( + "app.db_operations.activity.Session", lambda _: FailingSession() + ) + + _write_user_activity_sync(uuid4(), "127.0.0.1", "pytest") + + assert capsys.readouterr().out == ""