1+ use bon:: Builder ;
12use diesel:: pg:: Pg ;
23use diesel:: prelude:: * ;
4+ use diesel_async:: { AsyncPgConnection , RunQueryDsl } ;
35
6+ use self :: crate_owner_builder:: { SetOwnerId , SetOwnerKind } ;
47use crate :: models:: { Crate , CrateOwnerInvitation , Team , User } ;
58use crate :: schema:: crate_owners;
69use crates_io_diesel_helpers:: pg_enum;
710
8- #[ derive( Insertable , Associations , Identifiable , Debug , Clone , Copy ) ]
11+ #[ derive( Insertable , Associations , Identifiable , Debug , Clone , Copy , Builder ) ]
912#[ diesel(
1013 table_name = crate_owners,
1114 check_for_backend( diesel:: pg:: Pg ) ,
@@ -16,12 +19,33 @@ use crates_io_diesel_helpers::pg_enum;
1619) ]
1720pub struct CrateOwner {
1821 pub crate_id : i32 ,
22+ #[ builder( setters( vis = "pub(self)" ) ) ]
1923 pub owner_id : i32 ,
2024 pub created_by : i32 ,
25+ #[ builder( setters( vis = "pub(self)" ) ) ]
2126 pub owner_kind : OwnerKind ,
27+ #[ builder( default = true ) ]
2228 pub email_notifications : bool ,
2329}
2430
31+ impl < S : crate_owner_builder:: State > CrateOwnerBuilder < S > {
32+ pub fn team_id ( self , team_id : i32 ) -> CrateOwnerBuilder < SetOwnerId < SetOwnerKind < S > > >
33+ where
34+ S :: OwnerId : crate_owner_builder:: IsUnset ,
35+ S :: OwnerKind : crate_owner_builder:: IsUnset ,
36+ {
37+ self . owner_kind ( OwnerKind :: Team ) . owner_id ( team_id)
38+ }
39+
40+ pub fn user_id ( self , user_id : i32 ) -> CrateOwnerBuilder < SetOwnerId < SetOwnerKind < S > > >
41+ where
42+ S :: OwnerId : crate_owner_builder:: IsUnset ,
43+ S :: OwnerKind : crate_owner_builder:: IsUnset ,
44+ {
45+ self . owner_kind ( OwnerKind :: User ) . owner_id ( user_id)
46+ }
47+ }
48+
2549type BoxedQuery < ' a > = crate_owners:: BoxedQuery < ' a , Pg , crate_owners:: SqlType > ;
2650
2751impl CrateOwner {
@@ -35,13 +59,24 @@ impl CrateOwner {
3559 }
3660
3761 pub fn from_invite ( invite : & CrateOwnerInvitation ) -> Self {
38- Self {
39- crate_id : invite. crate_id ,
40- owner_id : invite. invited_user_id ,
41- created_by : invite. invited_by_user_id ,
42- owner_kind : OwnerKind :: User ,
43- email_notifications : true ,
44- }
62+ CrateOwner :: builder ( )
63+ . crate_id ( invite. crate_id )
64+ . user_id ( invite. invited_user_id )
65+ . created_by ( invite. invited_by_user_id )
66+ . build ( )
67+ }
68+
69+ /// Inserts the crate owner into the database, or removes the `deleted` flag
70+ /// if the record already exists.
71+ pub async fn insert ( & self , conn : & mut AsyncPgConnection ) -> QueryResult < ( ) > {
72+ diesel:: insert_into ( crate_owners:: table)
73+ . values ( self )
74+ . on_conflict ( crate_owners:: table. primary_key ( ) )
75+ . do_update ( )
76+ . set ( crate_owners:: deleted. eq ( false ) )
77+ . execute ( conn)
78+ . await
79+ . map ( |_| ( ) )
4580 }
4681}
4782
0 commit comments