Skip to main content

systemprompt_content/
extension.rs

1//! `Extension` registration for the content domain: schemas and dependencies.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use std::sync::Arc;
7
8use systemprompt_extension::prelude::*;
9
10use crate::branding_provider::default_branding_provider;
11use crate::homepage_prerenderer::DefaultHomepagePrerenderer;
12use crate::list_branding_provider::default_list_branding_provider;
13use crate::list_items_renderer::default_list_items_renderer;
14
15#[derive(Debug, Clone, Copy, Default)]
16pub struct ContentExtension;
17
18impl Extension for ContentExtension {
19    fn metadata(&self) -> ExtensionMetadata {
20        ExtensionMetadata {
21            id: "content",
22            name: "Content",
23            version: env!("CARGO_PKG_VERSION"),
24        }
25    }
26
27    fn schemas(&self) -> Vec<SchemaDefinition> {
28        vec![
29            SchemaDefinition::new(
30                "markdown_categories",
31                include_str!("../schema/markdown_categories.sql"),
32            )
33            .with_required_columns(vec!["id".into(), "name".into(), "slug".into()]),
34            SchemaDefinition::new(
35                "markdown_content",
36                include_str!("../schema/markdown_content.sql"),
37            )
38            .with_required_columns(vec!["id".into(), "slug".into(), "title".into()]),
39            SchemaDefinition::new("markdown_fts", include_str!("../schema/markdown_fts.sql")),
40            SchemaDefinition::new(
41                "content_performance_metrics",
42                include_str!("../schema/content_performance_metrics.sql"),
43            )
44            .with_required_columns(vec!["id".into(), "content_id".into()]),
45            SchemaDefinition::new(
46                "campaign_links",
47                include_str!("../schema/campaign_links.sql"),
48            )
49            .with_required_columns(vec![
50                "id".into(),
51                "short_code".into(),
52                "target_url".into(),
53            ]),
54            SchemaDefinition::new("link_clicks", include_str!("../schema/link_clicks.sql"))
55                .with_required_columns(vec!["id".into(), "link_id".into(), "clicked_at".into()]),
56            SchemaDefinition::new(
57                "link_analytics_views",
58                include_str!("../schema/link_analytics_views.sql"),
59            ),
60        ]
61    }
62
63    fn dependencies(&self) -> Vec<&'static str> {
64        vec!["users", "analytics"]
65    }
66
67    fn migrations(&self) -> Vec<Migration> {
68        extension_migrations!()
69    }
70
71    fn page_prerenderers(&self) -> Vec<Arc<dyn PagePrerenderer>> {
72        vec![Arc::new(DefaultHomepagePrerenderer)]
73    }
74
75    fn page_data_providers(&self) -> Vec<Arc<dyn PageDataProvider>> {
76        vec![
77            default_branding_provider(),
78            default_list_branding_provider(),
79        ]
80    }
81
82    fn component_renderers(&self) -> Vec<Arc<dyn ComponentRenderer>> {
83        vec![default_list_items_renderer()]
84    }
85}
86
87register_extension!(ContentExtension);