Skip to main content

systemprompt_analytics/repository/
mod.rs

1//! Repository layer.
2//!
3//! Typed `*Repository` structs that wrap `DbPool` and expose compile-time-
4//! verified `sqlx::query!` calls for every analytics aggregation, mutation,
5//! and lookup. Public re-exports below form the only supported entry points;
6//! internal submodules are private to the crate.
7//!
8//! Copyright (c) systemprompt.io — Business Source License 1.1.
9//! See <https://systemprompt.io> for licensing details.
10
11mod agents;
12mod cli_sessions;
13mod content_analytics;
14mod conversations;
15mod costs;
16mod engagement;
17mod events;
18mod fingerprint;
19mod overview;
20mod ownership;
21mod requests;
22mod session_signals;
23mod tools;
24mod traffic;
25
26pub use agents::AgentAnalyticsRepository;
27pub use cli_sessions::CliSessionAnalyticsRepository;
28pub use content_analytics::ContentAnalyticsRepository;
29pub use conversations::ConversationAnalyticsRepository;
30pub use costs::CostAnalyticsRepository;
31pub use engagement::EngagementRepository;
32pub use events::AnalyticsEventsRepository;
33pub use fingerprint::{
34    ABUSE_THRESHOLD_FOR_BAN, FingerprintRepository, HIGH_REQUEST_THRESHOLD, HIGH_VELOCITY_RPM,
35    MAX_SESSIONS_PER_FINGERPRINT, SUSTAINED_VELOCITY_MINUTES,
36};
37pub use overview::OverviewAnalyticsRepository;
38pub use ownership::AnalyticsOwnerReassignment;
39pub use requests::RequestAnalyticsRepository;
40pub use session_signals::SessionSignalsRepository;
41pub use tools::ToolAnalyticsRepository;
42pub use tools::list_queries::ToolListParams;
43pub use traffic::{NavigationQuery, PageQuery, TrafficAnalyticsRepository};
44
45use systemprompt_database::DbPool;
46use systemprompt_traits::DynSessionStore;
47
48#[derive(Clone)]
49pub struct AnalyticsRepositories {
50    pub session_store: DynSessionStore,
51    pub session_signals: SessionSignalsRepository,
52    pub costs: CostAnalyticsRepository,
53    pub engagement: EngagementRepository,
54    pub events: AnalyticsEventsRepository,
55}
56
57impl std::fmt::Debug for AnalyticsRepositories {
58    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
59        f.debug_struct("AnalyticsRepositories")
60            .field("session_signals", &self.session_signals)
61            .field("costs", &self.costs)
62            .field("engagement", &self.engagement)
63            .field("events", &self.events)
64            .finish_non_exhaustive()
65    }
66}
67
68impl AnalyticsRepositories {
69    pub fn new(
70        db: &DbPool,
71        sessions: DynSessionStore,
72        event_sink: systemprompt_traits::DynAnalyticsEventStore,
73        content: systemprompt_traits::DynContentCatalogStats,
74    ) -> Self {
75        Self {
76            session_signals: SessionSignalsRepository::new(
77                db,
78                std::sync::Arc::clone(&sessions),
79                std::sync::Arc::clone(&event_sink),
80                content,
81            ),
82            session_store: sessions,
83            costs: CostAnalyticsRepository::new(db),
84            engagement: EngagementRepository::new(db),
85            events: AnalyticsEventsRepository::new(event_sink),
86        }
87    }
88}