diff --git a/app/server/src/main/java/com/mobtools/server/configurations/ClientUserRepository.java b/app/server/src/main/java/com/mobtools/server/configurations/ClientUserRepository.java index 81c0b478bc..c4f57144f0 100644 --- a/app/server/src/main/java/com/mobtools/server/configurations/ClientUserRepository.java +++ b/app/server/src/main/java/com/mobtools/server/configurations/ClientUserRepository.java @@ -3,9 +3,9 @@ package com.mobtools.server.configurations; import com.mobtools.server.domains.LoginSource; import com.mobtools.server.domains.User; import com.mobtools.server.domains.UserState; -import com.mobtools.server.repositories.UserRepository; +import com.mobtools.server.services.TenantService; import com.mobtools.server.services.UserService; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; import org.springframework.security.core.Authentication; import org.springframework.security.oauth2.client.OAuth2AuthorizedClient; import org.springframework.security.oauth2.client.web.server.ServerOAuth2AuthorizedClientRepository; @@ -39,12 +39,15 @@ import java.util.Map; * saveAuthorizedClient is called on every successful OAuth2 authentication, this solves the problem * of plugging a handler for the same purpose. */ +@Configuration public class ClientUserRepository implements ServerOAuth2AuthorizedClientRepository { UserService userService; + TenantService tenantService; - public ClientUserRepository(UserService userService) { + public ClientUserRepository(UserService userService, TenantService tenantService) { this.userService = userService; + this.tenantService = tenantService; } private static final String DEFAULT_AUTHORIZED_CLIENTS_ATTR_NAME = @@ -83,7 +86,7 @@ public class ClientUserRepository implements ServerOAuth2AuthorizedClientReposit .then(Mono.empty()); } - private Mono checkAndCreateUser(OidcUser user) { + public Mono checkAndCreateUser(OidcUser user) { User newUser = new User(); newUser.setName(user.getFullName()); newUser.setEmail(user.getEmail()); @@ -91,7 +94,19 @@ public class ClientUserRepository implements ServerOAuth2AuthorizedClientReposit newUser.setState(UserState.ACTIVATED); newUser.setIsEnabled(true); - return userService.findByEmail(user.getEmail()) + /** TODO + * Tenant here is being hardcoded. This is a stop gap measure + * A flow needs to be added to connect a User to a Tenant. Once + * that is done, during the login, the tenant should be picked up + * and a user should be hence created. + */ + + return tenantService.findById("5d3e90a2dfec7c00047a81ea") + .map(tenant -> { + newUser.setTenant(tenant); + return newUser; + }) + .then(userService.findByEmail(user.getEmail())) .switchIfEmpty(userService.save(newUser)); } diff --git a/app/server/src/main/java/com/mobtools/server/configurations/SecurityConfig.java b/app/server/src/main/java/com/mobtools/server/configurations/SecurityConfig.java index f4435b78ac..9209c0d91c 100644 --- a/app/server/src/main/java/com/mobtools/server/configurations/SecurityConfig.java +++ b/app/server/src/main/java/com/mobtools/server/configurations/SecurityConfig.java @@ -2,7 +2,7 @@ package com.mobtools.server.configurations; import com.mobtools.server.constants.Security; -import com.mobtools.server.repositories.UserRepository; +import com.mobtools.server.services.TenantService; import com.mobtools.server.services.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -26,6 +26,9 @@ public class SecurityConfig { @Autowired private UserService userService; + @Autowired + private TenantService tenantService; + /** * This configuration enables CORS requests for the most common HTTP Methods * @@ -69,7 +72,7 @@ public class SecurityConfig { .authenticated() .and().httpBasic() .and().oauth2Login() - .authorizedClientRepository(new ClientUserRepository(userService)) + .authorizedClientRepository(new ClientUserRepository(userService, tenantService)) .and().formLogin() .and().build(); } diff --git a/app/server/src/main/java/com/mobtools/server/controllers/BaseController.java b/app/server/src/main/java/com/mobtools/server/controllers/BaseController.java index a7117105fe..789b77b242 100644 --- a/app/server/src/main/java/com/mobtools/server/controllers/BaseController.java +++ b/app/server/src/main/java/com/mobtools/server/controllers/BaseController.java @@ -2,10 +2,16 @@ package com.mobtools.server.controllers; import com.mobtools.server.domains.BaseDomain; import com.mobtools.server.dtos.ResponseDto; +import com.mobtools.server.exceptions.MobtoolsException; import com.mobtools.server.services.CrudService; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseStatus; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -18,7 +24,7 @@ public abstract class BaseController> create(@Valid @RequestBody T resource) { + public Mono> create(@Valid @RequestBody T resource) throws MobtoolsException { return service.create(resource) .map(created -> new ResponseDto<>(HttpStatus.CREATED.value(), created, null)); } diff --git a/app/server/src/main/java/com/mobtools/server/controllers/PluginController.java b/app/server/src/main/java/com/mobtools/server/controllers/PluginController.java index 0300a086b1..ef40f2eb35 100644 --- a/app/server/src/main/java/com/mobtools/server/controllers/PluginController.java +++ b/app/server/src/main/java/com/mobtools/server/controllers/PluginController.java @@ -2,10 +2,20 @@ package com.mobtools.server.controllers; import com.mobtools.server.constants.Url; import com.mobtools.server.domains.Plugin; +import com.mobtools.server.domains.Tenant; +import com.mobtools.server.dtos.PluginTenantDTO; +import com.mobtools.server.dtos.ResponseDto; import com.mobtools.server.services.PluginService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; + +import javax.validation.Valid; @RestController @@ -16,4 +26,19 @@ public class PluginController extends BaseController> install(@Valid @RequestBody PluginTenantDTO plugin) { + return service.installPlugin(plugin) + .map(tenant -> new ResponseDto<>(HttpStatus.CREATED.value(), tenant, null)); + } + + @PostMapping("/uninstall") + @ResponseStatus(HttpStatus.CREATED) + public Mono> uninstall(@Valid @RequestBody PluginTenantDTO plugin) { + return service.uninstallPlugin(plugin) + .map(tenant -> new ResponseDto<>(HttpStatus.CREATED.value(), tenant, null)); + } + } diff --git a/app/server/src/main/java/com/mobtools/server/controllers/QueryController.java b/app/server/src/main/java/com/mobtools/server/controllers/QueryController.java index 3645b1e591..e4c2d66995 100644 --- a/app/server/src/main/java/com/mobtools/server/controllers/QueryController.java +++ b/app/server/src/main/java/com/mobtools/server/controllers/QueryController.java @@ -5,7 +5,11 @@ import com.mobtools.server.domains.Query; import com.mobtools.server.dtos.CommandQueryParams; import com.mobtools.server.services.QueryService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; @RestController diff --git a/app/server/src/main/java/com/mobtools/server/domains/BaseDomain.java b/app/server/src/main/java/com/mobtools/server/domains/BaseDomain.java index 5db5e9e9b2..7fa95fbcdf 100644 --- a/app/server/src/main/java/com/mobtools/server/domains/BaseDomain.java +++ b/app/server/src/main/java/com/mobtools/server/domains/BaseDomain.java @@ -3,7 +3,11 @@ package com.mobtools.server.domains; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import org.springframework.data.annotation.*; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.Id; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.domain.Persistable; import java.util.Date; diff --git a/app/server/src/main/java/com/mobtools/server/domains/Plugin.java b/app/server/src/main/java/com/mobtools/server/domains/Plugin.java index 53e86d657b..efde52b180 100644 --- a/app/server/src/main/java/com/mobtools/server/domains/Plugin.java +++ b/app/server/src/main/java/com/mobtools/server/domains/Plugin.java @@ -23,5 +23,15 @@ public class Plugin extends BaseDomain { String executorClass; - List properties; + String jarLocation; + + List resourceParams; + + List actionParams; + + String minAppsmithVersionSupported; + + String maxAppsmithVersionSupported; + + String version; } diff --git a/app/server/src/main/java/com/mobtools/server/domains/PluginParameterType.java b/app/server/src/main/java/com/mobtools/server/domains/PluginParameterType.java new file mode 100644 index 0000000000..646b5690b4 --- /dev/null +++ b/app/server/src/main/java/com/mobtools/server/domains/PluginParameterType.java @@ -0,0 +1,15 @@ +package com.mobtools.server.domains; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +@NoArgsConstructor +public class PluginParameterType { + String key; + String dataType; +} diff --git a/app/server/src/main/java/com/mobtools/server/domains/Tenant.java b/app/server/src/main/java/com/mobtools/server/domains/Tenant.java index af9cf54c13..899f33f932 100644 --- a/app/server/src/main/java/com/mobtools/server/domains/Tenant.java +++ b/app/server/src/main/java/com/mobtools/server/domains/Tenant.java @@ -24,4 +24,6 @@ public class Tenant extends BaseDomain { private List tenantSettings; + private List plugins; + } diff --git a/app/server/src/main/java/com/mobtools/server/domains/TenantPlugin.java b/app/server/src/main/java/com/mobtools/server/domains/TenantPlugin.java new file mode 100644 index 0000000000..3068da38b6 --- /dev/null +++ b/app/server/src/main/java/com/mobtools/server/domains/TenantPlugin.java @@ -0,0 +1,21 @@ +package com.mobtools.server.domains; + +import com.mobtools.server.dtos.TenantPluginStatus; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.data.mongodb.core.mapping.DBRef; + +@Getter +@Setter +@ToString +@NoArgsConstructor +public class TenantPlugin extends BaseDomain { + + @DBRef + private Plugin plugin; + + TenantPluginStatus status; + +} diff --git a/app/server/src/main/java/com/mobtools/server/domains/User.java b/app/server/src/main/java/com/mobtools/server/domains/User.java index 7e06fce541..f3a508dd2a 100644 --- a/app/server/src/main/java/com/mobtools/server/domains/User.java +++ b/app/server/src/main/java/com/mobtools/server/domains/User.java @@ -9,7 +9,6 @@ import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; -import java.util.ArrayList; import java.util.Collection; import java.util.Set; import java.util.stream.Collectors; @@ -36,6 +35,8 @@ public class User extends BaseDomain implements UserDetails { private Boolean isEnabled; + private Tenant tenant; + @Override public Collection getAuthorities() { diff --git a/app/server/src/main/java/com/mobtools/server/dtos/AuthenticationDTO.java b/app/server/src/main/java/com/mobtools/server/dtos/AuthenticationDTO.java new file mode 100644 index 0000000000..fd5f76b4e9 --- /dev/null +++ b/app/server/src/main/java/com/mobtools/server/dtos/AuthenticationDTO.java @@ -0,0 +1,18 @@ +package com.mobtools.server.dtos; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +@NoArgsConstructor +@AllArgsConstructor +public class AuthenticationDTO { + String authType; + String username; + String password; +} diff --git a/app/server/src/main/java/com/mobtools/server/dtos/PluginDTO.java b/app/server/src/main/java/com/mobtools/server/dtos/PluginDTO.java new file mode 100644 index 0000000000..0ec890b9da --- /dev/null +++ b/app/server/src/main/java/com/mobtools/server/dtos/PluginDTO.java @@ -0,0 +1,14 @@ +package com.mobtools.server.dtos; + +import com.mobtools.server.domains.PluginType; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class PluginDTO { + String name; + PluginType type; + String executorClass; + String jarLocation; +} diff --git a/app/server/src/main/java/com/mobtools/server/dtos/PluginTenantDTO.java b/app/server/src/main/java/com/mobtools/server/dtos/PluginTenantDTO.java new file mode 100644 index 0000000000..649532cb07 --- /dev/null +++ b/app/server/src/main/java/com/mobtools/server/dtos/PluginTenantDTO.java @@ -0,0 +1,11 @@ +package com.mobtools.server.dtos; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class PluginTenantDTO { + String name; + TenantPluginStatus status; +} diff --git a/app/server/src/main/java/com/mobtools/server/dtos/ResponseDto.java b/app/server/src/main/java/com/mobtools/server/dtos/ResponseDto.java index 6e5ae2edcb..6e30474cd3 100644 --- a/app/server/src/main/java/com/mobtools/server/dtos/ResponseDto.java +++ b/app/server/src/main/java/com/mobtools/server/dtos/ResponseDto.java @@ -1,6 +1,10 @@ package com.mobtools.server.dtos; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; import java.io.Serializable; diff --git a/app/server/src/main/java/com/mobtools/server/dtos/TenantPluginStatus.java b/app/server/src/main/java/com/mobtools/server/dtos/TenantPluginStatus.java new file mode 100644 index 0000000000..dfb70f18b9 --- /dev/null +++ b/app/server/src/main/java/com/mobtools/server/dtos/TenantPluginStatus.java @@ -0,0 +1,5 @@ +package com.mobtools.server.dtos; + +public enum TenantPluginStatus { + FREE, TRIAL, ACTIVATED +} diff --git a/app/server/src/main/java/com/mobtools/server/plugins/PostgresDBPluginExecutor.java b/app/server/src/main/java/com/mobtools/server/plugins/PostgresDBPluginExecutor.java index 365b54f1c3..7bd440ba57 100644 --- a/app/server/src/main/java/com/mobtools/server/plugins/PostgresDBPluginExecutor.java +++ b/app/server/src/main/java/com/mobtools/server/plugins/PostgresDBPluginExecutor.java @@ -8,7 +8,12 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import reactor.core.publisher.Flux; -import java.sql.*; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; diff --git a/app/server/src/main/java/com/mobtools/server/repositories/PluginRepository.java b/app/server/src/main/java/com/mobtools/server/repositories/PluginRepository.java index 74ad5e8949..f6f7b9b858 100644 --- a/app/server/src/main/java/com/mobtools/server/repositories/PluginRepository.java +++ b/app/server/src/main/java/com/mobtools/server/repositories/PluginRepository.java @@ -2,7 +2,9 @@ package com.mobtools.server.repositories; import com.mobtools.server.domains.Plugin; import org.springframework.stereotype.Repository; +import reactor.core.publisher.Mono; @Repository public interface PluginRepository extends BaseRepository { + Mono findByName(String name); } diff --git a/app/server/src/main/java/com/mobtools/server/services/BaseService.java b/app/server/src/main/java/com/mobtools/server/services/BaseService.java index 0604c1ad0f..3bd1d7b07e 100644 --- a/app/server/src/main/java/com/mobtools/server/services/BaseService.java +++ b/app/server/src/main/java/com/mobtools/server/services/BaseService.java @@ -1,6 +1,7 @@ package com.mobtools.server.services; import com.mobtools.server.domains.BaseDomain; +import com.mobtools.server.exceptions.MobtoolsException; import com.mobtools.server.repositories.BaseRepository; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; @@ -65,7 +66,7 @@ public abstract class BaseService create(T object) { + public Mono create(T object) throws MobtoolsException { return repository.save(object); } diff --git a/app/server/src/main/java/com/mobtools/server/services/CrudService.java b/app/server/src/main/java/com/mobtools/server/services/CrudService.java index 75a461b05c..e6f82f7211 100644 --- a/app/server/src/main/java/com/mobtools/server/services/CrudService.java +++ b/app/server/src/main/java/com/mobtools/server/services/CrudService.java @@ -1,6 +1,7 @@ package com.mobtools.server.services; import com.mobtools.server.domains.BaseDomain; +import com.mobtools.server.exceptions.MobtoolsException; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -8,7 +9,7 @@ public interface CrudService { Flux get(); - Mono create(T resource); + Mono create(T resource) throws MobtoolsException; Mono update(ID id, T resource) throws Exception; diff --git a/app/server/src/main/java/com/mobtools/server/services/PluginService.java b/app/server/src/main/java/com/mobtools/server/services/PluginService.java index 2f4b12ae55..14a4242b37 100644 --- a/app/server/src/main/java/com/mobtools/server/services/PluginService.java +++ b/app/server/src/main/java/com/mobtools/server/services/PluginService.java @@ -2,6 +2,10 @@ package com.mobtools.server.services; import com.mobtools.server.domains.Plugin; import com.mobtools.server.domains.PluginType; +import com.mobtools.server.domains.Tenant; +import com.mobtools.server.dtos.PluginTenantDTO; +import com.mobtools.server.exceptions.MobtoolsException; +import reactor.core.publisher.Mono; public interface PluginService extends CrudService { @@ -14,4 +18,11 @@ public interface PluginService extends CrudService { * @return PluginExecutor */ PluginExecutor getPluginExecutor(PluginType pluginType, String className); + + public Mono create(Plugin plugin) throws MobtoolsException; + + public Mono installPlugin(PluginTenantDTO plugin); + + public Mono uninstallPlugin(PluginTenantDTO plugin); + } diff --git a/app/server/src/main/java/com/mobtools/server/services/PluginServiceImpl.java b/app/server/src/main/java/com/mobtools/server/services/PluginServiceImpl.java index 2da7b76b24..830f149f55 100644 --- a/app/server/src/main/java/com/mobtools/server/services/PluginServiceImpl.java +++ b/app/server/src/main/java/com/mobtools/server/services/PluginServiceImpl.java @@ -1,30 +1,56 @@ package com.mobtools.server.services; +import com.mobtools.server.configurations.ClientUserRepository; import com.mobtools.server.domains.Plugin; import com.mobtools.server.domains.PluginType; +import com.mobtools.server.domains.Tenant; +import com.mobtools.server.domains.TenantPlugin; +import com.mobtools.server.dtos.PluginTenantDTO; +import com.mobtools.server.dtos.TenantPluginStatus; +import com.mobtools.server.exceptions.MobtoolsException; import com.mobtools.server.repositories.PluginRepository; +import com.mobtools.server.repositories.UserRepository; import lombok.extern.slf4j.Slf4j; +import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.data.mongodb.core.ReactiveMongoTemplate; import org.springframework.data.mongodb.core.convert.MongoConverter; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.ReactiveSecurityContextHolder; +import org.springframework.security.core.context.SecurityContext; import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; import reactor.core.scheduler.Scheduler; +import java.util.ArrayList; +import java.util.List; + @Slf4j @Service public class PluginServiceImpl extends BaseService implements PluginService { + private final PluginRepository pluginRepository; + private final UserRepository userRepository; private final ApplicationContext applicationContext; + private final ClientUserRepository clientUserRepository; + private final TenantService tenantService; @Autowired public PluginServiceImpl(Scheduler scheduler, MongoConverter mongoConverter, ReactiveMongoTemplate reactiveMongoTemplate, PluginRepository repository, - ApplicationContext applicationContext) { + UserRepository userRepository, + ApplicationContext applicationContext, + ClientUserRepository clientUserRepository, + TenantService tenantService) { super(scheduler, mongoConverter, reactiveMongoTemplate, repository); + this.userRepository = userRepository; this.applicationContext = applicationContext; + pluginRepository = repository; + this.clientUserRepository = clientUserRepository; + this.tenantService = tenantService; } public PluginExecutor getPluginExecutor(PluginType pluginType, String className) { @@ -37,4 +63,112 @@ public class PluginServiceImpl extends BaseService create(Plugin plugin) throws MobtoolsException { + if (plugin.getId() != null) { + throw new MobtoolsException("During create plugin, Id is not null. Can't create new plugin."); + } + plugin.setDeleted(false); + return pluginRepository.save(plugin); + } + + @Override + public Mono installPlugin(PluginTenantDTO pluginTenantDTO) { + return pluginRepository + .findByName(pluginTenantDTO.getName()) + .flatMap(plugin1 -> storeTenantPlugin(plugin1, pluginTenantDTO.getStatus())) + .switchIfEmpty(Mono.empty()); + } + + @Override + public Mono uninstallPlugin(PluginTenantDTO plugin) { + /*TODO + * Tenant & user association is being mocked here by forcefully + * only using a hardcoded tenant. This needs to be replaced by + * a user-tenant association flow. The Tenant needs to be picked + * up from a user object. This is being used in install/uninstall + * plugin from a tenant flow. Instead, the current user should be read + * using the following : + * ReactiveSecurityContextHolder.getContext() + * .map(SecurityContext::getAuthentication) + * .map(Authentication::getPrincipal); + * Once the user has been pulled using this, tenant should already + * be stored as part of user and this tenant should be used to store + * the installed plugin or to delete plugin during uninstallation. + */ + Mono tenantMono = tenantService.findById("5d3e90a2dfec7c00047a81ea"); + + return tenantMono + .map(tenant -> { + List tenantPluginList = tenant.getPlugins(); + if (tenantPluginList == null || tenantPluginList.isEmpty()) { + return tenant; + } + for (TenantPlugin listPlugin : tenantPluginList) { + if (listPlugin.getPlugin().getName().equals(plugin.getName())) { + log.debug("Plugin {} found. Uninstalling now from Tenant {}.", + plugin.getName(), tenant.getName()); + tenantPluginList.remove(listPlugin); + tenant.setPlugins(tenantPluginList); + return tenant; + } + } + log.debug("Plugin {} not found. Can't uninstall a plugin which is not installed", + plugin.getName()); + return tenant; + }) + /* TODO + * Extra save is happening below in the edge case scenario of a plugin + * which needs to be removed from the installed list, didnt exist in this list + * to be begin with. Small optimization opportunity. + */ + .flatMap(tenantService::save); + } + + private Mono storeTenantPlugin(Plugin plugin, TenantPluginStatus status) { + /*TODO + * Tenant & user association is being mocked here by forcefully + * only using a hardcoded tenant. This needs to be replaced by + * a user-tenant association flow. The Tenant needs to be picked + * up from a user object. This is being used in install/uninstall + * plugin from a tenant flow. Instead, the current user should be read + * using the following : + * ReactiveSecurityContextHolder.getContext() + * .map(SecurityContext::getAuthentication) + * .map(Authentication::getPrincipal); + * Once the user has been pulled using this, tenant should already + * be stored as part of user and this tenant should be used to store + * the installed plugin or to delete plugin during uninstallation. + */ + Mono tenantMono = tenantService.findById("5d3e90a2dfec7c00047a81ea"); + + Mono userObjectMono = ReactiveSecurityContextHolder.getContext() + .map(SecurityContext::getAuthentication) + .map(Authentication::getPrincipal); + + return Mono.zip(tenantMono, userObjectMono, (tenant, user) -> { + List tenantPluginList = tenant.getPlugins(); + if (tenantPluginList == null) { + tenantPluginList = new ArrayList(); + } + + for (TenantPlugin listPlugin : tenantPluginList) { + if (listPlugin.getPlugin().getName().equals(plugin.getName())) { + log.debug("Plugin {} is already installed for Tenant {}. Don't add again.", + plugin.getName(), tenant.getName()); + return tenant; + } + } + TenantPlugin tenantPlugin = new TenantPlugin(); + //Set an ID in the nested document so that installed plugins can be referred to uniquely using IDs + ObjectId objectId = new ObjectId(); + tenantPlugin.setId(objectId.toString()); + tenantPlugin.setPlugin(plugin); + tenantPlugin.setStatus(status); + tenantPluginList.add(tenantPlugin); + tenant.setPlugins(tenantPluginList); + return tenant; + }).flatMap(tenantService::save); + } } diff --git a/app/server/src/main/java/com/mobtools/server/services/TenantService.java b/app/server/src/main/java/com/mobtools/server/services/TenantService.java index e902941cc1..9cabfe93e6 100644 --- a/app/server/src/main/java/com/mobtools/server/services/TenantService.java +++ b/app/server/src/main/java/com/mobtools/server/services/TenantService.java @@ -8,4 +8,8 @@ public interface TenantService extends CrudService { Mono getByName(String name); Mono create(Tenant object); + + Mono findById(String id); + + Mono save (Tenant tenant); } diff --git a/app/server/src/main/java/com/mobtools/server/services/TenantServiceImpl.java b/app/server/src/main/java/com/mobtools/server/services/TenantServiceImpl.java index 65f368344a..94bb826cbc 100644 --- a/app/server/src/main/java/com/mobtools/server/services/TenantServiceImpl.java +++ b/app/server/src/main/java/com/mobtools/server/services/TenantServiceImpl.java @@ -79,4 +79,14 @@ public class TenantServiceImpl extends BaseService findById(String id) { + return repository.findById(id); + } + + @Override + public Mono save(Tenant tenant) { + return repository.save(tenant); + } }