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()
.collect();
Ok(list)
}