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

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

واجهة إنشاء المناسبة POST /api/events — نظام إدارة الأعراس والمناسبات ودعوات QR | Next.js وPrisma | أديب الصلوي
وقت الدراسة
14 دقيقة

المسار: تطوير نظام إدارة الأعراس ودعوات QR الوحدة: واجهات API والبنية الخلفية

مدخل إلى الدرس: واجهة إنشاء المناسبة POST /api/events

واجهة إنشاء المناسبة POST /api/events — نظام إدارة الأعراس والمناسبات ودعوات QR | Next.js وPrisma | أديب الصلوي

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

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

  • بناء POST /api/events بتوليد slug فريد تلقائياً.
  • تطبيق تحقق مبدئي على الحقول الأساسية.
  • تجربة الطلب بأداة REST لإثبات النجاح.

المخطط: مخطط تدفق (Flowchart) لطلب إنشاء مناسبة

flowchart TD
    A["POST /api/events
body { name, date, location }"] --> Q{"اسم/تاريخ/مكان؟"} Q -->|ناقصة| B400["400 { error }"] Q -->|كاملة| SL["slug = slugify(name)
إن فشل → event-"] SL --> CR["prisma.event.create"] CR --> OK["201 { ok:true, data:event }"]

مثال

// app/api/events/route.ts
import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";

function slugify(s: string) {
  return s.trim().toLowerCase().replace(/\s+/g, "-").replace(/[^\w\u0600-\u06FF-]/g, "");
}

export async function POST(req: Request) {
  const body = await req.json();
  const { name, date, location } = body;

  if (!name || !date || !location) {
    return NextResponse.json(
      { ok: false, error: "name, date, location مطلوبة" },
      { status: 400 }
    );
  }

  const base = slugify(name);
  const slug = base || "event-" + Date.now();

  const event = await prisma.event.create({
    data: { name, date: new Date(date), location, slug },
  });
  return NextResponse.json({ ok: true, data: event }, { status: 201 });
}
الجزءالدورسبب وجوبه
slugifyتحويل الاسم لرابط صديقعنوان مباشر SEO وروابط الدعوات
تحقق الحقولمنع حفظ مناسبة فارغةchutz قيمة أمام قاعدة البيانات
Date.parseتحويل سلسلة إلى DatePrisma يرفض نصاً زمنياً
status 201إثبات إنشاء جديدتمييز عن استجابة 200

ملاحظة my

عند الفحص النهائي في الفصل 7 ستُضاف معالجة تكرار الاسم: نلحق -2 ثم -3... حتى ينجح التفرد. وحينها نجعل slug فريداً عبر المخطط من البداية.

مثال

# تجربة الطلب محلياً
curl -X POST http://localhost:3000/api/events \
  -H "Content-Type: application/json" \
  -d '{"name":"حفلة زواج نورة","date":"2026-06-01T19:00:00Z","location":"الرياض"}'

# => HTTP/1.1 201 Created
# { "ok": true, "data": { "id": "...", "slug": "حفلة-زواج-نورة", ... } }

تمرين تطبيقي: جرّب الطلب أعلاه ثم أضف شرطاً يرجع 409 عندما نحاول إنشاء مناسبة بنفس الاسم تماماً (تحقق findFirst).

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

  • حفظ slug فارغ عندما الاسم سلسلة رموز — نستخدم حدث fallback.
  • جلب date كسلسلة وتمريرها مباشرة إلى Prisma فيرتدي DateTime.
  • الرد ببيانات القاعدة كاملاً بما فيها حقول داخلية future.

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

slug
نص رابط مقروء فريد يحدد مناسبة على الويب.
نص 201
رمز حالة يدل على إنشاء المورد بنجاح.
fallback
قيمة احتياطية عند فشل التوليد الرئيسي.

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

اختبار سريع: اشرح بعبارتك معنى «واجهة إنشاء المناسبة POST /api/events»، ثم بيّن أين ستستخدمه داخل نظام تسجيل حضور دعوات مناسبة عبر رمز 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

عرض الدروس كاملة تحقق من صفحة تعلم الدورة
درس نصي 2/36
أنت تشاهد
واجهة إنشاء المناسبة POST /api/events