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 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);