File tree Expand file tree Collapse file tree 7 files changed +59
-2
lines changed Expand file tree Collapse file tree 7 files changed +59
-2
lines changed Original file line number Diff line number Diff line change @@ -14,6 +14,7 @@ export default Ember.Controller.extend({
14
14
this . myCrates = [ ] ;
15
15
this . myFollowing = [ ] ;
16
16
this . myFeed = [ ] ;
17
+ this . myStats = 0 ;
17
18
} ,
18
19
19
20
visibleCrates : computed ( 'myCreates' , function ( ) {
@@ -24,6 +25,10 @@ export default Ember.Controller.extend({
24
25
return this . get ( 'myFollowing' ) . slice ( 0 , TO_SHOW ) ;
25
26
} ) ,
26
27
28
+ visibleStats : computed ( 'myStats' , function ( ) {
29
+ return this . get ( 'myStats' ) ;
30
+ } ) ,
31
+
27
32
hasMoreCrates : computed ( 'myCreates' , function ( ) {
28
33
return this . get ( 'myCrates.length' ) > TO_SHOW ;
29
34
} ) ,
Original file line number Diff line number Diff line change @@ -7,4 +7,8 @@ export default DS.Model.extend({
7
7
api_token : DS . attr ( 'string' ) ,
8
8
avatar : DS . attr ( 'string' ) ,
9
9
url : DS . attr ( 'string' ) ,
10
+
11
+ stats ( ) {
12
+ return this . store . adapterFor ( 'user' ) . stats ( this . get ( 'id' ) ) ;
13
+ } ,
10
14
} ) ;
Original file line number Diff line number Diff line change @@ -10,6 +10,7 @@ export default Ember.Route.extend(AuthenticatedRoute, {
10
10
controller . set ( 'fetchingFeed' , true ) ;
11
11
controller . set ( 'myCrates' , this . get ( 'data.myCrates' ) ) ;
12
12
controller . set ( 'myFollowing' , this . get ( 'data.myFollowing' ) ) ;
13
+ controller . set ( 'myStats' , this . get ( 'data.myStats' ) ) ;
13
14
14
15
if ( ! controller . get ( 'loadingMore' ) ) {
15
16
controller . set ( 'myFeed' , [ ] ) ;
@@ -30,9 +31,14 @@ export default Ember.Route.extend(AuthenticatedRoute, {
30
31
following : 1
31
32
} ) ;
32
33
34
+ let myStats = user . stats ( ) ;
35
+
33
36
return Ember . RSVP . hash ( {
34
37
myCrates,
35
- myFollowing
36
- } ) . then ( ( hash ) => this . set ( 'data' , hash ) ) ;
38
+ myFollowing,
39
+ myStats
40
+ } ) . then ( ( hash ) => {
41
+ this . set ( 'data' , hash )
42
+ } ) ;
37
43
}
38
44
} ) ;
Original file line number Diff line number Diff line change 86
86
& :hover { background-color : darken ($bg , 10% ); }
87
87
}
88
88
}
89
+
90
+ #stats {
91
+ margin-left : auto ;
92
+ padding : 10px ;
93
+
94
+ span { margin-left : 10px ; }
95
+ .num {
96
+ font-size : 30px ;
97
+ font-weight : bold ;
98
+ }
99
+ .downloads {
100
+ @include display-flex ;
101
+ @include align-items (center );
102
+ }
103
+ }
Original file line number Diff line number Diff line change 3
3
<div id =' crates-heading' >
4
4
<img class =' logo dashboard' src =" /assets/dashboard.png" />
5
5
<h1 >My Dashboard</h1 >
6
+ <div id =" stats" >
7
+ <div class =' downloads' >
8
+ <img class =" download" src =" /assets/download.png" />
9
+ <span class =' num' >{{ visibleStats.total_downloads }} </span >
10
+ <span class =' desc small' >Total Downloads</span >
11
+ </div >
12
+ </div >
6
13
</div >
7
14
15
+
8
16
<div id =' my-info' >
9
17
<div id =' my-crate-lists' class =' crate-lists' >
10
18
<div id =' my-crates' >
Original file line number Diff line number Diff line change @@ -131,6 +131,7 @@ pub fn middleware(app: Arc<App>) -> MiddlewareBuilder {
131
131
api_router. get ( "/categories/:category_id" , C ( category:: show) ) ;
132
132
api_router. get ( "/category_slugs" , C ( category:: slugs) ) ;
133
133
api_router. get ( "/users/:user_id" , C ( user:: show) ) ;
134
+ api_router. get ( "/users/:user_id/stats" , C ( user:: stats) ) ;
134
135
let api_router = Arc :: new ( R404 ( api_router) ) ;
135
136
136
137
let mut router = RouteBuilder :: new ( ) ;
Original file line number Diff line number Diff line change @@ -378,6 +378,24 @@ pub fn updates(req: &mut Request) -> CargoResult<Response> {
378
378
Ok ( req. json ( & R { versions : versions, meta : Meta { more : more } } ) )
379
379
}
380
380
381
+ /// Handles the `GET /users/:user_id/stats` route.
382
+ pub fn stats ( req : & mut Request ) -> CargoResult < Response > {
383
+ use diesel:: expression:: dsl:: sum;
384
+ let name = & req. params ( ) [ "user_id" ] . parse :: < i32 > ( ) . ok ( ) . unwrap ( ) ;
385
+ let conn = req. db_conn ( ) ?;
386
+
387
+ let data = crate_downloads:: table. filter ( crate_downloads:: crate_id. eq_any (
388
+ crate_owners:: table. select ( crate_owners:: crate_id)
389
+ . filter ( crate_owners:: owner_id. eq ( name) )
390
+ ) ) . select ( sum ( crate_downloads:: downloads) ) . first :: < i64 > ( & * conn) ?;
391
+
392
+ #[ derive( RustcEncodable ) ]
393
+ struct R {
394
+ total_downloads : i64
395
+ }
396
+ Ok ( req. json ( & R { total_downloads : data } ) )
397
+ }
398
+
381
399
#[ cfg( test) ]
382
400
mod tests {
383
401
use super :: * ;
You can’t perform that action at this time.
0 commit comments