@@ -3,12 +3,15 @@ use crate::cloudfront::CloudFront;
3
3
use crate :: fastly:: Fastly ;
4
4
use crate :: storage:: Storage ;
5
5
use crate :: typosquat;
6
+ use crate :: worker:: jobs:: ProcessCloudfrontInvalidationQueue ;
6
7
use anyhow:: Context ;
7
8
use bon:: Builder ;
9
+ use crates_io_database:: models:: CloudFrontInvalidationQueueItem ;
8
10
use crates_io_docs_rs:: DocsRsClient ;
9
11
use crates_io_index:: { Repository , RepositoryConfig } ;
10
12
use crates_io_og_image:: OgImageGenerator ;
11
13
use crates_io_team_repo:: TeamRepo ;
14
+ use crates_io_worker:: BackgroundJob ;
12
15
use diesel_async:: AsyncPgConnection ;
13
16
use diesel_async:: pooled_connection:: deadpool:: Pool ;
14
17
use object_store:: ObjectStore ;
@@ -70,9 +73,20 @@ impl Environment {
70
73
}
71
74
72
75
/// Invalidate a file in all registered CDNs.
73
- pub ( crate ) async fn invalidate_cdns ( & self , path : & str ) -> anyhow:: Result < ( ) > {
74
- if let Some ( cloudfront) = self . cloudfront ( ) {
75
- cloudfront. invalidate ( path) . await . context ( "CloudFront" ) ?;
76
+ pub ( crate ) async fn invalidate_cdns (
77
+ & self ,
78
+ conn : & mut AsyncPgConnection ,
79
+ path : & str ,
80
+ ) -> anyhow:: Result < ( ) > {
81
+ // Queue CloudFront invalidations for batch processing instead of calling directly
82
+ if self . cloudfront ( ) . is_some ( ) {
83
+ let paths = & [ path. to_string ( ) ] ;
84
+ let result = CloudFrontInvalidationQueueItem :: queue_paths ( conn, paths) . await ;
85
+ result. context ( "Failed to queue CloudFront invalidation path" ) ?;
86
+
87
+ // Schedule the processing job to handle the queued paths
88
+ let result = ProcessCloudfrontInvalidationQueue . enqueue ( conn) . await ;
89
+ result. context ( "Failed to enqueue CloudFront invalidation processing job" ) ?;
76
90
}
77
91
78
92
if let Some ( fastly) = self . fastly ( ) {
0 commit comments