fix(downloads): clamp notification title to column limit so download_gc can't wedge
A downloaded FB/IG reel's "title" is the whole caption (up to ~1900 chars). It flowed untrimmed into Notification.title (String(255)); at the batched download_gc commit that raised psycopg StringDataRightTruncation in pass 1, aborting the whole run so expiry deletion, LRU eviction and orphan reap never executed (13/110 prod assets already exceed the limit). Clamp the title to 255 (with an ellipsis) centrally in create_notification — defending all six callers — since the full title already reaches the client via `data` and the column is only an English fallback. Add a regression test.
This commit is contained in:
@@ -14,6 +14,13 @@ from app.models import Notification
|
||||
# rows are never pruned (the user hasn't seen them yet).
|
||||
READ_SOFT_CAP = 200
|
||||
|
||||
# Hard limit of the Notification.title column (String(255)). Titles are only an English
|
||||
# fallback — the client renders the translated message from `data` — so clamping an
|
||||
# over-long one (e.g. a FB/IG reel whose "title" is the whole caption, hundreds of chars)
|
||||
# is harmless to the UI and prevents a StringDataRightTruncation that would abort the
|
||||
# caller's whole transaction (the batched download_gc run in particular).
|
||||
TITLE_MAX_LEN = 255
|
||||
|
||||
|
||||
def create_notification(
|
||||
db: Session,
|
||||
@@ -27,6 +34,8 @@ def create_notification(
|
||||
) -> Notification:
|
||||
"""Insert one notification for a user. Callers that batch many inserts in a single
|
||||
transaction can pass commit=False and commit once themselves."""
|
||||
if title is not None and len(title) > TITLE_MAX_LEN:
|
||||
title = title[: TITLE_MAX_LEN - 1] + "…" # clamp to the column limit, add an ellipsis
|
||||
notif = Notification(
|
||||
user_id=user_id, type=type, title=title, body=body, data=data
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user