Developer Page Specifications
Data Model
11 tables. CalendarEvent with 30+ fields in 11 logical clusters. 5 cross-module reference arrays.
Complete
11 tables backing the Calendar. CalendarEvent is the central record (30+ fields organised into 11 logical clusters per §9.6). 4 join tables for the multi-value taxonomies (audiences, stages, sectors, countries when multi-country eligibility). Plus Organizer (shared with Coverage), Country (shared platform-wide), and CalendarEventLang for i18n.
Table 1 · CalendarEvent (core)
- Identity
- Id (uuid PK), Slug (varchar(120) unique).
- Organizer
- OrganizerName (varchar(200)), OrganizerType (Accelerator|Incubator|VC|Corporate|Government|University|Community|Media|Other), OrganizerLogoUrl, OrganizerWebsite. Denormalised from Organizer for query speed; Organizer table holds the canonical record + cross-module reference target.
- Location
- CountryCode, City, Venue, VenueAddress, GeoLat (numeric), GeoLng (numeric), OnlineUrl, Mode (physical|online|hybrid).
- Time
- StartDate (timestamptz, required), EndDate (timestamptz, nullable), Timezone (IANA, e.g. Africa/Cairo, required), RegistrationDeadline, ApplicationDeadline.
- Classification
- Category (1 of 17 values), Status (computed-but-stored: upcoming|open|closing-soon|live|completed|postponed|cancelled). Industries (text[], free taxonomy).
- Action URLs
- WebsiteUrl, RegistrationUrl, ApplyUrl, ContactEmail. SocialLinks (jsonb: twitter, linkedin, instagram).
- Media
- CoverImageUrl (16:9 ≥1200×675), LogoUrl.
- Provenance
- SourceUrl (required), VerificationStatus (pending|verified|rejected|needs_info, required), LastVerifiedAt, VerifiedByUserId.
- Editorial decisions
- EditorialPriority (standard|featured|spotlight, default standard), CoverageEligible (bool), CoverageStatus (not_planned|planned|covered).
- Cross-module reference arrays
- RelatedEditorialIds (uuid[]), RelatedStartupIds, RelatedFounderIds, RelatedOpportunityIds, RelatedFileIds. All optional.
- SEO + audit
- MetaTitleLang + MetaDescriptionLang stored on CalendarEventLang. CreatedAt, UpdatedAt, PublishedAt.
Tables 2-11
- CalendarEventLang (composite PK EventId + Lang): Title, ShortDescription, FullDescription, WhyItMatters?, MetaTitle?, MetaDescription?.
- CalendarEventAudience (join: EventId ↔ AudienceCode). AudienceCode values: founders, startups, investors, students, operators, ecosystem-builders, corporates, government, media.
- CalendarEventStage (join: EventId ↔ StageCode). StageCode mirrors Opportunity Radar stages.
- CalendarEventSector (join: EventId ↔ SectorCode).
- CalendarEventCountry (join: EventId ↔ CountryCode) — for multi-country eligibility (anchor country lives on CalendarEvent.CountryCode).
- Organizer (Id, Name, Type, CountryCode, LogoUrl, WebsiteUrl, IsVerified). DescriptionLang companion.
- Country (shared lookup, Id, Code, NameLang, Region: GCC|Levant|North Africa).
- EventCategory (lookup, Slug, NameLang, DescriptionLang, IconKey).
- CalendarEventSubmission (Id, EventId, SubmitterEmail, SubmitterName, RawPayload jsonb, Status: pending|verified|rejected|needs-info, CreatedAt, IpAddress).
- CalendarEventAuditLog (Id, EventId, Action: created|updated|verified|published|postponed|cancelled, ActorUserId, ActorIp, BeforeJson, AfterJson, CreatedAt). Append-only.
