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 ]
57 }
58
59 fn dependencies(&self) -> Vec<&'static str> {
60 vec!["users", "analytics"]
61 }
62
63 fn migrations(&self) -> Vec<Migration> {
64 extension_migrations!()
65 }
66
67 fn page_prerenderers(&self) -> Vec<Arc<dyn PagePrerenderer>> {
68 vec![Arc::new(DefaultHomepagePrerenderer)]
69 }
70
71 fn page_data_providers(&self) -> Vec<Arc<dyn PageDataProvider>> {
72 vec![
73 default_branding_provider(),
74 default_list_branding_provider(),
75 ]
76 }
77
78 fn component_renderers(&self) -> Vec<Arc<dyn ComponentRenderer>> {
79 vec![default_list_items_renderer()]
80 }
81}
82
83register_extension!(ContentExtension);