From f470396b61e4b5a692124d252bc5bb9d22d1dcf4 Mon Sep 17 00:00:00 2001 From: Abhijeet <41686026+abhvsn@users.noreply.github.com> Date: Tue, 19 Sep 2023 10:39:45 +0530 Subject: [PATCH] fix: State management for tenant activation (#27371) ## Description While running the feature based migrations, updates are being made to the tenant object. As we are using the `repository.save` method it resulted in deserialising the tenant object from Spring giving the diff between the DB object and the object received by the downstream methods as we are overriding the tenant config object. To avoid this we are now retrieving the object explicitly after the object is saved to DB. Note: This needs to be looked after as it's increasing the DB calls. Create a ticket for tracking this request https://github.com/appsmithorg/appsmith-ee/issues/2386 EE PR: https://github.com/appsmithorg/appsmith-ee/pull/2375 #### PR fixes following issue(s) Fixes https://github.com/appsmithorg/appsmith-ee/issues/2361 #### Type of change - Bug fix (non-breaking change which fixes an issue) ## Testing #### How Has This Been Tested? - [x] Manual - [x] JUnit - [ ] Jest - [ ] Cypress > > #### Test Plan > Add Testsmith test cases links that relate to this PR > > #### Issues raised during DP testing > Link issues raised during DP testing for better visiblity and tracking (copy link from comments dropped on this PR) > > > ## Checklist: #### Dev activity - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag #### QA activity: - [ ] [Speedbreak features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-) have been covered - [ ] Test plan covers all impacted features and [areas of interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-) - [ ] Test plan has been peer reviewed by project stakeholders and other QA members - [ ] Manually tested functionality on DP - [ ] We had an implementation alignment call with stakeholders post QA Round 2 - [ ] Cypress test cases have been added and approved by SDET/manual QA - [ ] Added `Test Plan Approved` label after Cypress tests were reviewed - [ ] Added `Test Plan Approved` label after JUnit tests were reviewed --- .../domains/ce/TenantConfigurationCE.java | 3 +++ .../server/repositories/BaseRepository.java | 8 ++++++++ .../repositories/BaseRepositoryImpl.java | 12 +++++++++++ .../services/ce/TenantServiceCEImpl.java | 20 ++++++++++++++++--- .../services/ce/TenantServiceCETest.java | 1 - 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/domains/ce/TenantConfigurationCE.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/domains/ce/TenantConfigurationCE.java index a43f4c1d24..065381e193 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/domains/ce/TenantConfigurationCE.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/domains/ce/TenantConfigurationCE.java @@ -67,6 +67,9 @@ public class TenantConfigurationCE { instanceName = ObjectUtils.defaultIfNull(tenantConfiguration.getInstanceName(), instanceName); emailVerificationEnabled = ObjectUtils.defaultIfNull(tenantConfiguration.getEmailVerificationEnabled(), emailVerificationEnabled); + + featuresWithPendingMigration = tenantConfiguration.getFeaturesWithPendingMigration(); + migrationStatus = tenantConfiguration.getMigrationStatus(); } public Boolean getEmailVerificationEnabled() { diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/BaseRepository.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/BaseRepository.java index 2757f2bc81..646067fad9 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/BaseRepository.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/BaseRepository.java @@ -13,6 +13,14 @@ import java.util.Map; @NoRepositoryBean public interface BaseRepository extends ReactiveMongoRepository { + /** + * This function should be used to get an object from the DB without applying any ACL rules + * + * @param id The identifier for this type + * @return Mono + */ + Mono retrieveById(ID id); + /** * This function sets the deleted flag to true and then saves the modified document. * diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/BaseRepositoryImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/BaseRepositoryImpl.java index a4090d8f70..4f4cefc1d6 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/BaseRepositoryImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/BaseRepositoryImpl.java @@ -121,6 +121,18 @@ public class BaseRepositoryImpl }); } + @Override + public Mono retrieveById(ID id) { + Query query = new Query(getIdCriteria(id)); + query.addCriteria(notDeleted()); + + return mongoOperations + .query(entityInformation.getJavaType()) + .inCollection(entityInformation.getCollectionName()) + .matching(query) + .one(); + } + @Override public Mono findById(ID id) { return this.findByIdAndFieldNames(id, null); diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/TenantServiceCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/TenantServiceCEImpl.java index 109f73fe1d..eea73eded1 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/TenantServiceCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/TenantServiceCEImpl.java @@ -203,8 +203,7 @@ public class TenantServiceCEImpl extends BaseService checkAndExecuteMigrationsForTenantFeatureFlags(Tenant tenant) { - if (tenant.getTenantConfiguration() == null - || CollectionUtils.isNullOrEmpty(tenant.getTenantConfiguration().getFeaturesWithPendingMigration())) { + if (!isMigrationRequired(tenant)) { return Mono.just(tenant); } Map featureMigrationTypeMap = @@ -222,10 +221,25 @@ public class TenantServiceCEImpl extends BaseService resultMono = tenantService.checkAndExecuteMigrationsForTenantFeatureFlags(tenant); StepVerifier.create(resultMono) .assertNext(tenant1 -> { - assertThat(tenant1).isEqualTo(tenant); assertThat(tenant1.getTenantConfiguration().getFeaturesWithPendingMigration()) .isEmpty(); assertThat(tenant1.getTenantConfiguration().getMigrationStatus())