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