headless_lms_models/
partner_block.rs1use crate::prelude::*;
2
3#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
4#[cfg_attr(feature = "ts_rs", derive(TS))]
5pub struct PartnersBlock {
6 pub id: Uuid,
7 pub created_at: DateTime<Utc>,
8 pub updated_at: DateTime<Utc>,
9 pub deleted_at: Option<DateTime<Utc>>,
10 pub content: serde_json::Value,
11 pub course_id: Uuid,
12}
13
14#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
15#[cfg_attr(feature = "ts_rs", derive(TS))]
16pub struct PartnerBlockNew {
17 pub course_id: Uuid,
18 pub content: Option<serde_json::Value>,
19}
20
21pub async fn upsert_partner_block(
22 conn: &mut PgConnection,
23 course_id: Uuid,
24 content: Option<serde_json::Value>,
25) -> ModelResult<PartnersBlock> {
26 let res = sqlx::query_as!(
27 PartnersBlock,
28 r#"
29INSERT INTO partners_blocks (course_id, content)
30VALUES ($1, $2)
31ON CONFLICT (course_id)
32DO UPDATE
33SET content = EXCLUDED.content
34RETURNING *
35"#,
36 course_id,
37 content,
38 )
39 .fetch_one(conn)
40 .await?;
41 Ok(res)
42}
43
44pub async fn get_partner_block(
45 conn: &mut PgConnection,
46 course_id: Uuid,
47) -> ModelResult<PartnersBlock> {
48 let res = sqlx::query_as!(
49 PartnersBlock,
50 "SELECT *
51FROM partners_blocks
52WHERE course_id = $1
53 AND deleted_at IS NULL",
54 course_id
55 )
56 .fetch_one(conn)
57 .await?;
58 Ok(res)
59}
60
61pub async fn delete_partner_block(
62 conn: &mut PgConnection,
63 course_id: Uuid,
64) -> ModelResult<PartnersBlock> {
65 let deleted = sqlx::query_as!(
66 PartnersBlock,
67 r#"
68UPDATE partners_blocks
69SET deleted_at = now()
70WHERE course_id = $1
71RETURNING *
72 "#,
73 course_id
74 )
75 .fetch_one(conn)
76 .await?;
77 Ok(deleted)
78}
79
80pub async fn check_if_course_exists(
81 conn: &mut PgConnection,
82 course_id: Uuid,
83) -> Result<bool, sqlx::Error> {
84 let exists = sqlx::query!(
85 r#"
86 SELECT 1 AS exists
87 FROM partners_blocks
88 WHERE course_id = $1
89 LIMIT 1
90 "#,
91 course_id
92 )
93 .fetch_optional(conn)
94 .await?;
95 Ok(exists.is_some())
96}