3
3
//! The endpoint for downloading a crate and exposing version specific
4
4
//! download counts are located in `version::downloads`.
5
5
6
- use diesel_async:: async_connection_wrapper:: AsyncConnectionWrapper ;
7
6
use std:: cmp;
8
7
9
8
use crate :: controllers:: frontend_prelude:: * ;
@@ -13,63 +12,64 @@ use crate::schema::{crates, version_downloads, versions};
13
12
use crate :: sql:: to_char;
14
13
use crate :: util:: errors:: crate_not_found;
15
14
use crate :: views:: EncodableVersionDownload ;
15
+ use diesel_async:: RunQueryDsl ;
16
16
17
17
/// Handles the `GET /crates/:crate_id/downloads` route.
18
18
pub async fn downloads ( state : AppState , Path ( crate_name) : Path < String > ) -> AppResult < Json < Value > > {
19
- let conn = state. db_read ( ) . await ?;
20
- spawn_blocking ( move || {
21
- let conn: & mut AsyncConnectionWrapper < _ > = & mut conn. into ( ) ;
19
+ let mut conn = state. db_read ( ) . await ?;
22
20
23
- use diesel:: dsl:: * ;
24
- use diesel:: sql_types:: BigInt ;
21
+ use diesel:: dsl:: * ;
22
+ use diesel:: sql_types:: BigInt ;
25
23
26
- let crate_id: i32 = Crate :: by_name ( & crate_name)
27
- . select ( crates:: id)
28
- . first ( conn)
29
- . optional ( ) ?
30
- . ok_or_else ( || crate_not_found ( & crate_name) ) ?;
24
+ let crate_id: i32 = Crate :: by_name ( & crate_name)
25
+ . select ( crates:: id)
26
+ . first ( & mut conn)
27
+ . await
28
+ . optional ( ) ?
29
+ . ok_or_else ( || crate_not_found ( & crate_name) ) ?;
31
30
32
- let mut versions: Vec < Version > = versions:: table
33
- . filter ( versions:: crate_id. eq ( crate_id) )
34
- . load ( conn) ?;
35
- versions
36
- . sort_by_cached_key ( |version| cmp:: Reverse ( semver:: Version :: parse ( & version. num ) . ok ( ) ) ) ;
37
- let ( latest_five, rest) = versions. split_at ( cmp:: min ( 5 , versions. len ( ) ) ) ;
31
+ let mut versions: Vec < Version > = versions:: table
32
+ . filter ( versions:: crate_id. eq ( crate_id) )
33
+ . load ( & mut conn)
34
+ . await ?;
38
35
39
- let downloads = VersionDownload :: belonging_to ( latest_five)
40
- . filter ( version_downloads:: date. gt ( date ( now - 90 . days ( ) ) ) )
41
- . order ( (
42
- version_downloads:: date. asc ( ) ,
43
- version_downloads:: version_id. desc ( ) ,
44
- ) )
45
- . load ( conn) ?
46
- . into_iter ( )
47
- . map ( VersionDownload :: into)
48
- . collect :: < Vec < EncodableVersionDownload > > ( ) ;
36
+ versions. sort_by_cached_key ( |version| cmp:: Reverse ( semver:: Version :: parse ( & version. num ) . ok ( ) ) ) ;
37
+ let ( latest_five, rest) = versions. split_at ( cmp:: min ( 5 , versions. len ( ) ) ) ;
49
38
50
- let sum_downloads = sql :: < BigInt > ( "SUM(version_downloads.downloads)" ) ;
51
- let extra: Vec < ExtraDownload > = VersionDownload :: belonging_to ( rest)
52
- . select ( (
53
- to_char ( version_downloads:: date, "YYYY-MM-DD" ) ,
54
- sum_downloads,
55
- ) )
56
- . filter ( version_downloads:: date. gt ( date ( now - 90 . days ( ) ) ) )
57
- . group_by ( version_downloads:: date)
58
- . order ( version_downloads:: date. asc ( ) )
59
- . load ( conn) ?;
39
+ let downloads = VersionDownload :: belonging_to ( latest_five)
40
+ . filter ( version_downloads:: date. gt ( date ( now - 90 . days ( ) ) ) )
41
+ . order ( (
42
+ version_downloads:: date. asc ( ) ,
43
+ version_downloads:: version_id. desc ( ) ,
44
+ ) )
45
+ . load ( & mut conn)
46
+ . await ?
47
+ . into_iter ( )
48
+ . map ( VersionDownload :: into)
49
+ . collect :: < Vec < EncodableVersionDownload > > ( ) ;
60
50
61
- #[ derive( Serialize , Queryable ) ]
62
- struct ExtraDownload {
63
- date : String ,
64
- downloads : i64 ,
65
- }
51
+ let sum_downloads = sql :: < BigInt > ( "SUM(version_downloads.downloads)" ) ;
52
+ let extra: Vec < ExtraDownload > = VersionDownload :: belonging_to ( rest)
53
+ . select ( (
54
+ to_char ( version_downloads:: date, "YYYY-MM-DD" ) ,
55
+ sum_downloads,
56
+ ) )
57
+ . filter ( version_downloads:: date. gt ( date ( now - 90 . days ( ) ) ) )
58
+ . group_by ( version_downloads:: date)
59
+ . order ( version_downloads:: date. asc ( ) )
60
+ . load ( & mut conn)
61
+ . await ?;
66
62
67
- Ok ( Json ( json ! ( {
68
- "version_downloads" : downloads,
69
- "meta" : {
70
- "extra_downloads" : extra,
71
- } ,
72
- } ) ) )
73
- } )
74
- . await
63
+ #[ derive( Serialize , Queryable ) ]
64
+ struct ExtraDownload {
65
+ date : String ,
66
+ downloads : i64 ,
67
+ }
68
+
69
+ Ok ( Json ( json ! ( {
70
+ "version_downloads" : downloads,
71
+ "meta" : {
72
+ "extra_downloads" : extra,
73
+ } ,
74
+ } ) ) )
75
75
}
0 commit comments