Skip to content

Commit 4489377

Browse files
committed
fix: only send webhook after successful mod update
1 parent e45c124 commit 4489377

File tree

2 files changed

+61
-48
lines changed

2 files changed

+61
-48
lines changed

src/endpoints/mod_versions.rs

+48-35
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use serde::Deserialize;
55
use sqlx::{types::ipnetwork::IpNetwork, Acquire};
66

77
use crate::{
8-
extractors::auth::Auth, types::{
8+
extractors::auth::Auth,
9+
types::{
910
api::{ApiError, ApiResponse},
1011
mod_json::{split_version_and_compare, ModJson},
1112
models::{
@@ -16,7 +17,9 @@ use crate::{
1617
mod_version::{self, ModVersion},
1718
mod_version_status::ModVersionStatusEnum,
1819
},
19-
}, webhook::send_webhook, AppData
20+
},
21+
webhook::send_webhook,
22+
AppData,
2023
};
2124

2225
#[derive(Deserialize)]
@@ -92,9 +95,8 @@ pub async fn get_version_index(
9295
let mut pool = data.db.acquire().await.or(Err(ApiError::DbAcquireError))?;
9396

9497
let has_extended_permissions = match auth.developer() {
95-
Ok(dev) => dev.admin ||
96-
Developer::has_access_to_mod(dev.id, &path.id, &mut pool).await?,
97-
_ => false
98+
Ok(dev) => dev.admin || Developer::has_access_to_mod(dev.id, &path.id, &mut pool).await?,
99+
_ => false,
98100
};
99101

100102
let mut result = ModVersion::get_index(
@@ -130,9 +132,8 @@ pub async fn get_one(
130132
let mut pool = data.db.acquire().await.or(Err(ApiError::DbAcquireError))?;
131133

132134
let has_extended_permissions = match auth.developer() {
133-
Ok(dev) => dev.admin ||
134-
Developer::has_access_to_mod(dev.id, &path.id, &mut pool).await?,
135-
_ => false
135+
Ok(dev) => dev.admin || Developer::has_access_to_mod(dev.id, &path.id, &mut pool).await?,
136+
_ => false,
136137
};
137138

138139
let mut version = {
@@ -202,16 +203,18 @@ pub async fn download_version(
202203
};
203204
let net: IpNetwork = ip.parse().or(Err(ApiError::InternalError))?;
204205

205-
if let Ok((downloaded_version, downloaded_mod)) = download::create_download(
206-
net, mod_version.id, &mod_version.mod_id, &mut pool
207-
).await {
206+
if let Ok((downloaded_version, downloaded_mod)) =
207+
download::create_download(net, mod_version.id, &mod_version.mod_id, &mut pool).await
208+
{
208209
let name = mod_version.mod_id.clone();
209210
let version = mod_version.version.clone();
210211

211212
// only accepted mods can have their download counts incremented
212213
// we'll just fix this once they're updated anyways
213214

214-
if (downloaded_version || downloaded_mod) && mod_version.status == ModVersionStatusEnum::Accepted {
215+
if (downloaded_version || downloaded_mod)
216+
&& mod_version.status == ModVersionStatusEnum::Accepted
217+
{
215218
tokio::spawn(async move {
216219
if downloaded_version {
217220
// we must nest more
@@ -264,45 +267,53 @@ pub async fn create_version(
264267
}
265268

266269
// remove invalid characters from link - they break the location header on download
267-
let download_link: String = payload.download_link.chars()
268-
.filter(|c| c.is_ascii() && *c != '\0').collect();
270+
let download_link: String = payload
271+
.download_link
272+
.chars()
273+
.filter(|c| c.is_ascii() && *c != '\0')
274+
.collect();
269275

270276
let mut file_path = download_geode_file(&download_link).await?;
271-
let json = ModJson::from_zip(&mut file_path, &download_link, dev.verified)
272-
.map_err(|err| {
273-
log::error!("Failed to parse mod.json: {}", err);
274-
ApiError::FilesystemError
275-
})?;
277+
let json = ModJson::from_zip(&mut file_path, &download_link, dev.verified).map_err(|err| {
278+
log::error!("Failed to parse mod.json: {}", err);
279+
ApiError::FilesystemError
280+
})?;
276281
if json.id != path.id {
277282
return Err(ApiError::BadRequest(format!(
278283
"Request id {} does not match mod.json id {}",
279284
path.id, json.id
280285
)));
281286
}
282287

288+
json.validate()?;
289+
let mut transaction = pool.begin().await.or(Err(ApiError::TransactionError))?;
290+
if let Err(e) = Mod::new_version(&json, &dev, &mut transaction).await {
291+
transaction
292+
.rollback()
293+
.await
294+
.or(Err(ApiError::TransactionError))?;
295+
return Err(e);
296+
}
297+
283298
if dev.verified {
284299
send_webhook(
285300
json.id.clone(),
286301
json.name.clone(),
287302
json.version.clone(),
288303
true,
289-
Developer { id: dev.id, username: dev.username.clone(), display_name: dev.display_name.clone(), is_owner: true },
304+
Developer {
305+
id: dev.id,
306+
username: dev.username.clone(),
307+
display_name: dev.display_name.clone(),
308+
is_owner: true,
309+
},
290310
dev.clone(),
291311
data.webhook_url.clone(),
292-
data.app_url.clone()
312+
data.app_url.clone(),
293313
)
294314
.await;
295315
}
296316

297-
json.validate()?;
298-
let mut transaction = pool.begin().await.or(Err(ApiError::TransactionError))?;
299-
if let Err(e) = Mod::new_version(&json, dev, &mut transaction).await {
300-
transaction
301-
.rollback()
302-
.await
303-
.or(Err(ApiError::TransactionError))?;
304-
return Err(e);
305-
}
306317
transaction
307318
.commit()
308319
.await
@@ -327,8 +338,9 @@ pub async fn update_version(
327338
path.version.as_str(),
328339
false,
329340
false,
330-
&mut pool
331-
).await?;
341+
&mut pool,
342+
)
343+
.await?;
332344
let approved_count = ModVersion::get_accepted_count(version.mod_id.as_str(), &mut pool).await?;
333345
let mut transaction = pool.begin().await.or(Err(ApiError::TransactionError))?;
334346
let id = match sqlx::query!(
@@ -368,7 +380,7 @@ pub async fn update_version(
368380
.commit()
369381
.await
370382
.or(Err(ApiError::TransactionError))?;
371-
383+
372384
if payload.status == ModVersionStatusEnum::Accepted {
373385
let is_update = approved_count > 0;
374386

@@ -385,8 +397,9 @@ pub async fn update_version(
385397
owner.as_ref().unwrap().clone(),
386398
dev.clone(),
387399
data.webhook_url.clone(),
388-
data.app_url.clone()
389-
).await;
400+
data.app_url.clone(),
401+
)
402+
.await;
390403
}
391404

392405
Ok(HttpResponse::NoContent())

src/types/models/mod_entity.rs

+13-13
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ impl Mod {
121121
FROM (
122122
select m.id, m.download_count, row_number() over(partition by m.id) rn
123123
FROM mods m
124-
INNER JOIN mod_versions mv ON mv.mod_id = m.id
124+
INNER JOIN mod_versions mv ON mv.mod_id = m.id
125125
INNER JOIN mod_version_statuses mvs ON mvs.mod_version_id = mv.id
126126
WHERE mvs.status = 'accepted'
127127
) q
@@ -616,7 +616,7 @@ impl Mod {
616616
FROM mods m
617617
INNER JOIN mod_versions mv ON m.id = mv.mod_id
618618
INNER JOIN mod_version_statuses mvs ON mvs.mod_version_id = mv.id
619-
WHERE m.id = $1
619+
WHERE m.id = $1
620620
AND ($2 = false OR mvs.status = 'accepted')"#,
621621
id,
622622
only_accepted
@@ -737,7 +737,7 @@ impl Mod {
737737

738738
pub async fn new_version(
739739
json: &ModJson,
740-
developer: FetchedDeveloper,
740+
developer: &FetchedDeveloper,
741741
pool: &mut PgConnection,
742742
) -> Result<(), ApiError> {
743743
let result = sqlx::query!(
@@ -861,9 +861,9 @@ impl Mod {
861861
}
862862
match sqlx::query_as!(
863863
QueryResult,
864-
"SELECT m.image
864+
"SELECT m.image
865865
FROM mods m
866-
INNER JOIN mod_versions mv ON mv.mod_id = m.id
866+
INNER JOIN mod_versions mv ON mv.mod_id = m.id
867867
INNER JOIN mod_version_statuses mvs ON mvs.mod_version_id = mv.id
868868
WHERE m.id = $1",
869869
id
@@ -981,7 +981,7 @@ impl Mod {
981981
}
982982

983983
let counts = match sqlx::query!(
984-
"select
984+
"select
985985
count(1) filter (where mvs.status = ANY(array['accepted', 'pending']::mod_version_status[])) as not_rejected,
986986
count(1) filter (where mvs.status = 'rejected') as rejected,
987987
count(1) filter (where mvs.status = 'accepted') as validated
@@ -1318,20 +1318,20 @@ impl Mod {
13181318
pool: &mut PgConnection,
13191319
) -> Result<Vec<ModUpdate>, ApiError> {
13201320
let mut builder: QueryBuilder<Postgres> = QueryBuilder::new(
1321-
r#"SELECT
1322-
q.id,
1323-
q.inner_version as version,
1321+
r#"SELECT
1322+
q.id,
1323+
q.inner_version as version,
13241324
q.mod_version_id
13251325
FROM (
1326-
SELECT m.id,
1326+
SELECT m.id,
13271327
mv.id as mod_version_id,
13281328
mv.version as inner_version,
1329-
row_number() over (partition by m.id order by mv.id desc) rn
1329+
row_number() over (partition by m.id order by mv.id desc) rn
13301330
FROM mods m
1331-
INNER JOIN mod_versions mv ON mv.mod_id = m.id
1331+
INNER JOIN mod_versions mv ON mv.mod_id = m.id
13321332
INNER JOIN mod_version_statuses mvs ON mvs.mod_version_id = mv.id
13331333
INNER JOIN mod_gd_versions mgv ON mv.id = mgv.mod_id
1334-
WHERE mvs.status = 'accepted'
1334+
WHERE mvs.status = 'accepted'
13351335
AND mgv.platform = "#,
13361336
);
13371337
builder.push_bind(platforms);

0 commit comments

Comments
 (0)