# Activity Metadata Schema # # Extends PostMetadata with activity-specific fields (talks, workshops, events). # The `metadata` field carries event-specific data: type, location, slides, downloads. # # Usage — preferred (make_activity factory): # # let schema = import "content/metadata/activity_metadata.ncl" in # schema.make_activity { # id = "rust-async-patterns-2026", # title = "Rust Async Patterns in Production", # slug = "rust-async-patterns", # date = "2026-03-15", # category = "talks", # } let c = import "contracts.ncl" in let post = import "post_metadata.ncl" in let d = import "defaults.ncl" in { ActivityEventMetadata = { event_type | String | doc "Activity kind: 'talk' | 'workshop' | 'webinar' | 'panel' | 'other'" | optional, event_date | String | c.DateContract | doc "Date of the event (ISO 8601). May differ from the post date." | optional, event_location | String | doc "City or venue name. Empty string or absent for online events." | optional, slides_id | String | doc "Identifier used to derive the slides URL or file path." | optional, pdf_filename | String | doc "Filename of the downloadable PDF (relative to the slides asset directory)." | optional, repository_url | String | doc "URL to the companion source code repository." | optional, questionnaire_type | String | doc "Gating mechanism for downloads: 'internal' | 'external' | 'none'." | optional, questionnaire_config | String | doc "Identifier of the questionnaire configuration used for gating." | optional, download_requires_auth | Bool | doc "Require authenticated session before allowing download." | default = false, download_requires_questionnaire | Bool | doc "Require questionnaire completion before allowing download." | default = false, gallery | Array String | doc "List of image filenames or URLs for the activity photo gallery." | default = [], .. }, ActivityMetadata = post.PostMetadata & { sort_order | Number | doc "Display order within the category listing. Lower values appear first." | default = 100, metadata | ActivityEventMetadata | doc "Activity-specific event metadata (location, slides, downloads, etc.)." | default = {}, }, make_activity | not_exported | doc "Create a validated activity metadata record. Provide at minimum: title, slug, date, category." = fun overrides => d & overrides | ActivityMetadata, }