-
Notifications
You must be signed in to change notification settings - Fork 5
/
user_on_rocketchat_server.rs
131 lines (119 loc) · 6.07 KB
/
user_on_rocketchat_server.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
121
122
123
124
125
126
127
128
129
130
131
use diesel;
use diesel::prelude::*;
use diesel::sqlite::SqliteConnection;
use ruma_identifiers::UserId;
use errors::*;
use super::schema::users_on_rocketchat_servers;
use super::User;
/// A user on a Rocket.Chat server.
#[derive(Debug, Queryable)]
pub struct UserOnRocketchatServer {
/// Flag to indicate if the user is only used to send messages from Rocket.Chat
pub is_virtual_user: bool,
/// The users unique id on the Rocket.Chat server.
pub matrix_user_id: UserId,
/// The unique id for the Rocket.Chat server
pub rocketchat_server_id: i32,
/// The users unique id on the Rocket.Chat server.
pub rocketchat_user_id: Option<String>,
/// The token to identify reuqests from the Rocket.Chat server
pub rocketchat_auth_token: Option<String>,
/// The username on the Rocket.Chat server
pub rocketchat_username: Option<String>,
/// created timestamp
pub created_at: String,
/// updated timestamp
pub updated_at: String,
}
/// A new `Room`, not yet saved.
#[derive(Insertable)]
#[table_name="users_on_rocketchat_servers"]
pub struct NewUserOnRocketchatServer {
/// Flag to indicate if the user is only used to send messages from Rocket.Chat
pub is_virtual_user: bool,
/// The users unique id on the Rocket.Chat server.
pub matrix_user_id: UserId,
/// The unique id for the Rocket.Chat server
pub rocketchat_server_id: i32,
/// The users unique id on the Rocket.Chat server.
pub rocketchat_user_id: Option<String>,
/// The token to identify reuqests from the Rocket.Chat server
pub rocketchat_auth_token: Option<String>,
/// The username on the Rocket.Chat server
pub rocketchat_username: Option<String>,
}
impl UserOnRocketchatServer {
/// Insert or update a `UserOnRocketchatServer`.
pub fn upsert(connection: &SqliteConnection,
user_on_rocketchat_server: &NewUserOnRocketchatServer)
-> Result<UserOnRocketchatServer> {
let users_on_rocketchat_server: Vec<UserOnRocketchatServer> =
users_on_rocketchat_servers::table.find((&user_on_rocketchat_server.matrix_user_id,
&user_on_rocketchat_server.rocketchat_server_id))
.load(connection)
.chain_err(|| ErrorKind::DBSelectError)?;
match users_on_rocketchat_server.into_iter().next() {
Some(existing_user_on_rocketchat_server) => {
existing_user_on_rocketchat_server.set_credentials(connection,
user_on_rocketchat_server.rocketchat_user_id.clone(),
user_on_rocketchat_server.rocketchat_auth_token.clone())?;
}
None => {
diesel::insert(user_on_rocketchat_server).into(users_on_rocketchat_servers::table)
.execute(connection)
.chain_err(|| ErrorKind::DBInsertError)?;
}
}
UserOnRocketchatServer::find(connection,
&user_on_rocketchat_server.matrix_user_id,
user_on_rocketchat_server.rocketchat_server_id)
}
/// Find a `UserOnRocketchatServer` by his matrix user ID and the Rocket.Chat server ID, return
/// an error if the `UserOnRocketchatServer` is not found
pub fn find(connection: &SqliteConnection,
matrix_user_id: &UserId,
rocketchat_server_id: i32)
-> Result<UserOnRocketchatServer> {
let user_on_rocketchat_server = users_on_rocketchat_servers::table.find((matrix_user_id, rocketchat_server_id))
.first(connection)
.chain_err(|| ErrorKind::DBSelectError)?;
Ok(user_on_rocketchat_server)
}
/// Find a `UserOnRocketchatServer` by his Rocket.Chat user ID. Returns `None`, if the `UserOnRocketchatServer` is not found.
pub fn find_by_rocketchat_user_id(connection: &SqliteConnection,
rocketchat_server_id: i32,
rocketchat_user_id: String,
is_virtual_user: bool)
-> Result<Option<UserOnRocketchatServer>> {
let users_on_rocketchat_servers = users_on_rocketchat_servers::table.filter(users_on_rocketchat_servers::rocketchat_server_id.eq(rocketchat_server_id).and(users_on_rocketchat_servers::rocketchat_user_id.eq(rocketchat_user_id)).and(users_on_rocketchat_servers::is_virtual_user.eq(is_virtual_user)))
.load(connection)
.chain_err(|| ErrorKind::DBSelectError)?;
Ok(users_on_rocketchat_servers.into_iter().next())
}
/// Update the users credentials.
pub fn set_credentials(&self,
connection: &SqliteConnection,
rocketchat_user_id: Option<String>,
rocketchat_auth_token: Option<String>)
-> Result<()> {
diesel::update(users_on_rocketchat_servers::table.find((&self.matrix_user_id, self.rocketchat_server_id)))
.set((users_on_rocketchat_servers::rocketchat_user_id.eq(rocketchat_user_id),
users_on_rocketchat_servers::rocketchat_auth_token.eq(rocketchat_auth_token))).execute(connection)
.chain_err(|| ErrorKind::DBUpdateError)?;
Ok(())
}
/// Update the users Rocket.Chat username.
pub fn set_rocketchat_username(&self,
connection: &SqliteConnection,
rocketchat_username: Option<String>)
-> Result<()> {
diesel::update(users_on_rocketchat_servers::table.find((&self.matrix_user_id, self.rocketchat_server_id)))
.set(users_on_rocketchat_servers::rocketchat_username.eq(rocketchat_username)).execute(connection)
.chain_err(|| ErrorKind::DBUpdateError)?;
Ok(())
}
/// Get the `User` for a `UserOnRocketchatServer` record.
pub fn user(&self, connection: &SqliteConnection) -> Result<User> {
User::find(connection, &self.matrix_user_id)
}
}