use std::io; use chrono::prelude::*; use fcpv2::types::{traits::{FcpRequest, FcpParser}, SSK}; use rusqlite::{ types::{FromSql, FromSqlError, FromSqlResult, ToSqlOutput, ValueRef}, Result, ToSql, }; use serde_derive::{Deserialize, Serialize}; use uuid::Uuid; use crate::api::response::User as JsonableUser; pub const DB_PATH: &str = "hole.db"; pub type Time = chrono::DateTime; pub type SignKey = String; pub type InsertKey = SSK; #[derive(Debug, Deserialize, Serialize, PartialEq, Clone)] pub struct Id(pub uuid::Uuid); #[derive(Debug, Deserialize, Serialize, Clone)] pub struct User { pub id: Id, pub name: String, pub sign_key: SignKey, pub insert_key: InsertKey, pub messages_count: u32, pub my_messages_count: u32, } /// converting SSK to rusqlite type impl ToSql for Id { fn to_sql(&self) -> Result> { Ok(ToSqlOutput::from(self.0.to_string())) } } /// converting from rusqlite type to SSK impl FromSql for Id { fn column_result(value: ValueRef<'_>) -> FromSqlResult { let id = Uuid::parse_str(&(value.as_str()?)[..]).unwrap(); Ok(Id(id)) } } impl User { pub fn to_jsonable(self) -> JsonableUser { JsonableUser { id: self.id.0.to_string(), name: self.name, sign_key: self.sign_key, insert_key: SSK::convert(&self.insert_key), messages_count: self.messages_count, my_messages_count: self.my_messages_count, } } pub fn from_jsonable(json: JsonableUser) -> io::Result { Ok(User { id: Id(Uuid::parse_str(&json.id[..]).unwrap()), name: json.name, sign_key: json.sign_key, insert_key: SSK::parse(&json.insert_key[..]).unwrap(), messages_count: json.messages_count, my_messages_count: json.my_messages_count, }) } } #[derive(Debug, Deserialize, Serialize)] pub struct Message { pub id: u32, pub date: Time, pub user_id: Id, pub message: String, pub from_me: bool, }