systemprompt_content/
extension.rs1use 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);