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 #[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}