use anyhow::Result; use celery::{error::TaskError, task::TaskResult}; use diesel::prelude::*; use std::fs; use uuidv7::Uuid; use crate::{db, CONFIG}; fn do_task(db_conn: &mut db::Connection, id: Uuid) -> Result<()> { let (user_id, name) = db::schema::repositories::table .select(( db::schema::repositories::user_id, db::schema::repositories::name, )) .filter(db::schema::repositories::id.eq(id)) .first::<(Uuid, String)>(db_conn)?; let user_name = db::schema::users::table .select(db::schema::users::name) .filter(db::schema::users::id.eq(user_id)) .first::(db_conn)?; diesel::delete(db::schema::repositories::table.filter(db::schema::repositories::id.eq(id))) .execute(db_conn)?; if db::schema::repositories::table .filter(db::schema::repositories::user_id.eq(user_id)) .count() .get_result::(db_conn)? == 0 { diesel::delete(db::schema::users::table.filter(db::schema::users::id.eq(user_id))) .execute(db_conn)?; fs::remove_dir_all(format!("{}/{}", CONFIG.repos_dir, user_name))?; } else { fs::remove_dir_all(format!("{}/{}/{}", CONFIG.repos_dir, user_name, name))?; } Ok(()) } #[celery::task] pub fn delete_repo(id: Uuid) -> TaskResult<()> { let db_conn = &mut match db::POOL.get() { Ok(x) => x, Err(e) => return Err(TaskError::UnexpectedError(format!("{:?}", e))), }; if let Err(e) = do_task(db_conn, id) { return Err(TaskError::UnexpectedError(format!("{:?}", e))); } Ok(()) }