pub mod ai;
pub mod auth;
pub mod file;
pub mod search;
pub use ai::*;
pub use auth::*;
pub use search::*;
use serde::{Deserialize, Serialize};
use chrono::{DateTime, Utc};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct File {
pub name: String,
pub path: String,
pub size: u64,
pub modified: DateTime<Utc>,
pub mime_type: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Directory {
pub name: String,
pub path: String,
pub modified: DateTime<Utc>,
pub entries: Vec<crate::services::file::DirectoryEntry>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileMetadata {
pub size: u64,
pub modified: DateTime<Utc>,
pub created: DateTime<Utc>,
pub is_file: bool,
pub is_directory: bool,
pub permissions: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
pub id: String,
pub username: String,
pub email: String,
pub role: UserRole,
pub created_at: DateTime<Utc>,
pub last_login: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum UserRole {
Admin,
User,
ReadOnly,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ApiResponse<T> {
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<T>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
}
impl<T> ApiResponse<T> {
pub fn new(data: T, message: Option<String>) -> Self {
Self {
success: true,
data: Some(data),
message,
}
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ErrorResponse {
pub success: bool,
pub error: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum WebSocketMessage {
FileChanged {
path: String,
event: String
},
DirectoryChanged {
path: String,
event: String
},
SearchResults {
query: String,
results: Vec<SearchResult>
},
Error {
message: String
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UploadRequest {
pub path: String,
pub overwrite: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UploadResponse {
pub path: String,
pub size: u64,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchRequest {
pub query: String,
pub limit: Option<usize>,
pub filters: Option<SearchFilters>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchFilters {
pub mime_types: Option<Vec<String>>,
pub size_min: Option<u64>,
pub size_max: Option<u64>,
pub modified_after: Option<DateTime<Utc>>,
pub modified_before: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AnalysisRequest {
pub path: String,
pub options: AnalysisOptions,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AnalysisOptions {
pub summarize: bool,
pub extract_entities: bool,
pub generate_tags: bool,
pub detect_language: bool,
}
impl Default for AnalysisOptions {
fn default() -> Self {
Self {
summarize: true,
extract_entities: false,
generate_tags: false,
detect_language: false,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatRequest {
pub message: String,
pub context_paths: Option<Vec<String>>,
pub max_context_length: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatResponse {
pub response: String,
pub context_used: Vec<String>,
pub tokens_used: Option<u32>,
}