zero4rs 2.0.0

zero4rs is a powerful, pragmatic, and extremely fast web framework for Rust
Documentation
use lazy_static::lazy_static;

use bson::doc;
use models::AppLogsPo;
use models::AppLogsPoRecord;
use models::NetworkLogRecord;
use models::TasksLogPo;
use models::TasksLogRecord;

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

use crate::core::error2::Error;
use crate::core::error2::Result;

pub mod models;

use self::models::NetworkLogPo;

lazy_static! {
    pub static ref APP_LOGS_DB: &'static str = "app_logs_db";
    pub static ref APP_LOG_COL: &'static str = "t_app_log";
    pub static ref NETWORK_LOG_COL: &'static str = "t_network_log";
    pub static ref TASKS_LOG_COL: &'static str = "t_tasks_log";
}

pub async fn save_app_logs(
    client: &mongo::MongoClient,
    curr_user: Option<&UserDetails>,
    app_logs: &str,
) -> Result<usize> {
    let _record = match crate::commons::parse_json_string::<Vec<AppLogsPo>>(app_logs) {
        Ok(o) => o,
        Err(e) => {
            let error_msg = format!("Parse-app-logs-data-failed: error={}, data={}", e, app_logs);
            log::error!("{}", error_msg);
            return Err(Error::invalid_request(error_msg));
        }
    };

    // 查出数据库里上传的最后一条数据,并根据其时间从待保存的数据过滤掉小于该时间的数据
    let curr_device_id = _record
        .first()
        .map(|f| f.device_id.clone().unwrap_or_default())
        .unwrap_or_default();

    if curr_device_id.is_empty() {
        return Err(Error::invalid_request("空数据或无设备id!".to_string()));
    }

    let filter = doc! {"device_id": curr_device_id};
    let _sort = doc! {"timestamp": -1};

    let list: Vec<AppLogsPoRecord> = client
        .select::<AppLogsPoRecord>(*APP_LOGS_DB, *APP_LOG_COL, filter, _sort, (0, 1))
        .await?
        .into_iter()
        .collect();

    let filtered_records: Vec<AppLogsPo>;

    if let Some(record) = list.first() {
        filtered_records = _record
            .clone()
            .into_iter()
            .filter(|f| match f.timestamp.cmp(&record.timestamp) {
                std::cmp::Ordering::Less => false,
                std::cmp::Ordering::Greater => true,
                std::cmp::Ordering::Equal => false,
            })
            .collect();
    } else {
        log::info!("22");
        filtered_records = _record.clone();
    }

    for item in filtered_records.iter() {
        let record = AppLogsPoRecord::from(curr_user, item);

        client
            .insert_one(*APP_LOGS_DB, *APP_LOG_COL, record)
            .await?;
    }

    Ok(_record.len())
}

pub async fn save_network_log(
    client: &mongo::MongoClient,
    curr_user: Option<&UserDetails>,
    data: &str,
) -> Result<usize> {
    let _record = match crate::commons::parse_json_string::<Vec<NetworkLogPo>>(data) {
        Ok(o) => o,
        Err(e) => {
            let error_msg = format!("Parse-network-data-failed: error={}, data={}", e, data);
            log::error!("{}", error_msg);
            return Err(Error::invalid_request(error_msg));
        }
    };

    // 查出数据库里上传的最后一条数据,并根据其时间从待保存的数据过滤掉小于该时间的数据
    let curr_device_id = _record
        .first()
        .map(|f| f.device_id.clone().unwrap_or_default())
        .unwrap_or_default();

    if curr_device_id.is_empty() {
        return Err(Error::invalid_request("空数据或无设备id!".to_string()));
    }

    let filter = doc! {"device_id": curr_device_id};
    let _sort = doc! {"timestamp": -1};

    let list: Vec<NetworkLogRecord> = client
        .select::<NetworkLogRecord>(*APP_LOGS_DB, *NETWORK_LOG_COL, filter, _sort, (0, 1))
        .await?
        .into_iter()
        .collect();

    let filtered_records: Vec<NetworkLogPo>;

    if let Some(record) = list.first() {
        filtered_records = _record
            .clone()
            .into_iter()
            .filter(|f| match f.timestamp.cmp(&record.timestamp) {
                std::cmp::Ordering::Less => false,
                std::cmp::Ordering::Greater => true,
                std::cmp::Ordering::Equal => false,
            })
            .collect();
    } else {
        filtered_records = _record.clone();
    }

    for item in filtered_records.iter() {
        let record = NetworkLogRecord::from(curr_user, item);

        client
            .insert_one(*APP_LOGS_DB, *NETWORK_LOG_COL, record)
            .await?;
    }

    Ok(_record.len())
}

pub async fn save_tasks_log(
    client: &mongo::MongoClient,
    curr_user: Option<&UserDetails>,
    data: &str,
) -> Result<usize> {
    let _record = match crate::commons::parse_json_string::<Vec<TasksLogPo>>(data) {
        Ok(o) => o,
        Err(e) => {
            let error_msg = format!("Parse-network-data-failed: error={}, data={}", e, data);
            log::error!("{}", error_msg);
            return Err(Error::invalid_request(error_msg));
        }
    };

    // 查出数据库里上传的最后一条数据,并根据其时间从待保存的数据过滤掉小于该时间的数据
    let curr_device_id = _record
        .first()
        .map(|f| f.device_id.clone().unwrap_or_default())
        .unwrap_or_default();

    if curr_device_id.is_empty() {
        return Err(Error::invalid_request("空数据或无设备id!".to_string()));
    }

    let filter = doc! {"device_id": curr_device_id};
    let _sort = doc! {"timestamp": -1};

    let list: Vec<TasksLogRecord> = client
        .select::<TasksLogRecord>(*APP_LOGS_DB, *TASKS_LOG_COL, filter, _sort, (0, 1))
        .await?
        .into_iter()
        .collect();

    let filtered_records: Vec<TasksLogPo>;

    if let Some(record) = list.first() {
        filtered_records = _record
            .clone()
            .into_iter()
            .filter(|f| match f.timestamp.cmp(&record.timestamp) {
                std::cmp::Ordering::Less => false,
                std::cmp::Ordering::Greater => true,
                std::cmp::Ordering::Equal => false,
            })
            .collect();
    } else {
        filtered_records = _record.clone();
    }

    for item in filtered_records.iter() {
        let record = TasksLogRecord::from(curr_user, item);

        client
            .insert_one(*APP_LOGS_DB, *TASKS_LOG_COL, record)
            .await?;
    }

    Ok(_record.len())
}

pub async fn filter_network_log(
    client: &mongo::MongoClient,
    filter: mongodb::bson::Document,
    pagation: (u32, u32),
) -> Result<Vec<NetworkLogRecord>> {
    let _sort = doc! {"location_id": -1};

    let list = client
        .select::<NetworkLogRecord>(*APP_LOGS_DB, *NETWORK_LOG_COL, filter, _sort, pagation)
        .await?
        .into_iter()
        // .map(|r| LocationRecord::from(&r))
        .collect();

    Ok(list)
}