zero4rs 2.0.0

zero4rs is a powerful, pragmatic, and extremely fast web framework for Rust
Documentation
use actix::prelude::{Actor, Context, Recipient};

use crate::core::auth0::UserDetails;

use crate::websocket::webchat::output::Level;
use crate::websocket::webchat::output::OutputMessage;
use crate::websocket::webchat::output::OutputMessageType;
use crate::websocket::webchat::output::TypedMessage;
use crate::websocket::webchat::ConnectId;

#[allow(dead_code)]
pub struct Server {
    pub ctx: actix_web::web::Data<crate::server::AppContext>,
    pub connections: std::collections::HashMap<ConnectId, Recipient<OutputMessage>>,
    pub user_infos: std::collections::HashMap<ConnectId, UserDetails>,
    pub subscribes: std::collections::HashMap<ConnectId, Vec<String>>,
}

impl Actor for Server {
    type Context = Context<Self>;
}

impl Server {
    pub fn build(ctx: actix_web::web::Data<crate::server::AppContext>) -> Self {
        Self {
            ctx,
            connections: std::collections::HashMap::default(),
            user_infos: std::collections::HashMap::default(),
            subscribes: std::collections::HashMap::default(),
        }
    }

    pub fn destroy(&mut self, connection_id: &str) {
        self.connections.remove(connection_id);
        self.user_infos.remove(connection_id);
        self.subscribes.remove(connection_id);
    }

    pub fn send_message(
        &self,
        level: Level,
        ty: OutputMessageType,
        connect_id: &str,
        msg: &str,
        id: Option<String>,
    ) {
        if let Some(socket_recipient) = self.connections.get(connect_id) {
            socket_recipient.do_send(OutputMessage {
                id,
                level,
                ty,
                msg: TypedMessage::TextMessage(msg.to_string()),
            });
        } else {
            log::warn!("attempting to send message but couldn't find user id.");
        }
    }

    pub fn send_json(
        &self,
        level: Level,
        ty: OutputMessageType,
        connect_id: &str,
        msg: serde_json::Value,
        id: Option<String>,
    ) {
        if let Some(socket_recipient) = self.connections.get(connect_id) {
            socket_recipient.do_send(OutputMessage {
                id,
                level,
                ty,
                msg: TypedMessage::JsonMessage(msg),
            });
        } else {
            log::warn!("attempting to send message but couldn't find user id.");
        }
    }

    pub fn broadcase_message(&self, level: Level, ty: OutputMessageType, msg: &str) {
        self.connections
            .iter()
            .for_each(|conn| self.send_message(level, ty, conn.0, msg, None));
    }
}