Skip to content

Commit abd3190

Browse files
committed
admin/delete_crate: Insert deleted_crates row after successful deletion
1 parent bc857dc commit abd3190

File tree

1 file changed

+39
-7
lines changed

1 file changed

+39
-7
lines changed

src/bin/crates-admin/delete_crate.rs

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
use crate::dialoguer;
22
use anyhow::Context;
3+
use chrono::{NaiveDateTime, Utc};
34
use colored::Colorize;
4-
use crates_io::schema::crate_downloads;
5+
use crates_io::models::NewDeletedCrate;
6+
use crates_io::schema::{crate_downloads, deleted_crates};
57
use crates_io::worker::jobs;
68
use crates_io::{db, schema::crates};
79
use crates_io_worker::BackgroundJob;
810
use diesel::dsl::sql;
911
use diesel::expression::SqlLiteral;
1012
use diesel::prelude::*;
1113
use diesel::sql_types::{Array, BigInt, Text};
12-
use diesel_async::RunQueryDsl;
14+
use diesel_async::scoped_futures::ScopedFutureExt;
15+
use diesel_async::{AsyncConnection, AsyncPgConnection, RunQueryDsl};
1316
use std::fmt::Display;
1417

1518
#[derive(clap::Parser, Debug)]
@@ -60,17 +63,27 @@ pub async fn run(opts: Opts) -> anyhow::Result<()> {
6063
return Ok(());
6164
}
6265

66+
let now = Utc::now();
67+
6368
for name in &crate_names {
6469
if let Some(crate_info) = existing_crates.iter().find(|info| info.name == *name) {
6570
let id = crate_info.id;
6671

72+
let created_at = crate_info.created_at.and_utc();
73+
let deleted_crate = NewDeletedCrate::builder(name)
74+
.created_at(&created_at)
75+
.deleted_at(&now)
76+
.available_at(&now)
77+
.build();
78+
6779
info!("{name}: Deleting crate from the database…");
68-
if let Err(error) = diesel::delete(crates::table.find(id))
69-
.execute(&mut conn)
70-
.await
71-
{
80+
let result = conn
81+
.transaction(|conn| delete_from_database(conn, id, deleted_crate).scope_boxed())
82+
.await;
83+
84+
if let Err(error) = result {
7285
warn!(%id, "{name}: Failed to delete crate from the database: {error}");
73-
}
86+
};
7487
} else {
7588
info!("{name}: Skipped missing crate");
7689
};
@@ -96,12 +109,31 @@ pub async fn run(opts: Opts) -> anyhow::Result<()> {
96109
Ok(())
97110
}
98111

112+
async fn delete_from_database(
113+
conn: &mut AsyncPgConnection,
114+
crate_id: i32,
115+
deleted_crate: NewDeletedCrate<'_>,
116+
) -> anyhow::Result<()> {
117+
diesel::delete(crates::table.find(crate_id))
118+
.execute(conn)
119+
.await?;
120+
121+
diesel::insert_into(deleted_crates::table)
122+
.values(deleted_crate)
123+
.execute(conn)
124+
.await?;
125+
126+
Ok(())
127+
}
128+
99129
#[derive(Debug, Clone, Queryable, Selectable)]
100130
struct CrateInfo {
101131
#[diesel(select_expression = crates::columns::name)]
102132
name: String,
103133
#[diesel(select_expression = crates::columns::id)]
104134
id: i32,
135+
#[diesel(select_expression = crates::columns::created_at)]
136+
created_at: NaiveDateTime,
105137
#[diesel(select_expression = crate_downloads::columns::downloads)]
106138
downloads: i64,
107139
#[diesel(select_expression = owners_subquery())]

0 commit comments

Comments
 (0)