Files
customerTicket/docs/MESSAGE_READ_RECEIPTS.md

4.1 KiB

ثبت مشاهده پیام و polling تیکت

دریافت پیام، بازکردن صفحه، بارگذاری مکاتبات قدیمی و polling به‌تنهایی رسید مشاهده ثبت نمی‌کنند. ثبت seen از یک درخواست POST جدا انجام می‌شود؛ نمای فعلی تیکت و مدل‌های موجود حفظ شده‌اند.

مرورگر فقط در تب قابل مشاهده، پیام‌هایی را ارسال می‌کند که حداقل ۴۸ پیکسل از ارتفاع آن‌ها (یا تمام ارتفاع پیام کوتاه‌تر) در محدوده مکاتبات و نمایشگر قرار گرفته باشد. پس از ثابت‌شدن موقعیت برای ۲۵۰ میلی‌ثانیه، موقعیت دوباره بررسی می‌شود. محدوده واقعی نمایشگر در موبایل و بزرگ‌نمایی لحاظ می‌شود و مرکز بخش نمایان پیام نباید زیر پنجره یا لایه دیگری باشد. پیام حذف‌شده ارسال نمی‌شود. پاسخ موفق، شناسه‌های پذیرفته‌شده را برمی‌گرداند تا درخواست تکراری ارسال نشود؛ خطای موقت شبکه باعث تلاش مجدد می‌شود. شناسه‌ها فقط در حافظه همان صفحه نگهداری می‌شوند.

سرور در هر درخواست مجوز را دوباره بررسی می‌کند: مشتری و magic link فقط پیام‌های عمومی همان تیکت، و کارشناس فقط پیام‌های مجاز خود را می‌توانند تأیید کنند. پیام خود کاربر و پیام حذف‌شده رسید مشاهده نمی‌گیرند. ورودی نامعتبر پاسخ ۴۰۰ می‌گیرد، شناسه‌های خراب یا خارج از محدوده نادیده گرفته می‌شوند، و هر درخواست حداکثر ۱۰۰ شناسه دارد. CSRF، ثبت تکراریِ بدون اثر و کنترل ابطال حفظ شده‌اند. قفل تیکت، ثبت مشاهده را با لغو اشتراک و پردازش اعلان هماهنگ می‌کند.

پاسخ polling پس از لغو دسترسی یا جایگزین‌شدن درخواست اعمال نمی‌شود. در خطای دسترسی، پیام‌های صفحه پاک و polling متوقف می‌شود. نشانگر polling آخرین پیام تحویل‌داده‌شده است، تا صف بیش از ۵۰ پیام باعث حذف مکاتبات بین دو درخواست نشود. ویرایش و حذف پیام قدیمی، نسخه polling را تغییر می‌دهد و فهرست تازه دریافت می‌شود.

وضعیت خوانده‌شدن تیکت فقط پس از تأیید مشاهده آخرین پیام مجاز ثبت می‌شود. فیلتر «خوانده‌نشده» به رسید همان کاربر وابسته است و مشاهده همکار دیگر آن را تغییر نمی‌دهد. زمان بازشدن «اشتراک کل تیکت» در ممیزی اشتراک همچنان مستقل از رسید تک‌پیام است.

این قرارداد مشاهده در صفحه را ثبت می‌کند و اثبات خواندن انسانی متن نیست. رسیدهای قدیمی حذف یا بازنویسی نشده‌اند؛ داده‌های تاریخی به‌تنهایی امکان تشخیص seen اشتباه را نمی‌دهند. اشتراک پیام مجوز کل تیکت ایجاد نمی‌کند؛ دسترسی کامل قبلی کاربر همچنان برقرار است.

تست‌های دائمی:

.venv/Scripts/python.exe -m pytest tests/test_message_read_receipts.py tests/e2e/test_message_read_receipts_e2e.py -q

تست‌ها از دیتابیس و سرور جداگانه استفاده می‌کنند. تب پس‌زمینه در headless Chromium با سیگنال visibility کنترل‌شده شبیه‌سازی می‌شود؛ محدوده نمایش، اسکرول، خطای شبکه و رقابت لغو دسترسی با پاسخ polling نیز در مرورگر بررسی می‌شوند.