-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathpreference_row.rs
120 lines (103 loc) · 3.44 KB
/
preference_row.rs
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use crate::{
ChangeLogInsertRow, ChangelogRepository, ChangelogTableName, RepositoryError, RowActionType,
StorageConnection, Upsert,
};
use super::{preference_row::preference::dsl::*, store_row::store};
use serde::{Deserialize, Serialize};
use diesel::prelude::*;
table! {
preference (id) {
id -> Text,
key -> Text,
value -> Text,
store_id -> Nullable<Text>,
}
}
joinable!(preference -> store (store_id));
allow_tables_to_appear_in_same_query!(preference, store);
#[derive(
Clone, Insertable, Queryable, Debug, PartialEq, AsChangeset, Eq, Serialize, Deserialize, Default,
)]
#[diesel(table_name = preference)]
pub struct PreferenceRow {
pub id: String,
pub key: String,
pub value: String,
pub store_id: Option<String>,
}
pub struct PreferenceRowRepository<'a> {
connection: &'a StorageConnection,
}
impl<'a> PreferenceRowRepository<'a> {
pub fn new(connection: &'a StorageConnection) -> Self {
PreferenceRowRepository { connection }
}
fn upsert_one(&self, preference_row: &PreferenceRow) -> Result<i64, RepositoryError> {
diesel::insert_into(preference::table)
.values(preference_row)
.on_conflict(id)
.do_update()
.set(preference_row)
.execute(self.connection.lock().connection())?;
self.insert_changelog(preference_row.to_owned(), RowActionType::Upsert)
}
fn insert_changelog(
&self,
row: PreferenceRow,
action: RowActionType,
) -> Result<i64, RepositoryError> {
let row = ChangeLogInsertRow {
table_name: ChangelogTableName::Preference,
record_id: row.id,
row_action: action,
store_id: row.store_id.clone(),
name_link_id: None,
};
ChangelogRepository::new(self.connection).insert(&row)
}
pub fn find_one_by_key(
&self,
preference_key: &str,
) -> Result<Option<PreferenceRow>, RepositoryError> {
let result = preference
.filter(key.eq(preference_key))
.first(self.connection.lock().connection())
.optional()?;
Ok(result)
}
pub fn find_one_by_id(
&self,
preference_id: &str,
) -> Result<Option<PreferenceRow>, RepositoryError> {
let result = preference::table
.filter(preference::id.eq(preference_id))
.first(self.connection.lock().connection())
.optional()?;
Ok(result)
}
pub fn delete(&self, preference_id: &str) -> Result<Option<i64>, RepositoryError> {
let old_row = self.find_one_by_id(preference_id)?;
let change_log_id = match old_row {
Some(old_row) => self.insert_changelog(old_row, RowActionType::Delete)?,
None => {
return Ok(None);
}
};
diesel::delete(preference.filter(preference::id.eq(preference_id)))
.execute(self.connection.lock().connection())?;
Ok(Some(change_log_id))
}
}
impl Upsert for PreferenceRow {
fn upsert(&self, con: &StorageConnection) -> Result<Option<i64>, RepositoryError> {
let cursor_id = PreferenceRowRepository::new(con).upsert_one(self)?;
Ok(Some(cursor_id))
}
// Test only
fn assert_upserted(&self, con: &StorageConnection) {
assert_eq!(
PreferenceRowRepository::new(con).find_one_by_key(&self.key),
Ok(Some(self.clone()))
)
}
}