librmo 0.4.4

A library to manage media files and play them
Documentation
use std::time::Instant;

use crate::entity::album_group::{
    self, ActiveModel as AlbumGroupAModel, Entity as AlbumGroup, Model as AlbumGroupModel,
};
use crate::error::error::QueryError;
use crate::{app::settings::get_db_connection, error::CustomError};
use log::info;
use sea_orm::{ActiveModelTrait, ActiveValue, EntityTrait, ModelTrait, Set};
use sea_query;

use super::albums::{get_albums_by_release_group, get_earliest_album_by_release_group};
use super::get_albums;

pub async fn album_groups_rebuild() -> Result<(), CustomError> {
    let before = Instant::now();
    generate_album_groups().await?;
    validate_album_groups().await?;
    update_album_groups().await?;
    info!(
        "Timing Complete album_groups_rebuild in {:.2?}",
        before.elapsed()
    );
    Ok(())
}

pub async fn generate_album_groups() -> Result<String, CustomError> {
    info!("generate_album_groups");
    let db = get_db_connection().await?;
    let album_group: Vec<AlbumGroupAModel> = match get_albums().await {
        Ok(x) => x
            .into_iter()
            .map(|a| AlbumGroupAModel {
                id: ActiveValue::not_set(),
                mb_release_group_id: ActiveValue::Set(a.mb_release_group_id),
                title: ActiveValue::Set(a.title),
                release_year: ActiveValue::Set(a.original_year),
            })
            .collect(),
        Err(x) => return Err(x),
    };

    for a in album_group.iter() {
        let _x = AlbumGroup::insert(a.clone())
            .on_conflict(
                sea_query::OnConflict::column(album_group::Column::MbReleaseGroupId)
                    .update_column(album_group::Column::ReleaseYear)
                    .to_owned(),
            )
            .exec(&db)
            .await;
    }

    Ok("Ok".to_string())
}

pub async fn validate_album_groups() -> Result<(), CustomError> {
    let db = get_db_connection().await?;
    let album_groups = match get_all_album_group().await {
        Ok(x) => x,
        Err(x) => return Err(x),
    };

    for a in album_groups.iter() {
        let albums = match get_albums_by_release_group(a.mb_release_group_id.clone()).await {
            Ok(x) => x,
            Err(x) => return Err(x),
        };
        if albums.len() < 1 {
            a.clone().delete(&db).await?;
        }
    }
    Ok(())
}

pub async fn update_album_groups() -> Result<(), CustomError> {
    let db = get_db_connection().await?;
    let album_groups = match get_all_album_group().await {
        Ok(x) => x,
        Err(x) => return Err(x),
    };

    for a in album_groups.iter() {
        let albums = match get_earliest_album_by_release_group(a.mb_release_group_id.clone()).await
        {
            Ok(x) => x,
            Err(x) => return Err(x),
        };
        let mut album_group: AlbumGroupAModel = a.clone().into();
        album_group.release_year = Set(albums.original_year.to_owned());
        let _album_group: AlbumGroupModel = album_group.update(&db).await?;
    }

    Ok(())
}

pub async fn get_all_album_group() -> Result<Vec<AlbumGroupModel>, CustomError> {
    let db = get_db_connection().await?;
    let album_groups = match AlbumGroup::find().all(&db).await {
        Ok(x) => x,
        Err(_) => {
            return Err(CustomError::QueryErr(QueryError {
                query: format!("Failed to find get_all_album_group"),
            }))
        }
    };

    Ok(album_groups)
}