استاندارد زمانها
- تما م زمانها در دیتابیس بهصورت UTC ذخیره میشوند (
created،updated،deleted،startTime،endTime، …). - روی wire، زمانها همیشه بهصورت ISO 8601 برمیگردند (مثل
2026-07-02T15:30:00.000Z). - روی wire، ستونهای
created/updatedدر JSON همهٔ موجودیتها با نامcreatedAt/updatedAtبرمیگردند (مثلDeviceDto، موجودیتهای pull در sync و پروفایل کاربر)؛ نامِ ستونی فقط سمت دیتابیس و Prisma است. - فیلد
version(مربوط به همگامسازی) چونBigIntاست، روی wire همیشه بهصورت string بازمیگردد.
ستونهای زمانیِ یکسان
بیشتر مدلها سه فیلدِ زمانیِ استاندارد دارند:
| فیلد | نوع | معنی |
|---|---|---|
created | DateTime | زمانِ ساختِ رکورد |
updated | DateTime | زمانِ آخرین تغییر (توسط تریگر bump_record_version خودکار ست میشود) |
deleted | DateTime? | زمانِ حذفِ نرم (NULL یعنی حذفنشده) |
این سهتایی روی این مدلها هست: User، Calendar، Event، Task، Reminder،
CalendarShare، PersianHoliday.
استثناها:
Deviceفقطcreated/updatedدارد (deletedندارد؛ حذفِ دستگاه فیزیکی است).SyncConflictفقطcreatedدارد.
version و تریگرِ نسخهبندی
چهار موجودیتِ همگامشونده — Calendar، Event، Task، Reminder — یک ستونِ
version BigInt دارند. این ستون توسط تریگرِ bump_record_version() روی هر
INSERT/UPDATE از یک دنبالهٔ سراسری بهنام record_version_seq پر میشود؛ همان
تریگر updated را هم به now() ست میکند. پیش از اختصاصِ نسخه، تریگر یک
advisory lock کاربر-محور میگیرد تا نوشتنهای همزمانِ یک کاربر نسخههای
پشتسرهم نگیرند. (جزئیات ستونها در پایگاه داده.)
معادلسازیِ کوئری (Prisma)
// رکوردهای اخیر
const recent = await prisma.calendar.findMany({
where: { created: { gte: new Date(Date.now() - 7 * 86400_000) } },
});
// بهروزرسانیهای اخیر
const updated = await prisma.event.findMany({
where: { updated: { gte: new Date(Date.now() - 86400_000) } },
});
// فقط فعالها (حذفنشده)
const active = await prisma.event.findMany({ where: { deleted: null } });
// حذفشدهها
const trashed = await prisma.calendar.findMany({ where: { deleted: { not: null } } });
چرا این الگو؟
- یکسانسازی: همهٔ مدلها از همان نامگذاری استفاده میکنند.
- حذفِ نرم:
deletedاجازه میدهد رکورد را بدون حذفِ فیزیکی علامت بزنید — برای tombstoneهای همگامسازی لازم است. - کارایی: ایندکس روی
created/updated/deleted/versionکوئریهای رایج و همگامسازی را سریع نگه میدارد.