@ -11,7 +11,6 @@ use crate::{ 
			
		
	
		
		
			
				
					     } ,      } ,  
			
		
	
		
		
			
				
					     auth ::{ decode_invite ,   AdminHeaders ,   ClientVersion ,   Headers ,   ManagerHeaders ,   ManagerHeadersLoose ,   OwnerHeaders } ,      auth ::{ decode_invite ,   AdminHeaders ,   ClientVersion ,   Headers ,   ManagerHeaders ,   ManagerHeadersLoose ,   OwnerHeaders } ,  
			
		
	
		
		
			
				
					     db ::{ models ::* ,   DbConn } ,      db ::{ models ::* ,   DbConn } ,  
			
		
	
		
		
			
				
					     error ::Error ,  
			
		
	
		
		
			
				
					     mail ,      mail ,  
			
		
	
		
		
			
				
					     util ::{ convert_json_key_lcase_first ,   NumberOrString } ,      util ::{ convert_json_key_lcase_first ,   NumberOrString } ,  
			
		
	
		
		
			
				
					     CONFIG ,      CONFIG ,  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -127,6 +126,7 @@ struct NewCollectionData { 
			
		
	
		
		
			
				
					     name : String ,      name : String ,  
			
		
	
		
		
			
				
					     groups : Vec < NewCollectionObjectData > ,      groups : Vec < NewCollectionObjectData > ,  
			
		
	
		
		
			
				
					     users : Vec < NewCollectionObjectData > ,      users : Vec < NewCollectionObjectData > ,  
			
		
	
		
		
			
				
					     id : Option < String > ,  
			
		
	
		
		
			
				
					     external_id : Option < String > ,      external_id : Option < String > ,  
			
		
	
		
		
			
				
					} }  
			
		
	
		
		
			
				
					
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -1598,40 +1598,43 @@ async fn post_org_import( 
			
		
	
		
		
			
				
					     // TODO: See if we can optimize the whole cipher adding/importing and prevent duplicate code and checks.
      // TODO: See if we can optimize the whole cipher adding/importing and prevent duplicate code and checks.
  
			
		
	
		
		
			
				
					     Cipher ::validate_cipher_data ( & data . ciphers ) ? ;      Cipher ::validate_cipher_data ( & data . ciphers ) ? ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					
					     let   mut   collections   =   Vec ::new ( ) ;      let   existing_collections : HashSet < Option < String > >   =  
			
				
				
			
		
	
		
		
	
		
		
			
				
					         Collection ::find_by_organization ( & org_id ,   & mut   conn ) . await . into_iter ( ) . map ( | c |   ( Some ( c . uuid ) ) ) . collect ( ) ;  
			
		
	
		
		
			
				
					     let   mut   collections : Vec < String >   =   Vec ::with_capacity ( data . collections . len ( ) ) ;  
			
		
	
		
		
			
				
					     for   coll   in   data . collections   {      for   coll   in   data . collections   {  
			
		
	
		
		
			
				
					
					         let   collection   =   Collection ::new ( org_id . clone ( ) ,   coll . name ,   coll . external_id ) ;          let   collection_uuid   =   if   existing_collections . contains ( & coll . id )   {  
			
				
				
			
		
	
		
		
			
				
					
					         if   collection . save ( & mut   conn ) . await . is_err ( )   {              coll . id . unwrap ( )  
			
				
				
			
		
	
		
		
			
				
					             collections . push ( Err ( Error ::new ( "Failed to create Collection" ,   "Failed to create Collection" ) ) ) ;  
			
		
	
		
		
	
		
		
	
		
		
			
				
					         }   else   {          }   else   {  
			
		
	
		
		
			
				
					
					             collections . push ( Ok ( collection ) ) ;              let   new_collection   =   Collection ::new ( org_id . clone ( ) ,   coll . name ,   coll . external_id ) ;  
			
				
				
			
		
	
		
		
			
				
					
					         }              new_collection . save ( & mut   conn ) . await ? ;  
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					             new_collection . uuid  
			
		
	
		
		
			
				
					         } ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					         collections . push ( collection_uuid ) ;  
			
		
	
		
		
			
				
					     }      }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					     // Read the relations between collections and ciphers
      // Read the relations between collections and ciphers
  
			
		
	
		
		
			
				
					
					     let   mut   relations   =   Vec ::new ( ) ;      // Ciphers can be in multiple collections at the same time
  
			
				
				
			
		
	
		
		
	
		
		
			
				
					     let   mut   relations   =   Vec ::with_capacity ( data . collection_relationships . len ( ) ) ;  
			
		
	
		
		
			
				
					     for   relation   in   data . collection_relationships   {      for   relation   in   data . collection_relationships   {  
			
		
	
		
		
			
				
					         relations . push ( ( relation . key ,   relation . value ) ) ;          relations . push ( ( relation . key ,   relation . value ) ) ;  
			
		
	
		
		
			
				
					     }      }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					     let   headers : Headers   =   headers . into ( ) ;      let   headers : Headers   =   headers . into ( ) ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					
					     let   mut   ciphers   =   Vec ::new ( ) ;      let   mut   ciphers : Vec < String >   =   Vec ::with_capacity ( data . ciphers . len ( ) ) ;  
			
				
				
			
		
	
		
		
			
				
					
					     for   cipher_data   in   data . ciphers   {      for   mut   cipher_data   in   data . ciphers   {  
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					         // Always clear folder_id's via an organization import
  
			
		
	
		
		
			
				
					         cipher_data . folder_id   =   None ;  
			
		
	
		
		
			
				
					         let   mut   cipher   =   Cipher ::new ( cipher_data . r#type ,   cipher_data . name . clone ( ) ) ;          let   mut   cipher   =   Cipher ::new ( cipher_data . r#type ,   cipher_data . name . clone ( ) ) ;  
			
		
	
		
		
			
				
					         update_cipher_from_data ( & mut   cipher ,   cipher_data ,   & headers ,   None ,   & mut   conn ,   & nt ,   UpdateType ::None ) . await . ok ( ) ;          update_cipher_from_data ( & mut   cipher ,   cipher_data ,   & headers ,   None ,   & mut   conn ,   & nt ,   UpdateType ::None ) . await . ok ( ) ;  
			
		
	
		
		
			
				
					
					         ciphers . push ( cipher ) ;          ciphers . push ( cipher . uuid ) ;  
			
				
				
			
		
	
		
		
	
		
		
			
				
					     }      }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					     // Assign the collections
      // Assign the collections
  
			
		
	
		
		
			
				
					     for   ( cipher_index ,   coll_index )   in   relations   {      for   ( cipher_index ,   coll_index )   in   relations   {  
			
		
	
		
		
			
				
					
					         let   cipher_id   =   & ciphers [ cipher_index ] . uuid ;          let   cipher_id   =   & ciphers [ cipher_index ] ;  
			
				
				
			
		
	
		
		
			
				
					
					         let   coll   =   & collections [ coll_index ] ;          let   coll_id   =   & collections [ coll_index ] ;  
			
				
				
			
		
	
		
		
			
				
					         let   coll_id   =   match   coll   {  
			
		
	
		
		
			
				
					             Ok ( coll )   = >   coll . uuid . as_str ( ) ,  
			
		
	
		
		
			
				
					             Err ( _ )   = >   err ! ( "Failed to assign to collection" ) ,  
			
		
	
		
		
			
				
					         } ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
	
		
		
	
		
		
			
				
					         CollectionCipher ::save ( cipher_id ,   coll_id ,   & mut   conn ) . await ? ;          CollectionCipher ::save ( cipher_id ,   coll_id ,   & mut   conn ) . await ? ;  
			
		
	
		
		
			
				
					     }      }