headless_lms_models/
privacy_link.rs

1use crate::prelude::*;
2
3#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
4#[cfg_attr(feature = "ts_rs", derive(TS))]
5pub struct PrivacyLink {
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 title: String,
11    pub url: String,
12    pub course_id: Uuid,
13}
14
15#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
16#[cfg_attr(feature = "ts_rs", derive(TS))]
17pub struct PrivacyLinkNew {
18    pub course_id: Uuid,
19    pub title: String,
20    pub url: String,
21}
22
23pub async fn insert(
24    conn: &mut PgConnection,
25    course_id: Uuid,
26    title: String,
27    url: String,
28) -> ModelResult<PrivacyLink> {
29    let res = sqlx::query_as!(
30        PrivacyLink,
31        r#"
32INSERT INTO privacy_links (course_id, title, url)
33VALUES ($1, $2, $3)
34RETURNING *
35"#,
36        course_id,
37        title,
38        url,
39    )
40    .fetch_one(conn)
41    .await?;
42    Ok(res)
43}
44
45pub async fn get_privacy_link(
46    conn: &mut PgConnection,
47    course_id: Uuid,
48) -> ModelResult<Vec<PrivacyLink>> {
49    let res = sqlx::query_as!(
50        PrivacyLink,
51        "SELECT *
52FROM privacy_links
53WHERE course_id = $1
54  AND deleted_at IS NULL",
55        course_id
56    )
57    .fetch_all(conn)
58    .await?;
59    Ok(res)
60}
61
62pub async fn delete_privacy_link(
63    conn: &mut PgConnection,
64    course_id: Uuid,
65) -> ModelResult<PrivacyLink> {
66    let deleted = sqlx::query_as!(
67        PrivacyLink,
68        r#"
69UPDATE privacy_links
70SET deleted_at = now()
71WHERE course_id = $1
72RETURNING *
73  "#,
74        course_id
75    )
76    .fetch_one(conn)
77    .await?;
78    Ok(deleted)
79}