feat: implement media listing with sorting and filtering options
This commit is contained in:
@@ -21,4 +21,5 @@ pub struct Config {
|
||||
pub broker_url: String,
|
||||
pub max_upload_size_mb: Option<u32>,
|
||||
pub default_storage_quota_gb: Option<u64>,
|
||||
pub allowed_sort_columns: Option<Vec<String>>,
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ use uuid::Uuid;
|
||||
|
||||
use crate::{
|
||||
error::CoreResult,
|
||||
models::{Album, AlbumPermission, Media, User},
|
||||
models::{Album, AlbumPermission, Media, User}, schema::ListMediaOptions,
|
||||
};
|
||||
|
||||
#[async_trait]
|
||||
@@ -11,7 +11,7 @@ pub trait MediaRepository: Send + Sync {
|
||||
async fn find_by_hash(&self, hash: &str) -> CoreResult<Option<Media>>;
|
||||
async fn create(&self, media: &Media) -> CoreResult<()>;
|
||||
async fn find_by_id(&self, id: Uuid) -> CoreResult<Option<Media>>;
|
||||
async fn list_by_user(&self, user_id: Uuid) -> CoreResult<Vec<Media>>;
|
||||
async fn list_by_user(&self, user_id: Uuid, options: &ListMediaOptions) -> CoreResult<Vec<Media>>;
|
||||
async fn update_metadata(
|
||||
&self,
|
||||
id: Uuid,
|
||||
|
||||
@@ -52,3 +52,29 @@ pub struct UserResponse {
|
||||
pub username: String,
|
||||
pub email: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum SortOrder {
|
||||
Asc,
|
||||
Desc,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct SortParams {
|
||||
pub sort_by: String,
|
||||
pub sort_order: SortOrder,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Default)]
|
||||
pub struct FilterParams {
|
||||
// In the future, you can add fields like:
|
||||
// pub mime_type: Option<String>,
|
||||
// pub date_range: Option<(chrono::DateTime<chrono::Utc>, chrono::DateTime<chrono::Utc>)>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct ListMediaOptions {
|
||||
pub sort: Option<SortParams>,
|
||||
pub filter: Option<FilterParams>,
|
||||
// pub pagination: Option<PaginationParams>,
|
||||
}
|
||||
@@ -5,8 +5,7 @@ use crate::{
|
||||
error::CoreResult,
|
||||
models::{Album, Media, User},
|
||||
schema::{
|
||||
AddMediaToAlbumData, CreateAlbumData, CreateUserData, LoginUserData, ShareAlbumData,
|
||||
UpdateAlbumData, UploadMediaData,
|
||||
AddMediaToAlbumData, CreateAlbumData, CreateUserData, ListMediaOptions, LoginUserData, ShareAlbumData, UpdateAlbumData, UploadMediaData
|
||||
},
|
||||
};
|
||||
|
||||
@@ -14,7 +13,7 @@ use crate::{
|
||||
pub trait MediaService: Send + Sync {
|
||||
async fn upload_media(&self, data: UploadMediaData<'_>) -> CoreResult<Media>;
|
||||
async fn get_media_details(&self, id: Uuid, user_id: Uuid) -> CoreResult<Media>;
|
||||
async fn list_user_media(&self, user_id: Uuid) -> CoreResult<Vec<Media>>;
|
||||
async fn list_user_media(&self, user_id: Uuid, options: ListMediaOptions) -> CoreResult<Vec<Media>>;
|
||||
async fn get_media_filepath(&self, id: Uuid, user_id: Uuid) -> CoreResult<String>;
|
||||
async fn delete_media(&self, id: Uuid, user_id: Uuid) -> CoreResult<()>;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user