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

@@ -7,23 +7,14 @@ use axum::{
};
use futures::TryStreamExt;
use libertas_core::{error::CoreError, models::Media, schema::UploadMediaData};
use serde::Serialize;
use std::{io, path::PathBuf};
use tower::ServiceExt;
use tower_http::services::ServeFile;
use uuid::Uuid;
use crate::{error::ApiError, middleware::auth::UserId, state::AppState};
use crate::{error::ApiError, extractors::query_options::ApiListMediaOptions, middleware::auth::UserId, schema::MediaResponse, state::AppState};
#[derive(Serialize)]
pub struct MediaResponse {
id: uuid::Uuid,
storage_path: String,
original_filename: String,
mime_type: String,
hash: String,
}
impl From<Media> for MediaResponse {
fn from(media: Media) -> Self {
@@ -39,7 +30,7 @@ impl From<Media> for MediaResponse {
pub fn media_routes(max_upload_size: usize) -> Router<AppState> {
Router::new()
.route("/", post(upload_media))
.route("/", post(upload_media).get(list_user_media))
.route("/{id}", get(get_media_details).delete(delete_media))
.route("/{id}/file", get(get_media_file))
.layer(DefaultBodyLimit::max(max_upload_size))
@@ -123,3 +114,17 @@ async fn delete_media(
state.media_service.delete_media(id, user_id).await?;
Ok(StatusCode::NO_CONTENT)
}
async fn list_user_media(
State(state): State<AppState>,
UserId(user_id): UserId,
ApiListMediaOptions(options): ApiListMediaOptions,
) -> Result<Json<Vec<MediaResponse>>, ApiError> {
let media_list = state
.media_service
.list_user_media(user_id, options)
.await?;
let response = media_list.into_iter().map(MediaResponse::from).collect();
Ok(Json(response))
}