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    #[must_use]
15    pub const fn new(db_pool: DbPool) -> Self {
16        Self {
17            repository: LoggingRepository::new(db_pool)
18                .with_terminal(false)
19                .with_database(true),
20        }
21    }
22
23    #[must_use]
24    pub const fn from_repository(repository: LoggingRepository) -> Self {
25        Self { repository }
26    }
27
28    #[must_use]
29    pub const fn repository(&self) -> &LoggingRepository {
30        &self.repository
31    }
32}
33
34#[async_trait]
35impl LogService for DatabaseLogService {
36    type Entry = LogEntry;
37    type Filter = LogFilter;
38    type Error = LoggingError;
39
40    async fn log(&self, entry: Self::Entry) -> Result<(), Self::Error> {
41        self.repository.log(entry).await
42    }
43
44    async fn query(&self, filter: &Self::Filter) -> Result<(Vec<Self::Entry>, i64), Self::Error> {
45        self.repository.get_logs_paginated(filter).await
46    }
47
48    async fn get_recent(&self, limit: i64) -> Result<Vec<Self::Entry>, Self::Error> {
49        self.repository.get_recent_logs(limit).await
50    }
51
52    async fn get_by_id(&self, id: &str) -> Result<Option<Self::Entry>, Self::Error> {
53        let log_id = systemprompt_identifiers::LogId::new(id);
54        self.repository.get_by_id(&log_id).await
55    }
56
57    async fn delete(&self, id: &str) -> Result<bool, Self::Error> {
58        let log_id = systemprompt_identifiers::LogId::new(id);
59        self.repository.delete_log_entry(&log_id).await
60    }
61}