From c3c8e532c6b783c4a2c5c4e1b74f87acaa151951 Mon Sep 17 00:00:00 2001 From: Trisha Anand Date: Wed, 12 Aug 2020 15:35:04 +0530 Subject: [PATCH] Updated the invite and make public app migration script more performant so that it takes lesser time on big db (#289) * Updated the migration script to make more db queries instead of searching in the local app memory * Permission correction. --- .../server/migrations/DatabaseChangelog.java | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/migrations/DatabaseChangelog.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/migrations/DatabaseChangelog.java index 688ab8a365..24b73a6afc 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/migrations/DatabaseChangelog.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/migrations/DatabaseChangelog.java @@ -18,6 +18,7 @@ import com.appsmith.server.domains.PasswordResetToken; import com.appsmith.server.domains.Permission; import com.appsmith.server.domains.Plugin; import com.appsmith.server.domains.PluginType; +import com.appsmith.server.domains.QApplication; import com.appsmith.server.domains.Query; import com.appsmith.server.domains.Role; import com.appsmith.server.domains.Sequence; @@ -51,6 +52,7 @@ import static com.appsmith.server.acl.AclPermission.EXECUTE_ACTIONS; import static com.appsmith.server.acl.AclPermission.MAKE_PUBLIC_APPLICATIONS; import static com.appsmith.server.acl.AclPermission.ORGANIZATION_INVITE_USERS; import static com.appsmith.server.acl.AclPermission.READ_ACTIONS; +import static com.appsmith.server.repositories.BaseAppsmithRepositoryImpl.fieldName; import static org.springframework.data.mongodb.core.query.Criteria.where; import static org.springframework.data.mongodb.core.query.Query.query; import static org.springframework.data.mongodb.core.query.Update.update; @@ -588,11 +590,6 @@ public class DatabaseChangelog { Organization.class ); - final List applications = mongoTemplate.find( - query(where("policies").exists(true)), - Application.class - ); - for (final Organization organization : organizations) { Set adminUsernames = organization.getUserRoles() .stream() @@ -616,18 +613,24 @@ public class DatabaseChangelog { policies = new HashSet<>(); } - Policy inviteUserPolicy = Policy.builder().permission(ORGANIZATION_INVITE_USERS.getValue()) - .users(invitePermissionUsernames).build(); + Optional inviteUsersOptional = policies.stream().filter(policy -> policy.getPermission().equals(ORGANIZATION_INVITE_USERS.getValue())).findFirst(); + if (inviteUsersOptional.isPresent()) { + Policy inviteUserPolicy = inviteUsersOptional.get(); + inviteUserPolicy.getUsers().addAll(invitePermissionUsernames); + } else { + // this policy doesnt exist. create and add this to the policy set + Policy inviteUserPolicy = Policy.builder().permission(ORGANIZATION_INVITE_USERS.getValue()) + .users(invitePermissionUsernames).build(); + organization.getPolicies().add(inviteUserPolicy); + } - policies.add(inviteUserPolicy); - organization.setPolicies(policies); mongoTemplate.save(organization); // Update the applications with public view policy for all administrators of the organization - Set orgApplications = applications - .stream() - .filter(application -> application.getOrganizationId().equals(organization.getId())) - .collect(Collectors.toSet()); + List orgApplications = mongoTemplate.find( + query(where(fieldName(QApplication.application.organizationId)).is(organization.getId())), + Application.class + ); for (final Application application : orgApplications) { Set applicationPolicies = application.getPolicies(); @@ -635,10 +638,16 @@ public class DatabaseChangelog { applicationPolicies = new HashSet<>(); } - Policy newPublicAppPolicy = Policy.builder().permission(MAKE_PUBLIC_APPLICATIONS.getValue()) - .users(adminUsernames).build(); - applicationPolicies.add(newPublicAppPolicy); - application.setPolicies(applicationPolicies); + Optional makePublicAppOptional = applicationPolicies.stream().filter(policy -> policy.getPermission().equals(MAKE_PUBLIC_APPLICATIONS.getValue())).findFirst(); + if (makePublicAppOptional.isPresent()) { + Policy makePublicPolicy = makePublicAppOptional.get(); + makePublicPolicy.getUsers().addAll(adminUsernames); + } else { + // this policy doesnt exist. create and add this to the policy set + Policy newPublicAppPolicy = Policy.builder().permission(MAKE_PUBLIC_APPLICATIONS.getValue()) + .users(adminUsernames).build(); + application.getPolicies().add(newPublicAppPolicy); + } mongoTemplate.save(application); }