refactor(core): the core's owner filters go through userscope, each held by a second account

Tokens, notifications, quota, debug sessions and the reset-link burn filtered
their owner inline. Ten of the fifteen filters had no test that noticed one
going missing; each now has a test where another account's rows must not
count, show or change.
This commit is contained in:
2026-10-19 23:36:01 +02:00
parent 531eb2eef1
commit ad6ccbac05
11 changed files with 164 additions and 15 deletions
+5 -4
View File
@@ -5,6 +5,7 @@ from fastapi import APIRouter, Depends, Query
from sqlalchemy import func, select, update
from sqlalchemy.orm import Session
from app.userscope import owned_by
from app.auth import current_user
from app.db import get_db
from app.models import Notification, User
@@ -36,7 +37,7 @@ def list_notifications(
user: User = Depends(current_user),
db: Session = Depends(get_db),
) -> dict:
where = [Notification.user_id == user.id]
where = [owned_by(Notification.user_id, user)]
if not include_dismissed:
where.append(Notification.dismissed.is_(False))
total = db.scalar(select(func.count()).select_from(Notification).where(*where)) or 0
@@ -61,7 +62,7 @@ def unread_count(user: User = Depends(current_user), db: Session = Depends(get_d
select(func.count())
.select_from(Notification)
.where(
Notification.user_id == user.id,
owned_by(Notification.user_id, user),
Notification.read.is_(False),
Notification.dismissed.is_(False),
)
@@ -86,7 +87,7 @@ def mark_read(
def mark_all_read(user: User = Depends(current_user), db: Session = Depends(get_db)) -> dict:
db.execute(
update(Notification)
.where(Notification.user_id == user.id, Notification.read.is_(False))
.where(owned_by(Notification.user_id, user), Notification.read.is_(False))
.values(read=True)
)
db.commit()
@@ -113,7 +114,7 @@ def clear_all(user: User = Depends(current_user), db: Session = Depends(get_db))
"""Dismiss every (still-visible) notification for this user."""
db.execute(
update(Notification)
.where(Notification.user_id == user.id, Notification.dismissed.is_(False))
.where(owned_by(Notification.user_id, user), Notification.dismissed.is_(False))
.values(dismissed=True, read=True)
)
db.commit()