+ Adding last trait methods required for video meta storage to be properly done

! Still need to add file handling however I think I'm going to do that in the trait itself
This will probably require some thought so I'm gonna wait until the frontend
catches back up
This commit is contained in:
shockrah 2021-09-30 19:47:44 -07:00
parent 678dd3d7ee
commit 85b32d5e96
2 changed files with 90 additions and 16 deletions

View File

@ -42,13 +42,15 @@ fn uid() -> std::io::Result<String> {
pub struct VideoMeta { pub struct VideoMeta {
pub id: String, pub id: String,
pub name: String, pub name: String,
pub desc: Option<String> pub desc: Option<String>,
pub ext: String,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct VideoMetaEntry { struct VideoMetaEntry {
pub name: String, pub name: String,
pub desc: Option<String> pub desc: Option<String>,
pub ext: String
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
@ -67,9 +69,12 @@ pub trait KeyStore {
} }
pub trait VideoStore { pub trait VideoStore {
fn new_video(name: &str, desc: &str) -> err::Result<()>; fn new_video(name: &str, desc: &str, ext: &str) -> err::Result<()>;
fn del_video(id: String) -> err::Result<()>; fn del_video(id: String) -> err::Result<()>;
fn get_video(id: Option<String>, name: Option<&str>) -> err::Result<VideoMeta>;
fn rename_video(id: String, new: &str) -> err::Result<()>; fn get_video_by_name(name: &str) -> err::Result<Option<VideoMeta>>;
fn redescribe_video(id: String, new: &str) -> err::Result<()>; fn get_video_by_id(id: &str) -> err::Result<Option<VideoMeta>>;
fn rename_video(id: String, new: &str) -> err::Result<bool>;
fn redescribe_video(id: String, new: &str) -> err::Result<bool>;
} }

View File

@ -4,7 +4,7 @@ use crate::{filename, err, DB, uid};
use crate::{VideoStore, VideoMeta, VideoMetaEntry}; use crate::{VideoStore, VideoMeta, VideoMetaEntry};
impl VideoStore for DB { impl VideoStore for DB {
fn new_video(name: &str, desc: &str) -> err::Result<()> { fn new_video(name: &str, desc: &str, ext: &str) -> err::Result<()> {
let fname = filename(); let fname = filename();
let file = File::open(&fname)?; let file = File::open(&fname)?;
let reader = BufReader::new(file); let reader = BufReader::new(file);
@ -14,14 +14,18 @@ impl VideoStore for DB {
let mut data: DB = serde_json::from_reader(reader)?; let mut data: DB = serde_json::from_reader(reader)?;
let entry = VideoMetaEntry { let entry = VideoMetaEntry {
name: name.to_string(), name: name.to_string(),
ext: ext.to_string(),
desc: if desc.len() != 0 { None } else { Some(desc.to_string()) } desc: if desc.len() != 0 { None } else { Some(desc.to_string()) }
}; };
// update in mem-cache // update in mem-cache
data.videos.insert(id, entry); data.videos.insert(id, entry);
// update the content on disk
// Update the meta storage
let file = File::open(&fname)?; let file = File::open(&fname)?;
let writer = BufWriter::new(file); let writer = BufWriter::new(file);
serde_json::to_writer(writer, &data)?; serde_json::to_writer(writer, &data)?;
// TODO: Insert a new file into the data file bucket
Ok(()) Ok(())
} }
fn del_video(id: String) -> err::Result<()> { fn del_video(id: String) -> err::Result<()> {
@ -29,22 +33,87 @@ impl VideoStore for DB {
let file = File::open(&fname)?; let file = File::open(&fname)?;
let reader = BufReader::new(file); let reader = BufReader::new(file);
let mut data: DB = serde_json::from_reader(file)?; let mut data: DB = serde_json::from_reader(reader)?;
data.videos.remove(id); data.videos.remove(&id);
let file = File::open(&fname)?; let file = File::open(&fname)?;
let writer = BufWriter::new(file); let writer = BufWriter::new(file);
serde_json::to_writer(writer, &data)?; serde_json::to_writer(writer, &data)?;
Ok(()) Ok(())
} }
fn get_video(id: Option<String>, name: Option<&str>) -> err::Result<VideoMeta> { fn get_video_by_name(name: &str) -> err::Result<Option<VideoMeta>> {
todo!() let fname = filename();
let file = File::open(&fname)?;
let reader = BufReader::new(file);
let data: DB = serde_json::from_reader(reader)?;
// TODO: smarter searching using https://www.objc.io/blog/2020/08/18/fuzzy-search/
let row = data.videos.iter()
.find(|(_, entry)| entry.name.contains(name));
// >:|
match row {
Some((id, entry)) => {
Ok(Some(VideoMeta {
id: id.to_string(),
name: entry.name.clone(),
desc: entry.desc.clone(),
ext: entry.ext.clone(),
}))
},
None => Ok(None)
} }
fn rename_video(id: String, new: &str) -> err::Result<()> {
todo!()
} }
fn redescribe_video(id: String, new: &str) -> err::Result<()> { fn get_video_by_id(id: &str) -> err::Result<Option<VideoMeta>> {
todo!() let fname = filename();
let file = File::open(&fname)?;
let reader = BufReader::new(file);
let data: DB = serde_json::from_reader(reader)?;
match data.videos.get(id) {
Some(entry) => Ok(Some(VideoMeta {
id: id.to_string(),
name: entry.name.clone(),
ext: entry.ext.clone(),
desc: entry.desc.clone()
})),
None => Ok(None)
}
}
fn rename_video(id: String, new: &str) -> err::Result<bool> {
let fname = filename();
let file = File::open(&fname)?;
let reader = BufReader::new(file);
let mut data: DB = serde_json::from_reader(reader)?;
match data.videos.get_mut(&id) {
Some(mut entry) => {
entry.name = new.to_string();
let file = File::open(&fname)?;
let writer = BufWriter::new(file);
serde_json::to_writer(writer, &data)?;
Ok(true)
},
None => Ok(false)
}
}
fn redescribe_video(id: String, new: &str) -> err::Result<bool> {
let fname = filename();
let file = File::open(&fname)?;
let reader = BufReader::new(file);
let mut data: DB = serde_json::from_reader(reader)?;
match data.videos.get_mut(&id) {
Some(mut entry) => {
entry.desc = Some(new.to_string());
let file = File::open(&fname)?;
let writer = BufWriter::new(file);
serde_json::to_writer(writer, &data)?;
Ok(true)
},
None => Ok(false)
}
} }
} }