mirror of
https://gitlab.com/comunic/comunicapiv3
synced 2025-06-21 00:45:18 +00:00
Start user WebSocket implementation
This commit is contained in:
@ -12,6 +12,7 @@ use serde::export::Formatter;
|
||||
/// Simple result type
|
||||
pub type ResultExecError<E> = Result<E, ExecError>;
|
||||
pub type ResultBoxError<E = ()> = Result<E, Box<dyn Error>>;
|
||||
pub type Res<E = ()> = ResultBoxError<E>;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct ExecError(pub String);
|
||||
|
@ -3,6 +3,7 @@ pub mod config;
|
||||
|
||||
pub mod base_request_handler;
|
||||
pub mod http_request_handler;
|
||||
pub mod user_ws_request_handler;
|
||||
pub mod api_client;
|
||||
|
||||
pub mod user;
|
||||
@ -34,4 +35,5 @@ pub mod survey_response;
|
||||
pub mod general_settings;
|
||||
pub mod lang_settings;
|
||||
pub mod security_settings;
|
||||
pub mod new_custom_emoji;
|
||||
pub mod new_custom_emoji;
|
||||
pub mod ws_message;
|
86
src/data/user_ws_request_handler.rs
Normal file
86
src/data/user_ws_request_handler.rs
Normal file
@ -0,0 +1,86 @@
|
||||
//! # User Web Socket Request handler
|
||||
|
||||
use std::collections::HashMap;
|
||||
|
||||
use serde::Serialize;
|
||||
|
||||
use crate::api_data::http_error::HttpError;
|
||||
use crate::controllers::routes::RequestResult;
|
||||
use crate::controllers::user_ws_controller::WsConnection;
|
||||
use crate::data::base_request_handler::{BaseRequestHandler, RequestValue};
|
||||
use crate::data::error::ResultBoxError;
|
||||
use crate::data::user::UserID;
|
||||
|
||||
pub enum WsResponseType {
|
||||
SUCCESS,
|
||||
ERROR,
|
||||
}
|
||||
|
||||
pub struct WsResponse {
|
||||
pub r#type: WsResponseType,
|
||||
pub content: serde_json::Value,
|
||||
}
|
||||
|
||||
pub struct WsRequestHandler {
|
||||
connection: WsConnection,
|
||||
args: HashMap<String, RequestValue>,
|
||||
response: Option<WsResponse>,
|
||||
}
|
||||
|
||||
impl WsRequestHandler {
|
||||
pub fn new(connection: &WsConnection, args: HashMap<String, String>) -> WsRequestHandler {
|
||||
WsRequestHandler {
|
||||
connection: connection.clone(),
|
||||
args: args.into_iter().map(|f| (f.0, RequestValue::String(f.1))).collect(),
|
||||
response: None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Check if a response has been set
|
||||
pub fn has_response(&self) -> bool {
|
||||
self.response.is_some()
|
||||
}
|
||||
|
||||
/// Get the response to the request
|
||||
pub fn response(mut self) -> WsResponse {
|
||||
if !self.has_response() {
|
||||
self.success("Request done.").unwrap();
|
||||
}
|
||||
|
||||
return self.response.unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
impl BaseRequestHandler for WsRequestHandler {
|
||||
fn post_parameter_opt(&self, name: &str) -> Option<&RequestValue> {
|
||||
self.args.get(name)
|
||||
}
|
||||
|
||||
fn set_response<T: Serialize>(&mut self, response: T) -> RequestResult {
|
||||
self.response = Some(WsResponse {
|
||||
r#type: WsResponseType::SUCCESS,
|
||||
content: serde_json::to_value(response)?,
|
||||
});
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn set_error(&mut self, error: HttpError) {
|
||||
self.response = Some(WsResponse {
|
||||
r#type: WsResponseType::ERROR,
|
||||
content: serde_json::Value::String(error.error.message),
|
||||
});
|
||||
}
|
||||
|
||||
fn remote_ip(&self) -> String {
|
||||
self.connection.remote_ip.to_string()
|
||||
}
|
||||
|
||||
fn user_id_opt_ref(&self) -> Option<&UserID> {
|
||||
Some(&self.connection.user_id)
|
||||
}
|
||||
|
||||
fn user_id(&self) -> ResultBoxError<UserID> {
|
||||
Ok(self.connection.user_id.clone())
|
||||
}
|
||||
}
|
12
src/data/ws_message.rs
Normal file
12
src/data/ws_message.rs
Normal file
@ -0,0 +1,12 @@
|
||||
//! # WebSocket message
|
||||
//!
|
||||
//! @author Pierre Hubert
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Clone, Serialize, Deserialize)]
|
||||
pub struct WsMessage {
|
||||
pub id: Option<String>,
|
||||
pub title: String,
|
||||
pub data: serde_json::Value,
|
||||
}
|
Reference in New Issue
Block a user