use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[repr(u8)]
pub enum FileType {
File = 0,
Directory = 1,
}
impl FileType {
pub fn from_i64(val: i64) -> Option<Self> {
match val {
0 => Some(FileType::File),
1 => Some(FileType::Directory),
_ => None,
}
}
pub fn to_i64(self) -> i64 {
self as i64
}
pub fn is_dir(self) -> bool {
matches!(self, FileType::Directory)
}
pub fn is_file(self) -> bool {
matches!(self, FileType::File)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileEntry {
pub id: i64,
pub parent_id: Option<i64>,
pub name: String,
pub file_type: FileType,
pub content_hash: Option<[u8; 32]>,
pub size: u64,
pub created_at: DateTime<Utc>,
pub modified_at: DateTime<Utc>,
}
impl FileEntry {
pub fn new_file(id: i64, parent_id: i64, name: String, content_hash: [u8; 32], size: u64) -> Self {
let now = Utc::now();
Self {
id,
parent_id: Some(parent_id),
name,
file_type: FileType::File,
content_hash: Some(content_hash),
size,
created_at: now,
modified_at: now,
}
}
pub fn new_dir(id: i64, parent_id: Option<i64>, name: String) -> Self {
let now = Utc::now();
Self {
id,
parent_id,
name,
file_type: FileType::Directory,
content_hash: None,
size: 0,
created_at: now,
modified_at: now,
}
}
pub fn is_root(&self) -> bool {
self.parent_id.is_none()
}
pub fn is_dir(&self) -> bool {
self.file_type.is_dir()
}
pub fn is_file(&self) -> bool {
self.file_type.is_file()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContentBlob {
pub hash: [u8; 32],
pub size: u64,
pub ref_count: u32,
}
impl ContentBlob {
pub fn new(hash: [u8; 32], size: u64) -> Self {
Self {
hash,
size,
ref_count: 1,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DirEntry {
pub name: String,
pub file_type: FileType,
pub size: u64,
pub modified_at: DateTime<Utc>,
}
impl From<&FileEntry> for DirEntry {
fn from(entry: &FileEntry) -> Self {
Self {
name: entry.name.clone(),
file_type: entry.file_type,
size: entry.size,
modified_at: entry.modified_at,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileVersion {
pub id: i64,
pub file_id: i64,
pub version_number: u64,
pub content_hash: [u8; 32],
pub size: u64,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchResult {
pub file_id: i64,
pub path: String,
pub snippet: String,
pub rank: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Tag {
pub id: i64,
pub name: String,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Metadata {
pub key: String,
pub value: String,
pub modified_at: DateTime<Utc>,
}