pub mod error;
pub mod sqlite;
use std::path::Path;
use time::OffsetDateTime;
use crate::models::entry::{EntryFilter, TimeEntry};
use crate::models::project::{Project, ProjectStatus};
use crate::models::session::ShellSession;
use crate::models::types::{EntryId, ProjectId, SessionId};
use self::error::StorageError;
pub use self::sqlite::SqliteStorage;
pub trait Storage {
fn create_project(&self, project: &Project) -> Result<(), StorageError>;
fn get_project(&self, id: &ProjectId) -> Result<Option<Project>, StorageError>;
fn get_project_by_name(&self, name: &str) -> Result<Option<Project>, StorageError>;
fn get_project_by_path(&self, path: &Path) -> Result<Option<Project>, StorageError>;
fn list_projects(&self, status: Option<ProjectStatus>) -> Result<Vec<Project>, StorageError>;
fn update_project(&self, project: &Project) -> Result<(), StorageError>;
fn delete_project(&self, id: &ProjectId) -> Result<(), StorageError>;
fn create_entry(&self, entry: &TimeEntry) -> Result<(), StorageError>;
fn get_entry(&self, id: &EntryId) -> Result<Option<TimeEntry>, StorageError>;
fn get_running_entry(&self, project_id: &ProjectId) -> Result<Option<TimeEntry>, StorageError>;
fn get_running_hook_entry(
&self,
project_id: &ProjectId,
) -> Result<Option<TimeEntry>, StorageError>;
fn get_any_running_entry(&self) -> Result<Option<TimeEntry>, StorageError>;
fn list_entries(&self, filter: &EntryFilter) -> Result<Vec<TimeEntry>, StorageError>;
fn get_last_entry(&self) -> Result<Option<TimeEntry>, StorageError>;
fn update_entry(&self, entry: &TimeEntry) -> Result<(), StorageError>;
fn delete_entry(&self, id: &EntryId) -> Result<(), StorageError>;
fn upsert_session(&self, session: &ShellSession) -> Result<(), StorageError>;
fn get_session(&self, id: &SessionId) -> Result<Option<ShellSession>, StorageError>;
fn get_session_by_pid(&self, pid: u32) -> Result<Option<ShellSession>, StorageError>;
fn end_session(&self, id: &SessionId, ended_at: OffsetDateTime) -> Result<(), StorageError>;
fn count_active_sessions_for_project(
&self,
project_id: &ProjectId,
exclude_session_id: &SessionId,
) -> Result<usize, StorageError>;
fn get_stale_sessions(
&self,
older_than: OffsetDateTime,
) -> Result<Vec<ShellSession>, StorageError>;
fn add_ignored_path(&self, path: &Path) -> Result<(), StorageError>;
fn remove_ignored_path(&self, path: &Path) -> Result<bool, StorageError>;
fn is_path_ignored(&self, path: &Path) -> Result<bool, StorageError>;
fn list_ignored_paths(&self) -> Result<Vec<std::path::PathBuf>, StorageError>;
}