- الاسم: webapp (My Profile)
- الهدف: صفحة بروفايل شخصية قابلة للتعديل من المالك فقط مع إمكانية نشر تغريدات/صور/فيديوهات وعدّاد زوّار.
- المميزات: تعديل الاسم/المعرّف/الترحيب/الصورة/الخلفية، تفعيل روابط شبكات اجتماعية، نشر تغريدات نصية + وسائط، حذف منشورات، عدّاد زوّار فريد لكل متصفح، نظام ملكية محمي بمفتاح خاص.
- التطوير المحلي: http://localhost:3000
- الإنتاج: (يتم تحديده بعد النشر إلى Cloudflare Pages)
- ظهور
Save failedعند حفظ تعديلات البروفايل. - ظهور
Post failedعند نشر تغريدة/منشور.
الواجهة الأمامية كانت تستدعي مسارات API على شكل tables/profile_data, tables/posts, tables/visit_counter لكن لا يوجد سيرفر يردّ عليها (الكود مُعدّ سابقاً ليعمل مع GenSpark Tables المُلغاة)، فكانت كل عمليات POST/PUT/DELETE تفشل.
- بناء واجهة خلفية Hono على Cloudflare Pages تُحاكي نفس شكل الـ API الأصلي.
- التخزين الدائم عبر Cloudflare KV (binding اسمه
KV). - التحقق من الملكية على السيرفر:
- أول زائر يحفظ بروفايل → يصبح المالك ويُحفظ
ownerHashفيmeta:owner_hash. - أي تعديل لاحق يجب أن يحمل
ownerHashالمطابق أو_ownerKeyيُولّد نفس الهاش، وإلا يُرفض بـ 401.
- أول زائر يحفظ بروفايل → يصبح المالك ويُحفظ
- الواجهة الأمامية لم تتغيّر إطلاقاً — تعمل كما هي.
- تعديل
_routes.jsonليُقدِّم Cloudflare Pages الملفات الثابتة (/,/index.html,/static/*) ويُمرِّر فقط/tables/*و/api/*إلى Worker.
| الطريقة | المسار | الوصف |
|---|---|---|
| GET | /tables/profile_data/:id |
جلب البروفايل (عادة id=main) |
| POST | /tables/profile_data |
إنشاء بروفايل (أول مرة فقط — يُسجِّل المالك) |
| PUT | /tables/profile_data/:id |
تعديل البروفايل (يتطلب صلاحية المالك) |
| DELETE | /tables/profile_data/:id |
حذف البروفايل (يتطلب صلاحية المالك) |
| GET | /tables/posts?limit=200&sort=timestamp |
جلب قائمة المنشورات |
| GET | /tables/posts/:id |
جلب منشور واحد |
| POST | /tables/posts |
نشر منشور جديد (يتطلب صلاحية المالك) |
| DELETE | /tables/posts/:id |
حذف منشور (يتطلب صلاحية المالك) |
| GET | /tables/visit_counter |
جلب عدد الزوّار |
| POST | /tables/visit_counter |
تسجيل زيارة جديدة فريدة لكل متصفح |
| GET | /api/health |
فحص حالة الخادم |
- التخزين: Cloudflare KV (binding:
KV) - مفاتيح KV:
profile:<id>— صف البروفايل JSONposts:index— مصفوفة معرّفات المنشورات (الأحدث أولاً)posts:item:<id>— صف المنشور JSONvisits:item:<sessionId>— تسجيل زيارة فريدةvisits:count— العدد الكلي للزوّارmeta:owner_hash— هاش المالك المُسجَّل أول مرة (دفاع عميق)
- المالك يحصل على مفتاح سرّي عشوائي (~32 بايت) يُحفظ في
localStorageتحتprofile_owner_key. - الهاش (
SHA-256) للمفتاح يُحفظ على السيرفر فيmeta:owner_hashعند أول إنشاء. - كل طلب تعديل/حذف يتضمّن
ownerHash(أو_ownerKey) ويتم التحقق منه على السيرفر. - لمشاركة الملكية بين أجهزة → فتح الرابط
?owner=KEYيقوم بحفظ المفتاح في الجهاز الجديد.
- أول زيارة للموقع → يصبح الزائر المالك تلقائياً ويحصل على رابط خاص (
?owner=...). - اضغط على أيقونة الترس ⚙️ لتعديل الاسم/المعرّف/الترحيب/الخلفية وتفعيل الشبكات الاجتماعية.
- اضغط زر
+أعلى قسم Posts لنشر تغريدة (نصّ و/أو صورة/فيديو حتى 6 ميجابايت). - اضغط على الأفاتار لرفع صورة شخصية (يتم ضغطها تلقائياً).
- لتعديل البروفايل من جهاز آخر — احفظ رابط
?owner=...المعروض عند أول إنشاء.
- المنصة: Cloudflare Pages
- المسار البنائي:
dist/(يحتوي_worker.js+index.html+_routes.json) - الحزمة التقنية: Hono + TypeScript + Cloudflare KV + Vanilla JS/CSS
- الحالة: ✅ يعمل محلياً عبر
wrangler pages dev
# إعداد API key (مرة واحدة)
# ثم:
npm run build
npx wrangler kv:namespace create webapp_kv # إنشاء KV ناميسبيس حقيقي
# تحديث wrangler.jsonc بالـ id المُرجع
npx wrangler pages deploy dist --project-name webappcd /home/user/webapp
npm run build
pm2 start ecosystem.config.cjs
curl http://localhost:3000/api/health- نشر للإنتاج على Cloudflare Pages مع KV حقيقي (يحتاج API key من المستخدم).
- ربط نطاق مخصص (custom domain).
- نسخة احتياطية تلقائية للبيانات.
- ضبط Cloudflare API key لنشر التطبيق على نطاق
pages.dev. - إنشاء KV ناميسبيس حقيقي عبر
wrangler kv:namespace create. - (اختياري) إضافة rate limiting عبر Cloudflare Turnstile لزرّ النشر.
2026-05-01 — إصلاح Save failed و Post failed عبر بناء واجهة Hono خلفية.