systemprompt-content 0.1.21

Content module for systemprompt.io with content management, analytics, and event tracking
Documentation
use std::sync::Arc;

use systemprompt_extension::prelude::*;

use crate::branding_provider::default_branding_provider;
use crate::homepage_prerenderer::DefaultHomepagePrerenderer;
use crate::list_branding_provider::default_list_branding_provider;
use crate::list_items_renderer::default_list_items_renderer;

#[derive(Debug, Clone, Copy, Default)]
pub struct ContentExtension;

impl Extension for ContentExtension {
    fn metadata(&self) -> ExtensionMetadata {
        ExtensionMetadata {
            id: "content",
            name: "Content",
            version: env!("CARGO_PKG_VERSION"),
        }
    }

    fn migration_weight(&self) -> u32 {
        45
    }

    fn schemas(&self) -> Vec<SchemaDefinition> {
        vec![
            SchemaDefinition::inline(
                "markdown_categories",
                include_str!("../schema/markdown_categories.sql"),
            )
            .with_required_columns(vec!["id".into(), "name".into(), "slug".into()]),
            SchemaDefinition::inline(
                "markdown_content",
                include_str!("../schema/markdown_content.sql"),
            )
            .with_required_columns(vec!["id".into(), "slug".into(), "title".into()]),
            SchemaDefinition::inline("markdown_fts", include_str!("../schema/markdown_fts.sql")),
            SchemaDefinition::inline(
                "content_performance_metrics",
                include_str!("../schema/content_performance_metrics.sql"),
            )
            .with_required_columns(vec!["id".into(), "content_id".into()]),
            SchemaDefinition::inline(
                "campaign_links",
                include_str!("../schema/campaign_links.sql"),
            )
            .with_required_columns(vec![
                "id".into(),
                "short_code".into(),
                "target_url".into(),
            ]),
            SchemaDefinition::inline("link_clicks", include_str!("../schema/link_clicks.sql"))
                .with_required_columns(vec!["id".into(), "link_id".into(), "clicked_at".into()]),
            SchemaDefinition::inline(
                "link_analytics_views",
                include_str!("../schema/link_analytics_views.sql"),
            ),
        ]
    }

    fn dependencies(&self) -> Vec<&'static str> {
        vec!["users", "analytics"]
    }

    fn page_prerenderers(&self) -> Vec<Arc<dyn PagePrerenderer>> {
        vec![Arc::new(DefaultHomepagePrerenderer)]
    }

    fn page_data_providers(&self) -> Vec<Arc<dyn PageDataProvider>> {
        vec![
            default_branding_provider(),
            default_list_branding_provider(),
        ]
    }

    fn component_renderers(&self) -> Vec<Arc<dyn ComponentRenderer>> {
        vec![default_list_items_renderer()]
    }
}

register_extension!(ContentExtension);