feat: full site build — Project/Melody schema (Option A), admin CRUD, public sections, uploads, email+SMTP, internal analytics, legal pages, docs
This commit is contained in:
@@ -0,0 +1,249 @@
|
||||
# 🏛️ المعمارية والاتفاقيات — diyaa.de
|
||||
|
||||
> هاد الملف بيحدّد **الشكل المستهدف** للمشروع. أي feature جديد لازم يتبع هالاتفاقيات.
|
||||
|
||||
---
|
||||
|
||||
## 1) البنية العامة
|
||||
|
||||
الموقع بينقسم لـ **واجهة عامة (public)** + **لوحة تحكم (admin)** + **API/Server Actions** + **قاعدة بيانات**.
|
||||
|
||||
```
|
||||
[ الزوّار ] ──> صفحات عامة (app/[locale]/…) ──┐
|
||||
├──> Server Actions / Route Handlers ──> Prisma ──> PostgreSQL
|
||||
[ المالك ] ──> لوحة التحكم (app/admin/…) ─────┘ │
|
||||
ملفات مرفوعة (volume على الـ VPS)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2) أقسام الموقع (من رؤية المالك)
|
||||
|
||||
> كل هالأقسام (عدا الألحان) = صفوف بجدول `Project` واحد تتفلتر بحقل `type`. الفصل بالـ UI فقط.
|
||||
|
||||
1. **الأعمال / المعرض (Portfolio)** — `type=PORTFOLIO` بتصنيفات (شعارات، بروشورات، متاجر، أدوات ذكاء اصطناعي…).
|
||||
2. **التطبيقات (Apps)** — `type=APP` تطبيقات Swift، مع **سكرين شوتس** + حقول iOS (App Store، TestFlight، الإصدار، رابط الدعم، سياسة خصوصية التطبيق).
|
||||
3. **المواقع (Websites)** — `type=WEBSITE` مواقع Next.js/WordPress، مع سكرين شوتس ورابط حي.
|
||||
4. **التصاميم (Designs)** — `type=DESIGN` (أو ضمن PORTFOLIO) — شعارات، هويات بصرية.
|
||||
5. **الألحان (Melodies)** — جدول `Melody` منفصل، عرض وتشغيل بتصنيفات (عربية، شرقية…) + تحميل اختياري.
|
||||
6. **صفحات رسمية** — سياسة الخصوصية، الشروط، **Impressum** (إلزامي قانونياً بألمانيا).
|
||||
7. **تواصل** — موجود، بنربطه بإرسال إيميل عبر SMTP + **Honeypot + Rate limiting**.
|
||||
8. **لوحة تحكم** — إضافة/تعديل/حذف كل ما سبق + التصنيفات.
|
||||
|
||||
---
|
||||
|
||||
## 3) مخطط قاعدة البيانات (Prisma) — **الخيار A المعتمد**
|
||||
|
||||
> **القرار (2026-08-05):** جدول **`Project` موحّد** لكل الأعمال والتطبيقات والمواقع والتصاميم (يتميّزوا بحقل `type`)، و**`Melody` منفصل** (طبيعته صوتية). التقنيات والسكرين شوتس كـ `String[]` (بدون جداول join)؛ نضيف جداول `Technology`/`Media` منفصلة لاحقاً فقط لو لزم فلترة بالتقنية أو إدارة alt-text متقدمة. التصنيف علاقة **واحد-لواحد** (مش many-to-many).
|
||||
>
|
||||
> ⚠️ هاد **يستبدل** مخطط `Work/App/Melody` القديم يلي انبنى بـ T-03/T-06. الاستبدال آمن لأنو ما في داتا إنتاجية بعد. شوف مهمة الـ refactor بـ `TODO.md`.
|
||||
|
||||
```prisma
|
||||
enum ProjectType {
|
||||
PORTFOLIO // شعار، بروشور، هوية بصرية… (سابقاً "أعمال/تصاميم")
|
||||
APP // تطبيق Swift/iOS
|
||||
WEBSITE // موقع Next.js أو WordPress
|
||||
DESIGN // تصميم منفصل لو حبيت تفصله عن PORTFOLIO
|
||||
}
|
||||
|
||||
enum CategoryKind {
|
||||
PROJECT // تصنيفات المشاريع (شعارات، بروشورات، مواقع، متاجر، أدوات AI…)
|
||||
MELODY // تصنيفات الألحان (عربي، شرقي…)
|
||||
}
|
||||
|
||||
enum PublishStatus {
|
||||
DRAFT
|
||||
PUBLISHED
|
||||
ARCHIVED
|
||||
}
|
||||
|
||||
model Category {
|
||||
id String @id @default(cuid())
|
||||
kind CategoryKind
|
||||
slug String @unique
|
||||
nameAr String
|
||||
nameEn String
|
||||
order Int @default(0)
|
||||
projects Project[]
|
||||
melodies Melody[]
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
|
||||
model Project { // جدول موحّد: أعمال + تطبيقات + مواقع + تصاميم
|
||||
id String @id @default(cuid())
|
||||
type ProjectType
|
||||
slug String @unique
|
||||
titleAr String
|
||||
titleEn String
|
||||
summaryAr String?
|
||||
summaryEn String?
|
||||
descAr String?
|
||||
descEn String?
|
||||
coverImage String? // مسار الغلاف
|
||||
images String[] // معرض صور / سكرين شوتس
|
||||
technologies String[] // التقنيات المستخدمة (بسيط، بدون جدول منفصل)
|
||||
externalUrl String? // رابط المشروع/الموقع الحي
|
||||
repoUrl String? // GitHub اختياري
|
||||
// ── حقول خاصة بالتطبيقات (تبقى فاضية لغير APP) ──
|
||||
platform String? // "iOS/Swift" | "Next.js" | "WordPress"…
|
||||
appStoreUrl String?
|
||||
testflightUrl String?
|
||||
appVersion String?
|
||||
supportUrl String?
|
||||
appPrivacyUrl String?
|
||||
// ── حالة وترتيب ──
|
||||
status PublishStatus @default(DRAFT)
|
||||
isFeatured Boolean @default(false)
|
||||
sortOrder Int @default(0)
|
||||
publishedAt DateTime?
|
||||
categoryId String?
|
||||
category Category? @relation(fields: [categoryId], references: [id])
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@index([type, status])
|
||||
}
|
||||
|
||||
model Melody { // لحن (منفصل بسبب طبيعته الصوتية)
|
||||
id String @id @default(cuid())
|
||||
slug String @unique
|
||||
titleAr String
|
||||
titleEn String
|
||||
descAr String?
|
||||
descEn String?
|
||||
audioFile String // مسار ملف الصوت
|
||||
coverImage String? // artwork
|
||||
durationSec Int?
|
||||
isDownloadable Boolean @default(false) // سماح/منع التحميل
|
||||
status PublishStatus @default(DRAFT)
|
||||
isFeatured Boolean @default(false)
|
||||
sortOrder Int @default(0)
|
||||
categoryId String
|
||||
category Category @relation(fields: [categoryId], references: [id])
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
|
||||
model ContactMessage { // رسائل نموذج التواصل
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
email String
|
||||
message String
|
||||
createdAt DateTime @default(now())
|
||||
}
|
||||
|
||||
enum AnalyticsEventType {
|
||||
PAGE_VIEW
|
||||
PROJECT_OPEN
|
||||
MELODY_PLAY
|
||||
PROJECT_LINK_CLICK
|
||||
CONTACT_SUBMITTED
|
||||
}
|
||||
|
||||
model AnalyticsEvent { // عدّادات داخلية بدون خدمة خارجية
|
||||
id String @id @default(cuid())
|
||||
type AnalyticsEventType
|
||||
path String?
|
||||
projectId String?
|
||||
melodyId String?
|
||||
createdAt DateTime @default(now())
|
||||
}
|
||||
|
||||
model User { // مستخدم لوحة التحكم (أنت)
|
||||
id String @id @default(cuid())
|
||||
email String @unique
|
||||
password String // hashed
|
||||
createdAt DateTime @default(now())
|
||||
}
|
||||
|
||||
// (مؤجّل) إعدادات الموقع من الأدمن — نضيفه عند الحاجة
|
||||
// model SiteSetting { id String @id key String @unique value String }
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4) اتفاقيات المجلدات (الشكل المستهدف)
|
||||
|
||||
```
|
||||
diyaa.de/
|
||||
├── app/
|
||||
│ ├── [locale]/ # الموقع العام
|
||||
│ │ ├── page.tsx # الرئيسية
|
||||
│ │ ├── work/ # المعرض (PORTFOLIO) + [slug]
|
||||
│ │ ├── apps/ # التطبيقات (APP) + [slug]
|
||||
│ │ ├── websites/ # المواقع (WEBSITE) + [slug]
|
||||
│ │ ├── designs/ # التصاميم (DESIGN) + [slug]
|
||||
│ │ ├── melodies/ # الألحان + [slug]
|
||||
│ │ ├── legal/ # privacy, terms, impressum
|
||||
│ │ ├── about/ · contact/
|
||||
│ ├── maintenance/ · coming-soon/ # صفحات الأوضاع
|
||||
│ ├── admin/ # 🔒 لوحة التحكم (محميّة بـ Auth)
|
||||
│ │ ├── projects/ · melodies/ · categories/ · settings/
|
||||
│ │ └── layout.tsx
|
||||
│ ├── api/ # Route Handlers (health, upload, …)
|
||||
│ └── globals.css
|
||||
├── components/
|
||||
│ ├── ui/ # 🧩 shadcn/ui (مكوّنات أساسية)
|
||||
│ ├── public/ # مكوّنات الواجهة العامة
|
||||
│ ├── admin/ # مكوّنات لوحة التحكم
|
||||
│ └── shared/ # مشتركة
|
||||
├── lib/
|
||||
│ ├── db.ts # Prisma client (singleton)
|
||||
│ ├── auth.ts # إعداد Auth.js
|
||||
│ ├── email.ts # Nodemailer + SMTP
|
||||
│ ├── upload.ts # منطق رفع الملفات
|
||||
│ ├── validations/ # مخططات Zod
|
||||
│ ├── i18n.ts · site.ts · metadata.ts
|
||||
├── prisma/
|
||||
│ └── schema.prisma # 🎯 مصدر الحقيقة لبنية الداتا
|
||||
├── content/ # قواميس الترجمة الثابتة (ar/en)
|
||||
├── docs/ # 📚 التوثيق
|
||||
└── (Docker, Makefile, …)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5) اتفاقيات المكوّنات (Components)
|
||||
|
||||
- **كل شي كمكوّن قابل لإعادة الاستخدام.** لا تكرّر UI.
|
||||
- مكوّنات `components/ui/` = shadcn الأساسية (Button, Card, Dialog, Input…). لا تعدّل سلوكها الأساسي، ابنِ فوقها.
|
||||
- مكوّنات الأقسام (ProjectCard مشترك لكل الأنواع + MelodyCard + AudioPlayer) بتعيش بـ `components/public/`.
|
||||
- **Server Components افتراضياً**؛ استخدم `"use client"` فقط عند الحاجة للتفاعل (مشغّل صوت، فورمات، ثيم).
|
||||
- كل مكوّن عام لازم يدعم **العربي والإنجليزي** ويحترم اتجاه RTL/LTR.
|
||||
- الأنماط عبر **Tailwind utilities** + متغيّرات الثيم؛ لا CSS خام جديد (نحافظ على متغيّرات الثيم الموجودة لكن عبر إعداد Tailwind).
|
||||
|
||||
## 6) اتفاقيات Server Actions / API
|
||||
|
||||
- عمليات لوحة التحكم (إنشاء/تعديل/حذف) → **Server Actions** بـ فاليديشن Zod.
|
||||
- كل action بيتحقق من الجلسة (Auth) قبل أي كتابة.
|
||||
- endpoints العامة (رفع، health، ربما RSS للألحان) → `app/api/`.
|
||||
- كل مدخلات المستخدم تمرّ بـ Zod schema من `lib/validations/`.
|
||||
- **نموذج التواصل:** يتحمّى بـ **Honeypot** (حقل مخفي) + **Rate limiting** (تحديد عدد الطلبات) لمنع السبام.
|
||||
- **رفع الملفات:** تحقّق من نوع الملف وحجمه، أسماء ملفات آمنة، `altText` للصور، و**حذف الملف الفعلي من الـ volume عند حذف المحتوى**.
|
||||
|
||||
## 7) الوسائط والملفات
|
||||
|
||||
- الملفات المرفوعة تُخزّن على **volume** بالـ VPS (مش داخل صورة Docker).
|
||||
- الصور تُعالَج بـ `sharp` (تصغير + webp).
|
||||
- مسارات الملفات تُخزّن كـ نصوص بالداتابيس (مش الملف نفسه).
|
||||
- الرفع يتم عبر `app/api/upload/` بعد التحقق من جلسة الأدمن، والملفات تُقدّم عبر `app/api/uploads/`.
|
||||
- مسار التخزين قابل للضبط عبر `UPLOAD_DIR`، والـ Docker volume الافتراضي هو `/app/uploads`.
|
||||
|
||||
## 8) الأوضاع (Site modes)
|
||||
|
||||
- `NEXT_PUBLIC_SITE_MODE` بيقبل **ثلاث قيم**: `full` · `maintenance` · `coming-soon`.
|
||||
- `coming-soon`: يعرض `ComingSoonPanel` ويخفي الأقسام (موجود حالياً).
|
||||
- `maintenance`: يعرض صفحة صيانة (جديد — T-14).
|
||||
- `full`: الموقع الكامل.
|
||||
- ✅ **T-17 منجز:** `.env.example` يستخدم `full` بدل `live`، و`lib/site.ts` يعتمد `coming-soon | maintenance | full`. واجهة الصيانة الفعلية والاستثناء المرئي للأدمن ضمن T-14.
|
||||
- لوحة التحكم بتشتغل **بغضّ النظر عن الوضع** (محميّة بالـ Auth) عشان تحضّر المحتوى قبل الإطلاق.
|
||||
|
||||
---
|
||||
|
||||
## 9) البيئة والنشر
|
||||
|
||||
- بيضاف خدمة **postgres** لـ `docker-compose.yml` + volume للبيانات + volume للملفات المرفوعة.
|
||||
- الـ **Makefile** بينضاف عليه أوامر: `db-up`, `migrate`, `seed`, `studio` (Prisma Studio).
|
||||
- migrations تنطبق تلقائياً عند النشر (خطوة بالـ start أو entrypoint).
|
||||
- أسرار (SMTP, DB URL, AUTH secret) بـ `.env` فقط — **ولا تُرفع للـ git**.
|
||||
@@ -0,0 +1,99 @@
|
||||
# ✅ التشيك لست الشاملة — diyaa.de
|
||||
|
||||
> نظرة عامة على **كل شي** لازم يتبنى، مقسّم لمراحل. للمهام القابلة للتنفيذ حالاً شوف [`TODO.md`](./TODO.md).
|
||||
> `[ ]` = ناقص · `[~]` = جزئي/موجود ناقص · `[x]` = جاهز
|
||||
|
||||
---
|
||||
|
||||
## المرحلة 0 — الأساس (Foundation)
|
||||
- [x] مشروع Next.js 14 + TS + Docker + Traefik + Makefile
|
||||
- [x] i18n عربي/إنجليزي + ثيم فاتح/غامق
|
||||
- [x] وضع coming-soon
|
||||
- [x] تهيئة **Tailwind CSS** (نقل متغيّرات الثيم لإعداد Tailwind)
|
||||
- [x] تهيئة **shadcn/ui** (`components/ui/`)
|
||||
- [x] إعداد **PostgreSQL** بـ docker-compose + volume
|
||||
- [x] إعداد **Prisma** + `schema.prisma` أولي + أول migration
|
||||
- [x] `lib/db.ts` (Prisma client singleton)
|
||||
|
||||
## المرحلة 1 — المصادقة ولوحة التحكم (Admin core)
|
||||
- [x] **Auth.js** (Credentials) + جدول User + كلمة سر مشفّرة
|
||||
- [x] هيكل `app/admin/` محمي بالجلسة
|
||||
- [x] Layout للوحة التحكم (سايدبار، عناصر مشتركة)
|
||||
- [x] فورمات أساسية (React Hook Form + Zod) قابلة لإعادة الاستخدام
|
||||
|
||||
> ⚠️ **قرار 2026-08-05 (الخيار A):** الداتابيس صارت `Project` موحّد (PORTFOLIO/APP/WEBSITE/DESIGN) + `Melody` منفصل. المخطط القديم `Work/App` بينستبدل — شوف مهمة refactor بـ `TODO.md`.
|
||||
|
||||
## المرحلة 1.5 — إصلاحات معلّقة (من مراجعة 2026-08-05)
|
||||
- [x] 🐞 إصلاح `.env.example`: `live` → `full` + اعتماد قيمة `maintenance`
|
||||
- [x] إعادة تشكيل `schema.prisma` للخيار A (`Project` موحّد + `Melody`) + migration جديد
|
||||
- [x] مواءمة CRUD التصنيفات مع `CategoryKind = PROJECT | MELODY`
|
||||
|
||||
## المرحلة 2 — التصنيفات (Categories)
|
||||
- [x] موديل Category
|
||||
- [x] CRUD تصنيفات من لوحة التحكم
|
||||
- [x] مواءمة الأنواع للخيار A (PROJECT / MELODY)
|
||||
- [ ] تصنيفات المشاريع (شعارات، بروشورات، مواقع، متاجر، أدوات AI…)
|
||||
- [ ] تصنيفات الألحان (عربي، شرقي…)
|
||||
|
||||
## المرحلة 3 — رفع الملفات (Media)
|
||||
- [x] `lib/upload.ts` — رفع لـ volume على الـ VPS
|
||||
- [x] معالجة صور بـ `sharp` (webp + أحجام)
|
||||
- [x] رفع صوت للألحان
|
||||
- [x] التحقق من نوع/حجم الملف + أسماء ملفات آمنة
|
||||
- [ ] **حذف الملف الفعلي عند حذف المحتوى** + `altText` للصور
|
||||
- [x] مكوّن رفع قابل لإعادة الاستخدام (صور + صوت)
|
||||
|
||||
## المرحلة 4 — المشاريع: أعمال + مواقع + تصاميم (Project)
|
||||
- [x] موديل `Project` موحّد + migration
|
||||
- [x] **باك اند: إضافة/تعديل/حذف مشروع** + اختيار `type` + تصنيف + صور + تقنيات + `isFeatured`/`sortOrder`
|
||||
- [x] **فرونت اند: صفحة الأعمال** (شبكة + فلترة بالتصنيف) + تفاصيل `[slug]`
|
||||
- [x] **فرونت اند: صفحة المواقع** (Next.js/WordPress) + سكرين شوتس
|
||||
- [x] **فرونت اند: صفحة التصاميم** (شعارات/بروشورات/هويات)
|
||||
|
||||
## المرحلة 5 — التطبيقات (Apps · type=APP)
|
||||
- [x] **باك اند: إضافة تطبيق Swift** مع سكرين شوتس + حقول iOS
|
||||
- [x] حقول: App Store / TestFlight / رقم الإصدار / رابط الدعم / سياسة خصوصية التطبيق
|
||||
- [x] **فرونت اند: قسم التطبيقات** + معرض سكرين شوتس بصفحة التفاصيل
|
||||
|
||||
## المرحلة 6 — الألحان (Melodies)
|
||||
- [x] موديل Melody + migration
|
||||
- [x] **باك اند: إضافة لحن جديد** + تصنيف + ملف صوت + غلاف + سماح/منع تحميل
|
||||
- [x] **فرونت اند: قسم الألحان** + **مشغّل صوت** قابل لإعادة الاستخدام
|
||||
- [x] المشغّل: تشغيل/إيقاف + تقديم/تأخير + مستوى صوت + مدة + تحميل اختياري
|
||||
- [x] تصنيفات الألحان (عربي/شرقي) بالفلترة
|
||||
|
||||
## المرحلة 7 — الإيميلات و SMTP
|
||||
- [x] `lib/email.ts` — Nodemailer + إعداد **SMTP**
|
||||
- [x] قوالب **React Email** (تأكيد تواصل، تنبيه للمالك) + قالب نصي بديل
|
||||
- [x] ربط نموذج التواصل → حفظ بالداتابيس + إرسال إيميل
|
||||
- [x] **Honeypot + Rate limiting** لنموذج التواصل
|
||||
- [x] متغيّرات SMTP بـ `.env.example`
|
||||
|
||||
## المرحلة 8 — الصفحات الرسمية
|
||||
- [x] سياسة الخصوصية (ar/en)
|
||||
- [x] شروط الاستخدام (ar/en)
|
||||
- [x] **Impressum** (إلزامي قانونياً بألمانيا — دومين `.de`)
|
||||
- [x] روابط الصفحات بالـ footer
|
||||
|
||||
## المرحلة 9 — الاحصائيات (Analytics) — عدّادات داخلية أولاً
|
||||
- [x] عدّادات داخلية بسيطة: زيارات الصفحات، فتح المشاريع، تشغيل الألحان، نقر روابط المشاريع، عدد رسائل التواصل
|
||||
- [x] لوحة احصائيات مصغّرة داخل الأدمن
|
||||
- [ ] (لاحقاً فقط لو لزم) Umami self-hosted للتحليلات المتقدمة
|
||||
|
||||
## المرحلة 10 — coming-soon و الصيانة
|
||||
- [x] وضع coming-soon أساسي
|
||||
- [ ] وضع **صيانة** منفصل (رسالة صيانة + رجوع للأدمن)
|
||||
- [ ] تحكّم بالأوضاع من env بشكل موثّق
|
||||
|
||||
## المرحلة 11 — البنية التحتية والتشغيل
|
||||
- [ ] تحديث **Makefile**: `db-up`, `migrate`, `seed`, `studio`, أوامر لوكال + سيرفر
|
||||
- [x] docker-compose: خدمة postgres + volume البيانات
|
||||
- [ ] تطبيق migrations تلقائياً عند النشر
|
||||
- [ ] نسخ احتياطي للداتابيس (backup) موثّق
|
||||
|
||||
## عابرة لكل المراحل (Cross-cutting)
|
||||
- [ ] كل شي **مكوّنات قابلة لإعادة الاستخدام**
|
||||
- [ ] كل المكتبات **محليّة** (بدون CDN وقت التشغيل)
|
||||
- [ ] الفرونت اند مطابق لمعايير **Tailwind + shadcn**
|
||||
- [ ] تحديث `PROJECT-STATE.md` بعد كل خطوة كبيرة
|
||||
- [ ] نقل المهام المنجزة من `TODO.md` لقسم Ready
|
||||
@@ -0,0 +1,42 @@
|
||||
# 💡 أفكار مستقبلية — diyaa.de
|
||||
|
||||
> مكان لتجميع الأفكار **قبل** ما تتجدول. لما نقرّر ننفّذ فكرة، بتنتقل لـ [`TODO.md`](./TODO.md) كمهمة.
|
||||
> ضيف فكرة بأي وقت — سطر عنوان + وصف قصير + (اختياري) أولوية.
|
||||
|
||||
**الأولوية:** 🔥 عالية · ⭐ متوسطة · 💤 لاحقاً
|
||||
|
||||
---
|
||||
|
||||
## أفكار مطروحة
|
||||
|
||||
### 💤 مشاركة الألحان للناس ليستمتعوا فيها
|
||||
صفحة عامة تعرض الألحان مع مشغّل جميل، إمكانية مشاركة رابط لكل لحن، وربما playlist. (المالك ذكرها كطموح.)
|
||||
|
||||
### ⭐ RSS / Podcast feed للألحان
|
||||
توليد feed للألحان عشان الناس تتابعها من تطبيقات البودكاست.
|
||||
|
||||
### 💤 صفحة "المدوّنة / كتابات"
|
||||
قسم مقالات بالماركداون (MDX) لمشاركة أفكار تقنية أو موسيقية.
|
||||
|
||||
### ⭐ وضع معاينة (Preview) للمحتوى المسودّة
|
||||
رابط خاص يعاين العمل/اللحن قبل نشره وهو لسا DRAFT.
|
||||
|
||||
### 💤 بحث داخل الموقع
|
||||
بحث بسيط عبر الأعمال والتطبيقات والألحان.
|
||||
|
||||
### 💤 صفحة "خدمات" مع نموذج طلب
|
||||
لو حاب تعرض خدماتك (تصميم، تطوير، ألحان) مع نموذج طلب عرض سعر.
|
||||
|
||||
### ⭐ تحسينات SEO متقدمة
|
||||
structured data (JSON-LD) لكل عمل/تطبيق/لحن + OG images ديناميكية لكل عنصر.
|
||||
|
||||
### 💤 دعم لغات إضافية
|
||||
البنية جاهزة لـ ar/en — ممكن إضافة لغة ثالثة لاحقاً.
|
||||
|
||||
### 💤 تصدير/استيراد المحتوى
|
||||
أداة نسخ احتياطي للمحتوى (JSON) من لوحة التحكم.
|
||||
|
||||
---
|
||||
|
||||
### تعليمات
|
||||
لما تقرّر تنفّذ فكرة: انسخها لـ `TODO.md` كمهمة `T-##`، واحذفها من هون أو علّمها ✅ منقولة.
|
||||
@@ -0,0 +1,156 @@
|
||||
# 🗺️ الوضع الحالي للموقع — diyaa.de
|
||||
|
||||
> **الهدف من الملف:** أي agent يقرأه بيعرف الوضع الحالي للموقع **بدون ما يقرأ الكود**.
|
||||
> آخر تحديث: 2026-08-05
|
||||
|
||||
---
|
||||
|
||||
## نظرة عامة بسطر
|
||||
|
||||
موقع **Next.js 14** شخصي، ثنائي اللغة (عربي/إنجليزي)، حالياً بوضع **coming-soon**، منشور عبر **Docker + Traefik** على VPS خاص (STRATO). قاعدة PostgreSQL وPrisma ومصادقة الأدمن ومخطط Project/Melody وCRUD المشاريع والتطبيقات والألحان ورفع الوسائط وقسم الألحان العام ومشغّل الصوت ونموذج التواصل والصفحات الرسمية والإحصائيات الداخلية صارت مهيّأة.
|
||||
|
||||
---
|
||||
|
||||
## ✅ الموجود فعلياً حالياً
|
||||
|
||||
### الإطار والأدوات
|
||||
- **Next.js 14.2** (App Router) + **React 18** + **TypeScript** (strict).
|
||||
- إخراج `standalone` للنشر عبر Docker.
|
||||
- **Tailwind CSS 3.4** مهيّأ عبر `tailwind.config.js` و`postcss.config.js`، مع ربط ألوان وظلال وخطوط الثيم بمتغيّرات CSS الحالية.
|
||||
- **shadcn/ui** مهيّأ عبر `components.json`، مع مكوّنات UI محلية أساسية في `components/ui/` وأداة `cn` في `lib/utils.ts`.
|
||||
- **PostgreSQL 16** مضاف إلى `docker-compose.yml` مع volume دائم، شبكة داخلية، وفحص صحة.
|
||||
- **Prisma 6.19** مضاف مع `prisma/schema.prisma`، migration أولى، و`lib/db.ts` كـ singleton.
|
||||
- **Auth.js Credentials** مضاف مع جلسات JWT، تشفير كلمات السر بـ `bcryptjs`، وmiddleware يحمي `/admin/`.
|
||||
- **Admin layout** مضاف مع سايدبار، ترويسة صفحات مشتركة، وفورم reusable مبني على React Hook Form وZod.
|
||||
- **Categories CRUD** مضاف داخل لوحة الأدمن مع تحقق Zod ودعم أنواع PROJECT / MELODY.
|
||||
- **Project/Melody schema** مضاف عبر migration جديدة، مع أنواع المشاريع وحقول التطبيقات وحقول الترتيب والنشر.
|
||||
- **Project CRUD + public directories** مضاف للمشاريع الأساسية والتطبيقات، مع صفحات الأعمال والمواقع والتصاميم والتطبيقات وفلترة حسب التصنيف وصفحات تفاصيل حسب slug.
|
||||
- **Melody CRUD + public directory** مضاف مع إدارة الصوت والغلاف والتصنيف والنشر والتحميل، وصفحات قائمة/تفاصيل عامة ومشغّل صوت reusable.
|
||||
- **Media upload** مضاف مع تخزين دائم على volume، معالجة الصور إلى WebP عبر sharp، وحفظ ملفات الصوت بصيغتها الأصلية، ومربوط بنماذج المشاريع والألحان.
|
||||
- **Contact messaging** مضاف مع نموذج عام ثنائي اللغة، حفظ `ContactMessage`، إرسال إشعار للمالك وتأكيد للمرسل عبر Nodemailer/SMTP، وقالب HTML بـ React Email مع بديل نصي.
|
||||
- **Contact protection** مضاف عبر Honeypot وتحديد المعدل بخمسة طلبات لكل عنوان مصدر خلال عشر دقائق.
|
||||
- **Legal pages** مضافة بالعربي والإنجليزي: الخصوصية، شروط الاستخدام، وImpressum، مع روابط في الفوتر وحقول الهوية القانونية من `.env`.
|
||||
- **Internal analytics** مضافة عبر `AnalyticsEvent` وendpoint محمي بالتحديد والتحقق، مع عدّادات للزيارات وفتح المشاريع وتشغيل الألحان ونقر الروابط ورسائل التواصل ولوحة أدمن مختصرة.
|
||||
- ترويسات أمان مضبوطة بـ `next.config.js` (Referrer-Policy, X-Frame-Options, nosniff, Permissions-Policy).
|
||||
- alias `@/*` → جذر المشروع (بـ `tsconfig.json`).
|
||||
|
||||
### التنسيق (Styling) — ⚠️ الانتقال بدأ
|
||||
- **Tailwind CSS** شغّال عبر PostCSS، وtokens الثيم متاحة كألوان وظلال وخطوط ضمن `tailwind.config.js`.
|
||||
- مكوّنات **shadcn/ui** الأساسية مضافة محلياً وقابلة لإعادة الاستخدام؛ قواعد المكوّنات العامة الحالية ما زالت موجودة في `app/globals.css` كطبقة انتقالية بانتظار ترحيلها للـ utilities.
|
||||
- في نظام theme (فاتح/غامق) عبر `[data-theme]` ومتغيرات CSS + مكوّن `ThemeToggle`.
|
||||
|
||||
### التعدّد اللغوي (i18n)
|
||||
- لغتان: `ar` و `en` (`lib/i18n.ts`).
|
||||
- المحتوى مخزّن كـ dictionaries: `content/ar.ts`، `content/en.ts`، بأنواع من `content/types.ts`.
|
||||
- اتجاه تلقائي RTL للعربي / LTR للإنجليزي.
|
||||
- بوضع coming-soon: بيُجبر الموقع على الإنجليزي فقط.
|
||||
|
||||
### الإعدادات والأوضاع
|
||||
- كل الإعداد عبر متغيرات بيئة (`lib/site.ts`).
|
||||
- ثلاثة أوضاع معتمدة: `NEXT_PUBLIC_SITE_MODE = coming-soon | maintenance | full`؛ وضع الصيانة حالياً قيمة محجوزة إلى حين تنفيذ واجهته في T-14.
|
||||
- بيانات المالك: الاسم "Diyaa"، إيميل، LinkedIn، GitHub — كلها من env.
|
||||
|
||||
### الصفحات الموجودة (`app/`)
|
||||
- `app/[locale]/page.tsx` — الرئيسية (Hero).
|
||||
- `app/[locale]/about/page.tsx` — نبذة.
|
||||
- `app/[locale]/contact/page.tsx` — تواصل مع نموذج حفظ وإرسال الرسائل.
|
||||
- `app/[locale]/legal/` — الخصوصية، شروط الاستخدام، وImpressum بالعربي والإنجليزي.
|
||||
- `app/admin/(protected)/analytics/page.tsx` — ملخص الإحصائيات الداخلية لآخر 30 يوماً.
|
||||
- `app/api/analytics/route.ts` — endpoint تسجيل الأحداث العامة مع Zod وrate limiting.
|
||||
- `app/[locale]/melodies/` — قائمة الألحان العامة مع فلترة التصنيفات وصفحات التفاصيل.
|
||||
- `app/not-found.tsx` — 404.
|
||||
- `app/api/health/route.ts` — health check للـ Docker.
|
||||
- `app/robots.ts` + `app/sitemap.ts` — SEO.
|
||||
- صور OG/Twitter/icon جاهزة.
|
||||
|
||||
### المكوّنات الموجودة (`components/`)
|
||||
`SiteHeader` · `SiteFooter` · `HeroSection` · `ComingSoonPanel` · `BottomNav` · `ThemeToggle` · `LanguageSwitcher` · `ContactForm`
|
||||
|
||||
### النشر والبنية التحتية
|
||||
- **Dockerfile** متعدّد المراحل (deps → builder → runner) بمستخدم غير-root.
|
||||
- **docker-compose.yml** مربوط بشبكة **Traefik** خارجية، مع labels للـ HTTPS (`Host(diyaa.de)`, websecure, LetsEncrypt).
|
||||
- **Makefile** بأوامر: `build` · `start` · `stop` · `restart` · `logs` · `ps` (مع فحص `.env` و `COMPOSE_PROJECT_NAME`).
|
||||
- healthcheck عبر `/api/health`.
|
||||
- سكربتات npm: `dev` · `build` · `start` · `lint` · `typecheck` · `check`.
|
||||
|
||||
---
|
||||
|
||||
## ❌ الناقص (لسا ما تبنى)
|
||||
|
||||
| المجال | الحالة |
|
||||
|--------|--------|
|
||||
| **Tailwind + shadcn/ui** | 🟡 Tailwind وshadcn/ui مهيّآن؛ ترحيل المكوّنات العامة من CSS القديم لسا ناقص |
|
||||
| **قاعدة بيانات (PostgreSQL + Prisma)** | 🟡 مخطط Project/Melody وmigration جاهزان؛ CRUD المحتوى وباقي الداتا ناقصان |
|
||||
| **باك اند / لوحة تحكم (Admin)** | 🟡 layout وdashboard وCRUD التصنيفات والمشاريع والتطبيقات والألحان جاهزة؛ إدارة التواصل وباقي المحتوى لسا ناقصة |
|
||||
| **مصادقة (Auth) للأدمن** | 🟡 Auth.js Credentials وحماية `/admin/` جاهزان؛ إدارة المحتوى لسا ناقصة |
|
||||
| **معرض الأعمال + التصنيفات** | 🟡 Project CRUD والصفحات العامة للأعمال والمواقع والتصاميم جاهزة؛ المحتوى المنشور ناقص |
|
||||
| **قسم التطبيقات (Swift/Next.js) مع سكرين شوتس** | 🟡 CRUD وحقول iOS ومعرض السكرين شوتس جاهزين؛ محتوى التطبيقات المنشور ناقص |
|
||||
| **قسم الألحان + مشغّل + تصنيفات** | 🟡 CRUD وقائمة/تفاصيل عامة ومشغّل وفلترة جاهزة؛ المحتوى المنشور لسا ناقص |
|
||||
| **إيميلات + SMTP** | 🟡 التكامل والقوالب والنموذج جاهزة؛ يلزم وضع بيانات SMTP الحقيقية في `.env` |
|
||||
| **الاحصائيات (Analytics)** | 🟡 عدّادات داخلية وواجهة أدمن جاهزة؛ لا توجد تحليلات خارجية متقدمة |
|
||||
| **الصفحات الرسمية (سياسة الخصوصية، الشروط...)** | 🟡 الصفحات والروابط جاهزة؛ يلزم تعبئة بيانات الهوية ومراجعة النصوص قانونياً |
|
||||
| **رفع الملفات (صور/صوت)** | 🟡 API وvolume ومعالجة الصور ومكوّن الرفع وربطه بالمشاريع والألحان جاهز؛ حذف الملفات الفعلية لسا ناقص |
|
||||
|
||||
---
|
||||
|
||||
## 🧭 خريطة المجلدات الحالية
|
||||
|
||||
```
|
||||
diyaa.de/
|
||||
├── app/
|
||||
│ ├── [locale]/ # الصفحات المترجمة (home, about, contact, melodies)
|
||||
│ ├── api/health/ # health check
|
||||
│ ├── api/auth/ # Auth.js handlers
|
||||
│ ├── api/upload/ # رفع ملفات محمي للأدمن
|
||||
│ ├── api/uploads/ # تقديم الملفات المرفوعة
|
||||
│ ├── admin/ # login + layout + dashboard محميان بالمصادقة
|
||||
│ │ └── (protected)/categories/ # صفحات وإجراءات CRUD للتصنيفات
|
||||
│ │ └── (protected)/projects/ # صفحات وإجراءات CRUD للمشاريع
|
||||
│ │ └── (protected)/melodies/ # صفحات وإجراءات CRUD للألحان
|
||||
│ ├── [locale]/work/ # الأعمال المنشورة + [slug]
|
||||
│ ├── [locale]/apps/ # التطبيقات المنشورة + [slug]
|
||||
│ ├── [locale]/websites/ # المواقع المنشورة + [slug]
|
||||
│ ├── [locale]/designs/ # التصاميم المنشورة + [slug]
|
||||
│ ├── globals.css # متغيرات CSS + الثيم
|
||||
│ ├── layout.tsx · robots.ts · sitemap.ts · not-found.tsx
|
||||
├── components/ # مكوّنات الواجهة الحالية
|
||||
│ └── ui/ # مكوّنات shadcn/ui الأساسية
|
||||
├── prisma/ # schema.prisma + migrations (Project/Melody)
|
||||
├── content/ # قواميس الترجمة (ar/en) + الأنواع
|
||||
├── lib/ # auth · db · upload · i18n · site config · metadata · utils · validations
|
||||
├── components/admin/ # shell · page header · reusable form
|
||||
├── components/public/ # project/melody cards, details, directory, audio player
|
||||
├── middleware.ts # حماية مسارات admin
|
||||
├── public/ # أصول ثابتة
|
||||
├── docs/ # 📚 التوثيق (هون)
|
||||
├── Dockerfile · docker-compose.yml · Makefile
|
||||
└── .env.example
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 Changelog (خطوات كبيرة)
|
||||
|
||||
- **2026-08-03** — إنشاء منظومة التوثيق بمجلد `docs/` (STATE, STACK, ARCHITECTURE, CHECKLIST, TODO, IDEAS) + `AGENTS.md`. توثيق الوضع الحالي كقاعدة انطلاق.
|
||||
- **2026-08-05** — إنجاز **T-01**: تهيئة Tailwind CSS وPostCSS وربط tokens الثيم الحالية مع الحفاظ على الوضعين الفاتح والغامق.
|
||||
- **2026-08-05** — إنجاز **T-02**: تهيئة shadcn/ui وإضافة Button وCard وInput وDialog وSelect وForm كمكوّنات محلية قابلة لإعادة الاستخدام.
|
||||
- **2026-08-05** — إنجاز **T-03**: إضافة PostgreSQL 16 إلى Docker، مخطط Prisma الأولي، migration `init`، وعميل قاعدة البيانات singleton.
|
||||
- **2026-08-05** — إنجاز **T-04**: إضافة Auth.js Credentials، تشفير كلمات السر، حماية `/admin/`، صفحة تسجيل الدخول، وseed آمن لمستخدم الأدمن.
|
||||
- **2026-08-05** — إنجاز **T-05**: إضافة layout لوحة الأدمن، سايدبار، عناصر صفحات مشتركة، وفورم عام قابل لإعادة الاستخدام.
|
||||
- **2026-08-05** — إنجاز **T-06**: إضافة تحقق Zod وCRUD للتصنيفات داخل لوحة الأدمن مع دعم أنواع PROJECT / MELODY.
|
||||
- **2026-08-05** — إنجاز **T-07**: إضافة volume للملفات المرفوعة، تخزين محلي، معالجة صور بـ sharp، endpoint محمي، ومكوّن رفع reusable للصور والصوت.
|
||||
- **2026-08-05** — إنجاز **T-16**: استبدال Work/App بـ Project موحّد، تحديث CategoryKind إلى PROJECT/MELODY، إضافة حقول iOS والترتيب والنشر، وتطبيق migration الجديدة.
|
||||
- **2026-08-05** — إنجاز **T-08**: إضافة CRUD المشاريع في الأدمن، رفع الصور من النموذج، وصفحات الأعمال والمواقع والتصاميم مع الفلترة والتفاصيل.
|
||||
- **2026-08-05** — إنجاز **T-09**: إضافة CRUD تطبيقات APP وحقول iOS، فلتر التطبيقات في الأدمن، وقسم عام مع معرض السكرين شوتس وروابط التطبيقات.
|
||||
- **2026-08-05** — إنجاز **T-10**: إضافة CRUD الألحان مع رفع الصوت والغلاف والتحكم بالتحميل، الصفحات العامة والتفاصيل، فلترة التصنيفات، ومشغّل صوت reusable بعناصر التحكم الأساسية.
|
||||
- **2026-08-05** — إنجاز **T-11**: ربط نموذج التواصل بحفظ الرسائل وإرسال إشعار للمالك وتأكيد للمرسل عبر SMTP، إضافة قوالب React Email وبديل نصي، وحماية Honeypot وRate limiting.
|
||||
- **2026-08-05** — إنجاز **T-12**: إضافة صفحات الخصوصية وشروط الاستخدام وImpressum بالعربي والإنجليزي، ربط الفوتر، وإضافة إعدادات الهوية القانونية.
|
||||
- **2026-08-05** — إنجاز **T-13**: إضافة `AnalyticsEvent` وmigration، تتبع الزيارات والتفاعلات الأساسية، endpoint محمي، ولوحة إحصائيات داخل الأدمن.
|
||||
- **2026-08-05** — إنجاز **T-17**: تصحيح `.env.example` واعتماد أوضاع `coming-soon` و`maintenance` و`full` في طبقة إعدادات الموقع، مع إبقاء واجهة الصيانة ضمن T-14.
|
||||
- **2026-08-05** — **مراجعة + قرارات** (`REVIEW-2026-08-05.md`): بعد مقارنة تشيك لست ChatGPT مع الواقع، اعتُمد: (1) مخطط **الخيار A** — `Project` موحّد + `Melody` منفصل يستبدل `Work/App`؛ (2) الاحصائيات **عدّادات داخلية** أولاً بدل Umami؛ (3) إبقاء نظام التوثيق الحالي (6 ملفات)؛ (4) تبنّي إضافات: **Impressum**، حقول iOS، Honeypot/Rate-limit، تفاصيل مشغّل الألحان، فصل صفحات المواقع/التصاميم؛ (5) رصد باگ `.env.example` (`live`→`full`) وغياب `maintenance`. أُضيفت مهام **T-16** (refactor المخطط) و**T-17** (إصلاح env). *(المراجعة موثّقة، وT-16/T-17 أُنجزتا؛ واجهة الصيانة الفعلية لسا متروكة لـ T-14.)*
|
||||
- *(قبل التوثيق)* — موقع coming-soon ثنائي اللغة منشور عبر Docker + Traefik.
|
||||
|
||||
---
|
||||
|
||||
### تعليمات تحديث هذا الملف
|
||||
عند إنجاز أي feature: حدّث جدول "الموجود" و"الناقص"، وأضف سطر بالـ Changelog. خلّي هالملف يعكس **الواقع** لا الطموح.
|
||||
@@ -0,0 +1,27 @@
|
||||
# 📚 توثيق مشروع diyaa.de
|
||||
|
||||
هاد المجلد هو **مصدر الحقيقة الوحيد** لحالة المشروع وخططه. أي agent أو شخص لازم يقرأ من هون **قبل ما يلمس الكود**، وأي خطوة كبيرة لازم تنوثّق هون بعدها.
|
||||
|
||||
## الملفات
|
||||
|
||||
| الملف | شو فيه | إمتى تقرأه |
|
||||
|------|--------|-----------|
|
||||
| [`PROJECT-STATE.md`](./PROJECT-STATE.md) | الوضع الحالي الفعلي للموقع — شو موجود وشو شغّال | **أول شي دايماً** لتعرف الحالة بدون قراءة الكود |
|
||||
| [`STACK.md`](./STACK.md) | الستاك الموصى به وأسبابه | عند اتخاذ قرار تقني أو إضافة مكتبة |
|
||||
| [`ARCHITECTURE.md`](./ARCHITECTURE.md) | المعمارية المستهدفة، مخطط الداتابيس، اتفاقيات المجلدات والمكونات | قبل ما تبني أي feature جديد |
|
||||
| [`CHECKLIST.md`](./CHECKLIST.md) | تشيك لست شاملة لكل شي لازم يتبنى | نظرة عامة على المتبقّي |
|
||||
| [`TODO.md`](./TODO.md) | المهام الحالية القابلة للتنفيذ مع حالاتها | عند السؤال "شو عنا شي نعملو؟" |
|
||||
| [`IDEAS.md`](./IDEAS.md) | أفكار مستقبلية لسا مو مجدولة | لما يخطر ببال أفكار جديدة |
|
||||
|
||||
## سير العمل للـ Agents (مهم)
|
||||
|
||||
اقرأ [`../AGENTS.md`](../AGENTS.md) بالتفصيل. الخلاصة:
|
||||
|
||||
1. **قبل أي شغل** → اقرأ `PROJECT-STATE.md` عشان تفهم الوضع، وافحص `TODO.md` عشان تعرف المهام المفتوحة.
|
||||
2. **عند اقتراح شغل** → خد المهام يلي حالتها `TODO` من `TODO.md` واقترحها.
|
||||
3. **بعد إنجاز مهمة** →
|
||||
- انقل المهمة من قسم `## 🔵 قيد التنفيذ / مفتوحة` لقسم `## ✅ منجزة (Ready)` بملف `TODO.md`.
|
||||
- حدّث `PROJECT-STATE.md` ليعكس الوضع الجديد.
|
||||
- إذا كانت خطوة كبيرة، وثّقها بسطر بالـ changelog بآخر `PROJECT-STATE.md`.
|
||||
|
||||
> القاعدة الذهبية: **لا تخلّي الكود يسبق التوثيق.** إذا الكود تغيّر والتوثيق لأ — هاد باگ.
|
||||
@@ -0,0 +1,91 @@
|
||||
# 🔍 مراجعة: تشيك لست ChatGPT مقابل الواقع — 2026-08-05
|
||||
|
||||
> **✅ الحالة: القرارات معتمدة (2026-08-05).** انعكست على ملفات `docs/`. **التنفيذ على الكود لسا لم يبدأ.**
|
||||
> المصدر المُراجَع: `diyaa-website-clean-checklist-dropdown.md` (من ChatGPT).
|
||||
|
||||
## ✅ القرارات المعتمدة
|
||||
1. **المخطط:** الخيار A — `Project` موحّد + `Melody` منفصل، technologies/screenshots كـ `String[]`، تصنيف واحد-لواحد. → مهمة **T-16**.
|
||||
2. **الاحصائيات:** عدّادات داخلية أولاً؛ Umami مؤجّل. → **T-13**.
|
||||
3. **التوثيق:** إبقاء نظامنا الحالي (6 ملفات)، نوسّع عند الحاجة.
|
||||
4. **التبنّيات الخضراء:** كلها معتمدة (Impressum، حقول iOS، Honeypot/Rate-limit، تفاصيل المشغّل، فصل صفحات المواقع/التصاميم).
|
||||
5. **إصلاح env:** `live`→`full` + إضافة `maintenance`. → **T-17**.
|
||||
|
||||
**الملفات المحدَّثة:** `ARCHITECTURE.md` (مخطط + أقسام + مجلدات + أوضاع) · `CHECKLIST.md` · `TODO.md` (T-16/T-17 + تعديلات) · `STACK.md` · `PROJECT-STATE.md`.
|
||||
|
||||
---
|
||||
### (أدناه المراجعة الأصلية كما كُتبت — للمرجع)
|
||||
|
||||
## الخلاصة
|
||||
التشيك لست تبع ChatGPT **منظّمة وشاملة ومفيدة**، وفيها إضافات أحسن من ملفاتنا (Impressum، حقول iOS، فصل الصفحات، Honeypot/Rate-limit). بس فيها **تعارضات حقيقية** مع يلي **انبنى فعلياً** بالمشروع (T-01→T-05) ومع ملفات `docs/`. لو طبّقناها حرفياً رح نكسر شغل شغّال. أدناه التعارضات + التوصية لكل واحد.
|
||||
|
||||
---
|
||||
|
||||
## 🔴 تعارضات لازم قرار
|
||||
|
||||
### 1) بنية `src/` — تجاهلها
|
||||
ChatGPT يقترح `src/app`, `src/features`, `src/styles`, `src/types`, `src/config`.
|
||||
**الواقع:** المشروع مبني **بالجذر** (`app/`, `components/`, `lib/`, `content/`) ومشغّل.
|
||||
**التوصية:** ❌ تجاهل `src/`. الانتقال إليها = إعادة هيكلة كل الموجود بلا فائدة تقنية.
|
||||
|
||||
### 2) طبقة `features/` — اختيارية، مؤجَّلة
|
||||
ChatGPT يضيف layer `features/` (projects, applications, categories, tracks, media, contact, settings).
|
||||
**الواقع:** غير موجود؛ المنطق بـ `lib/` + `app/`.
|
||||
**التوصية:** 🟡 احتفظ بالنمط الحالي الآن. `features/` مفيدة لو كبر المشروع كثير، بس إضافتها الحين تعقيد مبكّر.
|
||||
|
||||
### 3) مخطط قاعدة البيانات — أكبر تعارض ⚠️
|
||||
| | ChatGPT | المبني فعلياً (`prisma/schema.prisma`) |
|
||||
|---|---|---|
|
||||
| النموذج | جدول موحّد `Project` + حقل `type` | جداول منفصلة `Work` / `App` / `Melody` |
|
||||
| التصنيفات | `Category` + join `project_categories` | `Category` (enum `CategoryKind`) علاقة مباشرة |
|
||||
| التقنيات | جدول `Technology` + join `project_technologies` | ❌ غير موجود |
|
||||
| الوسائط | جدول `Media` منفصل (altText, mime, size, order) | حقول inline (`coverImage`, `images[]`, `screenshots[]`) |
|
||||
|
||||
**تصميمان مختلفان جوهرياً.** المبني حالياً يشتغل وما فيه داتا بعد (فالتغيير آمن).
|
||||
**التوصية (وسط):** وحّد **Work + المواقع + التصاميم + التطبيقات** بجدول `Project` واحد مع `type` (`PORTFOLIO | APP | WEBSITE | DESIGN`)، واحتفظ بـ **`Melody` منفصل** (طبيعته صوتية مختلفة). هيك تلغي تكرار الجداول وتكسب "أنواع قابلة للإضافة"، وتضيف `Technology` (للفلترة) و`Media` (لـ alt text والترتيب) من ChatGPT.
|
||||
**البديل الأخف:** خلّي `Work/App/Melody` كما هي وزيد `WEBSITE` و`DESIGN` كقيم بـ `CategoryKind` — شغل أقل، مرونة أقل.
|
||||
> أي خيار = migration جديد يستبدل الحالي (آمن، لا داتا).
|
||||
|
||||
### 4) الاحصائيات — تعارض مباشر
|
||||
- **ChatGPT:** ❌ لا Umami. اعمل عدّادات داخلية بسيطة (زيارات صفحات، فتح مشاريع، تشغيل ألحان، نقر روابط، رسائل تواصل).
|
||||
- **`STACK.md` تبعنا:** ✅ Umami/Plausible self-hosted.
|
||||
**التوصية:** ابدأ بـ **عدّادات داخلية بسيطة** (اقتراح ChatGPT) للإطلاق الأول — أخف وأسرع وخصوصية أعلى. أضف Umami لاحقاً فقط لو احتجت تحليلات متقدمة. (نحدّث `STACK.md` بعد الموافقة.)
|
||||
|
||||
### 5) نظام التوثيق — نظامان لازم يصيروا واحد
|
||||
ChatGPT يقترح 12 ملف: `CURRENT_STATUS.md`, `ARCHITECTURE.md`, `DATABASE.md`, `DESIGN_SYSTEM.md`, `DEPLOYMENT.md`, `EMAIL.md`, `UPLOADS.md`, `SECURITY.md`, `CHANGELOG.md`, `IDEAS.md`, `TODO.md`, `ROADMAP.md`.
|
||||
عندنا 6: `PROJECT-STATE.md`, `STACK.md`, `ARCHITECTURE.md`, `CHECKLIST.md`, `TODO.md`, `IDEAS.md`.
|
||||
**تضارب أسماء:** `CURRENT_STATUS.md` ≟ `PROJECT-STATE.md` · ChatGPT يفصل `CHANGELOG.md` بينما نحن مدمجينه جوا `PROJECT-STATE.md`.
|
||||
**التوصية:** نظام واحد. أنصح نبقى على أسماءنا الحالية وننقل الملفات المتخصصة (DATABASE/EMAIL/UPLOADS/SECURITY/DEPLOYMENT) فقط لما نبنيها فعلاً — لا نعمل 12 ملف فاضي من الآن. (نضيف `CHANGELOG.md` منفصل إذا حبيت.)
|
||||
|
||||
### 6) Makefile — احتفظ بالحالي
|
||||
Makefile تبع ChatGPT أبسط، بس:
|
||||
- **يفقد** حمايات موجودة: فحص `.env`، فحص `COMPOSE_PROJECT_NAME`، `--env-file`، اسم مشروع Traefik.
|
||||
- **يضيف** `test` و`check: ... test` بينما **ما في test setup** → `make check` رح يفشل.
|
||||
**التوصية:** ❌ لا تستبدل. احتفظ بالـ Makefile الحالي، وزيد عليه بس أوامر Prisma (`db-migrate`, `db-studio`, `seed`) لاحقاً.
|
||||
|
||||
### 7) قيم `SITE_MODE` — تخبيص فعلي بمشروعك 🐞
|
||||
- ChatGPT: `full | maintenance | coming-soon`.
|
||||
- الكود الفعلي (`lib/site.ts`): بس `coming-soon | full` — **ما في `maintenance`**.
|
||||
- `.env.example` مكتوب فيه `# coming-soon | live` — كلمة **`live`** غلط، الكود بدّو **`full`**.
|
||||
**التوصية:** ✅ صلّح `.env.example` (`live` → `full`)، وأضف قيمة `maintenance` للكود (مطلوبة أصلاً بالتشيك لست، T-14).
|
||||
|
||||
---
|
||||
|
||||
## 🟢 نقاط ChatGPT أفضل — نتبنّاها
|
||||
|
||||
- **Impressum** — صفحة **إلزامية قانونياً بألمانيا** (دومين `.de` + سيرفر STRATO). ملفاتنا ما ذكرتها. **نضيفها لـ T-12.**
|
||||
- **حقول iOS للتطبيقات** — App Store / TestFlight / رقم الإصدار / رابط الدعم / سياسة خصوصية لكل تطبيق. **نضيفها لموديل التطبيق.**
|
||||
- **فصل الصفحات**: أعمال / تطبيقات / مواقع / تصاميم / ألحان — تقسيم UI أوضح من دمجها.
|
||||
- **نموذج التواصل:** **Honeypot + Rate limiting** — أمان جيد ما ذكرناه. **نضيفه لـ T-11.**
|
||||
- **مشغّل الألحان:** تحكم مستوى الصوت + تقديم/تأخير + سماح/منع التحميل — تفاصيل نضيفها لـ T-10.
|
||||
- **الوسائط:** حذف الملف الفعلي عند حذف المحتوى + `altText` للصور — نضيفه لـ T-07.
|
||||
- **SEO الأساسي بإعدادات الموقع** + `publishedAt` / `isFeatured` / `sortOrder` على المشاريع — إضافات مفيدة.
|
||||
|
||||
---
|
||||
|
||||
## 📋 القرارات المطلوبة منك (قبل أي تعديل)
|
||||
1. **المخطط:** وسط موحّد (`Project`+`Melody`) / إبقاء الحالي (`Work/App/Melody`) + إضافة WEBSITE/DESIGN كتصنيفات / تبنّي مخطط ChatGPT الكامل؟
|
||||
2. **الاحصائيات:** عدّادات داخلية أولاً (توصيتي) / Umami من الآن؟
|
||||
3. **التوثيق:** إبقاء نظامنا (6 ملفات، نوسّع عند الحاجة) / تبنّي هيكل ChatGPT (12 ملف)؟
|
||||
4. **موافقة على التبنّيات الخضراء** (Impressum، حقول iOS، Honeypot، تفاصيل المشغّل، فصل الصفحات)؟
|
||||
|
||||
> بعد موافقتك: أحدّث `TODO.md` / `CHECKLIST.md` / `ARCHITECTURE.md` / `.env.example` وفق القرارات، وأوثّق كل تغيير بالـ Changelog.
|
||||
@@ -0,0 +1,75 @@
|
||||
# 🧱 الستاك الموصى به — diyaa.de
|
||||
|
||||
> القرار: **Next.js فل ستاك + PostgreSQL + Prisma**. كل شي بمشروع واحد، مكوّنات قابلة لإعادة الاستخدام، ومكتبات محليّة (self-hosted) قدر الإمكان.
|
||||
>
|
||||
> **تحديث 2026-08-05:** المخطط اعتُمد على **الخيار A** — جدول `Project` موحّد + `Melody` منفصل (تفاصيله بـ `ARCHITECTURE.md §3`). الاحصائيات: **عدّادات داخلية أولاً** بدل Umami. راجع قرارات المراجعة بـ `REVIEW-2026-08-05.md`.
|
||||
|
||||
---
|
||||
|
||||
## الخلاصة السريعة
|
||||
|
||||
| الطبقة | الاختيار | ليش |
|
||||
|--------|---------|-----|
|
||||
| **Framework** | Next.js 14 (App Router) — *موجود* | فرونت + باك اند بمشروع واحد، Server Actions & Route Handlers |
|
||||
| **اللغة** | TypeScript (strict) — *موجود* | أمان أنواع، أسهل للـ agents يفهموا الكود |
|
||||
| **التنسيق** | **Tailwind CSS** | معيار مطلوب، utility-first، متناسق |
|
||||
| **مكوّنات UI** | **shadcn/ui** (Radix + Tailwind) | مكوّنات محليّة (بتتنسخ للريبو مش package)، قابلة للتعديل الكامل |
|
||||
| **قاعدة البيانات** | **PostgreSQL** | علاقات قوية (أعمال ↔ تصنيفات ↔ ألحان)، ممتاز محلياً وعلى السيرفر |
|
||||
| **ORM** | **Prisma** | Schema واحد = مصدر الحقيقة، migrations منظّمة، type-safe |
|
||||
| **المصادقة (Admin)** | **Auth.js (NextAuth v5)** بـ Credentials | لوحة تحكم لك وحدك، بدون طرف ثالث |
|
||||
| **رفع الملفات** | تخزين محلي على الـ VPS (volume) + معالجة بـ **sharp** | صور الأعمال والسكرين شوتس والصوت — self-hosted، بدون S3 إلزامي |
|
||||
| **الصوت (الألحان)** | `<audio>` عنصر أصلي + مشغّل مخصّص (wavesurfer.js اختياري، محلي) | تشغيل الألحان بدون خدمة خارجية |
|
||||
| **الإيميلات** | **Nodemailer + SMTP** (STRATO أو أي مزوّد) | تحكّم كامل، بدون API طرف ثالث |
|
||||
| **قوالب الإيميل** | **React Email** | قوالب بمكوّنات React، متسقة مع باقي الستاك |
|
||||
| **الاحصائيات** | **عدّادات داخلية بسيطة** أولاً (Umami self-hosted لاحقاً لو لزم) | أخف، خصوصية أعلى، بدون خدمة إضافية للإطلاق الأول |
|
||||
| **الفاليديشن** | **Zod** | تحقّق من الفورمات والـ API، متكامل مع Prisma/TS |
|
||||
| **الفورمات** | **React Hook Form + Zod** | إدارة نماذج لوحة التحكم |
|
||||
| **النشر** | Docker + Traefik + Makefile — *موجود* | نفس المنظومة الحالية، بنضيف عليها Postgres |
|
||||
|
||||
---
|
||||
|
||||
## ليش Next.js فل ستاك (مش باك اند منفصل)؟
|
||||
|
||||
- مشروع واحد = صيانة أسهل وتوثيق أوضح للـ agents.
|
||||
- **Server Actions** بتلغي الحاجة لطبقة API منفصلة لمعظم عمليات لوحة التحكم.
|
||||
- **Route Handlers** (`app/api/...`) لأي endpoints عامة (مثلاً webhook، رفع، RSS للألحان).
|
||||
- كل شي TypeScript من الداتابيس للواجهة = نوع واحد يمشي من `Prisma` لـ `React`.
|
||||
|
||||
## ليش PostgreSQL + Prisma؟
|
||||
|
||||
- بياناتك **علائقية**: عمل واحد ينتمي لتصنيف، تطبيق إله كذا سكرين شوت، لحن إله تصنيف (عربي/شرقي). Postgres مثالي لهيك.
|
||||
- Prisma بيخلّي `schema.prisma` **مصدر الحقيقة الوحيد** للبنية — وهاد بيخدم شرط التوثيق.
|
||||
- migrations منظّمة → تشتغل نفسها محلياً وعلى السيرفر.
|
||||
|
||||
## مبدأ "كل المكتبات محليّة"
|
||||
|
||||
- **shadcn/ui**: بتتنسخ داخل `components/ui/` — مش dependency خارجي، تحت سيطرتك بالكامل.
|
||||
- الخطوط: self-hosted عبر `next/font` (بدون Google Fonts CDN).
|
||||
- الأيقونات: `lucide-react` (bundled محلياً).
|
||||
- مشغّل الصوت والاحصائيات: self-hosted على نفس الـ VPS.
|
||||
- تجنّب أي CDN وقت التشغيل — كل شي يتحزّم مع الـ build.
|
||||
|
||||
---
|
||||
|
||||
## حزم مقترحة للتثبيت (مرجع)
|
||||
|
||||
```
|
||||
# UI
|
||||
tailwindcss postcss autoprefixer
|
||||
# shadcn/ui يُهيّأ عبر: npx shadcn@latest init
|
||||
class-variance-authority clsx tailwind-merge lucide-react tailwindcss-animate
|
||||
# DB
|
||||
prisma @prisma/client
|
||||
# Auth
|
||||
next-auth@beta
|
||||
# Forms & validation
|
||||
react-hook-form zod @hookform/resolvers
|
||||
# Email
|
||||
nodemailer @react-email/components @react-email/render
|
||||
# Media
|
||||
sharp
|
||||
# (اختياري) مشغّل صوت
|
||||
wavesurfer.js
|
||||
```
|
||||
|
||||
> ⚠️ لا تثبّت شي إلا وقت الحاجة الفعلية للـ feature المرتبط فيه، وحدّث `PROJECT-STATE.md` بعد كل إضافة.
|
||||
@@ -0,0 +1,54 @@
|
||||
# 📋 قائمة المهام — diyaa.de
|
||||
|
||||
> لما تسأل الـ agent "شو عنا شي نعملو؟" → بيقرأ من قسم **🔵 مفتوحة** ويقترح المهمة الجاهزة للبدء (يلي مو محجوبة بمهمة قبلها).
|
||||
> لما تخلص مهمة → **انقلها** من "🔵 مفتوحة" لـ "✅ منجزة (Ready)" مع تاريخ، وحدّث `PROJECT-STATE.md`.
|
||||
|
||||
**نظام الحالات:** `🔵 مفتوحة` · `🟡 قيد التنفيذ` · `✅ منجزة (Ready)` · `⛔ محجوبة (تحتاج مهمة قبلها)`
|
||||
|
||||
---
|
||||
|
||||
## 🟡 قيد التنفيذ
|
||||
|
||||
_(لا يوجد حالياً)_
|
||||
|
||||
---
|
||||
|
||||
## 🔵 مفتوحة (مرتّبة بالأولوية — ابدأ من فوق)
|
||||
|
||||
> 🆕 **قرارات مراجعة 2026-08-05** أضافت T-16 و T-17 وعدّلت T-08→T-13. اقرأ `REVIEW-2026-08-05.md`.
|
||||
|
||||
### T-14 · وضع الصيانة
|
||||
وضع صيانة منفصل عن coming-soon + رسالة + استثناء الأدمن.
|
||||
**الحالة:** 🔵
|
||||
|
||||
### T-15 · تحديث Makefile + docker-compose للداتابيس
|
||||
أوامر `db-up`, `migrate`, `seed`, `studio` + volumes (بيانات + ملفات) + تطبيق migrations عند النشر + backup موثّق.
|
||||
**الحالة:** 🔵
|
||||
|
||||
---
|
||||
|
||||
## ✅ منجزة (Ready)
|
||||
|
||||
- **2026-08-05 · T-13 · الإحصائيات الداخلية** — إضافة أحداث الزيارات وفتح المشاريع وتشغيل الألحان ونقر الروابط ورسائل التواصل، endpoint محمي بالتحقق وتحديد المعدل، وواجهة ملخص داخل الأدمن لآخر 30 يوماً. ✅
|
||||
- **2026-08-05 · T-12 · الصفحات الرسمية** — إضافة سياسة الخصوصية وشروط الاستخدام وImpressum بالعربي والإنجليزي، ربطها بالفوتر، وإضافة حقول الهوية القانونية إلى `.env.example`. ✅
|
||||
- **2026-08-05 · T-11 · الإيميلات + SMTP** — ربط نموذج التواصل بحفظ الرسائل وإرسال إشعار للمالك وتأكيد للمرسل عبر Nodemailer، قوالب React Email وبديل نصي، حماية Honeypot وRate limiting، وإضافة متغيّرات SMTP إلى `.env.example`. ✅
|
||||
- **2026-08-05 · T-10 · الألحان (باك + فرونت + مشغّل)** — إضافة CRUD كامل للألحان مع التصنيفات ورفع الصوت والغلاف والتحكم بالتحميل، قسم عام بصفحات قائمة وتفاصيل، فلترة التصنيفات، ومشغّل صوت reusable بالتشغيل والتقديم والتأخير ومستوى الصوت والمدة والتحميل الاختياري. ✅
|
||||
- **2026-08-05 · T-09 · التطبيقات (type=APP)** — إضافة حقول iOS إلى CRUD المشاريع، فلتر التطبيقات في الأدمن، وقسم عام للتطبيقات مع معرض السكرين شوتس وروابط المتاجر والدعم والخصوصية. ✅
|
||||
- **2026-08-05 · T-08 · المشاريع: أعمال + مواقع + تصاميم** — إضافة CRUD أساسي للمشاريع، رفع الصور من النموذج، صفحات الأعمال والمواقع والتصاميم مع فلترة التصنيفات وصفحات تفاصيل حسب slug. ✅
|
||||
- **2026-08-05 · T-16 · إعادة تشكيل المخطط للخيار A** — استبدال Work/App بـ Project موحّد، تحديث CategoryKind إلى PROJECT/MELODY، إضافة حقول المشاريع وحقول iOS، وتطبيق migration محلية ناجحة. ✅
|
||||
- **2026-08-05 · T-17 · إصلاح `.env.example` + وضع الصيانة** — تصحيح قيمة `full` وإضافة `maintenance` إلى أوضاع الموقع مع إبقاء واجهة الصيانة ضمن T-14. ✅
|
||||
- **2026-08-05 · T-07 · رفع الملفات (Media)** — إضافة تخزين دائم للملفات، معالجة الصور إلى WebP عبر sharp، حفظ الصوت بصيغته، endpoint محمي، ومكوّن رفع reusable. ✅
|
||||
- **2026-08-05 · T-06 · التصنيفات (Categories) CRUD** — إضافة تحقق Zod وعمليات إنشاء/تعديل/حذف للتصنيفات من لوحة الأدمن مع دعم PROJECT / MELODY. ✅
|
||||
- **2026-08-05 · T-05 · Layout لوحة التحكم** — إضافة shell محمي، سايدبار، ترويسة مشتركة، وفورم عام مبني على React Hook Form وZod. ✅
|
||||
- **2026-08-05 · T-04 · مصادقة الأدمن** — إضافة Auth.js Credentials، تشفير كلمات السر، حماية `app/admin/`، صفحة دخول، وseed آمن لمستخدم الأدمن. ✅
|
||||
- **2026-08-05 · T-03 · إعداد PostgreSQL + Prisma** — إضافة خدمة PostgreSQL مع volume وشبكة داخلية، مخطط Prisma الأولي، migration `init`، وعميل قاعدة البيانات singleton. ✅
|
||||
- **2026-08-05 · T-02 · تهيئة shadcn/ui** — إضافة `components.json`، أداة `cn`، والمكوّنات الأساسية Button/Card/Input/Dialog/Select/Form مع دعم RTL والثيم الحالي. ✅
|
||||
- **2026-08-05 · T-01 · تهيئة Tailwind CSS** — إضافة إعداد Tailwind/PostCSS، وربط tokens الثيم الحالية مع الحفاظ على الوضعين الفاتح والغامق. ✅
|
||||
- **2026-08-03 · T-00 · منظومة التوثيق** — إنشاء `docs/` (STATE, STACK, ARCHITECTURE, CHECKLIST, TODO, IDEAS) + `AGENTS.md`. موثّق بالكامل. ✅
|
||||
|
||||
---
|
||||
|
||||
### تعليمات للـ agent
|
||||
1. اقترح **أول مهمة 🔵 مفتوحة وغير محجوبة** من الأعلى.
|
||||
2. عند البدء: غيّر حالتها لـ `🟡 قيد التنفيذ`.
|
||||
3. عند الانتهاء: انقلها لـ **✅ منجزة** مع التاريخ ورقم المهمة، حرّر حالات المهام المحجوبة يلي انفتحت، وحدّث `PROJECT-STATE.md`.
|
||||
Reference in New Issue
Block a user