1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use crate::prelude::*;

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
#[cfg_attr(feature = "ts_rs", derive(TS))]
pub struct PageAudioFile {
    pub id: Uuid,
    pub page_id: Uuid,
    pub created_at: DateTime<Utc>,
    pub deleted_at: Option<DateTime<Utc>>,
    pub path: String,
    pub mime_type: String,
}

pub async fn insert_page_audio(
    conn: &mut PgConnection,
    page_id: Uuid,
    audio_file_path: &str,
    mime_type: &str,
) -> ModelResult<()> {
    sqlx::query!(
        r"
INSERT INTO page_audio_files (
  page_id,
  path,
  mime_type
)
VALUES($1, $2, $3)
      ",
        page_id,
        audio_file_path,
        mime_type,
    )
    .execute(conn)
    .await?;
    Ok(())
}

pub async fn delete_page_audio(conn: &mut PgConnection, id: Uuid) -> ModelResult<String> {
    let response = sqlx::query!(
        r#"
UPDATE page_audio_files
SET deleted_at = now()
WHERE id = $1
RETURNING path
      "#,
        id
    )
    .fetch_one(conn)
    .await?;
    Ok(response.path)
}

pub async fn get_page_audio_files(
    conn: &mut PgConnection,
    page_id: Uuid,
) -> ModelResult<Vec<PageAudioFile>> {
    let audio_files = sqlx::query_as!(
        PageAudioFile,
        "
SELECT *
FROM page_audio_files
WHERE page_id = $1
AND deleted_at IS NULL;
",
        page_id
    )
    .fetch_all(conn)
    .await?;
    Ok(audio_files)
}

pub async fn get_page_audio_files_by_id(
    conn: &mut PgConnection,
    id: Uuid,
) -> ModelResult<PageAudioFile> {
    let audio_files = sqlx::query_as!(
        PageAudioFile,
        "
SELECT *
FROM page_audio_files
WHERE id = $1
AND deleted_at IS NULL;
",
        id
    )
    .fetch_one(conn)
    .await?;
    Ok(audio_files)
}