@ -104,7 +104,7 @@ async fn sync(data: SyncData, headers: Headers, conn: DbConn) -> Json<Value> {
// Get all ciphers which are visible by the user
let ciphers = Cipher ::find_by_user_visible ( & headers . user . uuid , & conn ) . await ;
let cipher_sync_data = CipherSyncData ::new ( & headers . user . uuid , & ciphers , & conn ) . await ;
let cipher_sync_data = CipherSyncData ::new ( & headers . user . uuid , & ciphers , CipherSyncType ::User , & conn ) . await ;
// Lets generate the ciphers_json using all the gathered info
let ciphers_json : Vec < Value > = stream ::iter ( ciphers )
@ -154,7 +154,7 @@ async fn sync(data: SyncData, headers: Headers, conn: DbConn) -> Json<Value> {
#[ get( " /ciphers " ) ]
async fn get_ciphers ( headers : Headers , conn : DbConn ) -> Json < Value > {
let ciphers = Cipher ::find_by_user_visible ( & headers . user . uuid , & conn ) . await ;
let cipher_sync_data = CipherSyncData ::new ( & headers . user . uuid , & ciphers , & conn ) . await ;
let cipher_sync_data = CipherSyncData ::new ( & headers . user . uuid , & ciphers , CipherSyncType ::User , & conn ) . await ;
let ciphers_json = stream ::iter ( ciphers )
. then ( | c | async {
@ -1486,25 +1486,39 @@ pub struct CipherSyncData {
pub user_collections : HashMap < String , CollectionUser > ,
}
pub enum CipherSyncType {
User ,
Organization ,
}
impl CipherSyncData {
pub async fn new ( user_uuid : & str , ciphers : & Vec < Cipher > , conn : & DbConn ) -> Self {
pub async fn new ( user_uuid : & str , ciphers : & Vec < Cipher > , sync_type: CipherSyncType , conn: & DbConn ) -> Self {
// Generate a list of Cipher UUID's to be used during a query filter with an eq_any.
let cipher_uuids = stream ::iter ( ciphers ) . map ( | c | c . uuid . to_string ( ) ) . collect ::< Vec < String > > ( ) . await ;
let mut cipher_folders : HashMap < String , String > = HashMap ::new ( ) ;
let mut cipher_favorites : HashSet < String > = HashSet ::new ( ) ;
match sync_type {
// User Sync supports Folders and Favorits
CipherSyncType ::User = > {
// Generate a HashMap with the Cipher UUID as key and the Folder UUID as value
cipher_folders = stream ::iter ( FolderCipher ::find_by_user ( user_uuid , conn ) . await ) . collect ( ) . await ;
// Generate a HashSet of all the Cipher UUID's which are marked as favorite
cipher_favorites =
stream ::iter ( Favorite ::get_all_cipher_uuid_by_user ( user_uuid , conn ) . await ) . collect ( ) . await ;
}
// Organization Sync does not support Folders and Favorits.
// If these are set, it will cause issues in the web-vault.
CipherSyncType ::Organization = > { }
}
// Generate a list of Cipher UUID's containing a Vec with one or more Attachment records
let mut cipher_attachments : HashMap < String , Vec < Attachment > > = HashMap ::new ( ) ;
for attachment in Attachment ::find_all_by_ciphers ( & cipher_uuids , conn ) . await {
cipher_attachments . entry ( attachment . cipher_uuid . to_string ( ) ) . or_default ( ) . push ( attachment ) ;
}
// Generate a HashMap with the Cipher UUID as key and the Folder UUID as value
let cipher_folders : HashMap < String , String > =
stream ::iter ( FolderCipher ::find_by_user ( user_uuid , conn ) . await ) . collect ( ) . await ;
// Generate a HashSet of all the Cipher UUID's which are marked as favorite
let cipher_favorites : HashSet < String > =
stream ::iter ( Favorite ::get_all_cipher_uuid_by_user ( user_uuid , conn ) . await ) . collect ( ) . await ;
// Generate a HashMap with the Cipher UUID as key and one or more Collection UUID's
let mut cipher_collections : HashMap < String , Vec < String > > = HashMap ::new ( ) ;
for ( cipher , collection ) in Cipher ::get_collections_with_cipher_by_user ( user_uuid , conn ) . await {