Skip to main content

systemprompt_logging/services/
database_log.rs

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