Implement the service to list items in the root folder.

This commit is contained in:
Florian THIERRY
2026-07-14 14:50:37 +02:00
parent 2df12118eb
commit f76200e64a
6 changed files with 76 additions and 13 deletions
+7 -10
View File
@@ -5,7 +5,7 @@ use std::io::{BufRead, BufReader};
use std::path::Path; use std::path::Path;
use std::io::Read; use std::io::Read;
use lumiere_domain::video::error::VideoError; use lumiere_domain::video::error::VideoError;
use lumiere_domain::video::model::library_item::LibraryItem; use lumiere_domain::video::model::library_item::{LibraryItem, ReadLibraryItem};
use lumiere_domain::video::port::VideoPort; use lumiere_domain::video::port::VideoPort;
#[derive(Clone)] #[derive(Clone)]
@@ -19,15 +19,12 @@ impl VideoService {
} }
pub fn list_root_folder(self) -> Result<Vec<LibraryItem>, VideoError> { pub fn list_root_folder(self) -> Result<Vec<LibraryItem>, VideoError> {
let library_items = self.video_port.list_root_folder()?; let read_items_with_possibly_no_id = self.video_port.list_root_folder()?;
let items_with_id = read_items_with_possibly_no_id.iter()
let items_without_id = library_items.iter().filter(|item| item.id == None); .map(ReadLibraryItem::map_to_library_item)
// generate a new Uuid for each item without id .collect();
// assign this new Uuid to the item self.video_port.save_all(items_with_id);
// save the item by using the method video_port.save Ok(items_with_id)
// replace the items_without_id by modified items_without_id
Ok(vec!())
} }
} }
@@ -1,3 +1,4 @@
use std::io::Read;
use uuid::Uuid; use uuid::Uuid;
pub enum LibraryItemType { pub enum LibraryItemType {
@@ -15,4 +16,13 @@ pub struct ReadLibraryItem {
pub id: Option<Uuid>, pub id: Option<Uuid>,
pub name: String, pub name: String,
pub r#type: LibraryItemType, pub r#type: LibraryItemType,
}
impl ReadLibraryItem {
pub fn map_to_library_item(&self) -> LibraryItem {
LibraryItem {
id: self.id.unwrap_or(Uuid::new_v4()),
name: self.name,
r#type: self.r#type,
}
}
} }
+1 -1
View File
@@ -7,7 +7,7 @@ pub trait VideoPort: Send + Sync {
fn list_root_folder(&self) -> Result<Vec<ReadLibraryItem>, VideoError>; fn list_root_folder(&self) -> Result<Vec<ReadLibraryItem>, VideoError>;
fn list_folder(&self, folder_id: Uuid) -> Result<Vec<ReadLibraryItem>, VideoError>; fn list_folder(&self, folder_id: Uuid) -> Result<Vec<ReadLibraryItem>, VideoError>;
fn get_video_stream(&self, video_id: Uuid) -> Result<Video, VideoError>; fn get_video_stream(&self, video_id: Uuid) -> Result<Video, VideoError>;
fn save(&self, library_item: LibraryItem) -> Result<(), VideoError>; fn save(&self, library_item: &LibraryItem) -> Result<(), VideoError>;
fn clone_box(&self) -> Box<dyn VideoPort>; fn clone_box(&self) -> Box<dyn VideoPort>;
} }
@@ -0,0 +1,55 @@
use lumiere_domain::video::error::VideoError;
use lumiere_domain::video::model::library_item::{LibraryItem, ReadLibraryItem};
use lumiere_domain::video::model::video::Video;
use lumiere_domain::video::port::VideoPort;
use uuid::Uuid;
pub struct VideoAdapter {
}
impl VideoAdapter {
pub fn new() -> Self {
Self {}
}
pub fn get_root_folder_read_library_items(&self) -> Result<Vec<ReadLibraryItem>, VideoError> {
// get the root_folder path from the environment variable named "ROOT_FOLDER"
// list all elements inside this folder on the file system
// map all those elements into ReadLibraryItem objects
// return the list
todo!()
}
pub fn get_all_library_items_from_db(&self) -> Result<Vec<ReadLibraryItem>, VideoError> {
todo!()
}
}
impl VideoPort for VideoAdapter {
fn list_root_folder(&self) -> Result<Vec<ReadLibraryItem>, VideoError> {
// In parallel:
// - call method "get_root_folder_read_library_items()"
// - call method "get_all_library_items_from_db()"
//
// then, merge the two lists. If an item from the "get_root_folder_read_library_items()" result has the same id as an item from the "get_all_library_items_from_db()" results, merge those two items in one single.
// return the merged list
todo!()
}
fn list_folder(&self, folder_id: Uuid) -> Result<Vec<ReadLibraryItem>, VideoError> {
todo!()
}
fn get_video_stream(&self, video_id: Uuid) -> Result<Video, VideoError> {
todo!()
}
fn save(&self, library_item: LibraryItem) -> Result<(), VideoError> {
todo!()
}
fn clone_box(&self) -> Box<dyn VideoPort> {
todo!()
}
}
+1
View File
@@ -1,2 +1,3 @@
pub mod adapter;
pub mod model; pub mod model;
pub mod video_format_detector; pub mod video_format_detector;
@@ -1,7 +1,7 @@
use std::fs::File; use std::fs::File;
use std::path::Path; use std::path::Path;
use lumiere_domain::video::library_item::VideoFormat; use lumiere_domain::video::model::video::VideoFormat;
use lumiere_domain::video::library_item::VideoFormat::{AVI, MKV, MP4, UNKNOWN, WEBM}; use lumiere_domain::video::model::video::VideoFormat::{AVI, MKV, MP4, UNKNOWN, WEBM};
/// Determine Content-Type by reading file headers (magic numbers) /// Determine Content-Type by reading file headers (magic numbers)
pub fn get_content_type(path: &Path) -> VideoFormat { pub fn get_content_type(path: &Path) -> VideoFormat {