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}