54 lines
1.6 KiB
Rust
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(())
|
|
}
|