# إعداد Firestore — مرّة واحدة فقط (3 دقائق)

Firestore هو قاعدة بيانات Firebase. تفعيله يحوّل كل عمليات الإدارة إلى **نقرة زرّ واحدة** بدل تعديل الملفّات يدويّاً على GitHub.

---

## الخطوة 1: إنشاء قاعدة البيانات

1. افتح: <https://console.firebase.google.com/project/taybaa-libya-library/firestore>
2. اضغط زرّ **"Create database"** (إنشاء قاعدة بيانات)
3. اختر **"Production mode"** ← سيظهر تحذير، اقبله. سنُضيف القواعد بعد قليل.
4. اختر منطقة (Location): **`europe-west1`** أو **`europe-west3`** (الأقرب لليبيا)
5. اضغط **"Create"** وانتظر ~30 ثانية

---

## الخطوة 2: لصق قواعد الأمان (النسخة الكاملة)

1. في نفس الصفحة، اضغط تبويب **"Rules"** (الأعلى)
2. احذف كلّ ما في المحرّر
3. الصق هذا بالضبط:

```javascript
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    // ─── Admin config (admin emails, restricted categories, hidden books) ───
    match /admin-config/{docId} {
      allow read: if true;
      allow write: if request.auth != null && (
        request.auth.token.email == 'tsallabi55@gmail.com' ||
        (resource != null && request.auth.token.email in resource.data.adminEmails)
      );
    }

    // ─── User reviews (per-book) ───
    match /reviews/{reviewId} {
      allow read: if true;
      allow create: if request.auth != null;
      allow update, delete: if request.auth != null && (
        request.auth.token.email == resource.data.userEmail ||
        request.auth.token.email == 'tsallabi55@gmail.com'
      );
    }

    // ─── Reading club posts ───
    match /club-posts/{postId} {
      allow read: if true;
      allow create: if request.auth != null;
      allow update, delete: if request.auth != null && (
        request.auth.token.email == resource.data.userEmail ||
        request.auth.token.email == 'tsallabi55@gmail.com'
      );
    }

    // ─── Contact-form messages (Libya Pro footer) ───
    //     Anyone (even anonymous) can CREATE a message; only admins
    //     can read/update/delete them.
    match /messages/{messageId} {
      allow create: if request.resource.data.email is string
                    && request.resource.data.email.size() > 5
                    && request.resource.data.message is string
                    && request.resource.data.message.size() >= 20
                    && request.resource.data.message.size() <= 5000;

      allow read, update, delete: if request.auth != null && (
        request.auth.token.email == 'tsallabi55@gmail.com' ||
        request.auth.token.email in get(/databases/$(database)/documents/admin-config/main).data.adminEmails
      );
    }

    // Deny all other paths by default
    match /{document=**} { allow read, write: if false; }
  }
}
```

4. اضغط **"Publish"** (نشر)

> **⚠️ تحديث 2026-05-19:** أضفنا قواعد `messages` الجديدة لدعم نموذج التواصل في الفوتر (ليبيا برو). إن كنت قد لصقتَ القواعد قبل هذا التاريخ، **يجب** أن تنسخ النسخة الكاملة أعلاه وتعيد النشر لتفعيل مركز الرسائل الجديد.

---

## انتهيت ✅

الآن كلّ شيء يعمل بنقرة واحدة:

- إضافة أدمن جديد من لوحة الإدارة → يحصل على الصلاحيّة **فوراً**
- إخفاء كتاب → يختفي لكلّ الزوّار في **نفس اللحظة**
- منح إيميل صلاحيّة رؤية قسم الإسلاميات → **فوري**
- استقبال رسائل التواصل عبر مركز الرسائل في `/admin/messages.html` ← **فوريّ كذلك**

**لا تحتاج إلى تعديل أيّ ملفّ على GitHub بعد الآن.**

---

## 📧 إعداد البريد الإلكتروني (MailChannels)

نموذج التواصل في الفوتر يحفظ الرسائل في Firestore **و** يُرسل نسخة بريديّة إلى المالك (`tsallabi55@gmail.com`) عبر MailChannels.

### كيف يعمل
- المسار: `POST /api/contact/send-email` (Cloudflare Pages function)
- المُرسِل: `noreply@taybaa-library.pages.dev`
- المُستقبِل: `tsallabi55@gmail.com`
- المُكتبة المستخدمة: [MailChannels](https://www.mailchannels.com/) — مجانيّة لـCloudflare Workers/Pages.

### ⚠️ مهمّ — سجلّ SPF DNS

لكي تصل الرسائل إلى **صندوق الوارد** (Inbox) بدل **مجلّد الـSpam**، يجب إضافة سجلّ SPF واحد في DNS:

```
TYPE: TXT
NAME: @  (أو taybaa-library.pages.dev)
VALUE: v=spf1 a mx include:relay.mailchannels.net ~all
```

#### إن كنت تستخدم نطاق `*.pages.dev` (الافتراضي)
- Cloudflare يدير DNS تلقائياً، لكن لا يمكنك إضافة سجلّ SPF على `pages.dev` لأنّه نطاق مشترك.
- النتيجة: الرسائل **ستصل** لكنّها قد تظهر في الـSpam في Gmail.
- **الحلّ الموصى به:** اربط نطاقاً مخصّصاً (custom domain) عبر Cloudflare ثم أضف SPF.

#### إن كنت تستخدم نطاقاً مخصّصاً
1. افتح Cloudflare Dashboard → DNS → Records
2. أضف سجلّ TXT بالقيم أعلاه
3. حدّث `FROM_EMAIL` في `functions/api/contact/send-email.js` ليطابق نطاقك (مثلاً `noreply@taybaa.ly`)
4. أعد نشر Pages

### بدون SPF: ماذا يحدث؟
- ✅ الرسائل **تُحفظ** في Firestore دائماً (لا تضيع أبداً)
- ✅ يمكنك قراءتها كاملة من `/admin/messages.html`
- ⚠️ الإيميلات قد تصل في الـSpam أو تُرفض من بعض الخدمات
- 🔁 يمكنك دائماً إضافة SPF لاحقاً دون فقدان أي بيانات

### للمزيد
- وثائق MailChannels لـCloudflare Pages: <https://developers.cloudflare.com/pages/functions/api-reference/#mailchannels-integration>
- وثائق MailChannels API: <https://api.mailchannels.net/tx/v1/documentation>

---

## ملاحظات

- المالك (`tsallabi55@gmail.com`) يستطيع دائماً الكتابة (مرتبط بالـ Rules مباشرة).
- المدراء الإضافيّون الذين تُضيفهم من اللوحة يستطيعون أيضاً تعديل القائمة وقراءة جميع الرسائل.
- أيّ زائر — حتى دون تسجيل دخول — يمكنه إرسال رسالة عبر نموذج «ليبيا برو» في الفوتر (قواعد `messages.create` تسمح بذلك مع تحقّق من الحقول الأساسيّة).
- Firestore Free Tier (Spark plan) يُتيح **50,000 قراءة و20,000 كتابة يوميّاً** — أكثر بكثير ممّا تحتاجه مكتبة شخصيّة.
- إذا غيّرت بريد المالك في المستقبل، عدّل السطر `request.auth.token.email == 'tsallabi55@gmail.com'` في القواعد **وأيضاً** ثابت `OWNER_EMAIL` في `functions/api/contact/send-email.js`.
