Fixed installation for multiple plugins into organizations (#7767)

This commit is contained in:
Nidhi 2021-09-24 11:14:14 +05:30 committed by GitHub
parent 0f83f79840
commit 59ec853498
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 39 additions and 26 deletions

View File

@ -121,7 +121,7 @@ public class EncryptionHandler {
field.setAccessible(true);
Object fieldValue = ReflectionUtils.getField(field, source);
List<?> list = (List<?>) fieldValue;
Collection<?> list = (Collection<?>) fieldValue;
if (list == null || list.isEmpty()) {
finalCandidateFields.add(new CandidateField(field, CandidateField.Type.APPSMITH_LIST_UNKNOWN));

View File

@ -11,6 +11,7 @@ import org.springframework.data.mongodb.core.mapping.Document;
import javax.validation.constraints.NotBlank;
import java.util.List;
import java.util.Set;
@Getter
@ -29,7 +30,7 @@ public class Organization extends BaseDomain {
private String email;
private List<OrganizationPlugin> plugins;
private Set<OrganizationPlugin> plugins;
private String slug;

View File

@ -184,7 +184,7 @@ public class DatabaseChangelog {
private void installPluginToAllOrganizations(MongockTemplate mongockTemplate, String pluginId) {
for (Organization organization : mongockTemplate.findAll(Organization.class)) {
if (CollectionUtils.isEmpty(organization.getPlugins())) {
organization.setPlugins(new ArrayList<>());
organization.setPlugins(new HashSet<>());
}
final Set<String> installedPlugins = organization.getPlugins()
@ -453,7 +453,7 @@ public class DatabaseChangelog {
for (Organization organization : mongoTemplate.findAll(Organization.class)) {
if (CollectionUtils.isEmpty(organization.getPlugins())) {
organization.setPlugins(new ArrayList<>());
organization.setPlugins(new HashSet<>());
}
final Set<String> installedPlugins = organization.getPlugins()

View File

@ -17,4 +17,6 @@ public interface CustomOrganizationRepository extends AppsmithRepository<Organiz
Mono<Long> nextSlugNumber(String slugPrefix);
Mono<Void> updateUserRoleNames(String userId, String userName);
Flux<Organization> findAllOrganizations();
}

View File

@ -1,7 +1,6 @@
package com.appsmith.server.repositories;
import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.domains.Comment;
import com.appsmith.server.domains.Organization;
import com.appsmith.server.domains.QOrganization;
import lombok.extern.slf4j.Slf4j;
@ -78,4 +77,9 @@ public class CustomOrganizationRepositoryImpl extends BaseAppsmithRepositoryImpl
)
.then();
}
@Override
public Flux<Organization> findAllOrganizations() {
return mongoOperations.find(new Query(), Organization.class);
}
}

View File

@ -38,6 +38,7 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import static com.appsmith.server.acl.AclPermission.MANAGE_ORGANIZATIONS;
import static com.appsmith.server.acl.AclPermission.ORGANIZATION_INVITE_USERS;
@ -171,7 +172,7 @@ public class OrganizationServiceImpl extends BaseService<OrganizationRepository,
*/
.flatMap(org -> pluginRepository.findByDefaultInstall(true)
.map(obj -> new OrganizationPlugin(obj.getId(), OrganizationPluginStatus.FREE))
.collectList()
.collect(Collectors.toSet())
.map(pluginList -> {
org.setPlugins(pluginList);
return org;
@ -340,7 +341,7 @@ public class OrganizationServiceImpl extends BaseService<OrganizationRepository,
@Override
public Flux<Organization> getAll() {
return repository.findAll();
return repository.findAllOrganizations();
}
}

View File

@ -48,13 +48,14 @@ import java.io.InputStream;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@Slf4j
@ -220,7 +221,7 @@ public class PluginServiceImpl extends BaseService<PluginRepository, Plugin, Str
//i.e. the rest of the code flow would only happen when there is a plugin found for the organization that can
//be uninstalled.
.flatMap(organization -> {
List<OrganizationPlugin> organizationPluginList = organization.getPlugins();
Set<OrganizationPlugin> organizationPluginList = organization.getPlugins();
organizationPluginList.removeIf(listPlugin -> listPlugin.getPluginId().equals(pluginDTO.getPluginId()));
organization.setPlugins(organizationPluginList);
return organizationService.save(organization);
@ -262,9 +263,9 @@ public class PluginServiceImpl extends BaseService<PluginRepository, Plugin, Str
.then(organizationService.getById(pluginDTO.getOrganizationId()))
.flatMap(organization -> {
List<OrganizationPlugin> organizationPluginList = organization.getPlugins();
Set<OrganizationPlugin> organizationPluginList = organization.getPlugins();
if (organizationPluginList == null) {
organizationPluginList = new ArrayList<>();
organizationPluginList = new HashSet<>();
}
OrganizationPlugin organizationPlugin = new OrganizationPlugin();

View File

@ -40,13 +40,9 @@ public class PluginScheduledTask {
private Instant lastUpdatedAt = null;
/**
* Gets the external IP address of this server and pings a data point to indicate that this server instance is live.
* We use an initial delay of two minutes to roughly wait for the application along with the migrations are finished
* and ready.
*/
// Number of milliseconds between the start of each scheduled calls to this method.
@Scheduled(initialDelay = 2 * 60 * 1000 /* two minutes */, fixedRate = 2 * 60 * 60 * 1000 /* two hours */)
@Scheduled(initialDelay = 30 * 1000 /* 30 seconds */, fixedRate = 2 * 60 * 60 * 1000 /* two hours */)
public void updateRemotePlugins() {
// Get all plugins on this instance
final Mono<Map<PluginIdentifier, Plugin>> availablePluginsMono =
@ -60,7 +56,7 @@ public class PluginScheduledTask {
final Mono<Map<PluginIdentifier, Plugin>> newPluginsMono = getRemotePlugins();
Mono.zip(availablePluginsMono, newPluginsMono)
.flatMapMany(tuple -> {
.flatMap(tuple -> {
final Map<PluginIdentifier, Plugin> availablePlugins = tuple.getT1();
final Map<PluginIdentifier, Plugin> newPlugins = tuple.getT2();
final List<Plugin> updatablePlugins = new ArrayList<>();
@ -70,17 +66,24 @@ public class PluginScheduledTask {
v.setId(availablePlugins.get(k).getId());
updatablePlugins.add(v);
} else {
v.setId(null);
insertablePlugins.add(v);
}
});
final Flux<Plugin> updatedPluginsFlux = pluginService.saveAll(updatablePlugins);
final Flux<Organization> organizationFlux = pluginService.saveAll(insertablePlugins)
.filter(Plugin::getDefaultInstall)
.collectList()
.flatMapMany(pluginService::installDefaultPlugins);
final Mono<List<Plugin>> updatedPluginsFlux = pluginService.saveAll(updatablePlugins)
.collectList();
final Mono<List<Organization>> organizationFlux =
Flux.fromIterable(insertablePlugins)
.flatMap(pluginService::create)
.filter(Plugin::getDefaultInstall)
.collectList()
.flatMapMany(pluginService::installDefaultPlugins)
.collectList();
return updatedPluginsFlux.zipWith(organizationFlux);
return updatedPluginsFlux
.zipWith(organizationFlux)
.then();
})
.subscribeOn(Schedulers.single())
.subscribe();

View File

@ -30,6 +30,7 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import static com.appsmith.server.acl.AclPermission.MANAGE_APPLICATIONS;
import static com.appsmith.server.acl.AclPermission.MANAGE_ORGANIZATIONS;
@ -177,12 +178,12 @@ public class SeedMongoData {
Flux<Organization> organizationFlux = mongoTemplate
.find(new Query().addCriteria(where("name").in(pluginData[0][0], pluginData[1][0], pluginData[2][0])), Plugin.class)
.map(plugin -> new OrganizationPlugin(plugin.getId(), OrganizationPluginStatus.FREE))
.collectList()
.collect(Collectors.toSet())
.cache()
.repeat()
.zipWithIterable(List.of(orgData))
.map(tuple -> {
final List<OrganizationPlugin> orgPlugins = tuple.getT1();
final Set<OrganizationPlugin> orgPlugins = tuple.getT1();
final Object[] orgArray = tuple.getT2();
Organization organization = new Organization();