Skip to main content

headless_lms_models/
proposed_block_edits.rs

1use crate::prelude::*;
2use utoipa::ToSchema;
3
4#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq, ToSchema)]
5
6pub struct NewProposedBlockEdit {
7    pub block_id: Uuid,
8    pub block_attribute: String,
9    pub original_text: String,
10    pub changed_text: String,
11}
12
13#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq, ToSchema)]
14pub struct ProposedBlockEdit {
15    pub id: Uuid,
16    pub proposal_id: Uuid,
17    pub block_id: Uuid,
18    pub block_attribute: String,
19    pub original_text: String,
20    pub changed_text: String,
21    pub status: ProposalStatus,
22    pub created_at: DateTime<Utc>,
23    pub updated_at: DateTime<Utc>,
24    pub deleted_at: Option<DateTime<Utc>>,
25}
26
27#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq, sqlx::Type, ToSchema)]
28#[sqlx(type_name = "proposal_status", rename_all = "lowercase")]
29pub enum ProposalStatus {
30    Pending,
31    Accepted,
32    Rejected,
33}
34
35#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq, ToSchema)]
36
37pub struct EditedBlockStillExistsData {
38    pub id: Uuid,
39    pub block_id: Uuid,
40    pub current_text: String,
41    pub changed_text: String,
42    pub original_text: String,
43    pub status: ProposalStatus,
44    pub accept_preview: Option<String>,
45}
46
47#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq, ToSchema)]
48
49pub struct EditedBlockNoLongerExistsData {
50    pub id: Uuid,
51    pub block_id: Uuid,
52    pub changed_text: String,
53    pub original_text: String,
54    pub status: ProposalStatus,
55}
56
57#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq, ToSchema)]
58#[serde(tag = "type", rename_all = "kebab-case")]
59pub enum BlockProposal {
60    EditedBlockStillExists(EditedBlockStillExistsData),
61    EditedBlockNoLongerExists(EditedBlockNoLongerExistsData),
62}
63
64#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq, ToSchema)]
65
66pub struct BlockProposalInfo {
67    pub id: Uuid,
68    pub action: BlockProposalAction,
69}
70
71#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq, ToSchema)]
72#[serde(tag = "tag", content = "data")]
73pub enum BlockProposalAction {
74    Accept(String),
75    Reject,
76}
77
78pub async fn get_by_ids(
79    conn: &mut PgConnection,
80    ids: &[Uuid],
81) -> ModelResult<Vec<ProposedBlockEdit>> {
82    let res = sqlx::query_as!(
83        ProposedBlockEdit,
84        r#"
85SELECT id,
86  proposal_id,
87  block_id,
88  block_attribute,
89  original_text,
90  changed_text,
91  status AS "status: ProposalStatus",
92  created_at,
93  updated_at,
94  deleted_at
95FROM proposed_block_edits
96WHERE id = ANY($1)
97  AND deleted_at IS NULL
98        "#,
99        ids
100    )
101    .fetch_all(conn)
102    .await?;
103    Ok(res)
104}