diff --git a/src/app_state.rs b/src/app_state.rs index 5e4b523..ca610d6 100644 --- a/src/app_state.rs +++ b/src/app_state.rs @@ -105,20 +105,27 @@ impl AppState { .expect("Failed to list files from S3"); if let Some(objects) = list_response.contents { - // Формируем список файлов - let file_list: Vec = objects - .iter() - .filter_map(|object| object.key.clone()) - .collect(); + // Формируем список файлов без дубликатов по имени файла (без расширения) + let mut file_list = std::collections::HashMap::new(); + for object in objects.iter() { + if let Some(key) = &object.key { + let parts: Vec<&str> = key.split('.').collect(); + if parts.len() > 1 && !parts.last().unwrap().contains('/') { + let filename = parts[0..parts.len()-1].join("."); + file_list.entry(filename).or_insert(key.clone()); + } else { + file_list.entry(key.to_string()).or_insert(key.clone()); + } + } + } - // Сохраняем список файлов в Redis в формате JSON - let _: () = redis - .set( - FILE_LIST_CACHE_KEY, - serde_json::to_string(&file_list).unwrap(), - ) - .await - .expect("Failed to cache file list in Redis"); + // Сохраняем список файлов в Redis, используя HSET для каждого файла + for (filename, path) in file_list { + let _: () = redis + .hset(FILE_LIST_CACHE_KEY, filename, path) + .await + .expect("Failed to cache file in Redis"); + } } } @@ -127,14 +134,10 @@ impl AppState { let mut redis = self.redis.clone(); // Пытаемся получить кэшированный список из Redis - let cached_list: Option = redis.get(FILE_LIST_CACHE_KEY).await.unwrap_or(None); + let cached_list: HashMap = redis.hgetall(FILE_LIST_CACHE_KEY).await.unwrap_or_default(); - if let Some(cached_list) = cached_list { - // Если список найден, возвращаем его в виде вектора строк - serde_json::from_str(&cached_list).unwrap_or_else(|_| vec![]) - } else { - vec![] - } + // Преобразуем HashMap в Vec, используя значения (пути файлов) + cached_list.into_values().collect() } /// Периодически обновляет кэшированный список файлов из Storj S3.