systemprompt_content/
extension.rs1use 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 schemas(&self) -> Vec<SchemaDefinition> {
23 vec![
24 SchemaDefinition::new(
25 "markdown_categories",
26 include_str!("../schema/markdown_categories.sql"),
27 )
28 .with_required_columns(vec!["id".into(), "name".into(), "slug".into()]),
29 SchemaDefinition::new(
30 "markdown_content",
31 include_str!("../schema/markdown_content.sql"),
32 )
33 .with_required_columns(vec!["id".into(), "slug".into(), "title".into()]),
34 SchemaDefinition::new("markdown_fts", include_str!("../schema/markdown_fts.sql")),
35 SchemaDefinition::new(
36 "content_performance_metrics",
37 include_str!("../schema/content_performance_metrics.sql"),
38 )
39 .with_required_columns(vec!["id".into(), "content_id".into()]),
40 SchemaDefinition::new(
41 "campaign_links",
42 include_str!("../schema/campaign_links.sql"),
43 )
44 .with_required_columns(vec![
45 "id".into(),
46 "short_code".into(),
47 "target_url".into(),
48 ]),
49 SchemaDefinition::new("link_clicks", include_str!("../schema/link_clicks.sql"))
50 .with_required_columns(vec!["id".into(), "link_id".into(), "clicked_at".into()]),
51 SchemaDefinition::new(
52 "link_analytics_views",
53 include_str!("../schema/link_analytics_views.sql"),
54 ),
55 ]
56 }
57
58 fn dependencies(&self) -> Vec<&'static str> {
59 vec!["users", "analytics"]
60 }
61
62 fn migrations(&self) -> Vec<Migration> {
63 extension_migrations!()
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);