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:
2026-08-05 20:53:40 +02:00
parent d87f3033c6
commit c26f41511f
122 changed files with 15068 additions and 41 deletions
+249
View File
@@ -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**.
+99
View File
@@ -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
+42
View File
@@ -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-##`، واحذفها من هون أو علّمها ✅ منقولة.
+156
View File
@@ -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. خلّي هالملف يعكس **الواقع** لا الطموح.
+27
View File
@@ -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`.
> القاعدة الذهبية: **لا تخلّي الكود يسبق التوثيق.** إذا الكود تغيّر والتوثيق لأ — هاد باگ.
+91
View File
@@ -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.
+75
View File
@@ -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` بعد كل إضافة.
+54
View File
@@ -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`.