Skip to main content

systemprompt_logging/services/
database_log.rs

1use async_trait::async_trait;
2use systemprompt_database::DbPool;
3use systemprompt_traits::LogService;
4
5use crate::models::{LogEntry, LogFilter, LoggingError};
6use crate::repository::LoggingRepository;
7
8#[derive(Clone, Debug)]
9pub struct DatabaseLogService {
10    repository: LoggingRepository,
11}
12
13impl DatabaseLogService {
14    pub fn new(db_pool: &DbPool) -> anyhow::Result<Self> {
15        Ok(Self {
16            repository: LoggingRepository::new(db_pool)?
17                .with_terminal(false)
18                .with_database(true),
19        })
20    }
21
22    #[must_use]
23    pub const fn from_repository(repository: LoggingRepository) -> Self {
24        Self { repository }
25    }
26
27    #[must_use]
28    pub const fn repository(&self) -> &LoggingRepository {
29        &self.repository
30    }
31}
32
33#[async_trait]
34impl LogService for DatabaseLogService {
35    type Entry = LogEntry;
36    type Filter = LogFilter;
37    type Error = LoggingError;
38
39    async fn log(&self, entry: Self::Entry) -> Result<(), Self::Error> {
40        self.repository.log(entry).await
41    }
42
43    async fn query(&self, filter: &Self::Filter) -> Result<(Vec<Self::Entry>, i64), Self::Error> {
44        self.repository.get_logs_paginated(filter).await
45    }
46
47    async fn get_recent(&self, limit: i64) -> Result<Vec<Self::Entry>, Self::Error> {
48        self.repository.get_recent_logs(limit).await
49    }
50
51    async fn get_by_id(&self, id: &str) -> Result<Option<Self::Entry>, Self::Error> {
52        let log_id = systemprompt_identifiers::LogId::new(id);
53        self.repository.get_by_id(&log_id).await
54    }
55
56    async fn delete(&self, id: &str) -> Result<bool, Self::Error> {
57        let log_id = systemprompt_identifiers::LogId::new(id);
58        self.repository.delete_log_entry(&log_id).await
59    }
60}