gitea_pages/backend/src/worker/delete_repo.rs

54 lines
1.6 KiB
Rust

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::<String>(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::<i64>(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(())
}