systemprompt_files/models/
file.rs1use 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}