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