Developer Page Specifications
Data Model
17 tables — Article core, Lang i18n, Industry + IndustryLang + ArticleIndustry, Category, Topic, Author, Images, ArticleConnectedEntity, Analytics, Seo, Versions.
مكتمل
14 جدول لـ Editorial. الأساسي (Article + Lang)، Taxonomy (Category + Topic مع رفقاء Lang + join ArticleTopic)، الناس (Author + Lang)، الإعلام (ArticleImage)، Cross-module (ArticleRelated للروابط اليدوية، EcosystemEntityLinks مشترك)، التشغيلي (Analytics، Seo). كل حقل bilingual يَستخدم جدول رفيق *Lang.
الجدول 1 · EditorialArticle (أساسي)
- الهوية
- Id (uuid PK)، Slug (varchar(120) unique). CanonicalArticleId (FK → self، nullable) لربط زوج-الترجمة.
- النوع + الموضوع
- Type (enum: news|analysis|commentary|interview|profile|guide، مطلوب). Topic (varchar(40)، مطلوب، قيمة واحدة). Sector + Country (varchar، nullable، مُسوّاة من الإشارات للفلترة السريعة).
- مفاتيح أجنبية
- CategoryId (FK → EditorialCategory، مطلوب)، AuthorId (FK → EditorialAuthor، مطلوب)، FeaturedImageId (FK → EditorialArticleImage، nullable).
- مصفوفات entities المذكورة
- MentionedFounderIds (uuid[])، MentionedStartupIds، MentionedEventIds، MentionedOpportunityIds. كلها اختيارية. تُغذّي reverse-lookups cross-module + شريط connected-signals.
- علامات تحريرية
- IsActive (bool، بوّابة soft-delete)، IsFeatured (bool، يَقود spotlight)، IsEditorPick (bool، يَقود فرز "editor-picks")، IsMostRead (bool، override يدوي للاختيارات التحريرية)، IsSponsored (bool، يَقود إفصاح الراعي)، IsPractical (bool، يَكتم شريط Files cross-module)، IsTranslated (bool، true حين هذه ترجمة لمقالة أخرى).
- دورة الحياة
- Status (enum: draft|in-review|scheduled|published|archived، مطلوب). PublishDate، UpdatedDate، ScheduledFor (timestamptz). ViewCount (int، مُسوّاة من EditorialArticleAnalytics).
- meta القراءة
- ReadingTimeMinutes (int، محتسبة من عدد كلمات الجسم وقت الحفظ)، WordCount (int)، OriginalLanguage (varchar(2)، 'en' أو 'ar').
- التدقيق
- CreatedAt، UpdatedAt، CreatedByUserId، LastEditedByUserId.
الجداول 2-14
- EditorialArticleLang (PK مُرَكَّب ArticleId + Lang): Title، Subtitle?، Dek، Excerpt، BodyHtml (مُعَقَّم)، MetaTitle?، MetaDescription?.
- EditorialCategory (Id، Slug، IconKey، DisplayOrder، IsActive). رفيق EditorialCategoryLang: Name + Description.
- EditorialTopic (Id، Slug، RelatedCategoryId?). رفيق EditorialTopicLang: Name + Description.
- EditorialArticleTopic (join: ArticleId ↔ TopicId، DisplayOrder).
- EditorialAuthor (Id، Slug، AvatarUrl، LinkedInUrl، TwitterUrl، PersonalSiteUrl، Email، IsActive). رفيق EditorialAuthorLang: DisplayName + Role + Bio.
- EditorialArticleImage (Id، ArticleId، Url، Alt (bilingual)، Caption (bilingual)، Credit، AspectRatio، DisplayOrder). DisplayOrder=0 هو الغلاف المميَّز.
- EditorialArticleRelated (related يدوي: ArticleId ↔ RelatedArticleId، DisplayOrder). مُنَسَّق-من-المحرّر.
- EditorialArticleAnalytics (ArticleId PK، ViewCount، AvgReadingTimeMs، ScrollDepthAvgPct، BounceRate، LastViewedAt). تُحَدَّث تدريجياً بـ analytics ingestion.
- EditorialArticleSeo (ArticleId PK، CanonicalUrl، OgImage?، SchemaType: 'Article'|'NewsArticle'|'BlogPosting'). حين null، مُشتقّ من الافتراضيات.
- EditorialArticleVersion (جدول لقطات لتاريخ التحرير، نافذة استرداد 90-يوم).
- EcosystemEntityLinks (مشترك على نطاق-المنصّة، انظر §13.1.3 — يَدعم entityType='editorial').
- EditorialSubscription (Email، PreferredLang، InterestCategories[]، ConsentPlatform، ConsentPartners، Source: 'listing'|'category'|'topic'|'article'، ArticleIdContext?، CreatedAt).
