دورة تطوير نظام إدارة الأعراس والمناسبات ودعوات QR عمليًا

نموذج الرد Rsvp ومنع التكرار

نموذج الرد Rsvp ومنع التكرار — نظام إدارة الأعراس والمناسبات ودعوات QR | Next.js وPrisma | أديب الصلوي
وقت الدراسة
11 دقيقة

المسار: تطوير نظام إدارة الأعراس ودعوات QR الوحدة: نمذجة قاعدة البيانات بـ Prisma

مدخل إلى الدرس: نموذج الرد Rsvp ومنع التكرار

نموذج الرد Rsvp ومنع التكرار — نظام إدارة الأعراس والمناسبات ودعوات QR | Next.js وPrisma | أديب الصلوي

طريقة الدراسة: اقرأ التعريف، تتبّع المثال في الشرح، نفّذه بنفسك، ثم اختبر النتيجة والحالات الاستثنائية قبل الانتقال.

أهداف هذا الدرس

  • تصميم جدول ردود بقيود UNIQUE المركب.
  • ربط Rsvp بالحدث والمدعو معاً بلا تكرار.
  • استيعاب لماذا نستخدم upsert بدل create أو update.

مثال

model Rsvp {
  id        String   @id @default(cuid())
  guestId   String
  eventId   String
  status    String   @default("pending") // accepted | declined | pending
  notes     String?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  guest     Guest    @relation(fields: [guestId], references: [id], onDelete: Cascade)
  event     Event    @relation(fields: [eventId], references: [id], onDelete: Cascade)

  @@unique([guestId, eventId])
  @@index([eventId])
}

المخطط: مسار معالجة الرد عند إرسال النموذج

flowchart TD
    A["POST /api/rsvp {guestId, status}"] --> Q{"رد سابق؟"}
    Q -->|لا| C["create — إدراج جديد"]
    Q -->|نعم| U2["update — تحديث الرد القديم"]
    C --> U["upsert يدمج الحالتين في أمر واحد"]
    U2 --> U

لماذا @@unique مزدوج وليس فقط على حقل؟

الخطأ الشائع هو اعتماد unique على guestId فقط، فيمنع الضيف من الرد على مناسبتين مستقبليتين. المفتاح المركب (guestId, eventId) يضمن: رد واحد لكل مدعو داخل كل مناسبة، مع بقاء التعدد بين المناسبات.

واجهة الـ API

الوظيفة prisma.rsvp.upsert تأخذ where بالـ composite key وهذا هو حل الحدود النهائي أمام ضغط مزدوج من المتصفح أو إعادة تسليم النموذج.

تمرين تطبيقي: أنشئ ضيفاً ثم أرسل رداً بقبول، ثم أعد نفس الطلب بفعل اعتذار: تحقق أن الجدول لا يخلق صفاً ثانياً بل يعدّل الأول.

أخطاء شائعة يجب تفاديها

  • فقط id في unique — يتكرر الرد بغباء.
  • استخدام create فقط — يعطي 500 عند إعادة الطلب.
  • نوع status نص بلا اتفاق سياسة للقيم المقبولة.

معجم مصطلحات الدرس

upsert
أمر قواعد بيانات يحدّث أو ينشئ حسب الوجود.
مفتاح مركب
فهرس/قيد على أكثر من عمود معاً.
قيم مقبولة
مقدار محدد مسبقاً يحرس به status (pending/accepted/declined).

مراجعة وتمرين تثبيت المهارة

اختبار سريع: اشرح بعبارتك معنى «نموذج الرد Rsvp ومنع التكرار»، ثم بيّن أين ستستخدمه داخل نظام تسجيل حضور دعوات مناسبة عبر رمز QR، وما الخطأ الذي يجب اختباره قبل الاعتماد على الحل.

تحدٍّ إضافي: غيّر شرطًا واحدًا في التطبيق، وتوقع النتيجة، ثم نفّذ الاختبار وفسّر الاختلاف.

الدرس التالي: الاستعلام والجلب مع العلاقات. من الأفضل إنهاء التجربة الحالية قبل متابعة الدرس التالي.

دروس نصية

#1

نظرة عامة على الدورة والمخرجات

#2

مقدمة إلى Next.js وأسباب اختياره

#3

أساسيات schema.prisma والنماذج

#4

مقدمة Route Handlers وبنية الاستجابة

#5

فهم Server Components والجلب الآمن

#6

تصميم الرمز Secured والتوقيع HMAC

#7

بناء الإنتاج وتجنّب أخطاء الحالة المربكة

#8

تحليل المتطلبات وتحديد الكيانات

#9

إنشاء مشروع Next.js وتجربته

#10

نموذج المناسبة Event بالعلاقات

#11

واجهة إنشاء المناسبة POST /api/events

#12

تصميم صفحة الدعوة الإلكترونية

#13

توليد صورة QR من قاعدة الدعوة

#14

نشر المشروع على Vercel

#15

تصميم قاعدة البيانات والعلاقات

#16

تجريب PostgreSQL محلياً وإنشاء قاعدة الداتا

#17

نموذج المدعو Guest مع الرمز الموقّع

#18

واجهات الضيوف الإضافة والقائمة

#19

نموذج الرد RSVP التفاعلي

#20

تجربة المسح في بوابة الحفل

#21

قاعدة بيانات إنتاج مُدارة وأمانها

#22

تدفق الدعوة وقراءة QR من التوليد إلى الحضور

#23

تثبيت Prisma والاتصال بالقاعدة

#24

نموذج الرد Rsvp ومنع التكرار

#25

واجهة تسجيل الحضور POST /api/checkin

#26

صفحة قائمة الضيوف والفرز

#27

واجهة تتفهم حالة الحضور والحصر

#28

إدارة المتغيرات السرية بيئة وواجهة

#29

سيناريو المشروع وقواعد العمل

#30

بنية مجلدات المشروع ومسارات الصفحات

#31

الاستعلام والجلب مع العلاقات

#32

التحقق من المدخلات ومعالجة الأخطاء

#33

لوحة الإحصائيات الحية

#34

تأمين الروابط والهجمات الشائعة

#35

قائمة الفحص النهائي قبل الإطلاق

#36

الترحيلات migrations والبذور seed

عرض الدروس كاملة تحقق من صفحة تعلم الدورة
درس نصي 4/36
أنت تشاهد
نموذج الرد Rsvp ومنع التكرار