use super::errors::StorageResult;
use super::file::{FileMetadata, StoredFile};
use async_trait::async_trait;
use chrono::{DateTime, Utc};
#[async_trait]
pub trait Storage: Send + Sync {
async fn save(&self, path: &str, content: &[u8]) -> StorageResult<FileMetadata>;
async fn read(&self, path: &str) -> StorageResult<StoredFile>;
async fn delete(&self, path: &str) -> StorageResult<()>;
async fn exists(&self, path: &str) -> StorageResult<bool>;
async fn metadata(&self, path: &str) -> StorageResult<FileMetadata>;
async fn list(&self, path: &str) -> StorageResult<Vec<FileMetadata>>;
fn url(&self, path: &str) -> String;
fn path(&self, name: &str) -> String;
async fn get_accessed_time(&self, path: &str) -> StorageResult<DateTime<Utc>> {
Ok(self.metadata(path).await?.modified_at)
}
async fn get_created_time(&self, path: &str) -> StorageResult<DateTime<Utc>> {
Ok(self.metadata(path).await?.created_at)
}
async fn get_modified_time(&self, path: &str) -> StorageResult<DateTime<Utc>> {
Ok(self.metadata(path).await?.modified_at)
}
}