systemprompt_content/repository/content/
mod.rs1mod mutations;
2mod queries;
3
4use crate::error::ContentError;
5use crate::models::{Content, CreateContentParams, UpdateContentParams};
6use sqlx::PgPool;
7use std::sync::Arc;
8use systemprompt_database::DbPool;
9use systemprompt_identifiers::{CategoryId, ContentId, SourceId};
10
11#[derive(Debug)]
12pub struct ContentRepository {
13 pool: Arc<PgPool>,
14 write_pool: Arc<PgPool>,
15}
16
17impl ContentRepository {
18 pub fn new(db: &DbPool) -> Result<Self, ContentError> {
19 let pool = db
20 .pool_arc()
21 .map_err(|e| ContentError::InvalidRequest(format!("Database pool error: {e}")))?;
22 let write_pool = db
23 .write_pool_arc()
24 .map_err(|e| ContentError::InvalidRequest(format!("Database write pool error: {e}")))?;
25 Ok(Self { pool, write_pool })
26 }
27
28 pub async fn create(&self, params: &CreateContentParams) -> Result<Content, sqlx::Error> {
29 mutations::create(&self.write_pool, params).await
30 }
31
32 pub async fn get_by_id(&self, id: &ContentId) -> Result<Option<Content>, sqlx::Error> {
33 queries::get_by_id(&self.pool, id).await
34 }
35
36 pub async fn get_by_slug(&self, slug: &str) -> Result<Option<Content>, sqlx::Error> {
37 queries::get_by_slug(&self.pool, slug).await
38 }
39
40 pub async fn get_by_source_and_slug(
41 &self,
42 source_id: &SourceId,
43 slug: &str,
44 ) -> Result<Option<Content>, sqlx::Error> {
45 queries::get_by_source_and_slug(&self.pool, source_id, slug).await
46 }
47
48 pub async fn list(&self, limit: i64, offset: i64) -> Result<Vec<Content>, sqlx::Error> {
49 queries::list(&self.pool, limit, offset).await
50 }
51
52 pub async fn list_by_source(&self, source_id: &SourceId) -> Result<Vec<Content>, sqlx::Error> {
53 queries::list_by_source(&self.pool, source_id).await
54 }
55
56 pub async fn list_by_source_limited(
57 &self,
58 source_id: &SourceId,
59 limit: i64,
60 ) -> Result<Vec<Content>, sqlx::Error> {
61 queries::list_by_source_limited(&self.pool, source_id, limit).await
62 }
63
64 pub async fn update(&self, params: &UpdateContentParams) -> Result<Content, sqlx::Error> {
65 mutations::update(&self.write_pool, params).await
66 }
67
68 pub async fn category_exists(&self, category_id: &CategoryId) -> Result<bool, sqlx::Error> {
69 queries::category_exists(&self.pool, category_id).await
70 }
71
72 pub async fn delete(&self, id: &ContentId) -> Result<(), sqlx::Error> {
73 mutations::delete(&self.write_pool, id).await
74 }
75
76 pub async fn delete_by_source(&self, source_id: &SourceId) -> Result<u64, sqlx::Error> {
77 mutations::delete_by_source(&self.write_pool, source_id).await
78 }
79
80 pub async fn list_all(&self, limit: i64, offset: i64) -> Result<Vec<Content>, sqlx::Error> {
81 queries::list_all(&self.pool, limit, offset).await
82 }
83
84 pub async fn get_popular_content_ids(
85 &self,
86 source_id: &SourceId,
87 days: i32,
88 limit: i64,
89 ) -> Result<Vec<ContentId>, sqlx::Error> {
90 queries::get_popular_content_ids(&self.pool, source_id, days, limit).await
91 }
92}