use crate::app::settings::get_db_connection;
use crate::entity::{
media::Entity as MediaEntity,
music::Entity as MusicEntity,
report::{self, ActiveModel as ReportAModel, Column as ReportColumn, Entity as ReportEntity},
};
use crate::error::error::CustomError;
use log::info;
use sea_orm::{
ActiveModelTrait, ColumnTrait, DatabaseConnection, EntityTrait, Iterable, QueryFilter,
};
use serde::Serialize;
use std::sync::mpsc::Sender;
use std::time::Instant;
#[derive(Serialize, Debug)]
pub struct ReportList {
pub report_type: String,
pub path: String,
}
pub struct MusicValidator {
pub sender: Option<Sender<String>>,
}
impl MusicValidator {
pub fn new(tx: Option<Sender<String>>) -> Self {
Self { sender: tx }
}
pub async fn insert_report(
reports: Vec<ReportAModel>,
db: &DatabaseConnection,
) -> Result<String, CustomError> {
for chunk in reports.chunks(
(u16::MAX / (<report::Entity as EntityTrait>::Column::iter().count() as u16 * 5))
as usize,
) {
for individual_report in chunk.iter() {
individual_report.clone().insert(db).await?;
}
}
Ok("Ok".to_string())
}
pub async fn get_reports() -> Result<Vec<ReportList>, CustomError> {
let _before = Instant::now();
let mut mapped_media_reports: Vec<_> = get_media_reports().await?;
let mut mapped_music_reports: Vec<ReportList> = get_music_reports().await?;
mapped_media_reports.append(&mut mapped_music_reports);
println!("Timing Complete get_reports in {:.2?}", _before.elapsed());
Ok(mapped_media_reports)
}
}
#[deprecated]
#[allow(dead_code)]
pub async fn get_reports() -> Result<Vec<ReportList>, CustomError> {
let _before = Instant::now();
let mut mapped_media_reports: Vec<_> = get_media_reports().await?;
let mut mapped_music_reports: Vec<ReportList> = get_music_reports().await?;
mapped_media_reports.append(&mut mapped_music_reports);
println!("Timing Complete get_reports in {:.2?}", _before.elapsed());
Ok(mapped_media_reports)
}
async fn get_media_reports() -> Result<Vec<ReportList>, CustomError> {
let before = Instant::now();
let db = get_db_connection().await?;
let reports = report::Entity::find()
.find_also_related(MediaEntity)
.all(&db)
.await?;
let filtered_reports: Vec<_> = reports.into_iter().filter(|x| x.1.is_some()).collect();
let mapped_media_reports: Vec<_> = filtered_reports
.iter()
.map(|x| ReportList {
report_type: x.0.report_type.to_owned(),
path: x.1.clone().unwrap().path,
})
.collect();
info!(
"Timing Complete get_media_reports in {:.2?}",
before.elapsed()
);
Ok(mapped_media_reports)
}
async fn get_music_reports() -> Result<Vec<ReportList>, CustomError> {
let before = Instant::now();
let db = get_db_connection().await?;
let reports = report::Entity::find()
.find_also_related(MusicEntity)
.all(&db)
.await?;
let filtered_reports: Vec<_> = reports.into_iter().filter(|x| x.1.is_some()).collect();
let mut mapped_music_reports: Vec<ReportList> = Vec::new();
for f in filtered_reports.iter() {
let media_path = get_media_path(&db, f.clone().1.unwrap().clone().media_id).await?;
mapped_music_reports.push(ReportList {
report_type: f.0.clone().report_type,
path: media_path,
});
}
info!(
"Timing Complete get_music_reports in {:.2?}",
before.elapsed()
);
Ok(mapped_music_reports)
}
async fn get_media_path(db: &DatabaseConnection, media_id: i32) -> Result<String, CustomError> {
let one = MediaEntity::find_by_id(media_id).one(db).await?;
Ok(one.unwrap().path.to_string())
}
#[allow(dead_code)]
pub async fn delete_reports() -> Result<String, CustomError> {
let db = get_db_connection().await?;
ReportEntity::delete_many()
.filter(ReportColumn::Id.is_not_null())
.exec(&db)
.await?;
Ok("Ok".to_string())
}
#[allow(dead_code)]
pub async fn run_reports() -> Result<String, CustomError> {
todo!()
}