1
0
mirror of https://github.com/dani-garcia/vaultwarden.git synced 2024-11-22 10:52:40 +01:00

Rewrite find_by_user_uuid to use one query

This commit is contained in:
Miroslav Prasil 2018-12-27 18:56:01 +01:00
parent 9f0357ce82
commit 8451a70de6

View File

@ -79,25 +79,26 @@ impl Collection {
} }
pub fn find_by_user_uuid(user_uuid: &str, conn: &DbConn) -> Vec<Self> { pub fn find_by_user_uuid(user_uuid: &str, conn: &DbConn) -> Vec<Self> {
let mut all_access_collections = users_organizations::table collections::table
.filter(users_organizations::user_uuid.eq(user_uuid)) .left_join(users_collections::table.on(
.filter(users_organizations::status.eq(UserOrgStatus::Confirmed as i32)) users_collections::collection_uuid.eq(collections::uuid).and(
.filter(users_organizations::access_all.eq(true)) users_collections::user_uuid.eq(user_uuid)
.inner_join(collections::table.on(collections::org_uuid.eq(users_organizations::org_uuid))) )
.select(collections::all_columns) ))
.load::<Self>(&**conn).expect("Error loading collections"); .left_join(users_organizations::table.on(
collections::org_uuid.eq(users_organizations::org_uuid).and(
let mut assigned_collections = users_collections::table.inner_join(collections::table) users_organizations::user_uuid.eq(user_uuid)
.left_join(users_organizations::table.on( )
users_collections::user_uuid.eq(users_organizations::user_uuid) ))
)) .filter(
.filter(users_collections::user_uuid.eq(user_uuid)) users_organizations::status.eq(UserOrgStatus::Confirmed as i32)
.filter(users_organizations::status.eq(UserOrgStatus::Confirmed as i32)) )
.select(collections::all_columns) .filter(
.load::<Self>(&**conn).expect("Error loading collections"); users_collections::user_uuid.eq(user_uuid).or( // Directly accessed collection
users_organizations::access_all.eq(true) // access_all in Organization
all_access_collections.append(&mut assigned_collections); )
all_access_collections ).select(collections::all_columns)
.load::<Self>(&**conn).expect("Error loading collections")
} }
pub fn find_by_organization_and_user_uuid(org_uuid: &str, user_uuid: &str, conn: &DbConn) -> Vec<Self> { pub fn find_by_organization_and_user_uuid(org_uuid: &str, user_uuid: &str, conn: &DbConn) -> Vec<Self> {