Skip to main content

systemprompt_files/models/
file.rs

1use anyhow::{anyhow, Result};
2use chrono::{DateTime, Utc};
3use serde::{Deserialize, Serialize};
4use sqlx::FromRow;
5use systemprompt_identifiers::{ContextId, FileId, SessionId, TraceId, UserId};
6
7use super::metadata::FileMetadata;
8
9#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
10pub struct File {
11    pub id: uuid::Uuid,
12    pub path: String,
13    pub public_url: String,
14    pub mime_type: String,
15    pub size_bytes: Option<i64>,
16    pub ai_content: bool,
17    pub metadata: serde_json::Value,
18    pub user_id: Option<UserId>,
19    pub session_id: Option<SessionId>,
20    pub trace_id: Option<TraceId>,
21    pub context_id: Option<ContextId>,
22    pub created_at: DateTime<Utc>,
23    pub updated_at: DateTime<Utc>,
24    pub deleted_at: Option<DateTime<Utc>>,
25}
26
27impl File {
28    pub fn id(&self) -> FileId {
29        FileId::new(self.id.to_string())
30    }
31
32    pub fn metadata(&self) -> Result<FileMetadata> {
33        serde_json::from_value(self.metadata.clone())
34            .map_err(|e| anyhow!("Failed to deserialize file metadata (id: {}): {e}", self.id))
35    }
36}