@@ -2,6 +2,9 @@ use actix_web::{get, post, put, web, HttpResponse, Responder};
2
2
use serde:: Deserialize ;
3
3
use sqlx:: Acquire ;
4
4
5
+ use crate :: database:: repository:: developers;
6
+ use crate :: database:: repository:: mods;
7
+ use crate :: events:: mod_feature:: ModFeaturedEvent ;
5
8
use crate :: extractors:: auth:: Auth ;
6
9
use crate :: types:: api:: { create_download_link, ApiError , ApiResponse } ;
7
10
use crate :: types:: mod_json:: ModJson ;
@@ -10,6 +13,7 @@ use crate::types::models::incompatibility::Incompatibility;
10
13
use crate :: types:: models:: mod_entity:: { download_geode_file, Mod , ModUpdate } ;
11
14
use crate :: types:: models:: mod_gd_version:: { GDVersionEnum , VerPlatform } ;
12
15
use crate :: types:: models:: mod_version_status:: ModVersionStatusEnum ;
16
+ use crate :: webhook:: discord:: DiscordWebhook ;
13
17
use crate :: AppData ;
14
18
15
19
#[ derive( Deserialize , Default ) ]
@@ -245,8 +249,10 @@ pub async fn update_mod(
245
249
return Err ( ApiError :: Forbidden ) ;
246
250
}
247
251
let mut pool = data. db . acquire ( ) . await . or ( Err ( ApiError :: DbAcquireError ) ) ?;
252
+ let id = path. into_inner ( ) ;
253
+ let featured = mods:: is_featured ( & id, & mut pool) ?;
248
254
let mut transaction = pool. begin ( ) . await . or ( Err ( ApiError :: TransactionError ) ) ?;
249
- if let Err ( e) = Mod :: update_mod ( & path , payload. featured , & mut transaction) . await {
255
+ if let Err ( e) = Mod :: update_mod ( & id , payload. featured , & mut transaction) . await {
250
256
transaction
251
257
. rollback ( )
252
258
. await
@@ -258,5 +264,25 @@ pub async fn update_mod(
258
264
. await
259
265
. or ( Err ( ApiError :: TransactionError ) ) ?;
260
266
267
+ if featured != payload. featured {
268
+ let item = Mod :: get_one ( & id, true , & mut pool) . await ?;
269
+ if let Some ( item) = item {
270
+ let owner = developers:: get_owner_for_mod ( & id, & mut pool) . await ?;
271
+ let first_ver = item. versions . first ( ) ;
272
+ if let Some ( ver) = first_ver {
273
+ ModFeaturedEvent {
274
+ id : item. id ,
275
+ name : ver. name . clone ( ) ,
276
+ owner,
277
+ admin : dev,
278
+ base_url : data. app_url . clone ( ) ,
279
+ featured : payload. featured ,
280
+ }
281
+ . to_discord_webhook ( )
282
+ . send ( & data. webhook_url ) ;
283
+ }
284
+ }
285
+ }
286
+
261
287
Ok ( HttpResponse :: NoContent ( ) )
262
288
}
0 commit comments