Skip to main content

systemprompt_files/repository/ai/
mod.rs

1//! [`FileRepository`] queries for AI-generated files.
2//!
3//! Listing and counting of files flagged with `ai_content`, both globally and
4//! scoped to an owning user.
5//!
6//! Copyright (c) systemprompt.io — Business Source License 1.1.
7//! See <https://systemprompt.io> for licensing details.
8
9use systemprompt_identifiers::{ContextId, SessionId, TraceId, UserId};
10
11use super::file::FileRepository;
12use crate::error::FilesResult;
13use crate::models::{File, FileMetadata};
14
15impl FileRepository {
16    pub async fn list_ai_images(&self, limit: i64, offset: i64) -> FilesResult<Vec<File>> {
17        let result = sqlx::query_as!(
18            File,
19            r#"
20            SELECT id, path, public_url, mime_type, size_bytes, ai_content, metadata as "metadata: sqlx::types::Json<FileMetadata>", user_id as "user_id: UserId", session_id as "session_id: SessionId", trace_id as "trace_id: TraceId", context_id as "context_id: ContextId", created_at, updated_at, deleted_at
21            FROM files
22            WHERE ai_content = true AND deleted_at IS NULL
23            ORDER BY created_at DESC
24            LIMIT $1 OFFSET $2
25            "#,
26            limit,
27            offset
28        )
29        .fetch_all(self.pool.as_ref())
30        .await?;
31
32        Ok(result)
33    }
34
35    pub async fn list_ai_images_by_user(
36        &self,
37        user_id: &UserId,
38        limit: i64,
39        offset: i64,
40    ) -> FilesResult<Vec<File>> {
41        let user_id_str = user_id.as_str();
42        let result = sqlx::query_as!(
43            File,
44            r#"
45            SELECT id, path, public_url, mime_type, size_bytes, ai_content, metadata as "metadata: sqlx::types::Json<FileMetadata>", user_id as "user_id: UserId", session_id as "session_id: SessionId", trace_id as "trace_id: TraceId", context_id as "context_id: ContextId", created_at, updated_at, deleted_at
46            FROM files
47            WHERE user_id = $1 AND ai_content = true AND deleted_at IS NULL
48            ORDER BY created_at DESC
49            LIMIT $2 OFFSET $3
50            "#,
51            user_id_str,
52            limit,
53            offset
54        )
55        .fetch_all(self.pool.as_ref())
56        .await?;
57
58        Ok(result)
59    }
60
61    pub async fn count_ai_images_by_user(&self, user_id: &UserId) -> FilesResult<i64> {
62        let user_id_str = user_id.as_str();
63        let count = sqlx::query_scalar!(
64            r#"
65            SELECT COUNT(*) as "count!"
66            FROM files
67            WHERE user_id = $1 AND ai_content = true AND deleted_at IS NULL
68            "#,
69            user_id_str
70        )
71        .fetch_one(self.pool.as_ref())
72        .await?;
73
74        Ok(count)
75    }
76
77    pub async fn count_ai_images(&self) -> FilesResult<i64> {
78        let count = sqlx::query_scalar!(
79            r#"
80            SELECT COUNT(*) as "count!"
81            FROM files
82            WHERE ai_content = true AND deleted_at IS NULL
83            "#
84        )
85        .fetch_one(self.pool.as_ref())
86        .await?;
87
88        Ok(count)
89    }
90}