Switch server to sqlite

This commit is contained in:
2024-07-27 13:38:55 -04:00
Unverified
parent c134a78062
commit daeb5180fa
6 changed files with 164 additions and 242 deletions

View File

@@ -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,