Fixed installation for multiple plugins into organizations (#7767)
This commit is contained in:
parent
0f83f79840
commit
59ec853498
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user