systemprompt_logging/services/
database_log.rs1use 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}