feat: implement media listing with sorting and filtering options

This commit is contained in:
2025-11-04 05:57:04 +01:00
parent ab8eeb882e
commit eaf4c90fa8
18 changed files with 238 additions and 39 deletions

View File

@@ -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>>,
}

View File

@@ -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,

View File

@@ -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>,
}

View File

@@ -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<()>;
}