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