feat: enhance media management with EXIF data extraction, metadata filtering, and storage path generation

refactor: update configuration handling to use environment variables and improve code organization
This commit is contained in:
2025-11-14 11:22:51 +01:00
parent 70dc0a7131
commit 3c3b51a2a7
24 changed files with 393 additions and 181 deletions

View File

@@ -38,12 +38,41 @@ impl QueryBuilder<ListMediaOptions> for MediaQueryBuilder {
mut query: SqlxQueryBuilder<'a, sqlx::Postgres>,
options: &'a ListMediaOptions,
) -> CoreResult<SqlxQueryBuilder<'a, sqlx::Postgres>> {
if let Some(_filter) = &options.filter {
// In the future, you would add logic here:
// if let Some(mime) = &filter.mime_type {
// query.push(" AND mime_type = ");
// query.push_bind(mime);
// }
let mut metadata_filter_count = 0;
if let Some(filter) = &options.filter {
if let Some(mime) = &filter.mime_type {
query.push(" AND media.mime_type = ");
query.push_bind(mime);
}
if let Some(metadata_filters) = &filter.metadata_filters {
if !metadata_filters.is_empty() {
metadata_filter_count = metadata_filters.len();
query.push(" JOIN media_metadata mm ON media.id == mm.media_id ");
query.push(" AND ( ");
for (i, filter) in metadata_filters.iter().enumerate() {
if i > 0 {
query.push(" OR ");
}
query.push(" ( mm.tag_name = ");
query.push_bind(&filter.tag_name);
query.push(" AND mm.tag_value = ");
query.push_bind(&filter.tag_value);
query.push(" ) ");
}
query.push(" ) ");
}
}
}
if metadata_filter_count > 0 {
query.push(" GROUP BY media.id ");
query.push(" HAVING COUNT(DISTINCT mm.tag_name) = ");
query.push_bind(metadata_filter_count as i64);
}
if let Some(sort) = &options.sort {