@@ -462,50 +462,62 @@ impl Crate {
462
462
req_user : & User ,
463
463
login : & str ,
464
464
) -> CargoResult < String > {
465
- let owner = match Owner :: find_by_login ( conn, login) {
466
- Ok ( owner @ Owner :: User ( _) ) => owner,
467
- Ok ( Owner :: Team ( team) ) => if team. contains_user ( app, req_user) ? {
468
- Owner :: Team ( team)
469
- } else {
470
- return Err ( human ( & format_args ! (
471
- "only members of {} can add it as \
472
- an owner",
473
- login
474
- ) ) ) ;
475
- } ,
476
- Err ( err) => if login. contains ( ':' ) {
477
- Owner :: Team ( Team :: create ( app, conn, login, req_user) ?)
478
- } else {
479
- return Err ( err) ;
480
- } ,
481
- } ;
465
+ use diesel:: insert;
482
466
483
- let owner_invitation = NewCrateOwnerInvitation {
484
- invited_user_id : owner. id ( ) ,
485
- invited_by_user_id : req_user. id ,
486
- crate_id : self . id ,
487
- } ;
467
+ let owner = Owner :: find_or_create_by_login ( app, conn, req_user, login) ?;
488
468
489
- diesel:: insert ( & owner_invitation. on_conflict_do_nothing ( ) )
490
- . into ( crate_owner_invitations:: table)
491
- . execute ( conn) ?;
469
+ match owner {
470
+ // Users are invited and must accept before being added
471
+ owner @ Owner :: User ( _) => {
472
+ let owner_invitation = NewCrateOwnerInvitation {
473
+ invited_user_id : owner. id ( ) ,
474
+ invited_by_user_id : req_user. id ,
475
+ crate_id : self . id ,
476
+ } ;
492
477
493
- Ok ( format ! (
494
- "user {} has been invited to be an owner of crate {}" ,
495
- owner. login( ) ,
496
- self . name
497
- ) )
478
+ diesel:: insert ( & owner_invitation. on_conflict_do_nothing ( ) )
479
+ . into ( crate_owner_invitations:: table)
480
+ . execute ( conn) ?;
481
+
482
+ Ok ( format ! (
483
+ "user {} has been invited to be an owner of crate {}" ,
484
+ owner. login( ) ,
485
+ self . name
486
+ ) )
487
+ } ,
488
+ // Teams are added as owners immediately
489
+ owner @ Owner :: Team ( _) => {
490
+ let crate_owner = CrateOwner {
491
+ crate_id : self . id ,
492
+ owner_id : owner. id ( ) ,
493
+ created_by : req_user. id ,
494
+ owner_kind : OwnerKind :: Team as i32 ,
495
+ } ;
496
+
497
+ insert ( & crate_owner. on_conflict (
498
+ crate_owners:: table. primary_key ( ) ,
499
+ do_update ( ) . set ( crate_owners:: deleted. eq ( false ) ) ,
500
+ ) ) . into ( crate_owners:: table)
501
+ . execute ( conn) ?;
502
+
503
+ Ok ( format ! (
504
+ "team {} has been added as an owner of crate {}" ,
505
+ owner. login( ) ,
506
+ self . name
507
+ ) )
508
+ }
509
+ }
498
510
}
499
511
500
512
pub fn owner_remove (
501
513
& self ,
514
+ app : & App ,
502
515
conn : & PgConnection ,
503
- _req_user : & User ,
516
+ req_user : & User ,
504
517
login : & str ,
505
518
) -> CargoResult < ( ) > {
506
- let owner = Owner :: find_by_login ( conn, login) . map_err ( |_| {
507
- human ( & format_args ! ( "could not find owner with login `{}`" , login) )
508
- } ) ?;
519
+ let owner = Owner :: find_or_create_by_login ( app, conn, req_user, login) ?;
520
+
509
521
let target = crate_owners:: table. find ( ( self . id ( ) , owner. id ( ) , owner. kind ( ) as i32 ) ) ;
510
522
diesel:: update ( target)
511
523
. set ( crate_owners:: deleted. eq ( true ) )
@@ -1363,6 +1375,7 @@ pub fn remove_owners(req: &mut Request) -> CargoResult<Response> {
1363
1375
fn modify_owners ( req : & mut Request , add : bool ) -> CargoResult < Response > {
1364
1376
let mut body = String :: new ( ) ;
1365
1377
req. body ( ) . read_to_string ( & mut body) ?;
1378
+
1366
1379
let user = req. user ( ) ?;
1367
1380
let conn = req. db_conn ( ) ?;
1368
1381
let krate = Crate :: by_name ( & req. params ( ) [ "crate_id" ] ) . first :: < Crate > ( & * conn) ?;
@@ -1408,7 +1421,7 @@ fn modify_owners(req: &mut Request, add: bool) -> CargoResult<Response> {
1408
1421
if owners. len ( ) == 1 {
1409
1422
return Err ( human ( "cannot remove the sole owner of a crate" ) ) ;
1410
1423
}
1411
- krate. owner_remove ( & conn, user, login) ?;
1424
+ krate. owner_remove ( req . app ( ) , & conn, user, login) ?;
1412
1425
}
1413
1426
}
1414
1427
0 commit comments