Skip to main content

systemprompt_content/
extension.rs

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