Switch server to sqlite
This commit is contained in:
@@ -1,7 +1,12 @@
|
||||
use chrono::{DateTime, TimeZone, Utc};
|
||||
use chrono::{DateTime, Utc};
|
||||
use sqlx::{FromRow, Row};
|
||||
use sqlx::sqlite::SqliteRow;
|
||||
use tarpc::serde::{Deserialize, Serialize};
|
||||
|
||||
use realm_shared::types::ErrorCode;
|
||||
|
||||
use crate::types::MessageData::*;
|
||||
|
||||
#[tarpc::service]
|
||||
pub trait RealmChat {
|
||||
async fn test(name: String) -> String;
|
||||
@@ -18,7 +23,8 @@ pub trait RealmChat {
|
||||
async fn get_rooms(auth_token: String) -> Result<Vec<Room>, ErrorCode>;
|
||||
async fn get_room(auth_token: String, roomid: String) -> Result<Room, ErrorCode>;
|
||||
async fn get_user(userid: String) -> Result<User, ErrorCode>;
|
||||
async fn get_users(get_only_online: bool) -> Result<Vec<User>, ErrorCode>;
|
||||
async fn get_users() -> Result<Vec<User>, ErrorCode>;
|
||||
async fn get_online_users() -> Result<Vec<User>, ErrorCode>;
|
||||
|
||||
//TODO: Admin access only!
|
||||
// async fn create_room() -> Result<Room, ErrorCode>;
|
||||
@@ -29,15 +35,59 @@ pub trait RealmChat {
|
||||
// unban user
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
pub struct Message {
|
||||
pub id: u32,
|
||||
pub timestamp: DateTime<Utc>, //TODO: Does the database already have timestamps for us?
|
||||
pub id: i64,
|
||||
pub timestamp: DateTime<Utc>,
|
||||
pub user: User,
|
||||
pub room: Room,
|
||||
#[sqlx(flatten)]
|
||||
pub data: MessageData,
|
||||
}
|
||||
|
||||
impl FromRow<'_, SqliteRow> for Message {
|
||||
fn from_row(row: &SqliteRow) -> sqlx::Result<Self> {
|
||||
Ok(Self {
|
||||
id: row.try_get("id")?,
|
||||
timestamp: row.try_get("timestamp")?,
|
||||
user: User {
|
||||
id: row.try_get("user_id")?,
|
||||
userid: row.try_get("user_userid")?,
|
||||
name: row.try_get("user_name")?,
|
||||
online: row.try_get("user_online")?,
|
||||
admin: row.try_get("user_admin")?,
|
||||
},
|
||||
room: Room {
|
||||
id: row.try_get("room_id")?,
|
||||
roomid: row.try_get("room_roomid")?,
|
||||
name: row.try_get("room_name")?,
|
||||
admin_only_send: row.try_get("room_admin_only_send")?,
|
||||
admin_only_view: row.try_get("room_admin_only_view")?,
|
||||
},
|
||||
data: match row.try_get("msg_type")? {
|
||||
"text" => Text(row.try_get("msg_text")?),
|
||||
"attachment" => todo!(),
|
||||
"reply" => Reply(Reply {
|
||||
referencing_id: row.try_get("referencing_id")?,
|
||||
text: row.try_get("msg_text")?,
|
||||
}),
|
||||
"edit" => Edit(Edit {
|
||||
referencing_id: row.try_get("referencing_id")?,
|
||||
text: row.try_get("msg_text")?,
|
||||
}),
|
||||
"reaction" => Reaction(Reaction {
|
||||
referencing_id: row.try_get("referencing_id")?,
|
||||
emoji: row.try_get("emoji")?,
|
||||
}),
|
||||
"redaction" => Redaction(Redaction {
|
||||
referencing_id: row.try_get("referencing_id")?,
|
||||
}),
|
||||
_ => { panic!() }
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: Maybe have multipart messages
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub enum MessageData {
|
||||
@@ -77,19 +127,18 @@ pub struct Redaction {
|
||||
pub referencing_id: u32,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
pub struct User {
|
||||
pub id: u32,
|
||||
pub id: i64,
|
||||
pub userid: String,
|
||||
pub name: String,
|
||||
pub online: bool,
|
||||
pub admin: bool,
|
||||
//TODO: auth stuff needed, should be Option
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
pub struct Room {
|
||||
pub id: u32,
|
||||
pub id: i64,
|
||||
pub roomid: String,
|
||||
pub name: String,
|
||||
pub admin_only_send: bool,
|
||||
|
||||
Reference in New Issue
Block a user