@@ -2,6 +2,8 @@ use conduit::{Request, Response};
2
2
use conduit_cookie:: RequestSession ;
3
3
use conduit_router:: RequestParams ;
4
4
use diesel:: prelude:: * ;
5
+ use diesel;
6
+
5
7
use diesel:: pg:: PgConnection ;
6
8
use pg:: GenericConnection ;
7
9
use pg:: rows:: Row ;
@@ -375,6 +377,61 @@ pub fn show_team(req: &mut Request) -> CargoResult<Response> {
375
377
Ok ( req. json ( & R { team : team. encodable ( ) } ) )
376
378
}
377
379
380
+ #[ derive( Insertable , Queryable , Identifiable , Associations ) ]
381
+ #[ belongs_to( User ) ]
382
+ #[ primary_key( user_id, target_id) ]
383
+ #[ table_name="favorite_users" ]
384
+ pub struct FavoriteUser {
385
+ user_id : i32 ,
386
+ target_id : i32 ,
387
+ }
388
+
389
+ fn favorite_target ( req : & mut Request ) -> CargoResult < FavoriteUser > {
390
+ let user = req. user ( ) ?;
391
+ let target_user_id: i32 = req. params ( ) [ "user_id" ] . parse ( ) . expect ( "User ID not found" ) ;
392
+ Ok ( FavoriteUser {
393
+ user_id : user. id ,
394
+ target_id : target_user_id,
395
+ } )
396
+ }
397
+
398
+ /// Handles the `PUT /users/:user_id/favorite` route.
399
+ pub fn favorite ( req : & mut Request ) -> CargoResult < Response > {
400
+ use diesel:: pg:: upsert:: OnConflictExtension ;
401
+
402
+ let favorite = favorite_target ( req) ?;
403
+ let conn = req. db_conn ( ) ?;
404
+ diesel:: insert ( & favorite. on_conflict_do_nothing ( ) )
405
+ . into ( favorite_users:: table)
406
+ . execute ( & * conn) ?;
407
+ #[ derive( RustcEncodable ) ]
408
+ struct R { ok : bool }
409
+ Ok ( req. json ( & R { ok : true } ) )
410
+ }
411
+
412
+ /// Handles the `DELETE /users/:user_id/favorite` route.
413
+ pub fn unfavorite ( req : & mut Request ) -> CargoResult < Response > {
414
+ let favorite = favorite_target ( req) ?;
415
+ let conn = req. db_conn ( ) ?;
416
+ diesel:: delete ( & favorite) . execute ( & * conn) ?;
417
+ #[ derive( RustcEncodable ) ]
418
+ struct R { ok : bool }
419
+ Ok ( req. json ( & R { ok : true } ) )
420
+ }
421
+
422
+ /// Handles the `GET /users/:user_id/favorited` route.
423
+ pub fn favorited ( req : & mut Request ) -> CargoResult < Response > {
424
+ use diesel:: expression:: dsl:: exists;
425
+
426
+ let fav = favorite_target ( req) ?;
427
+ let conn = req. db_conn ( ) ?;
428
+ let favorited = diesel:: select ( exists ( favorite_users:: table. find ( fav. id ( ) ) ) )
429
+ . get_result ( & * conn) ?;
430
+ #[ derive( RustcEncodable ) ]
431
+ struct R { favorited : bool }
432
+ Ok ( req. json ( & R { favorited : favorited } ) )
433
+ }
434
+
378
435
/// Handles the `GET /me/updates` route.
379
436
pub fn updates ( req : & mut Request ) -> CargoResult < Response > {
380
437
use diesel:: expression:: dsl:: any;
0 commit comments