Skip to main content

systemprompt_api/repository/
gateway.rs

1//! AI-domain repositories owned by the gateway, constructed once at router
2//! build and threaded through dispatch.
3//!
4//! Copyright (c) systemprompt.io — Business Source License 1.1.
5//! See <https://systemprompt.io> for licensing details.
6
7use std::sync::Arc;
8
9use systemprompt_ai::repository::{
10    AiGatewayPolicyRepository, AiQuotaBucketRepository, AiRequestPayloadRepository,
11    AiRequestRepository, AiSafetyFindingRepository, AiThoughtSignatureRepository,
12};
13use systemprompt_database::DbPool;
14use systemprompt_traits::DynContextMaterializer;
15
16use crate::services::gateway::signature_cache::{TTL, ThoughtSignatureCache};
17
18#[derive(Clone)]
19pub struct GatewayRepositories {
20    pub quota_buckets: AiQuotaBucketRepository,
21    pub requests: Arc<AiRequestRepository>,
22    pub payloads: Arc<AiRequestPayloadRepository>,
23    pub safety_findings: AiSafetyFindingRepository,
24    pub gateway_policies: AiGatewayPolicyRepository,
25    pub thought_signatures: Arc<ThoughtSignatureCache>,
26    pub context_materializer: DynContextMaterializer,
27}
28
29impl std::fmt::Debug for GatewayRepositories {
30    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
31        f.debug_struct("GatewayRepositories")
32            .finish_non_exhaustive()
33    }
34}
35
36impl GatewayRepositories {
37    pub fn new(
38        db: &DbPool,
39        context_materializer: DynContextMaterializer,
40    ) -> Result<Self, systemprompt_ai::error::RepositoryError> {
41        Ok(Self {
42            quota_buckets: AiQuotaBucketRepository::new(db)?,
43            requests: Arc::new(AiRequestRepository::new(db)?),
44            payloads: Arc::new(AiRequestPayloadRepository::new(db)?),
45            safety_findings: AiSafetyFindingRepository::new(db)?,
46            gateway_policies: AiGatewayPolicyRepository::new(db)?,
47            thought_signatures: Arc::new(ThoughtSignatureCache::new(
48                TTL,
49                Arc::new(AiThoughtSignatureRepository::new(db)?),
50            )),
51            context_materializer,
52        })
53    }
54}